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