跳到主要内容

方舟字节码基本原理

总体设计

概述

方舟字节码(Ark Bytecode)是由方舟编译器编译ArkTS/TS/JS生成的,提供给方舟运行时解释执行的二进制文件。方舟字节码中的主要内容是方舟字节码指令。

本文旨在介绍方舟字节码指令相关的设计,将在后续章节中对构成指令的重要概念和具体的指令格式及含义进行说明,帮助开发者了解方舟字节码指令,指导开发者进行指令相关的特性开发工作。

一条方舟字节码指令,由操作码(指令的名称)和指令入参列表组成。操作码包含无前缀的操作码和有前缀的操作码两种。寄存器、立即数以及string id/method id/literal id均可以作为指令的入参。除此之外,部分指令中使用累加器作为默认参数。

方舟字节码中,除寄存器和累加器之外,还存在全局变量模块(module)命名空间和模块变量词法环境和词法变量补丁变量4种值存储方式。指令可以使用这4种储值位置中的值作为入参。

术语和约束

术语

本文涉及的术语清单:

术语说明
accaccumulator:累加器,方舟字节码中一个特殊的寄存器,用于存储大多数指令的默认输入或输出值。
bit比特:本文中用位表示。
hole尚未初始化的对象或变量。
idindex:索引,是string id/method id/literal id的总称。
string idstring index:字符串索引,16位的数字,用于索引到对应的字符串。
method idmethod index:方法索引,16位的数字,用于索引到对应的方法。
literal idliteral index:字面量索引,16位的数字,用于索引到对应的字面量数组。
lexical environment词法环境:用来存放闭包变量的语义环境。
lexical variable词法变量:词法环境中所存的闭包变量。

约束

  • 本文中所有采用代码形式描述的内容均遵循ArkTS语言规范
  • 本文仅适用于版本号为12.0.6.0的方舟字节码(版本号为方舟编译器内部保留字段,开发者无需关注)。

字节码构成

操作码与前缀

方舟字节码中的操作码通常被编码为一个8位的值,因此至多只能有256个操作码。随着方舟编译器运行时功能的演进,字节码的数量也在逐步增加,已经超过了256个。因此,方舟字节码引入了前缀(prefix),将操作码最大宽度从8位扩展到16位。8位操作码(无前缀的)用于表示频繁出现的指令,16位操作码(有前缀的)用于表示出现频率不高的指令。

带前缀的操作码为小端法存储的16位值,由8位操作码和8位前缀组成,编码规则为:操作码左移8位,再与前缀相或。

前缀操作码助记符描述
0xfethrow有条件/无条件的throw指令。
0xfdwide含有更宽编码宽度的立即数、id或寄存器索引的指令。
0xfcdeprecated方舟编译器不再会产生的指令,仅用于维护运行时兼容性; 本文后续章节中将省略对这些指令的说明。
0xfbcallruntime调用运行时方法的指令。

前缀操作码的助记符的形式为前缀助记符.操作码助记符,例如,wide.stlexvar。stlexvar指令的操作码是0x0d,前缀wide是0xfd,则此带前缀的指令(wide.stlexvar)的操作码是0x0dfd。

寄存器与累加器

方舟虚拟机模型基于寄存器,所有的寄存器均为虚拟寄存器。当寄存器中存放原始类型的值时,宽度是64位;当寄存器中存放对象类型的值时,宽度适应为足够宽,以存放对该对象的引用。

方舟字节码中,存在一个名为累加器(accumulator,也简称作acc)的不可见寄存器。acc是许多指令的默认目标寄存器,也是许多指令的默认参数。acc不占用编码宽度,有助于产生更为紧凑的字节码。

示例代码:

function foo0(): number {
return 1;
}

字节码中的相关指令:

.function any .foo(any a0, any a1, any a2) {
ldai 0x1
return
}

指令ldai 0x1:将整型字面量1加载到acc中;

指令return:返回acc中的值。

立即数

方舟字节码中部分指令采用常数形式来表示整型数值、双精度浮点型数值和跳转偏移量等数据。这类常数被称为立即数,可以是8位、16位、32位或64位。

方法索引、字符串索引、字面量索引

方舟字节码中存放着源文件中使用到的所有方法、字符串和字面量数组的偏移量。其中,字面量数组中存放着各种字面量数据,例如整型数字、字符串偏移量和方法偏移量。在方舟字节码指令中,这些方法、字符串以及字面量数组的索引都是16位的,分别被称作方法索引(method id)、字符串索引(string id)以及字面量索引(literal id)。这些索引被编码在指令中,以引用方法、字符串和字面量数组。

值存储方式

全局变量

Script编译模式下,全局变量是一个存储在全局唯一的映射中的变量,其键值为全局变量的名称,值为全局变量的值。全局变量可通过全局(global)相关的指令进行访问。

示例代码:

let a = 1;
let b = 1;
function foo1(): void {
a += 2;
b = 5;
}

字节码中的相关指令:

.function any .foo(any a0, any a1, any a2) {
tryldglobalbyname 0x0, a
sta v4
ldai 0x2
add2 0x1, v4
trystglobalbyname 0x2, a
ldai 0x5
trystglobalbyname 0x3, b
...
}

指令tryldglobalbyname 0x0, a:将名称为a的全局变量加载进acc,不存在名称为a的全局变量时,抛出异常;

指令trystglobalbyname 0x2, a:将acc中的值存放到名称为a的全局变量上,不存在名称为a的全局变量时,抛出异常;

指令trystglobalbyname 0x3, b:将acc中的值存放到名称为b的全局变量上,不存在名称为b的全局变量时,抛出异常。

上述指令中出现的0x0,0x2,0x3是方舟运行时内部使用的保留数字,开发者无需关注。

模块命名空间和模块变量

源文件中使用到的所有的模块命名空间(module namespace)都会被编译进一个数组中,指令中使用索引来引用一个模块命名空间。例如,指令getmodulenamespace 0x1引用了索引0x1处的模块命名空间。

源文件中使用到的所有模块变量(module variable)都会被编译进一个数组中,指令通过索引来引用这些模块变量。例如,指令stmodulevar 0x1引用了索引0x1处的模块变量。

在函数中,如果模块变量的声明与该函数位于同一源文件,则该变量称为局部模块变量;否则称为外部模块变量。例如,指令ldlocalmodulevar和ldexternalmodulevar分别用于加载局部模块变量和外部模块变量。

产生模块指令的相关场景,包括importexport,主要场景列举如下:

  • import * as:module namespace
  • import { }:module variable
  • export:local export

模块相关的逻辑是编译器的内部实现,随着方舟编译器的后续演进,可能会出现新的涉及模块指令的场景;另一方面,现有的模块命名空间和模块变量指令的相关场景,也可能会随着需求演进和代码重构,不再涉及产生模块相关指令。

示例代码:

// ModuleFoo.ts
export let a: number = 1;
export let b: number = 2;
// ModuleBar.ts
export let c: number = 4;
// ModuleIndex.ts
import { a, b } from "./ModuleFoo";
import * as c from "./ModuleBar";

export let d: number = 3;

a + b + d;
c;

字节码中的相关指令:

.function any .func_main_0(any a0, any a1, any a2) {
getmodulenamespace 0x1
ldai 0x3
stmodulevar 0x0
ldexternalmodulevar 0x0
sta v0
throw.undefinedifholewithname a
ldexternalmodulevar 0x1
sta v1
throw.undefinedifholewithname b
lda v1
add2 0x0, v0
sta v0
ldlocalmodulevar 0x0
sta v1
throw.undefinedifholewithname d
lda v1
add2 0x1, v0
stmodulevar 0x1
returnundefined
...
}

指令getmodulenamespace 0x1:获取1号槽位上的模块命名空间(c),存放到acc中;

指令stmodulevar 0x0:将acc中的值存放到当前模块的0号槽位上;

指令ldexternalmodulevar 0x0:加载外部模块的0号槽位上的值(a),存放到acc中;

指令ldlocalmodulevar 0x0:加载当前局部模块的0号槽位上的值(d),存放到acc中。

词法环境和词法变量

