From ff8e28fa06f1d207bb690ae30f87e12eaa4c39c3 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 12 Oct 2026 06:13:33 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BD=A2=E5=8F=82=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=E6=89=AB=E6=8F=8F=E5=8C=85=E6=B7=B1=E5=BA=A6=E5=A2=9E?= =?UTF-8?q?=E5=87=8F=EF=BC=8C=E6=81=A2=E5=A4=8D=E7=88=B6=E7=BA=A7=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E6=8D=95=E8=8E=B7=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 40 ++++++++++++------------ Cargo.toml | 2 +- crates/oxide_emit/src/capture/scanner.rs | 4 +++ crates/oxide_emit/tests/emit_ir_tests.rs | 14 +++++++++ 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8f4e2ac..c338ea41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.16.8" +version = "0.16.9" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.16.8" +version = "0.16.9" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.16.8" +version = "0.16.9" dependencies = [ "ansi_term", "bumpalo", @@ -1228,7 +1228,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.16.8" +version = "0.16.9" dependencies = [ "lru", "oxide_bytecode", @@ -1237,7 +1237,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1257,7 +1257,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1271,7 +1271,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.16.8" +version = "0.16.9" dependencies = [ "num-bigint", "oxc_allocator", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1298,7 +1298,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1307,7 +1307,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bumpalo", "dashmap", @@ -1321,7 +1321,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1333,7 +1333,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.16.8" +version = "0.16.9" dependencies = [ "tracing", "tracing-appender", @@ -1342,11 +1342,11 @@ dependencies = [ [[package]] name = "oxide_net" -version = "0.16.8" +version = "0.16.9" [[package]] name = "oxide_parser" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1361,7 +1361,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1377,7 +1377,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.16.8" +version = "0.16.9" dependencies = [ "num-bigint", "num-traits", @@ -1390,7 +1390,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.16.8" +version = "0.16.9" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1410,7 +1410,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bumpalo", "dashmap", @@ -1423,7 +1423,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index e6516677..295e0599 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ members = [ ] [workspace.package] -version = "0.16.8" +version = "0.16.9" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_emit/src/capture/scanner.rs b/crates/oxide_emit/src/capture/scanner.rs index e2e8ddaf..81bfa68d 100644 --- a/crates/oxide_emit/src/capture/scanner.rs +++ b/crates/oxide_emit/src/capture/scanner.rs @@ -568,7 +568,10 @@ pub(crate) fn collect_capture_names_simple_target( } /// 收集函数参数默认值表达式里的引用(子层 upvalue 判定;参数名遮蔽)。 +/// 默认值在定义处外层作用域求值,其中对外层 own 绑定的引用须纳入捕获判定: +/// 扫描前临时深度加一过门槛,扫完即减回;upvalue 判定无深度门槛,不受影响。 pub(crate) fn collect_fn_default_names(params: &oxide_parser::FormalParameters, eng: &mut CaptureEngine) { + eng.depth += 1; for p in ¶ms.items { if let Some(init) = &p.initializer { collect_capture_names_expr(init, eng); @@ -578,6 +581,7 @@ pub(crate) fn collect_fn_default_names(params: &oxide_parser::FormalParameters, collect_capture_names_binding_pattern(&p.pattern, eng); eng.shadow = saved; } + eng.depth -= 1; } /// 按表达式类型递归扫描引用;进入嵌套函数体时以形参 + 体内声明扩充遮蔽集。与 diff --git a/crates/oxide_emit/tests/emit_ir_tests.rs b/crates/oxide_emit/tests/emit_ir_tests.rs index ac6689ce..4e16d1ef 100644 --- a/crates/oxide_emit/tests/emit_ir_tests.rs +++ b/crates/oxide_emit/tests/emit_ir_tests.rs @@ -227,6 +227,20 @@ fn closure_captures_cell_and_upvalue() { ); } +/// 面 13:直接子函数(深度 0)形参默认值对父级绑定的直接引用须纳入父捕获集 +/// (父建 cell、子建 upvalue),否则逃逸闭包缺参调用经 LOAD_VAR 读父帧死寄存器取陈旧值。 +#[test] +fn nested_fn_default_ref_captures_parent_binding() { + let src = "function f() { var x = 1; var g = function(a = x) { return a; }; return g; }"; + let ir = emit_ir(src); + let f = &ir.nested[0]; + assert!(f.cells_needed >= 1, "父函数应为默认值引用的 x 建 cell"); + assert!(count_op(&f.insts, OpCode::MAKE_CELL) >= 1, "父函数入口应发 MAKE_CELL"); + let g = &f.nested[0]; + let g_names: HashSet<&str> = g.upvalue_captures.iter().map(|c| c.name.as_str()).collect(); + assert!(g_names.contains("x"), "子函数形参默认值引用的 x 应成为子 upvalue"); +} + /// 面 5:对象 rest 展开与数组 holes 的现状形态:REST_OBJECT 的 ext 键是排除键 /// (显式绑定的键名);解构赋值经 for-of 迭代面(FOR_OF_INIT)逐元素绑定, /// 空洞元素被消费但不绑定;常量池含 Undefined。