Javascript 有人能解释一下Google V8字节码CreateObjectLiteral吗?
这是一个JavaScript源代码Javascript 有人能解释一下Google V8字节码CreateObjectLiteral吗?,javascript,node.js,v8,Javascript,Node.js,V8,这是一个JavaScript源代码 const obj = { name: 'hello', age: 12 }; console.log(obj); 这是一个使用NodeJS选项生成的Google V8字节码——打印字节码 [generated bytecode for function: ] Parameter count 6 Frame size 12 0 E> 17543D4A @ 0 : a0 StackCheck
const obj = {
name: 'hello',
age: 12
};
console.log(obj);
这是一个使用NodeJS选项生成的Google V8字节码——打印字节码
[generated bytecode for function: ]
Parameter count 6
Frame size 12
0 E> 17543D4A @ 0 : a0 StackCheck
12 S> 17543D4B @ 1 : 79 00 00 29 fa CreateObjectLiteral [0], [0], #41, r1
17543D50 @ 6 : 27 fa fb Mov r1, r0
54 S> 17543D53 @ 9 : 13 01 01 LdaGlobal [1], [1]
17543D56 @ 12 : 26 f9 Star r2
62 E> 17543D58 @ 14 : 28 f9 02 03 LdaNamedProperty r2, [2], [3]
17543D5C @ 18 : 26 fa Star r1
62 E> 17543D5E @ 20 : 57 fa f9 fb 05 CallProperty1 r1, r2, r0, [5]
17543D63 @ 25 : 0d LdaUndefined
70 S> 17543D64 @ 26 : a4 Return
Constant pool (size = 3)
17543CFD: [FixedArray] in OldSpace
- map: 0x3a0841e5 <Map>
- length: 3
0: 0x17543cdd <BoilerplateDescription[4]>
1: 0x3a6927a1 <String[7]: console>
2: 0x3a685b69 <String[3]: log>
Handler Table (size = 0)
[为函数生成的字节码:]
参数计数6
框架尺寸12
0 E>17543D4A@0:a0堆叠检查
12 S>17543D4B@1:79 00 00 29 fa CreateObjectLiteral[0],[0],#41,r1
17543D50@6:27 fa fb Mov r1,r0
54 S>17543D53@9:13 01 LdaGlobal[1],[1]
17543D56@12:26 f9星r2
62 E>17543D58@14:28 f9 02 03 LdaNamedProperty r2[2],[3]
17543D5C@18:26 fa星r1
62 E>17543D5E@20:57 fa f9 fb 05 CallProperty1 r1、r2、r0[5]
17543D63@25:0d
70秒>17543D64@26:a4返回
固定池(大小=3)
17543CFD:[固定阵列]在旧空间中
-地图:0x3a0841e5
-长度:3
0:0x17543cdd
1:0x3a6927a1
2:0x3a685b69
处理程序表(大小=0)
任何帮助都是感激的 顾名思义,
CreateObjectLiteral
从文本创建对象,在本例中,{name:'hello',…}
。为了提高效率,V8使用了它所谓的“样板”对象,这些对象是部分填充的“蓝图”,可以快速复制以创建新实例;之后,将填充任何动态属性(即,非编译时常量)。在这个例子中,你没有这些,所以你看不到。观察与以下稍加修改的示例的差异:
function foo(n, a) {
const obj = {name: n, age: a};
console.log(obj);
}
foo("hello", 12);
那么你对字节码的问题到底是什么?您对v8字节码的熟悉程度如何?你需要这个做什么,只是好奇?。。。您具体需要/想要解释什么?我想知道CreateObjectLiteral的操作数含义。非常感谢您的回答。在“CreateObjectLiteral[0]、[0]、#41、r1”中,[0]、#41、r1是什么?字节码的操作数。请参见
BytecodeGraphBuilder::VisitCreateObjectLiteral
。[0]是样板文件的常量池项,[0]是类型反馈向量中的插槽,#41是带标志的位字段,r1是目标寄存器。