mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
emit/vm: 可删全局内置集撤 globalThis 与 TypedArray 两名——现行规范 globalThis 为 c:true 可删(真删清槽)、%TypedArray% 无全局名(删不存在属性返 true),宿主名排除面收窄至 $262,delete 子集 A/B 逐文件零翻转
This commit is contained in:
@@ -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}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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",
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user