方舟字节码中,词法环境(lexical environment)可以看作是一个具有多个槽位的数组,每个槽位对应一个词法变量(lexical variable),一个方法中可能会存在多个词法环境。指令中使用词法环境的相对层级编号和槽位索引,来表示一个词法变量。例如,指令ldlexvar 0x1, 0x2的含义是:将1个层次外的词法环境的2号槽位上的值存放到acc中。

|xxx|xxx|xxx|xxx| <-- 当前词法环境外的第1个词法环境
^
|------------ ldlexvar 0x1, 0x2

|xxx|xxx|xxx|xxx| <-- 当前词法环境

lexical相关的逻辑是编译器的内部实现。随着方舟编译器的演进,可能会出现新的涉及lexical指令的场景。现有的lexical指令场景也可能会因需求演进和代码重构而不再涉及lexical的相关指令。

示例代码:

// Index.ts
function foo(): void {
let a: number = 1;
function bar(): number {
return a;
}
}

字节码中的相关指令:

.function any .foo(any a0, any a1, any a2) {
newlexenv 0x1
...
definefunc 0x0, .bar, 0x0
sta v3
ldai 0x1
...
stlexvar 0x0, 0x0
...
}

.function any .bar(any a0, any a1, any a2) {
...
ldlexvar 0x0, 0x0
...
}

指令newlexenv 0x1:创建一个槽位数为1的词法环境,将其存放到acc中,并进入该词法环境;

指令stlexvar 0x0, 0x0:将acc中的值存放到0个层次外的词法环境的0号槽位上;

指令ldlexvar 0x0, 0x0:将0个层次外的词法环境的0号槽位上的值存放到acc中。

共享词法环境

共享词法环境是一类特殊的词法环境。与一般词法环境的区别在于,共享词法环境中的每个词法变量都是sendable对象。方舟编译器通过共享词法环境实现词法变量在多线程中共享。

示例代码:

@Sendable
class A { }

@Sendable
class B {
u: A = new A();
}

字节码中的相关指令:

.function any .#~B=#B(any a0, any a1, any a2) {
label_1:
label_0:
callruntime.ldsendablevar 0x0, 0x0
sta v0
throw.undefinedifholewithname A
...
label_2:
}

.function any .func_main_0(any a0, any a1, any a2) {
label_1:
label_0:
callruntime.newsendableenv 0x1
...
callruntime.definesendableclass 0x0, .#~A=#A, _3, 0x0, v0
callruntime.stsendablevar 0x0, 0x0
...
label_2:
}

指令callruntime.newsendableenv 0x1:创建一个槽位数为1的共享词法环境,并进入该词法环境;

指令callruntime.stsendablevar 0x0, 0x0:将acc中的值存放到0个层次外的共享词法环境的0号槽位上;

指令callruntime.ldsendablevar 0x0, 0x0:将0个层次外的共享词法环境的0号槽位上的值存放到acc中。

补丁变量

方舟编译器支持补丁模式的编译,当源文件发生修改时,经过补丁模式编译,生成一个补丁字节码,配合原字节码,完成功能的更新。方舟编译器在补丁模式下编译时,产生的补丁变量会被存放在一个特殊的补丁词法环境中。方舟字节码中使用补丁词法环境上的槽位编号来引用补丁变量。例如,指令ldpatchvar 0x1加载的是槽位号为1的补丁变量。

示例代码:

function bar(): void {} // 新增语句,编译补丁

function foo2(): void {
bar(); // 新增语句,编译补丁
}

字节码中的相关指令:

.function any foo(...) {
...
wide.ldpatchvar 0x0
sta v4
lda v4
callarg0 0x0
...
}

.function any patch_main_0(...) {
newlexenv 0x1
definefunc 0x1, bar:(any,any,any), 0x0
wide.stpatchvar 0x0
...
}

指令wide.stpatchvar 0x0:将函数bar存放到补丁词法环境的0号槽位;

指令wide.ldpatchvar 0x0:将补丁词法环境上0号槽位的值存放到acc中。

函数调用规范

对于一个包含了N个形参的方法,该方法所使用的寄存器中的最后N+3个会被用于传递参数。其中,前三个寄存器固定表示函数本身(FunctionObject)、new.target(NewTarget)和函数所在的词法环境中的this(this),后续的N个寄存器依次对应这N个形参。

示例代码:

function foo3(a: number, b: number): void {}

字节码中的相关指令:

.function any .foo(any a0, any a1, any a2, any a3, any a4) {
// a0: FunctionObject
// a1: NewTarget
// a2: this
// a3: a
// a4: b
}

字节码格式说明

助记符语义说明
ID168位操作码,16位id。
IMM168位操作码,16位立即数。
IMM16_ID168位操作码,16位立即数,16位id。
IMM16_ID16_ID16_IMM16_V88位操作码,16位立即数,2个16位id,16位立即数,8位寄存器。
IMM16_ID16_IMM88位操作码,16位立即数,16位id,8位立即数。
IMM16_ID16_V88位操作码,16位立即数,16位id,8位寄存器。
IMM16_IMM168位操作码,2个16位立即数。
IMM16_IMM8_V88位操作码,16位立即数,8位立即数,8位寄存器。
IMM16_V88位操作码,16位立即数,8位寄存器。
IMM16_V8_IMM168位操作码,16位立即数,8位寄存器,16位立即数。
IMM16_V8_V88位操作码,16位立即数,2个8位寄存器。
IMM328位操作码,32位立即数。
IMM4_IMM48位操作码,2个4位立即数。
IMM648位操作码,64位立即数。
IMM88位操作码,8位立即数。
IMM8_ID168位操作码,8位立即数,16位id。
IMM8_ID16_ID16_IMM16_V88位操作码,8位立即数,2个16位id,16位立即数,8位寄存器。
IMM8_ID16_IMM88位操作码,8位立即数,16位id,8位立即数。
IMM8_ID16_V88位操作码,8位立即数,16位id,8位寄存器。
IMM8_IMM168位操作码,8位立即数,16位立即数。
IMM8_IMM88位操作码,2个8位立即数。
IMM8_IMM8_V88位操作码,2个8位立即数,8位寄存器。
IMM8_V88位操作码,8位立即数,8位寄存器。
IMM8_V8_IMM168位操作码,8位立即数,8位寄存器,16位立即数。
IMM8_V8_V88位操作码,8位立即数,2个8位寄存器。
IMM8_V8_V8_V88位操作码,8位立即数,3个8位寄存器。
IMM8_V8_V8_V8_V88位操作码,8位立即数,4个8位寄存器。
NONE8位操作码。
PREF_IMM1616位前缀操作码,16位立即数。
PREF_IMM16_ID1616位前缀操作码,16位立即数,16位id。
PREF_IMM16_V816位前缀操作码,16位立即数,8位寄存器。
PREF_IMM16_V8_V816位前缀操作码,16位立即数,2个8位寄存器。
PREF_IMM816位前缀操作码,8位立即数。
PREF_NONE16位前缀操作码。
PREF_V816位前缀操作码,8位寄存器。
PREF_V8_ID1616位前缀操作码,8位寄存器,16位id。
PREF_V8_IMM3216位前缀操作码,8位寄存器,32位立即数。
V16_V168位操作码,2个16位寄存器。
V4_V48位操作码,2个4位寄存器。
V88位操作码,8位寄存器。
V8_IMM168位操作码,8位寄存器,16位立即数。
V8_IMM88位操作码,8位寄存器,8位立即数。
V8_V88位操作码,2个8位寄存器。
V8_V8_V88位操作码,3个8位寄存器。
V8_V8_V8_V88位操作码,4个8位寄存器。

字节码汇总集合

下表中汇总了当前版本的所有方舟字节码,寄存器索引、立即数和id通过每四位宽度使用一个字符替代的形式来描述。

以指令defineclasswithbuffer RR, @AAAA, @BBBB, +CCCC, vDD为例:

  • defineclasswithbuffer:指示操作的操作码助记符。
  • RR:方舟运行时内部使用的8位保留数字,此处提及仅为完整展示指令格式,开发者无需关注。
  • @AAAA,@BBBB:16位id。
  • +CCCC:16位立即数。
  • vDD:8位寄存器索引。
