feat: 捕获 cell 换键——类合成 cell 切计数器分配,类名与函数声明改可见绑定索引

This commit is contained in:
2026-10-05 17:05:08 +00:00
parent 1144b07534
commit 6cb7964764
4 changed files with 29 additions and 28 deletions
Generated
+18 -18
View File
@@ -1095,7 +1095,7 @@ dependencies = [
[[package]]
name = "oxide_builtins"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"chrono",
"fast-float",
@@ -1120,7 +1120,7 @@ dependencies = [
[[package]]
name = "oxide_bytecode"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"num-bigint",
"oxide_log",
@@ -1128,7 +1128,7 @@ dependencies = [
[[package]]
name = "oxide_cfg"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"oxide_bytecode",
"oxide_emit",
@@ -1139,7 +1139,7 @@ dependencies = [
[[package]]
name = "oxide_cli"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"ansi_term",
"bumpalo",
@@ -1159,7 +1159,7 @@ dependencies = [
[[package]]
name = "oxide_code_cache"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"lru",
"oxide_bytecode",
@@ -1168,7 +1168,7 @@ dependencies = [
[[package]]
name = "oxide_compiler"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"oxide_bytecode",
"oxide_cfg",
@@ -1187,7 +1187,7 @@ dependencies = [
[[package]]
name = "oxide_dce"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"oxide_bytecode",
"oxide_cfg",
@@ -1201,7 +1201,7 @@ dependencies = [
[[package]]
name = "oxide_emit"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"num-bigint",
"oxc_allocator",
@@ -1216,7 +1216,7 @@ dependencies = [
[[package]]
name = "oxide_ir"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"oxide_bytecode",
"oxide_log",
@@ -1225,7 +1225,7 @@ dependencies = [
[[package]]
name = "oxide_kernel"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"bumpalo",
"dashmap",
@@ -1240,7 +1240,7 @@ dependencies = [
[[package]]
name = "oxide_liveness"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"oxide_bytecode",
"oxide_cfg",
@@ -1252,7 +1252,7 @@ dependencies = [
[[package]]
name = "oxide_log"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"tracing",
"tracing-appender",
@@ -1261,7 +1261,7 @@ dependencies = [
[[package]]
name = "oxide_parser"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"oxc_allocator",
"oxc_ast",
@@ -1276,7 +1276,7 @@ dependencies = [
[[package]]
name = "oxide_regalloc"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"oxide_bytecode",
"oxide_cfg",
@@ -1292,7 +1292,7 @@ dependencies = [
[[package]]
name = "oxide_runtime_api"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"num-bigint",
"num-traits",
@@ -1304,7 +1304,7 @@ dependencies = [
[[package]]
name = "oxide_test262"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"oxide_bytecode",
"oxide_compiler",
@@ -1321,7 +1321,7 @@ dependencies = [
[[package]]
name = "oxide_types"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"bumpalo",
"hashbrown 0.14.5",
@@ -1333,7 +1333,7 @@ dependencies = [
[[package]]
name = "oxide_vm"
version = "0.8.9"
version = "0.8.10"
dependencies = [
"bumpalo",
"chrono",
+1 -1
View File
@@ -22,7 +22,7 @@ members = [
]
[workspace.package]
version = "0.8.9"
version = "0.8.10"
edition = "2021"
license = "MIT"
rust-version = "1.80"
+9 -8
View File
@@ -138,7 +138,7 @@ impl Emitter {
// (会改写 cell 值)与内联 accessor 调用(会清空寄存器文件)之后仍保持 identity
// 一致;合成键 @@class_self_N 不影响外层作用域的同名用户绑定。
let class_self_cell: Option<u8> = ctor_name.as_deref().map(|_| {
let cell_idx = ctx.captured_bindings.values().copied().max().map_or(0, |m| m.saturating_add(1));
let cell_idx = ctx.alloc_cell_idx();
ctx.captured_bindings.insert(format!("@@class_self_{cell_idx}"), cell_idx);
cell_idx
});
@@ -167,13 +167,14 @@ impl Emitter {
ctx.scopes.private_brand_id = private_brand_id;
// 实例公有字段 computed key 求值于构造器帧外,须类定义期存入数组。构造器以
// upvalue 捕获该数组:父作用域登记 `@@field_keys`(cell_idx 取现有最大 +1)。
// upvalue 捕获该数组:父作用域登记 `@@field_keys`(索引经共享计数器追加,
// 与块级遮蔽绑定的追加索引不碰撞)。
let has_computed_instance = instance_field_indices.iter().any(|&i| {
let ClassElement::PropertyDefinition(p) = &elements[i] else { return false };
p.computed && !matches!(p.key, PropertyKey::PrivateIdentifier(_))
});
let field_key_cell: Option<u8> = if has_computed_instance {
let cell_idx = ctx.captured_bindings.values().copied().max().map_or(0, |m| m.saturating_add(1));
let cell_idx = ctx.alloc_cell_idx();
ctx.captured_bindings.insert("@@field_keys".to_string(), cell_idx);
Some(cell_idx)
} else {
@@ -181,7 +182,7 @@ impl Emitter {
};
// 类 brand 对象(= proto)由类定义期 MAKE_CELL 写入,构造器经 upvalue 捕获。
let brand_cell: Option<u8> = private_brand_id.map(|_| {
let cell_idx = ctx.captured_bindings.values().copied().max().map_or(0, |m| m.saturating_add(1));
let cell_idx = ctx.alloc_cell_idx();
ctx.captured_bindings.insert("@@class_brand".to_string(), cell_idx);
cell_idx
});
@@ -419,11 +420,11 @@ impl Emitter {
}
// 类名被外层嵌套函数捕获时,真实名 cell 同样须初始化(类元素自引用走
// @@class_self_* 合成 cell,二者 cell_idx 不同则各发一次)。
// 仅类声明:类名是本作用域绑定,captured_bindings 按名命中的才是
// 它的 cell;类表达式名是类体内独立 const 绑定,按名查询只会命中
// 外层同名绑定 cell,MAKE_CELL 会把类值误写进外层绑定。
// 仅类声明:类名是本作用域绑定,可见绑定解析到的是它的 cell;类表达式
// 名是类体内独立 const 绑定,按名解析只会命中外层同名绑定 cell,
// MAKE_CELL 会把类值误写进外层绑定。
if is_class_decl {
if let Some(&cell_idx) = ctx.captured_bindings.get(name) {
if let Some((cell_idx, _)) = ctx.visible_cell(name) {
ctx.inst(Inst::new(
OpCode::MAKE_CELL,
Operand::Reg(binding_reg),
@@ -164,7 +164,7 @@ impl Emitter {
ctx.nested.push(sub_module);
ctx.inst(Inst::create_closure(Operand::Reg(reg), ctx.nested.len() as u16));
if write_slot {
if let Some(&cell_idx) = ctx.captured_bindings.get(name) {
if let Some((cell_idx, _)) = ctx.visible_cell(name) {
ctx.inst(Inst::new(
OpCode::MAKE_CELL,
Operand::Reg(reg),