types/vm/runner: JsString 布局补 size_of/offset_of 编译期锚(实测 32B、utf16_len@24,tag 并入载荷首字无独立索引字),eval fn-decl 抛后描述符改显式值读钉住,non-definable-global-var 复测全绿撤 skip 条目

This commit is contained in:
2026-09-13 12:26:24 +00:00
parent c80944d375
commit c7a9b273fa
3 changed files with 19 additions and 9 deletions
-1
View File
@@ -490,7 +490,6 @@ fn eval_family_excluded(path: &str) -> Option<&'static str> {
let is_direct = path.contains("eval-code/direct/");
let common = [
"declare-arguments", // 直接 eval 的 arguments 语义族(档 3)
"non-definable-global-var", // CanDeclareGlobalVar(var 面)c:false 语义与全局描述符面裁决绑定
"this-value-func", // 调用者 this 传递(档 3)
"new.target", // new.target 语义(档 3)
"strict-caller", // 严格调用者传播(档 3)
+11 -1
View File
@@ -25,6 +25,7 @@ use std::sync::OnceLock;
/// `Cons` 首字为 tag(0xffff_ffff_ffff_ffff)@0、子节点指针@8;`utf16_len`
/// 两形态统一 @24(4B),尾部 4B 填充。`String` 原样存储(零 realloc 收缩);
/// Cons 专属状态(子节点/产物缓存)独立分配在 [`ConsNode`],仅大链持有。
/// 尺寸锚见下方 size_of/offset_of 断言。
///
/// 生命周期约定:
/// - `Cons` 子节点各自独立登记 session 字符串表(或为 perm 串),由 GC 的
@@ -42,6 +43,14 @@ pub struct JsString {
utf16_len: AtomicU32,
}
// 布局锚:32B = 载荷 24B(Flat 内联 String / Cons tag+子指针)+ utf16_len 4B
// + 尾部填充 4B。tag 并入载荷首字(Cons 以 0xffff.. marker 占位),无独立索引字——
// 换变体形状/字段类型可能改变该折叠,布局变更先同步结构体头注释再改本断言。
const _: () = assert!(
std::mem::size_of::<JsString>() == 32 && std::mem::offset_of!(JsString, utf16_len) == 24,
"JsString 布局漂移:锚定布局见结构体头注释(32B,utf16_len@24)"
);
/// 字符串内容变体。
#[derive(Debug)]
enum StringKind {
@@ -52,7 +61,8 @@ enum StringKind {
/// Cons(rope)节点的载荷:左右子节点指针 + O(1) 拼接字节长 + 扁平化产物缓存。
///
/// 独立于 `JsString` 分配,使 Flat 路径的 `JsString` 保持与 rope 前相同的 32B
/// 结构;仅超过字节阈值的拼接(`Vm::new_cons_string`)才创建本节点。
/// 结构(tag 并入载荷首字,见其尺寸断言);仅超过字节阈值的拼接
/// (`Vm::new_cons_string`)才创建本节点。
///
/// 生命周期约定:节点由 `Box::into_raw` 分配,只经 [`JsString::drop_cons_node`]
/// 释放(连带扁平化产物);`left`/`right` 由 GC 传播闭包保证随父存活。
@@ -205,11 +205,12 @@ fn eval_fn_decl_with_function_no_partial_binding_creation() {
#[test]
fn eval_fn_decl_a_side_value_and_descriptor_preserved() {
// 抛后 A 侧保留:Infinity 仍为原常量(自相等),描述符不可写位不变。
// 抛后 A 侧保留:Infinity 属性值仍为原常量(显式值读),描述符不可写位不变。
let s = eval_str(
"try { eval('function Infinity(){}'); } catch (e) {} \
(Infinity === Infinity) + ':' + \
(Object.getOwnPropertyDescriptor(globalThis, 'Infinity').writable === false ? 'w-false' : 'w-true')",
var d = Object.getOwnPropertyDescriptor(globalThis, 'Infinity'); \
(d.value === Infinity) + ':' + \
(d.writable === false ? 'w-false' : 'w-true')",
);
assert_eq!(s, "true:w-false");
}