如何检测 V8 中从一种形状到另一种形状的过渡?

How to detect transition from one shape to another in V8?

假设我有下一个代码:

let x = null;
x = 10;

我如何在这里检测形状转换?从 NULL_TYPE 到 SMI? 我知道应该有一些内置功能。 Here 是列表。

我希望可以 运行 node --allow-natives-syntax 或类似的东西,例如:


let x = null;
x = 10;
console.log(%DetectTransition(x))

(此处为 V8 开发人员。)

该代码段中没有形状转换,因为“形状”概念仅适用于对象。

这是一个形状转换的例子:

let a = {x: 1};
let b = {x: 1};
%HaveSameMap(a, b);  // true
b.y = 2;
%HaveSameMap(a, b);  // false
a.y = 3;
%HaveSameMap(a, b);  // true

%HaveSameMap 将提供的对象的形状描述符与 returns truefalse 进行比较。有关更多详细信息,您还可以按照@JonasWilms 的建议使用 %DebugPrint

当然,我们在这里讨论的是内部细节(包括幕后发生的事情,以及您如何检查它以进行调试或出于好奇目的)。没有人承诺事情将继续以这种方式继续运作。 (我认为基础不太可能改变,但细节确实会改变。)