HarmonyOS NEXT - 方舟字节码基本原理(6-21)开发者大会更新

总体设计

概述

方舟字节码(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语言规范
  • 本文仅适用于版本号为11.0.2.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 foo(): 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)相关的指令进行访问。

示例代码:

function foo(): 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

注意:

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

示例代码:

import { a, b } from "./module_foo"
import * as c from "./module_bar"

export let d: number = 3;

a + b + d;

字节码中的相关指令:

.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
    ...
}

指令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相关指令。

示例代码:

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中。

补丁变量

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

示例代码:

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

function foo(): 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 foo(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位寄存器索引
操作码格式助记符/语法参数说明
0x00NONEldundefinedundefined加载进acc。
0x01NONEldnullnull加载进acc。
0x02NONEldtruetrue加载进acc。
0x03NONEldfalsefalse加载进acc。
0x04NONEcreateemptyobject创建一个空对象,并将其存放到acc中。
0x05IMM8createemptyarray RRR:方舟运行时内部使用的8位保留数字创建一个空数组,并将其存放到acc中。
0x06IMM8_ID16createarraywithbuffer RR, @AAAA

R:方舟运行时内部使用的8位保留数字

A:16位的literal id

使用索引A对应的字面量数组,创建一个数组对象,并将其存放到acc中。
0x07IMM8_ID16createobjectwithbuffer RR, @AAAA

R:方舟运行时内部使用的8位保留数字

A:16位的literal id

使用索引A对应的字面量数组,创建一个对象,并将其存放到acc中。
0x08IMM8_IMM8_V8newobjrange RR, +AA, vBB

R:方舟运行时内部使用的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 | acc,并将计算结果存放到acc中。
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, vBB

R:方舟运行时内部使用的8位保留数字

A:参数数量

B, ..., B + A - 1:参数

以B, ..., B + A - 1作为参数, 调用super函数,并将结果存放到acc中。

当A的值是0时,B是undefined

此指令仅出现在非箭头函数中。

0x33IMM8_ID16_IMM8definefunc RR, @AAAA, +BB

R:方舟运行时内部使用的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]]](https://262.ecma-international.org/12.0/#sec-ecmascript-function-objects)属性,并将该函数对象存放到acc中。
0x35IMM8_ID16_ID16_IMM16_V8defineclasswithbuffer RR, @AAAA, @BBBB, +CCCC, vDD

R:方舟运行时内部使用的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, +B

A:词法环境层级

B:槽位号

将A个层次外的词法环境的B号槽位上的值存放到acc中。
0x3dIMM4_IMM4stlexvar +A, +B

默认入参:acc:值

A:词法环境层级

B:槽位号

将acc中的值存放到A个层次外的词法环境的B号槽位上。
0x3eID16lda.str @AAAAA:string id将索引A对应的字符串存放到acc中。
0x3fIMM8_ID16tryldglobalbyname RR, @AAAA

R:方舟运行时内部使用的8位保留数字

A:string id

将名称为索引A对应的字符串的全局变量存放进acc中,不存在名称为A的全局变量时,抛出异常。
0x40IMM8_ID16trystglobalbyname RR, @AAAA

默认入参:acc:值

R:方舟运行时内部使用的8位保留数字

A:string id

将acc中的值存放到名称为索引A对应的字符串的全局变量上,不存在名称为A的全局变量时,抛出异常。
0x41IMM16_ID16ldglobalvar RRRR, @AAAA

R:方舟运行时内部使用的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, @AAAA

R:方舟运行时内部使用的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, vAA

R:方舟运行时内部使用的8位保留数字

A:对象

以类型为 iteratorRecord的A作为参数,执行IteratorClose,并将结果存放到acc中。
0x69NONEpoplexenv跳出当前的词法环境,进入外面一层词法环境。
0x6aNONEldnannan存放到acc中。
0x6bNONEldinfinityinfinity存放到acc中。
0x6cNONEgetunmappedargs将当前函数的arguments存放到acc中。
0x6dNONEldglobalglobal对象存放到acc中。
0x6eNONEldnewtarget

将当前函数的隐式参数NewTarget存放到acc中。

指令功能未使能,暂不可用。

0x6fNONEldthis将this存放到acc中。
0x70NONEldholehole存放到acc中。
0x71IMM8_ID16_IMM8createregexpwithliteral RR, @AAAA, +BB

R:方舟运行时内部使用的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, +BB

R:方舟运行时内部使用的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, +BB

R:方舟运行时内部使用的16位保留数字

A:method id

B:方法A的形参数量

创建方法A的函数对象,并将其存放到acc中。
0x75IMM16_ID16_ID16_IMM16_V8defineclasswithbuffer RRRR, @AAAA, @BBBB, +CCCC, vDD

R:方舟运行时内部使用的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, @AAAA

R:方舟运行时内部使用的16位保留数字

A:literal id

使用索引A对应的字面量数组,创建一个数组对象, 并将其存放到acc中。
0x82IMM16_ID16createobjectwithbuffer RRRR, @AAAA

R:方舟运行时内部使用的16位保留数字

A:literal id

使用索引A对应的字面量数组,创建一个对象, 并将其存放到acc中。
0x83IMM16_IMM8_V8newobjrange RRRR, +AA, vBB

R:方舟运行时内部使用的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, +BB

A:词法环境层级

B:槽位号

将A个层次外的词法环境的B号槽位上的值存放到acc中。
0x8bIMM8_IMM8stlexvar +AA, +BB

默认入参:acc:值

A:词法环境层级

B:槽位号

将acc中的值存放到A个层次外的词法环境的B号槽位上。
0x8cIMM16_ID16tryldglobalbyname RRRR, @AAAA

R:方舟运行时内部使用的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, @AAAA

R:方舟运行时内部使用的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:生成器

使用 genaratorA和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, vAA

R:方舟运行时内部使用的16位保留数字

A:对象

以类型为 iteratorRecord的A作为参数,执行IteratorClose,并将结果存放到acc中。
0xadNONEldsymbol加载Symbol对象到acc中。
0xaeNONEasyncfunctionenter创建一个异步函数对象,并将这个对象存放到acc中。
0xafNONEldfunction将当前的函数对象加载到acc中。
0xb0NONEdebugger调试时用于暂停执行。
0xb1V8creategeneratorobj vAAA:函数对象使用函数对象A,创建一个generator,并将其存放到acc中。
0xb2V8_V8createiterresultobj vAA, vBB

A:对象

B:布尔值

以 value A和 done B作为参数,执行CreateIterResultObject,并将结果存放到acc中。
0xb3IMM8_V8_V8createobjectwithexcludedkeys +AA, vBB, vCC

A:范围寄存器数量

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, @BBBB

A:词法环境中的槽位数量

B:literal id

使用索引B对应的字面量数组中所存放的词法变量名称,创建一个具有A个槽位的词法环境,将这个词法环境存放到acc中,并进入该词法环境。
0xb7V8createasyncgeneratorobj vAAA:函数对象基于函数对象A,创建一个异步的genarator,并将其存放到acc中。
0xb8V8_V8_V8asyncgeneratorresolve vAA, vBB, vCC

A:生成器

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]]](https://262.ecma-international.org/12.0/#sec-ecmascript-function-objects)属性,并将该函数对象存放到acc中。
0xbfNONEresumegenerator默认入参:acc:生成器基于acc中存放的genarator,执行GeneratorResume,并将结果存放到acc中。
0xc0NONEgetresumemode默认入参:acc:生成器获取acc中所存放的genarator的执行完成后恢复值的类型,并将其存放到acc中。
0xc1IMM16gettemplateobject RRRR

默认入参:acc:对象

R:方舟运行时内部使用的16位保留数字

执行GetTemplateObject(acc),并将结果存放到acc中。
0xc2V8delobjprop vAA

默认入参:acc:属性键值

A:对象

删除对象A的键值为acc的属性。
0xc3V8suspendgenerator vAA

默认入参:acc:值

A:生成器

使用acc中所存放的值,挂起genarator 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中存放的genarator的状态设置为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, vCC

A:词法环境层级

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中的值存放到其中。
0xfbPREF_NONEcallruntime.notifyconcurrentresult默认入参:acc:并发函数的返回值

将并发函数的返回值通知运行时。

此指令仅出现在并发函数中。

0xfc(deprecated)(弃用的操作码)
0xfdPREF_IMM16_V8_V8wide.createobjectwithexcludedkeys +AAAA, vBB, vCC

A:范围寄存器数量

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, vBB

A:参数数量

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, @BBBB

A:词法环境中的槽位数量

B:literal id

使用索引B对应的字面量数组中所存放的词法变量名称,创建一个具有A个槽位的词法环境,将这个词法环境存放到acc中,并进入该词法环境。
0x03fePREF_NONEthrow.deletesuperproperty抛出异常:删除父类的属性。
0x04fbPREF_IMM_16_ID16callruntime.createprivateproperty +AAAA, @BBBB

A:要创建的符号数量

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, vAA

acc:函数对象

R:方舟运行时内部使用的8位保留数字

A:对象

将this的值设置为A,不传递参数,调用acc中存放的函数对象,并将结果存放到acc中。
0x06fc(deprecated)(弃用的操作码)
0x06fdPREF_IMM16_V8wide.supercallthisrange +AAAA, vBB

A:参数数量

B, ..., B + A - 1:参数

以B, ..., B + A - 1作为参数, 调用super函数,并将结果存放到acc中。

当A的值是0时,B是undefined

此指令仅出现在非箭头函数中。

0x06fePREF_V8_V8throw.undefinedifhole vAA, vBB

A:对象

B:对象名称

如果A的值是hole,则抛出异常:B的值是undefined
0x07fbPREF_IMM16_ID16_ID16_IMM16_V8callruntime.definesendableclass RRRR, @AAAA, @BBBB, +CCCC, vDD

R:方舟运行时内部使用的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没有被正确调用,抛出错误。
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
0x0afc(deprecated)(弃用的操作码)
0x0afdPREF_V8_IMM32wide.stownbyindex vAA, +BBBBBBBB

默认入参:acc:值

A:对象

B:属性键值

将acc中的值存放到对象A的键值为B的属性上。
0x0bfc(deprecated)(弃用的操作码)
0x0bfdPREF_IMM16wide.copyrestargs +AAAAA:形参列表中剩余参数起始的位次复制剩余参数,并将复制出的参数数组副本存放到acc中。
0x0cfc(deprecated)(弃用的操作码)
0x0cfdPREF_IMM16_IMM16wide.ldlexvar +AAAA, +BBBB

A:词法环境层级

B:槽位号

将A个层次外的词法环境的B号槽位上的值存放到acc中。
0x0dfc(deprecated)(弃用的操作码)
0x0dfdPREF_IMM16_IMM16wide.stlexvar +AAAA, +BBBB

默认入参:acc:值

A:词法环境层级

B:槽位号

将acc中的值存放到A个层次外的词法环境的B号槽位上。
0x0efc(deprecated)(弃用的操作码)
0x0efdPREF_IMM16wide.getmodulenamespace +AAAAA:模块索引对第A个模块,执行GetModuleNamespace,并将结果存放到acc中。
0x0ffc(deprecated)(弃用的操作码)
0x0ffdPREF_IMM16wide.stmodulevar +AAAA

默认入参:acc:值

A:槽位号

将acc中的值存放到槽位号为A的模块变量中。
0x10fc(deprecated)(弃用的操作码)
0x10fdPREF_IMM16wide.ldlocalmodulevar +AAAAA:槽位号将槽位号为A的局部模块变量存放到acc中。
0x11fc(deprecated)(弃用的操作码)
0x11fdPREF_IMM16wide.ldexternalmodulevar +AAAAA:槽位号将槽位号为A的外部模块变量存放到acc中。
0x12fc(deprecated)(弃用的操作码)
0x12fdPREF_IMM16wide.ldpatchvar +AAAAA:补丁变量槽位号

将槽位号为A的补丁变量加载到acc中。

此指令仅出现在补丁模式编译场景下。

0x13fc(deprecated)(弃用的操作码)
0x13fdPREF_IMM16wide.stpatchvar +AAAA

默认入参:acc:值

A:补丁变量槽位号

将acc中的值存放进槽位号为A的补丁变量中。

此指令仅出现在补丁模式编译场景下。

0x14fc

0x15fc

...

0x2efc

(deprecated)(弃用的操作码)
  • 31
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值