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 闭合)

This commit is contained in:
2026-09-14 03:04:03 +00:00
parent 3acac721b0
commit 0c750fa74c
20 changed files with 398 additions and 129 deletions
@@ -24,7 +24,7 @@ impl Emitter {
let ObjectPropertyKind::ObjectProperty(p) = prop else {
unreachable!("批量前缀必为 ObjectProperty");
};
let name = self.class_property_name(&p.key).expect("批量前缀键为静态名");
let name = crate::shared::string_pool::pool_key_property(&p.key).expect("批量前缀键为静态名");
u32::from(ctx.add_constant(Constant::String(name)))
})
.collect();
@@ -141,7 +141,8 @@ impl Emitter {
));
}
None => {
let idx = ctx.add_constant(Constant::String(prop_name.to_string()));
let key = crate::shared::string_pool::pool_key_property(&p.key)?;
let idx = ctx.add_constant(Constant::String(key));
ctx.inst(Inst::define_accessor(
Operand::Reg(obj_reg),
Operand::Reg(get_reg),
@@ -155,7 +156,8 @@ impl Emitter {
let key_reg = if computed {
self.emit_expression(p.key.to_expression(), ctx)?
} else {
let idx = ctx.add_constant(Constant::String(prop_name.to_string()));
let key = crate::shared::string_pool::pool_key_property(&p.key)?;
let idx = ctx.add_constant(Constant::String(key));
let reg = ctx.alloc_reg();
ctx.inst(Inst::load_const(Operand::Reg(reg), idx));
reg