Files
OxideJS-New/crates/oxide_emit/src/shared/string_pool.rs
T
pjh123 0c750fa74c emit/kernel/vm/builtins: 常量池键编码 + 键物化真实串值面 + 16 回归钉——emit 侧字面量/键/模板统一改存无标志键编码:lone_surrogates 字面量与模板 cooked 按 oxc marker 解码还原真单元序列(FFFD+hex4≠fffd→surrogate 单元、FFFD+fffd→FFFD、FFFD+非 hex 防御臂),无标志串 encode_key(encode_utf16()) 入池(BMP 无 FFFD 键恒等 = 现值,池条目零漂移),string_pool 集中收口 9 处入池点;interner string_ptr 由单元物化(含孤立→FlatU16、良形→Flat);键物化面改真实 JS 串值(key_si_to_js_value 经 decode_key,Object.keys/ownKeys/entries/Reflect.ownKeys/json reviver 键同源;整数键反解数字串);批内修复三处子集 A/B 差分撞出回归:replace $n 展开按 spec GetSubstitution 重写(digitCount 2/1、越界回退 1 位、越界含 $0 原文输出,node 13 用例对照钉住)、String 构造器 Symbol 路径按 new.target 分流(String(sym)→描述串、new String(sym)→TypeError,恢复 to_string_for_string_constructor)、padStart/padEnd 未给 fill 时按单空格补(原 lossy 串取 'un' 杂质,pre-existing 一并归零);迭代器 dispose 钉改回真值断言(String(Symbol.dispose) 现合法返回描述串);property-escapes 613/0/0(B167 基线 582/31/0,31 归零)、String 子集 963/250/10 vs BASE 949/264/10(14 修 0 回归)、for-of +1(string-astral-truncated)、五 crate 113 套件 2680/0、clippy/fmt 零新增(JSON 面与全量 test262 收尾在 131.2 后续 commit 闭合)
2026-09-14 03:04:23 +00:00

40 lines
1.9 KiB
Rust

//! 常量池字符串键编码:池统一存无标志键编码(`oxide_kernel::string_forge::encode_key`
//! 语义),物化侧(perm_string → `decode_key`)是其精确逆变换。
//!
//! 两类来源文本:
//! - oxc marker 文本(`StringLiteral.value` / `TemplateElement.cooked`):
//! `lone_surrogates` 置位时 marker 与键编码同构(FFFD+hex4 = 孤立 surrogate 单元、
//! FFFD+fffd = 真实 FFFD),原样即池键;未置位时为普通文本(可含裸 FFFD),
//! 须逃逸编码防裸 FFFD 与 surrogate marker 碰撞;
//! - 普通文本(标识符 / 数字 / 源文本):非 FFFD 恒等,真实 FFFD 逃逸为 FFFD+"fffd"。
use oxide_kernel::string_forge::encode_key;
use oxide_parser::PropertyKey;
/// 普通文本 → 池键:真实 FFFD 逃逸为 FFFD+"fffd",其余逐单元恒等。
pub(crate) fn pool_key_plain(text: &str) -> String {
let units: Vec<u16> = text.encode_utf16().collect();
encode_key(&units)
}
/// oxc marker 文本 → 池键,按 `lone_surrogates` 分派(语义见模块头注释)。
pub(crate) fn pool_key_marker(text: &str, lone_surrogates: bool) -> String {
if lone_surrogates {
text.to_string()
} else {
pool_key_plain(text)
}
}
/// 属性键 → 池键:字符串字面量键经 marker 解码,标识符 / 数字键走普通编码。
pub(crate) fn pool_key_property(key: &PropertyKey) -> Result<String, String> {
match key {
PropertyKey::StaticIdentifier(ident) => Ok(pool_key_plain(ident.name.as_str())),
PropertyKey::Identifier(ident) => Ok(pool_key_plain(ident.name.as_str())),
PropertyKey::StringLiteral(s) => Ok(pool_key_marker(&s.value, s.lone_surrogates)),
PropertyKey::NumericLiteral(n) => Ok(pool_key_plain(&n.value.to_string())),
PropertyKey::PrivateIdentifier(_) => Err("private class elements not yet supported".into()),
_ => Err("unsupported class property key type".into()),
}
}