操作码格式助记符/语法参数说明
0x00NONEldundefined-undefined加载进acc。
0x01NONEldnull-null加载进acc。
0x02NONEldtrue-true加载进acc。
0x03NONEldfalse-false加载进acc。
0x04NONEcreateemptyobject-创建一个空对象,并将其存放到acc中。
0x05IMM8createemptyarray RRR:方舟运行时内部使用的8位保留数字创建一个空数组,并将其存放到acc中。
0x06IMM8_ID16createarraywithbuffer RR, @AAAAR:方舟运行时内部使用的8位保留数字 A:16位的literal id使用索引A对应的字面量数组,创建一个数组对象,并将其存放到acc中。
0x07IMM8_ID16createobjectwithbuffer RR, @AAAAR:方舟运行时内部使用的8位保留数字 A:16位的literal id使用索引A对应的字面量数组,创建一个对象,并将其存放到acc中。
0x08IMM8_IMM8_V8newobjrange RR, +AA, vBBR:方舟运行时内部使用的8位保留数字 A:参数数量 B:类对象 B + 1, ..., B + A - 1:传递给构造函数的参数以B + 1, ..., B + A - 1作为参数,创建一个B类的实例,并将其存放到acc中。
0x09IMM8newlexenv +AAA:词法环境中的槽位数目创建一个槽位数为A的词法环境,将其存放到acc中,并进入该词法环境。
0x0aIMM8_V8add2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A + acc,并将计算结果存放到acc中。
0x0bIMM8_V8sub2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A - acc,并将计算结果存放到acc中。
0x0cIMM8_V8mul2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A * acc,并将计算结果存放到acc中。
0x0dIMM8_V8div2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A / acc,并将计算结果存放到acc中。
0x0eIMM8_V8mod2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A % acc,并将计算结果存放到acc中。
0x0fIMM8_V8eq RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A == acc,并将计算结果存放到acc中。
0x10IMM8_V8noteq RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A != acc,并将计算结果存放到acc中。
0x11IMM8_V8less RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A < acc,并将计算结果存放到acc中。
0x12IMM8_V8lesseq RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A <= acc,并将计算结果存放到acc中。
0x13IMM8_V8greater RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A > acc,并将计算结果存放到acc中。
0x14IMM8_V8greatereq RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A >= acc,并将计算结果存放到acc中。
0x15IMM8_V8shl2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A << acc,并将计算结果存放到acc中。
0x16IMM8_V8shr2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A >>> acc,并将计算结果存放到acc中。
0x17IMM8_V8ashr2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A >> acc,并将计算结果存放到acc中。
0x18IMM8_V8and2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A & acc,并将计算结果存放到acc中。
0x19IMM8_V8or2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A
0x1aIMM8_V8xor2 RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A ^ acc,并将计算结果存放到acc中。
0x1bIMM8_V8exp RR, vAA默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字 A:操作数计算A ** acc,并将计算结果存放到acc中。
0x1cIMM8typeof RR默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字计算typeof acc,并将计算结果存放到acc中。
0x1dIMM8tonumber RR默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字以acc作为参数,执行ToNumber,将结果存放到acc中。
0x1eIMM8tonumeric RR默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字以acc作为参数,执行ToNumeric,将结果存放到acc中。
0x1fIMM8neg RR默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字计算-acc,并将计算结果存放到acc中。
0x20IMM8not RR默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字计算~acc,并将计算结果存放到acc中。
0x21IMM8inc RR默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字计算acc + 1,并将计算结果存放到acc中。
0x22IMM8dec RR默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字计算acc - 1,并将计算结果存放到acc中。
0x23NONEistrue默认入参:acc:对象计算acc == true,并将计算结果存放到acc中。
0x24NONEisfalse默认入参:acc:对象计算acc == false,并将计算结果存放到acc中。
0x25IMM8_V8isin RR, vAA默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字 A:对象计算A in acc,并将计算结果存放到acc中。
0x26IMM8_V8instanceof RR, vAA默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字 A:对象计算A instanceof acc,并将计算结果存放到acc中。
0x27IMM8_V8strictnoteq RR, vAA默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字 A:对象计算acc !== A,并将计算结果存放到acc中。
0x28IMM8_V8stricteq RR, vAA默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字 A:对象计算acc === A,并将计算结果存放到acc中。
0x29IMM8callarg0 RR默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字不传递参数,直接调用acc中存放的函数对象,并将结果存放到acc中。
0x2aIMM8_V8callarg1 RR, vAA默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:参数以A作为参数,调用acc中存放的函数对象,并将结果存放到acc中。
0x2bIMM8_V8_V8callargs2 RR, vAA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A, B:参数以A,B作为参数,调用acc中存放的函数对象,并将结果存放到acc中。
0x2cIMM8_V8_V8_V8callargs3 RR, vAA, vBB, vCC默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A, B, C:参数以A, B, C作为参数,调用acc中存放的函数对象,并将结果存放到acc中。
0x2dIMM8_V8callthis0 RR, vAA默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:对象将this的值设置为A,不传递参数,调用acc中存放的函数对象,并将结果存放到acc中。
0x2eIMM8_V8_V8callthis1 RR, vAA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:对象 B:参数将this的值设置为A,以B作为参数,调用acc中存放的函数对象,并将计算结果存放到acc中。
0x2fIMM8_V8_V8_V8callthis2 RR, vAA, vBB, vCC默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:对象 B, C:参数将this的值设置为A,以B,C作为参数,调用acc中存放的函数对象,并将计算结果存放到acc中。
0x30IMM8_V8_V8_V8_V8callthis3 RR, vAA, vBB, vCC, vDD默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:对象 B, C, D:参数将this的值设置为A,以B, C, D作为参数,调用acc中存放的函数对象,并将计算结果存放到acc中。
0x31IMM8_IMM8_V8callthisrange RR, +AA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:参数数量 B:对象 B + 1, ..., B + A:参数将this的值设置为B,以B + 1,...,B + A作为参数,调用acc中存放的函数对象,并将计算结果存放到acc中。
0x32IMM8_IMM8_V8supercallthisrange RR, +AA, vBBR:方舟运行时内部使用的8位保留数字 A:参数数量 B, ..., B + A - 1:参数以B, ..., B + A - 1作为参数, 调用super函数,并将结果存放到acc中。 当A的值是0时,B是undefined。 此指令仅出现在非箭头函数中。
0x33IMM8_ID16_IMM8definefunc RR, @AAAA, +BBR:方舟运行时内部使用的8位保留数字 A:method id B:方法A的形参数量创建方法A的函数对象,并将其存放到acc中。
0x34IMM8_ID16_IMM8definemethod RR, @AAAA, +BB默认入参:acc:类对象或类对象的对象原型,方法为静态方法时,acc中是类对象 R:方舟运行时内部使用的8位保留数字 A:method id B:方法A的形参数量创建方法A的函数对象,将acc中的对象设置为该函数对象的HomeObject属性,并将该函数对象存放到acc中。
0x35IMM8_ID16_ID16_IMM16_V8defineclasswithbuffer RR, @AAAA, @BBBB, +CCCC, vDDR:方舟运行时内部使用的8位保留数字 A:类的构造函数的method id B:literal id C:方法A的形参数量 D:父类使用索引B对应的字面量数组和父类D,创建A的类对象,并将其存放到acc中。
0x36V8getnextpropname vAAA:迭代器执行for-in迭代器A的next方法,并将结果存放到acc中。
0x37IMM8_V8ldobjbyvalue RR, vAA默认入参:acc:属性键值 R:方舟运行时内部使用的8位保留数字 A:对象加载A对象的键值为acc的属性,并将结果存放到acc中。
0x38IMM8_V8_V8stobjbyvalue RR, vAA, vBB默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0x39IMM8_V8ldsuperbyvalue RR, vAA默认入参:acc:属性键值 R:方舟运行时内部使用的8位保留数字 A:对象在当前函数中,获取super的键值为acc的属性,并将其存放到acc中。若该属性为访问器属性,则将A中的对象作为调用该属性getter函数时的this参数。
0x3aIMM8_IMM16ldobjbyindex RR, +AAAA默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字 A:属性键值加载acc中所存对象的键值为A的属性,并将其存放到acc中。
0x3bIMM8_V8_IMM16stobjbyindex RR, vAA, +BBBB默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0x3cIMM4_IMM4ldlexvar +A, +BA:词法环境层级 B:槽位号将A个层次外的词法环境的B号槽位上的值存放到acc中。
0x3dIMM4_IMM4stlexvar +A, +B默认入参:acc:值 A:词法环境层级 B:槽位号将acc中的值存放到A个层次外的词法环境的B号槽位上。
0x3eID16lda.str @AAAAA:string id将索引A对应的字符串存放到acc中。
0x3fIMM8_ID16tryldglobalbyname RR, @AAAAR:方舟运行时内部使用的8位保留数字 A:string id将名称为索引A对应的字符串的全局变量存放进acc中,不存在名称为A的全局变量时,抛出异常。
0x40IMM8_ID16trystglobalbyname RR, @AAAA默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:string id将acc中的值存放到名称为索引A对应的字符串的全局变量上,不存在名称为A的全局变量时,抛出异常。
0x41IMM16_ID16ldglobalvar RRRR, @AAAAR:方舟运行时内部使用的16位保留数字 A:string id将名称为索引A对应的字符串的全局变量的值存放到acc中,该变量一定存在。
0x42IMM8_ID16ldobjbyname RR, @AAAA默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字 A:string id加载acc中所存对象的键值为索引A对应的字符串的属性,并将其存放到acc中。
0x43IMM8_ID16_V8stobjbyname RR, @AAAA, vBB默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:string id B:对象将acc中的值存放到对象B的键值为索引A对应的字符串的属性上。
0x44V4_V4mov vA, vBA, B:寄存器索引将寄存器B中的内容复制到寄存器A中。
0x45V8_V8mov vAA, vBBA, B:寄存器索引将寄存器B中的内容复制到寄存器A中。
0x46IMM8_ID16ldsuperbyname RR, @AAAA默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字 A:string id在当前函数中,获取super的键值为索引A对应的字符串的属性,并将其存放到acc中。若该属性为访问器属性,则将acc中的对象作为调用该属性getter函数时的this参数。
0x47IMM16_ID16stconsttoglobalrecord RRRR, @AAAA默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:string id将acc的值存放到全局变量中以const定义的名字为索引A对应的字符串的常量。
0x48IMM16_ID16sttoglobalrecord RRRR, @AAAA默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:string id将acc的值存放到全局变量中以let定义的名字为索引A对应的字符串的变量。
0x49IMM8_ID16ldthisbyname RR, @AAAAR:方舟运行时内部使用的8位保留数字 A:string id加载this的键值为索引A对应的字符串的属性,并把结果存放到acc中。
0x4aIMM8_ID16stthisbyname RR, @AAAA默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:string id将acc中的值存放到this的键值为索引A对应的字符串的属性上。
0x4bIMM8ldthisbyvalue RR默认入参:acc:属性键值 R:方舟运行时内部使用的8位保留数字加载this的键值为acc的属性,并将结果存放到acc中。
0x4cIMM8_V8stthisbyvalue RR, vAA默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:属性键值将acc中的值存放到this的键值为A的属性上。
0x4dIMM8jmp +AAA:有符号的分支偏移量无条件跳转到分支A。
0x4eIMM16jmp +AAAAA:有符号的分支偏移量无条件跳转到分支A。
0x4fIMM8jeqz +AA默认入参:acc:值 A:有符号的分支偏移量计算acc == 0,如果为真,则跳转到分支A。
0x50IMM16jeqz +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc == 0,如果为真,则跳转到分支A。
0x51IMM8jnez +AA默认入参:acc:值 A:有符号的分支偏移量计算acc != 0,如果为真,则跳转到分支A。
0x52IMM8jstricteqz +AA默认入参:acc:值 A:有符号的分支偏移量计算acc === 0,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x53IMM8jnstricteqz +AA默认入参:acc:值 A:有符号的分支偏移量计算acc !== 0,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x54IMM8jeqnull +AA默认入参:acc:值 A:有符号的分支偏移量计算acc == null,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x55IMM8jnenull +AA默认入参:acc:值 A:有符号的分支偏移量计算acc != null,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x56IMM8jstricteqnull +AA默认入参:acc:值 A:有符号的分支偏移量计算acc === null,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x57IMM8jnstricteqnull +AA默认入参:acc:值 A:有符号的分支偏移量计算acc !== null,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x58IMM8jequndefined +AA默认入参:acc:值 A:有符号的分支偏移量计算acc == undefined,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x59IMM8jneundefined +AA默认入参:acc:值 A:有符号的分支偏移量计算acc != undefined,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x5aIMM8jstrictequndefined +AA默认入参:acc:值 A:有符号的分支偏移量计算acc === undefined,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x5bIMM8jnstrictequndefined +AA默认入参:acc:值 A:有符号的分支偏移量计算acc !== undefined,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x5cV8_IMM8jeq vAA, +BB默认入参:acc:值 A:值 B:有符号的分支偏移量计算acc == A,如果为真,则跳转到分支B。 指令功能未使能,暂不可用。
0x5dV8_IMM8jne vAA, +BB默认入参:acc:值 A:值 B:有符号的分支偏移量计算acc != A,如果为真,则跳转到分支B。 指令功能未使能,暂不可用。
0x5eV8_IMM8jstricteq vAA, +BB默认入参:acc:对象 A:对象 B:有符号的分支偏移量计算acc === A,如果为真,则跳转到分支B。 指令功能未使能,暂不可用。
0x5fV8_IMM8jnstricteq vAA, +BB默认入参:acc:对象 A:对象 B:有符号的分支偏移量计算acc !== A,如果为真,则跳转到分支B。 指令功能未使能,暂不可用。
0x60V8lda vAAA:寄存器索引将寄存器A中的内容存放到acc中。
0x61V8sta vAA默认入参:acc A:寄存器索引将acc中的内容存放到寄存器A中。
0x62IMM32ldai +AAAAAAAAA:常量字面量将整型字面量A存放到acc中。
0x63IMM64fldai +AAAAAAAAAAAAAAAAA:常量字面量将双精度浮点型字面量A存放到acc中。
0x64NONEreturn默认入参:acc:值返回acc中的值。
0x65NONEreturnundefined-返回undefined
0x66NONEgetpropiterator默认入参:acc:对象将acc中所存的对象的for-in迭代器存放到acc中。
0x67IMM8getiterator RR默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字执行GetIterator(acc, sync)方法,并将结果存放到acc中。
0x68IMM8_V8closeiterator RR, vAAR:方舟运行时内部使用的8位保留数字 A:对象以类型为 iteratorRecord 的A作为参数,执行IteratorClose,并将结果存放到acc中。
0x69NONEpoplexenv-跳出当前的词法环境,进入外面一层词法环境。
0x6aNONEldnan-nan存放到acc中。
0x6bNONEldinfinity-infinity存放到acc中。
0x6cNONEgetunmappedargs-将当前函数的arguments存放到acc中。
0x6dNONEldglobal-global对象存放到acc中。
0x6eNONEldnewtarget-将当前函数的隐式参数NewTarget存放到acc中。 指令功能未使能,暂不可用。
0x6fNONEldthis-将this存放到acc中。
0x70NONEldhole-hole存放到acc中。
0x71IMM8_ID16_IMM8createregexpwithliteral RR, @AAAA, +BBR:方舟运行时内部使用的8位保留数字 A:string id B:指代正则表达式修饰符使用索引A对应的字符串和B指代的修饰符,创建一个正则表达式,并存放到acc中。 B和所指代的修饰符的对应关系为:0(默认值,无修饰符),1(g),2(i),4(m),8(s),16(u),32(y);B也可以指代符合语法规范的修饰符的组合,例如3,指代的修饰符是gi。
0x72IMM16_ID16_IMM8createregexpwithliteral RRRR, @AAAA, +BBR:方舟运行时内部使用的16位保留数字 A:string id B:指代正则表达式修饰符使用索引A对应的字符串和B指代的修饰符,创建一个正则表达式,并存放到acc中。 B和所指代的修饰符的对应关系为:0(默认值,无修饰符),1(g),2(i),4(m),8(s),16(u),32(y);B也可以指代符合语法规范的修饰符的组合,例如3,指代的修饰符是gi。
0x73IMM8_IMM8_V8callrange RR, +AA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:参数数量 B,..., B + A - 1:参数以B, ..., B + A - 1作为参数,调用acc中存放的函数对象,并将结果存放到acc中。
0x74IMM16_ID16_IMM8definefunc RRRR, @AAAA, +BBR:方舟运行时内部使用的16位保留数字 A:method id B:方法A的形参数量创建方法A的函数对象,并将其存放到acc中。
0x75IMM16_ID16_ID16_IMM16_V8defineclasswithbuffer RRRR, @AAAA, @BBBB, +CCCC, vDDR:方舟运行时内部使用的16位保留数字 A:类的构造函数的method id B:literal id C:方法A的形参数量 D:父类使用索引B对应的字面量数组和父类D,创建A的类对象,并将其存放到acc中。
0x76IMM8gettemplateobject RR默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字执行GetTemplateObject(acc),并将结果存放到acc中。
0x77IMM8_V8setobjectwithproto RR, vAA默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字 A:值将acc中存放对象的 __proto__ 属性设置为A。
0x78IMM8_V8_V8stownbyvalue RR, vAA, vBB默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0x79IMM8_V8_IMM16stownbyindex RR, vAA, +BBBB默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0x7aIMM8_ID16_V8stownbyname RR, @AAAA, vBB默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:string id B:对象将acc中的值存放到对象B的键值为索引A对应的字符串的属性上。
0x7bIMM8getmodulenamespace +AAA:模块索引对第A个模块,执行GetModuleNamespace,并将结果存放到acc中。
0x7cIMM8stmodulevar +AA默认入参:acc:值 A:槽位号将acc中的值存放到槽位号为A的模块变量中。
0x7dIMM8ldlocalmodulevar +AAA:槽位号将槽位号为A的局部模块变量存放到acc中。
0x7eIMM8ldexternalmodulevar +AAA:槽位号将槽位号为A的外部模块变量存放到acc中。
0x7fIMM16_ID16stglobalvar RRRR, @AAAA默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:string id将acc中的值存放到名字为索引A对应的字符串的全局变量上,这个变量一定存在。
0x80IMM16createemptyarray RRRRR:方舟运行时内部使用的16位保留数字创建一个空数组,并将其存放到acc中。
0x81IMM16_ID16createarraywithbuffer RRRR, @AAAAR:方舟运行时内部使用的16位保留数字 A:literal id使用索引A对应的字面量数组,创建一个数组对象, 并将其存放到acc中。
0x82IMM16_ID16createobjectwithbuffer RRRR, @AAAAR:方舟运行时内部使用的16位保留数字 A:literal id使用索引A对应的字面量数组,创建一个对象, 并将其存放到acc中。
0x83IMM16_IMM8_V8newobjrange RRRR, +AA, vBBR:方舟运行时内部使用的16位保留数字 A:参数数量 B:类对象 B + 1, ..., B + A - 1:传递给构造函数的参数以B + 1, ..., B + A - 1作为参数,创建一个B类的实例,并将其存放到acc中。
0x84IMM16typeof RRRR默认入参:acc:对象 R:方舟运行时内部使用的16位保留数字计算typeof acc,并将计算结果存放到acc中。
0x85IMM16_V8ldobjbyvalue RRRR, vAA默认入参:acc:属性键值 R:方舟运行时内部使用的16位保留数字 A:对象加载A对象的键值为acc的属性,并将结果存放到acc中。
0x86IMM16_V8_V8stobjbyvalue RRRR, vAA, vBB默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0x87IMM16_V8ldsuperbyvalue RRRR, vAA默认入参:acc:属性键值 R:方舟运行时内部使用的16位保留数字 A:对象在当前函数中,获取super的键值为acc的属性,并将其存放到acc中。若该属性为访问器属性,则将A中的对象作为调用该属性getter函数时的this参数。
0x88IMM16_IMM16ldobjbyindex RRRR, +AAAA默认入参:acc:对象 R:方舟运行时内部使用的16位保留数字 A:属性键值加载acc中所存对象的键值为A的属性,并将其存放到acc中。
0x89IMM16_V8_IMM16stobjbyindex RRRR, vAA, +BBBB默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0x8aIMM8_IMM8ldlexvar +AA, +BBA:词法环境层级 B:槽位号将A个层次外的词法环境的B号槽位上的值存放到acc中。
0x8bIMM8_IMM8stlexvar +AA, +BB默认入参:acc:值 A:词法环境层级 B:槽位号将acc中的值存放到A个层次外的词法环境的B号槽位上。
0x8cIMM16_ID16tryldglobalbyname RRRR, @AAAAR:方舟运行时内部使用的16位保留数字 A:string id将名称为索引A对应的字符串的全局变量存放进acc中,不存在名称为A的全局变量时,抛出异常。
0x8dIMM16_ID16trystglobalbyname RRRR, @AAAA默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:string id将acc中的值存放到名称为索引A对应的字符串的全局变量上,不存在名称为A的全局变量时,抛出异常。
0x8eIMM8_ID16_V8stownbynamewithnameset RR, @AAAA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:string id B:对象将acc中的函数对象存放到对象B的键值为索引A对应的字符串的属性上,并将函数的名称设置为索引A对应的字符串。
0x8fV16_V16mov vAAAA, vBBBBA, B:寄存器索引将寄存器B中的内容复制到寄存器A中。
0x90IMM16_ID16ldobjbyname RRRR, @AAAA默认入参:acc:对象 R:方舟运行时内部使用的16位保留数字 A:string id加载acc中所存对象的键值为索引A对应的字符串的属性,并将其存放到acc中。
0x91IMM16_ID16_V8stobjbyname RRRR, @AAAA, vBB默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:string id B:对象将acc中的值存放到对象B的键值为索引A对应的字符串的属性上。
0x92IMM16_ID16ldsuperbyname RRRR, @AAAA默认入参:acc:对象 R:方舟运行时内部使用的16位保留数字 A:string id在当前函数中,获取super的键值为索引A对应的字符串的属性,并将其存放到acc中。若该属性为访问器属性,则将acc中的对象作为调用该属性getter函数时的this参数。
0x93IMM16_ID16ldthisbyname RRRR, @AAAAR:方舟运行时内部使用的16位保留数字 A:string id加载this的键值为索引A对应的字符串的属性,并把结果存放到acc中。
0x94IMM16_ID16stthisbyname RRRR, @AAAA默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:string id将acc中的值存放到this的键值为索引A对应的字符串的属性上。
0x95IMM16ldthisbyvalue RRRR默认入参:acc:属性键值 R:方舟运行时内部使用的16位保留数字加载this的键值为acc的属性,并将结果存放到acc中。
0x96IMM16_V8stthisbyvalue RRRR, vAA默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:属性键值将acc中的值存放到this的键值为A的属性上。
0x97V8asyncgeneratorreject vAA默认入参:acc:异常 A:生成器使用generator A和acc中存放的异常,执行AsyncGeneratorReject,并将结果存放到acc中。
0x98IMM32jmp +AAAAAAAAA:有符号的分支偏移量无条件跳转到分支A。
0x99IMM8_V8_V8stownbyvaluewithnameset RR, vAA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上,并将函数的名称设置为B。
0x9aIMM32jeqz +AAAAAAAA默认入参:acc:值 A:有符号的分支偏移量计算acc == 0,如果为真,则跳转到分支A。
0x9bIMM16jnez +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc != 0,如果为真,则跳转到分支A。
0x9cIMM32jnez +AAAAAAAA默认入参:acc:值 A:有符号的分支偏移量计算acc != 0,如果为真,则跳转到分支A。
0x9dIMM16jstricteqz +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc === 0,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x9eIMM16jnstricteqz +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc !== 0,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0x9fIMM16jeqnull +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc == null,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0xa0IMM16jnenull +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc != null,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0xa1IMM16jstricteqnull +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc === null,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0xa2IMM16jnstricteqnull +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc !== null,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0xa3IMM16jequndefined +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc == undefined,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0xa4IMM16jneundefined +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc != undefined,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0xa5IMM16jstrictequndefined +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc === undefined,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0xa6IMM16jnstrictequndefined +AAAA默认入参:acc:值 A:有符号的分支偏移量计算acc !== undefined,如果为真,则跳转到分支A。 指令功能未使能,暂不可用。
0xa7V8_IMM16jeq vAA, +BBBB默认入参:acc:值 A:值 B:有符号的分支偏移量计算acc == A,如果为真,则跳转到分支B。 指令功能未使能,暂不可用。
0xa8V8_IMM16jne vAA, +BBBB默认入参:acc:值 A:值 B:有符号的分支偏移量计算acc != A,如果为真,则跳转到分支B。 指令功能未使能,暂不可用。
0xa9V8_IMM16jstricteq vAA, +BBBB默认入参:acc:值 A:值 B:有符号的分支偏移量计算acc === A,如果为真,则跳转到分支B。 指令功能未使能,暂不可用。
0xaaV8_IMM16jnstricteq vAA, +BBBB默认入参:acc:值 A:值 B:有符号的分支偏移量计算acc !== A,如果为真,则跳转到分支B。 指令功能未使能,暂不可用。
0xabIMM16getiterator RRRR默认入参:acc:对象 R:方舟运行时内部使用的16位保留数字执行GetIterator(acc, sync)方法,并将结果存放到acc中。
0xacIMM16_V8closeiterator RRRR, vAAR:方舟运行时内部使用的16位保留数字 A:对象以类型为iteratorRecord的A作为参数,执行IteratorClose,并将结果存放到acc中。
0xadNONEldsymbol-加载Symbol对象到acc中。
0xaeNONEasyncfunctionenter-创建一个异步函数对象,并将这个对象存放到acc中。
0xafNONEldfunction-将当前的函数对象加载到acc中。
0xb0NONEdebugger-调试时用于暂停执行。
0xb1V8creategeneratorobj vAAA:函数对象使用函数对象A,创建一个generator,并将其存放到acc中。
0xb2V8_V8createiterresultobj vAA, vBBA:对象 B:布尔值以 value A和 done B作为参数,执行CreateIterResultObject,并将结果存放到acc中。
0xb3IMM8_V8_V8createobjectwithexcludedkeys +AA, vBB, vCCA:范围寄存器数量 B:对象 C, ..., C + A:属性键值基于对象B,创建一个排除了键值C, ..., C + A的对象,并将其存放到acc中。 这个指令用于支持使用析构和扩展语法创建对象。
0xb4IMM8_V8newobjapply RR, vAA默认入参:acc:参数列表 R:方舟运行时内部使用的8位保留数字 A:类对象使用acc中存放的参数列表,创建一个A类的实例,并将其存放到acc中。
0xb5IMM16_V8newobjapply RRRR, vAA默认入参:acc:参数列表 R:方舟运行时内部使用的16位保留数字 A:类对象使用acc中存放的参数列表,创建一个A类的实例,并将其存放到acc中。
0xb6IMM8_ID16newlexenvwithname +AA, @BBBBA:词法环境中的槽位数量 B:literal id使用索引B对应的字面量数组中所存放的词法变量名称,创建一个具有A个槽位的词法环境,将这个词法环境存放到acc中,并进入该词法环境。
0xb7V8createasyncgeneratorobj vAAA:函数对象基于函数对象A,创建一个异步的generator,并将其存放到acc中。
0xb8V8_V8_V8asyncgeneratorresolve vAA, vBB, vCCA:生成器 B:对象 C:布尔值以 generator A, value B和 done C作为参数,执行AsyncGeneratorResolve,并将结果存放到acc中。
0xb9IMM8_V8supercallspread RR, vAA默认入参:acc:类对象 R:方舟运行时内部使用的8位保留数字 A:参数列表以参数列表A作为参数,调用acc中所存类的父类构造函数,并将结果存放到acc中。
0xbaIMM8_V8_V8apply RR, vAA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:对象 B:参数列表将this设置为A,以参数列表B作为参数,调用acc中存放的函数对象,并将返回值存放到acc中。
0xbbIMM8_IMM8_V8supercallarrowrange RR, +AA, vBB默认入参:acc:类对象 R:方舟运行时内部使用的8位保留数字 A:参数数量 B, ..., B + A - 1:参数以B, ..., B + A - 1作为参数,调用acc中所存类的父类的构造函数,并将结果存放到acc中。 如果A的值为0,则B为undefined。 此指令仅出现在箭头函数中。
0xbcV8_V8_V8_V8definegettersetterbyvalue vAA, vBB, vCC, vDD默认入参:acc:是否需要为访问器设置名称,是一个布尔值 A:对象 B:属性键值 C:getter函数对象 D:setter函数对象以getter方法 C和setter方法 D作为参数,定义对象A的键值为B的属性的访问器,并将结果对象存放到acc中。 如果C是undefined,则不会设置getter,如果D是undefined,则不会设置setter。
0xbdNONEdynamicimport默认入参:acc:值使用acc中的值作为参数,执行ImportCalls,并把结果存放到acc中。
0xbeIMM16_ID16_IMM8definemethod RRRR, @AAAA, +BB默认入参:acc:类对象或类对象的对象原型,方法为静态方法时,acc中是类对象 R:方舟运行时内部使用的16位保留数字 A:method id B:方法A的形参数量创建方法A的函数对象,将acc中的对象设置为该函数对象的[[HomeObject]]属性,并将该函数对象存放到acc中。
0xbfNONEresumegenerator默认入参:acc:生成器基于acc中存放的generator,执行GeneratorResume,并将结果存放到acc中。
0xc0NONEgetresumemode默认入参:acc:生成器获取acc中所存放的generator的执行完成后恢复值的类型,并将其存放到acc中。
0xc1IMM16gettemplateobject RRRR默认入参:acc:对象 R:方舟运行时内部使用的16位保留数字执行GetTemplateObject(acc),并将结果存放到acc中。
0xc2V8delobjprop vAA默认入参:acc:属性键值 A:对象删除对象A的键值为acc的属性。
0xc3V8suspendgenerator vAA默认入参:acc:值 A:生成器使用acc中所存放的值,挂起generator A,并将结果存放到acc中。
0xc4V8asyncfunctionawaituncaught vAA默认入参:acc:值 A:函数对象使用函数对象A和acc的值,执行AwaitExpression,并将结果存放到acc中。
0xc5V8copydataproperties vAA默认入参:acc:对象 A:目标对象将acc中所存放的对象的所有属性拷贝到A中,并将A存放到acc中。
0xc6V8_V8starrayspread vAA, vBB默认入参:acc:值 A:数组 B:数组索引将acc中的值按照SpreadElement的形式存放到数组A的以索引B起始的位置上,并将结果数组的长度存放到acc中。
0xc7IMM16_V8setobjectwithproto RRRR, vAA默认入参:acc:对象 R:方舟运行时内部使用的16位保留数字 A:值将acc中存放对象的 __proto__ 属性设置为A。
0xc8IMM16_V8_V8stownbyvalue RRRR, vAA, vBB默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0xc9IMM8_V8_V8stsuperbyvalue RR, vAA, vBB默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:对象 B:属性键值在当前函数中,将acc中的值存放到super的键值为B的属性上。若该属性为访问器属性,则将A中的对象作为调用该属性setter函数时的this参数。
0xcaIMM16_V8_V8stsuperbyvalue RRRR, vAA, vBB默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:对象 B:属性键值在当前函数中,将acc中的值存放到super的键值为B的属性上。若该属性为访问器属性,则将A中的对象作为调用该属性setter函数时的this参数。
0xcbIMM16_V8_IMM16stownbyindex RRRR, vAA, +BBBB默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0xccIMM16_ID16_V8stownbyname RRRR, @AAAA, vBB默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:string id B:对象将acc中的值存放到对象B的键值为索引A对应的字符串的属性上。
0xcdV8asyncfunctionresolve vAA默认入参:acc:值 A:异步的函数对象使用acc中的值,解析对象A的Promise对象,并将结果存放到acc中。
0xceV8asyncfunctionreject vAA默认入参:acc:值 A:异步的函数对象使用acc中的值,驳回对象A的Promise对象,并将结果存放到acc中。
0xcfIMM8copyrestargs +AAA:形参列表中剩余参数所在的位次复制剩余参数,并将复制出的参数数组副本存放到acc中。
0xd0IMM8_ID16_V8stsuperbyname RR, @AAAA, vBB默认入参:acc:值 R:方舟运行时内部使用的8位保留数字 A:string id B:对象在当前函数中,将acc中的值存放到super的键值为索引A对应的字符串的属性上。 若该属性为访问器属性,则将B中的对象作为调用该属性setter函数时的this参数。
0xd1IMM16_ID16_V8stsuperbyname RRRR, @AAAA, vBB默认入参:acc:值 R:方舟运行时内部使用的16位保留数字 A:string id B:对象在当前函数中,将acc中的值存放到super的键值为索引A对应的字符串的属性上。 若该属性为访问器属性,则将B中的对象作为调用该属性setter函数时的this参数。
0xd2IMM16_V8_V8stownbyvaluewithnameset RRRR, vAA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的8位保留数字 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上,并将函数的名称设置为B。
0xd3ID16ldbigint @AAAAA:string id基于索引A对应的字符串,创建BigInt类型的值,并将其存放到acc中。
0xd4IMM16_ID16_V8stownbynamewithnameset RRRR, @AAAA, vBB默认入参:acc:函数对象 R:方舟运行时内部使用的16位保留数字 A:string id B:对象将acc中的函数对象存放到对象B的键值为索引A对应的字符串的属性上,并将函数的名称设置为索引A对应的字符串。
0xd5NONEnop-无操作。
0xd6IMM8setgeneratorstate +AA默认入参:acc:生成器对象 A:生成器状态将acc中存放的generator的状态设置为A (参考:GeneratorStateAsyncGeneratorState) A可能的值有以下几项:undefined(0x0)、suspendedStart(0x1)、suspendedYield(0x2)、executing(0x3)、completed(0x4)和awaitingReturn(0x5)。
0xd7IMM8getasynciterator RR默认入参:acc:对象 R:方舟运行时内部使用的8位保留数字执行GetIterator(acc, async),并将结果存放到acc上。
0xd8IMM8_IMM16_IMM16ldprivateproperty RR, +AAAA, +BBBB默认入参:acc:对象 A:词法环境层级 B:槽位号加载A个层次外的词法环境的B号槽位上的值,作为属性键值,将acc中所存放对象的该键值对应的值存放到acc中。
0xd9IMM8_IMM16_IMM16_V8stprivateproperty RR, +AAAA, +BBBB, vCCA:词法环境层级 B:槽位号 C:对象加载A个层次外的词法环境的B号槽位上的值,作为属性键值,将acc中的值存放到C中所存放对象的该键值上。
0xdaIMM8_IMM16_IMM16testin RR, +AAAA, +BBBB默认入参:acc:对象 A:词法环境层级 B:槽位号加载A个层次外的词法环境的B号槽位上的值,计算是否in acc,将结果存放到acc中。
0xdbIMM8_ID16_V8definefieldbyname RR, @AAAA, vBB默认入参:acc:值 A:string id B:对象为对象B定义一个键值为A的属性,并将acc中的值存放到其中。
0xdcIMM8_ID16_V8definepropertybyname RR, @AAAA, vBB默认入参:acc:值 A:string id B:对象为对象B定义一个键值为A的属性,并将acc中的值存放到其中。
0xfbPREF_NONEcallruntime.notifyconcurrentresult默认入参:acc:并发函数的返回值将并发函数的返回值通知运行时。 此指令仅出现在并发函数中。
0xfc(deprecated)--(弃用的操作码)
0xfdPREF_IMM16_V8_V8wide.createobjectwithexcludedkeys +AAAA, vBB, vCCA:范围寄存器数量 B:对象 C, ..., C + A:属性键值基于对象B,创建一个排除了键值C, ..., C + A的对象,并将其存放到acc中。 这个指令用例支持使用析构和扩展语法创建对象。
0xfePREF_NONEthrow默认入参:acc:异常抛出acc中存放的异常。
0x01fbPREF_IMM8_V8_V8callruntime.definefieldbyvalue RR, vAA, vBB默认入参:acc:值 A:属性键值 B:对象为对象B定义一个键值为A的属性,并将acc中的值存放到其中。
0x01fc(deprecated)--(弃用的操作码)
0x01fdPREF_IMM16_V8wide.newobjrange +AAAA, vBBA:参数数量 B:类对象 B + 1, ..., B + A - 1:传递给构造函数的参数以B + 1, ..., B + A - 1作为参数,创建一个B类的实例,并将其存放到acc中。
0x01fePREF_NONEthrow.notexists-抛出异常:未定义的方法。
0x02fbPREF_IMM8_IMM32_V8callruntime.definefieldbyindex RR, +AAAAAAAA, vBB默认入参:acc:值 A:属性键值 B:对象为对象B定义一个键值为A的属性,并将acc中的值存放到其中。
0x02fc(deprecated)--(弃用的操作码)
0x02fdPREF_IMM16wide.newlexenv +AAAAA:词法环境中的槽位数目创建一个槽位数为A的词法环境,将其存放到acc中,并进入该词法环境。
0x02fePREF_NONEthrow.patternnoncoercible-抛出异常:此对象不可以强制执行。
0x03fbPREF_NONEcallruntime.topropertykey默认入参:acc:值将acc中的值转换为属性值,如果转换失败,则抛出错误。
0x03fc(deprecated)--(弃用的操作码)
0x03fdPREF_IMM16_ID16wide.newlexenvwithname +AAAA, @BBBBA:词法环境中的槽位数量 B:literal id使用索引B对应的字面量数组中所存放的词法变量名称,创建一个具有A个槽位的词法环境,将这个词法环境存放到acc中,并进入该词法环境。
0x03fePREF_NONEthrow.deletesuperproperty-抛出异常:删除父类的属性。
0x04fbPREF_IMM_16_ID16callruntime.createprivateproperty +AAAA, @BBBBA:要创建的符号数量 B:literal id创建A个符号;从索引B对应的字面量数组中获取存放的私有方法,如果其中存在私有实例方法,则额外创建一个符号("method"),将所有创建出的符号按照创建顺序,依次放到当前类所在的词法环境的末尾。 此指令仅出现在定义类的时候。
0x04fc(deprecated)--(弃用的操作码)
0x04fdPREF_IMM16_V8wide.callrange +AAAA, vBB默认入参:acc:函数对象 A:参数数量 B, ..., B + A - 1:参数以B, ..., B + A - 1作为参数,调用acc中存放的函数对象,并将结果存放到acc中。
0x04fePREF_V8throw.constassignment vAAA:常量变量的名称抛出异常:对常量变量进行赋值。
0x05fbPREF_IMM8_IMM_16_IMM_16_V8callruntime.defineprivateproperty RR, +AAAA, +BBBB, vCC默认入参:acc:值 A:词法环境层数 B:槽位号 C:对象加载A个层次外的词法环境的B号槽位上的符号,赋值为acc,将其作为私有属性添加到对象C上。
0x05fc(deprecated)--(弃用的操作码)
0x05fdPREF_IMM16_V8wide.callthisrange +AAAA, vBB默认入参:acc:函数对象 A:参数数量 B:对象 B + 1, ..., B + A:参数将this的值设置为B,以B + 1,...,B + A作为参数,调用acc中存放的函数对象,并将计算结果存放到acc中。
0x05fePREF_V8throw.ifnotobject vAAA:对象如果A不是一个对象,抛出异常。
0x06fbPREF_IMM8_V8callruntime.callinit +RR, vAAacc:函数对象 R:方舟运行时内部使用的8位保留数字 A:对象将this的值设置为A,不传递参数,调用acc中存放的函数对象,并将结果存放到acc中。
0x06fc(deprecated)--(弃用的操作码)
0x06fdPREF_IMM16_V8wide.supercallthisrange +AAAA, vBBA:参数数量 B, ..., B + A - 1:参数以B, ..., B + A - 1作为参数, 调用super函数,并将结果存放到acc中。 当A的值是0时,B是undefined。 此指令仅出现在非箭头函数中。
0x06fePREF_V8_V8throw.undefinedifhole vAA, vBBA:对象 B:对象名称如果A的值是hole,则抛出异常:B的值是undefined
0x07fbPREF_IMM16_ID16_ID16_IMM16_V8callruntime.definesendableclass RRRR, @AAAA, @BBBB, +CCCC, vDDR:方舟运行时内部使用的16位保留数字 A:sendable class的构造函数的method id B:literal id C:方法A的形参数量 D:父类使用索引B对应的字面量数组和父类D,创建一个A类的对象,并将其存放到acc中。
0x07fc(deprecated)--(弃用的操作码)
0x07fdPREF_IMM16_V8wide.supercallarrowrange +AAAA, vBB默认入参:acc:类对象 A:参数数量 B, ..., B + A - 1:参数以B, ..., B + A - 1作为参数,调用acc中所存类的父类的构造函数,并将结果存放到acc中。 如果A的值为0,则B为undefined。 此指令仅出现在箭头函数中。
0x07fePREF_IMM8throw.ifsupernotcorrectcall +AA默认入参:acc:对象 A:错误种类如果super没有被正确调用,抛出错误。
0x08fbPREF_IMM16callruntime.ldsendableclass +AAAAA:词法环境层级将A个层次外的词法环境的sendable class存放到acc中。
0x08fc(deprecated)--(弃用的操作码)
0x08fdPREF_IMM32wide.ldobjbyindex +AAAAAAAA默认入参:acc:对象 A:属性键值加载acc中所存对象的键值为A的属性,并将其存放到acc中。
0x08fePREF_IMM16throw.ifsupernotcorrectcall +AAAA默认入参:acc:对象 A:错误种类如果super没有被正确调用,抛出错误。
0x09fbPREF_IMM8callruntime.ldsendableexternalmodulevar +AAA:槽位号将槽位号为A的外部模块变量存放到acc中。此指令仅出现在sendable class和sendable function中。
0x09fc(deprecated)--(弃用的操作码)
0x09fdPREF_V8_IMM32wide.stobjbyindex vAA, +BBBBBBBB默认入参:acc:值 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0x09fePREF_ID16throw.undefinedifholewithname @AAAA默认入参:acc:对象 A:string id如果acc中的值是hole,则抛出异常:A的值是undefined
0x0afbPREF_IMM16callruntime.wideldsendableexternalmodulevar +AAAAA:槽位号将槽位号为A的外部模块变量存放到acc中。此指令仅出现在sendable class和sendable function中。
0x0afc(deprecated)--(弃用的操作码)
0x0afdPREF_V8_IMM32wide.stownbyindex vAA, +BBBBBBBB默认入参:acc:值 A:对象 B:属性键值将acc中的值存放到对象A的键值为B的属性上。
0x0bfbPREF_IMM8callruntime.newsendableenv +AAA:共享词法环境中的槽位数目创建一个槽位数为A的共享词法环境,并进入该词法环境。
0x0bfc(deprecated)--(弃用的操作码)
0x0bfdPREF_IMM16wide.copyrestargs +AAAAA:形参列表中剩余参数起始的位次复制剩余参数,并将复制出的参数数组副本存放到acc中。
0x0cfbPREF_IMM16callruntime.widenewsendableenv +AAAAA:共享词法环境中的槽位数目创建一个槽位数为A的共享词法环境,并进入该词法环境 。
0x0cfc(deprecated)--(弃用的操作码)
0x0cfdPREF_IMM16_IMM16wide.ldlexvar +AAAA, +BBBBA:词法环境层级 B:槽位号将A个层次外的词法环境的B号槽位上的值存放到acc中。
0x0dfbPREF_IMM4_IMM4callruntime.stsendablevar +A +B默认入参:acc:值 A:共享词法环境层级 B:槽位号将acc中的值存放到A个层次外的共享词法环境的B号槽位上。
0x0dfc(deprecated)--(弃用的操作码)
0x0dfdPREF_IMM16_IMM16wide.stlexvar +AAAA, +BBBB默认入参:acc:值 A:词法环境层级 B:槽位号将acc中的值存放到A个层次外的词法环境的B号槽位上。
0x0efbPREF_IMM8_IMM8callruntime.stsendablevar +AA +BB默认入参:acc:值 A:共享词法环境层级 B:槽位号将acc中的值存放到A个层次外的共享词法环境的B号槽位上 。
0x0efc(deprecated)--(弃用的操作码)
0x0efdPREF_IMM16wide.getmodulenamespace +AAAAA:模块索引对第A个模块,执行GetModuleNamespace,并将结果存放到acc中。
0x0ffbPREF_IMM16_IMM16callruntime.widestsendablevar +AAAA +BBBB默认入参:acc:值 A:共享词法环境层级 B:槽位号将acc中的值存放到A个层次外的共享词法环境的B号槽位上。
0x0ffc(deprecated)--(弃用的操作码)
0x0ffdPREF_IMM16wide.stmodulevar +AAAA默认入参:acc:值 A:槽位号将acc中的值存放到槽位号为A的模块变量中。
0x10fbPREF_IMM4_IMM4callruntime.ldsendablevar +A +BA:共享词法环境层级 B:槽位号将A个层次外的共享词法环境的B号槽位上的值存放到acc中。
0x10fc(deprecated)--(弃用的操作码)
0x10fdPREF_IMM16wide.ldlocalmodulevar +AAAAA:槽位号将槽位号为A的局部模块变量存放到acc中。
0x11fbPREF_IMM8_IMM8callruntime.ldsendablevar +AA + BBA:共享词法环境层级 B:槽位号将A个层次外的共享词法环境的B号槽位上的值存放到acc中。
0x11fc(deprecated)--(弃用的操作码)
0x11fdPREF_IMM16wide.ldexternalmodulevar +AAAAA:槽位号将槽位号为A的外部模块变量存放到acc中。
0x12fbPREF_IMM16_IMM16callruntime.wideldsendablevar +AAAA +BBBBA:共享词法环境层级 B:槽位号将A个层次外的共享词法环境的B号槽位上的值存放到acc中。
0x12fc(deprecated)--(弃用的操作码)
0x12fdPREF_IMM16wide.ldpatchvar +AAAAA:补丁变量槽位号将槽位号为A的补丁变量加载到acc中。 此指令仅出现在补丁模式编译场景下。
0x13fbPREF_IMM8callruntime.istrue +RR默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字计算acc == true,并将计算结果存放到acc中。
0x13fc(deprecated)--(弃用的操作码)
0x13fdPREF_IMM16wide.stpatchvar +AAAA默认入参:acc:值 A:补丁变量槽位号将acc中的值存放进槽位号为A的补丁变量中。 此指令仅出现在补丁模式编译场景下。
0x14fbPREF_IMM8callruntime.isfalse +RR默认入参:acc:操作数 R:方舟运行时内部使用的8位保留数字计算acc == false,并将计算结果存放到acc中。
0x15fbPREF_IMM8callruntime.ldlazymodulevar +AAA:槽位号将槽位号为A的外部模块变量存放到acc中。此指令仅适用于通过lazy import导入的模块变量。
0x16fbPREF_IMM16callruntime.wideldlazymodulevar +AAAAA:槽位号将槽位号为A的外部模块变量存放到acc中。此指令仅适用于通过lazy import导入的模块变量。
0x17fbPREF_IMM8callruntime.ldlazysendablemodulevar +AAA:槽位号将槽位号为A的外部模块变量存放到acc中。此指令仅适用于通过lazy import导入的模块变量且仅出现在sendable class和sendable function中。
0x18fbPREF_IMM16callruntime.wideldlazysendablemodulevar +AAAAA:槽位号将槽位号为A的外部模块变量存放到acc中。此指令仅适用于通过lazy import导入的模块变量且仅出现在sendable class和sendable function中。
0x14fc 0x15fc ... 0x2efc(deprecated)--(弃用的操作码)