From f088858cf4af27230aee727b743b846d8bafc6d4 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Sun, 13 Sep 2026 17:07:51 +0000 Subject: [PATCH] =?UTF-8?q?emit/vm:=20=E5=8F=AF=E5=88=A0=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=86=85=E7=BD=AE=E9=9B=86=E6=92=A4=20globalThis=20=E4=B8=8E?= =?UTF-8?q?=20TypedArray=20=E4=B8=A4=E5=90=8D=E2=80=94=E2=80=94=E7=8E=B0?= =?UTF-8?q?=E8=A1=8C=E8=A7=84=E8=8C=83=20globalThis=20=E4=B8=BA=20c:true?= =?UTF-8?q?=20=E5=8F=AF=E5=88=A0=EF=BC=88=E7=9C=9F=E5=88=A0=E6=B8=85?= =?UTF-8?q?=E6=A7=BD=EF=BC=89=E3=80=81%TypedArray%=20=E6=97=A0=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=90=8D=EF=BC=88=E5=88=A0=E4=B8=8D=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E8=BF=94=20true=EF=BC=89=EF=BC=8C=E5=AE=BF?= =?UTF-8?q?=E4=B8=BB=E5=90=8D=E6=8E=92=E9=99=A4=E9=9D=A2=E6=94=B6=E7=AA=84?= =?UTF-8?q?=E8=87=B3=20$262=EF=BC=8Cdelete=20=E5=AD=90=E9=9B=86=20A/B=20?= =?UTF-8?q?=E9=80=90=E6=96=87=E4=BB=B6=E9=9B=B6=E7=BF=BB=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_emit/src/emit.rs | 14 +++++++------- crates/oxide_emit/src/expr/operator/mod.rs | 2 +- .../oxide_vm/tests/global_builtin_delete_tests.rs | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/crates/oxide_emit/src/emit.rs b/crates/oxide_emit/src/emit.rs index af5ae036..a3ec2aad 100644 --- a/crates/oxide_emit/src/emit.rs +++ b/crates/oxide_emit/src/emit.rs @@ -707,12 +707,12 @@ impl CompileCtx { BUILTIN_GLOBALS.contains(&name) && !NON_WRITABLE_GLOBAL_BUILTINS.contains(&name) } - /// 可删除全局内置名:可写全局名再除 globalThis(规范 configurable:false, - /// 不可删)与两个宿主名($262/TypedArray,非规范全局,删除会破坏宿主面)—— - /// 自只读/可写单一真源派生,不另立名单。余名描述符皆 - /// {writable:true, configurable:true},delete 真删且返 true。 + /// 可删除全局内置名:可写全局名再除宿主名 $262(harness 全局 + /// {configurable:false},删除会破坏宿主面)——自只读/可写单一真源派生, + /// 不另立名单。余名描述符皆 {writable:true, configurable:true},delete + /// 真删且返 true。 pub(crate) fn is_deletable_global_builtin(name: &str) -> bool { - Self::is_writable_builtin_global(name) && !matches!(name, "globalThis" | "$262" | "TypedArray") + Self::is_writable_builtin_global(name) && name != "$262" } /// delete 标识符是否解析到可删除的全局内置镜像槽:名可删(上谓词)且预注册 @@ -1865,7 +1865,7 @@ mod tests { } /// 漂移守卫:可删名集自可写划分派生(可删 ⊆ 可写、只读三常量不入可删), - /// 且 globalThis/宿主名恒不可删——防派生口径改动时 delete 面单边漂移。 + /// 且宿主名 $262 恒不可删——防派生口径改动时 delete 面单边漂移。 #[test] fn deletable_global_builtins_derive_from_writable_partition() { for name in BUILTIN_GLOBALS { @@ -1876,7 +1876,7 @@ mod tests { assert!(!deletable, "只读三常量名误入可删集:{name}"); } } - for name in ["globalThis", "$262", "TypedArray"] { + for name in ["$262"] { assert!(!crate::CompileCtx::is_deletable_global_builtin(name), "不可删名误入可删集:{name}"); } } diff --git a/crates/oxide_emit/src/expr/operator/mod.rs b/crates/oxide_emit/src/expr/operator/mod.rs index 4cbf3318..8f03135a 100644 --- a/crates/oxide_emit/src/expr/operator/mod.rs +++ b/crates/oxide_emit/src/expr/operator/mod.rs @@ -130,7 +130,7 @@ impl Emitter { ctx.labels.set_label_pos(end_label, ctx.insts.len()); return Ok(result_reg); } - // 可删全局内置(可写全局名除 globalThis 与宿主名):运行期真删 + // 可删全局内置(可写全局名除宿主名 $262):运行期真删 // 全局对象属性(c:true 数据描述符)并返 true;删除成功时清镜像 // 槽,裸读与 globalThis 反射不失步。 if let Some(slot_reg) = ctx.global_builtin_delete_slot(name) { diff --git a/crates/oxide_vm/tests/global_builtin_delete_tests.rs b/crates/oxide_vm/tests/global_builtin_delete_tests.rs index 34178421..b1f5c3e0 100644 --- a/crates/oxide_vm/tests/global_builtin_delete_tests.rs +++ b/crates/oxide_vm/tests/global_builtin_delete_tests.rs @@ -1,10 +1,10 @@ //! delete 全局内置标识符(DELETE_GLOBAL_PROP_C)回归测试。 //! -//! 可删全局内置(可写全局名除 globalThis 与宿主名,描述符 +//! 可删全局内置(可写全局名除宿主名 $262,描述符 //! {writable:true, configurable:true})的 delete 标识符运行期真删全局对象属性 //! 并返 true,删除成功时清镜像槽(裸读与 globalThis 反射不失步)。覆盖:删除返 -//! 值、属性真删、镜像槽清、删后重写、重复删、三常量 c:false 拒绝、globalThis 拒 -//! 绝、成员形不受影响、参数遮蔽不命中。 +//! 值、属性真删、镜像槽清、删后重写、重复删、三常量 c:false 拒绝、globalThis 真 +//! 删、成员形不受影响、参数遮蔽不命中。 use std::sync::Arc; @@ -72,12 +72,12 @@ fn delete_three_constants_refused_property_kept() { ); } -// ── globalThis c:false:拒绝且属性保留 ── +// ── globalThis c:true:真删且返 true,镜像槽清 ── #[test] -fn delete_global_this_refused_property_kept() { +fn delete_global_this_returns_true_and_property_removed() { eval_truthy( - "delete globalThis === false \ - && Object.getOwnPropertyDescriptor(globalThis, 'globalThis') !== undefined", + "var g = globalThis; var d = delete globalThis; \ + d === true && g.globalThis === undefined && globalThis === undefined", ); }