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
+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]);