feat: 类体计算键访问器落地动态定义访问器指令

This commit is contained in:
2026-09-24 09:16:08 +00:00
parent 821e24cd0b
commit 70e03c6a62
12 changed files with 193 additions and 21 deletions
+6
View File
@@ -206,6 +206,12 @@ impl Inst {
pub fn define_accessor_attrs(home: Operand, get: Operand, set: Operand, key_idx: u32, attrs: u32) -> Self {
Self::with_ext(OpCode::DEFINE_ACCESSOR_ATTRS, home, get, set, &[key_idx, attrs])
}
/// 定义计算键访问器属性并指定描述符:ext = [key 寄存器(高位标记 `0x8000_0000 | key_reg`),
/// attrs](attrs 位同 DEFINE_PROP_ATTRS),键值运行期从寄存器读取。
pub fn define_accessor_attrs_dynamic(home: Operand, get: Operand, set: Operand, key_reg: u32, attrs: u32) -> Self {
Self::with_ext(OpCode::DEFINE_ACCESSOR_ATTRS_DYNAMIC, home, get, set, &[0x8000_0000 | key_reg, attrs])
}
/// 定义访问器属性(运行时计算键):home 为宿主对象,get/set 为访问器函数寄存器,
/// key_reg 为键值寄存器(编码进 ext[0],高位标记 `0x8000_0000 | key_reg`)。
pub fn define_accessor_dynamic(home: Operand, get: Operand, set: Operand, key_reg: u32) -> Self {
+4
View File
@@ -415,6 +415,9 @@ fn canonical_inst(op: OpCode) -> Inst {
OpCode::DEFINE_ACCESSOR_DYNAMIC => {
Inst::define_accessor_dynamic(Operand::Reg(1), Operand::Reg(2), Operand::Reg(3), 7)
}
OpCode::DEFINE_ACCESSOR_ATTRS_DYNAMIC => {
Inst::define_accessor_attrs_dynamic(Operand::Reg(1), Operand::Reg(2), Operand::Reg(3), 7, 0b101)
}
OpCode::DELETE_PROP_STATIC => Inst::delete_prop_static(Operand::Reg(1), 9),
_ => Inst::new(op, Operand::Reg(1), Operand::Reg(2), Operand::Reg(3)),
}
@@ -598,6 +601,7 @@ fn opcode_semantics_golden_table() {
assert_contract(OpCode::SET_HOME_OBJECT, None, &[1, 2], false);
assert_contract(OpCode::DEFINE_ACCESSOR, None, &[1, 2, 3], false);
assert_contract(OpCode::DEFINE_ACCESSOR_DYNAMIC, None, &[1, 2, 3, 7], false);
assert_contract(OpCode::DEFINE_ACCESSOR_ATTRS_DYNAMIC, None, &[1, 2, 3, 7], false);
// Object Property:GET_PROP 写 a 槽、DYNAMIC 写 b 槽
assert_contract(OpCode::GET_PROP, Some(2), &[1, 3], false);
assert_contract(OpCode::GET_PROP_DYNAMIC, Some(3), &[1, 2], false);
@@ -79,6 +79,14 @@ fn single_ext_word_instructions() {
assert_eq!(dyn_accessor.a, Operand::Reg(1));
assert_eq!(dyn_accessor.b, Operand::Reg(2));
// 计算键访问器带描述符:ext = [key 寄存器高位标记, attrs] 两字。
let attrs_dyn = Inst::define_accessor_attrs_dynamic(Operand::Reg(0), Operand::Reg(1), Operand::Reg(2), 7, 0b101);
assert_eq!(attrs_dyn.op, OpCode::DEFINE_ACCESSOR_ATTRS_DYNAMIC);
assert_eq!(attrs_dyn.ext.as_slice(), &[0x8000_0000 | 7, 0b101]);
assert_eq!(attrs_dyn.rd, Operand::Reg(0));
assert_eq!(attrs_dyn.a, Operand::Reg(1));
assert_eq!(attrs_dyn.b, Operand::Reg(2));
let rest = Inst::rest_object(Operand::Reg(0), Operand::Reg(1), 7, None);
assert_eq!(rest.ext.as_slice(), &[7]);