fix: 顶层 var 读写直连全局对象属性单一真值——GDI 序言 + 声明处同步删除,类原型 session 直分防晋升克隆 identity 分裂,自增减 int 保持

This commit is contained in:
2026-09-12 15:48:32 +00:00
parent 4b807b5b90
commit 44c16cab8a
21 changed files with 447 additions and 74 deletions
+8 -3
View File
@@ -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);
+19
View File
@@ -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])