mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-26 03:31:12 +08:00
feat: 类体计算键访问器落地动态定义访问器指令
This commit is contained in:
@@ -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]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user