mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-24 18:51:13 +08:00
fix: 顶层 var 读写直连全局对象属性单一真值——GDI 序言 + 声明处同步删除,类原型 session 直分防晋升克隆 identity 分裂,自增减 int 保持
This commit is contained in:
@@ -737,10 +737,15 @@ mod tests {
|
||||
assert_contract(OpCode::SET_PROP_BATCH, None, &[1, 2, 3], false);
|
||||
assert_contract(OpCode::IC_SET_PROP, None, &[1, 2, 3], false);
|
||||
assert_contract(OpCode::SET_ELEM, None, &[1, 2, 3], false);
|
||||
assert_group(&[OpCode::NEW_OBJECT, OpCode::NEW_ARRAY], Some(1), &[], true);
|
||||
assert_group(&[OpCode::NEW_OBJECT, OpCode::NEW_SESSION_OBJECT, OpCode::NEW_ARRAY], Some(1), &[], true);
|
||||
// define 语义属性写入 / arguments / rest
|
||||
assert_group(&[OpCode::DEFINE_PROP, OpCode::DEFINE_GLOBAL_PROP], None, &[1, 2, 3], false);
|
||||
assert_contract(OpCode::DEFINE_GLOBAL_PROP_C, None, &[2], false);
|
||||
assert_group(
|
||||
&[OpCode::DEFINE_PROP, OpCode::DEFINE_GLOBAL_PROP, OpCode::DEFINE_GLOBAL_PROP_IF_ABSENT],
|
||||
None,
|
||||
&[1, 2, 3],
|
||||
false,
|
||||
);
|
||||
assert_group(&[OpCode::DEFINE_GLOBAL_PROP_C, OpCode::DEFINE_GLOBAL_PROP_C_IF_ABSENT], None, &[2], false);
|
||||
assert_contract(OpCode::DEFINE_PROP_ATTRS, None, &[1, 2, 3], false);
|
||||
assert_contract(OpCode::DEFINE_ACCESSOR_ATTRS, None, &[1, 2, 3], false);
|
||||
assert_group(&[OpCode::CREATE_ARGUMENTS, OpCode::CREATE_REST_ARRAY], Some(1), &[], false);
|
||||
|
||||
@@ -236,6 +236,25 @@ impl Inst {
|
||||
Self::with_ext(OpCode::DEFINE_GLOBAL_PROP_C, Operand::None, value, Operand::None, &[key_idx as u32])
|
||||
}
|
||||
|
||||
/// 顶层 var 声明的全局属性 define-if-absent:target 为全局对象,value/key 为寄存器。
|
||||
/// 既有属性零动作;缺失新建可写/可枚举/不可配置(脚本 GDI 序言,CreateGlobalVarBinding
|
||||
/// 对既有数据描述符零修改)。
|
||||
pub fn define_global_prop_if_absent(target: Operand, value: Operand, key: Operand) -> Self {
|
||||
Self::new(OpCode::DEFINE_GLOBAL_PROP_IF_ABSENT, target, value, key)
|
||||
}
|
||||
|
||||
/// eval 脚本顶层 var 声明的全局属性 define-if-absent:ext = [key_idx](键常量池
|
||||
/// 下标),value 放 a 槽。既有属性零动作;缺失新建可写/可枚举/可配置。
|
||||
pub fn define_global_prop_c_if_absent(value: Operand, key_idx: u16) -> Self {
|
||||
Self::with_ext(
|
||||
OpCode::DEFINE_GLOBAL_PROP_C_IF_ABSENT,
|
||||
Operand::None,
|
||||
value,
|
||||
Operand::None,
|
||||
&[key_idx as u32],
|
||||
)
|
||||
}
|
||||
|
||||
/// 静态删除属性:obj 同时放 rd/a 槽,const_idx 为属性名常量下标。
|
||||
pub fn delete_prop_static(obj: Operand, const_idx: u32) -> Self {
|
||||
Self::with_ext(OpCode::DELETE_PROP_STATIC, obj, obj, Operand::None, &[const_idx])
|
||||
|
||||
Reference in New Issue
Block a user