From a791a312ece1f7dbebe0f440b4f583adcd2ceb5d Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 16 Oct 2026 16:04:36 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8D=95=E8=8E=B7=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E5=99=A8=E8=B5=8B=E5=80=BC=E7=9B=AE=E6=A0=87=E7=A7=81=E6=9C=89?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E8=87=82=E6=94=B9=E6=89=AB=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 42 ++++++++++++------------ Cargo.toml | 2 +- crates/oxide_emit/src/capture/scanner.rs | 8 +++-- crates/oxide_emit/tests/emit_ir_tests.rs | 40 ++++++++++++++++++++++ 4 files changed, 67 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6cab91a9..278c04db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.19.34" +version = "0.19.35" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.19.34" +version = "0.19.35" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.19.34" +version = "0.19.35" dependencies = [ "ansi_term", "bumpalo", @@ -1228,7 +1228,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.19.34" +version = "0.19.35" dependencies = [ "lru", "oxide_bytecode", @@ -1237,7 +1237,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1258,7 +1258,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1272,7 +1272,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.19.34" +version = "0.19.35" dependencies = [ "num-bigint", "oxc_allocator", @@ -1288,7 +1288,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1300,7 +1300,7 @@ dependencies = [ [[package]] name = "oxide_fold" -version = "0.19.34" +version = "0.19.35" dependencies = [ "num-bigint", "oxide_bytecode", @@ -1312,7 +1312,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1321,7 +1321,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.19.34" +version = "0.19.35" dependencies = [ "bumpalo", "dashmap", @@ -1335,7 +1335,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1347,7 +1347,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.19.34" +version = "0.19.35" dependencies = [ "tracing", "tracing-appender", @@ -1356,11 +1356,11 @@ dependencies = [ [[package]] name = "oxide_net" -version = "0.19.34" +version = "0.19.35" [[package]] name = "oxide_parser" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1375,7 +1375,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1391,7 +1391,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.19.34" +version = "0.19.35" dependencies = [ "num-bigint", "num-traits", @@ -1404,7 +1404,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.19.34" +version = "0.19.35" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1424,7 +1424,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.19.34" +version = "0.19.35" dependencies = [ "bumpalo", "dashmap", @@ -1437,7 +1437,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.19.34" +version = "0.19.35" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 25b4c291..677eafd7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ members = [ ] [workspace.package] -version = "0.19.34" +version = "0.19.35" 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 bb5a48fe..96c70d82 100644 --- a/crates/oxide_emit/src/capture/scanner.rs +++ b/crates/oxide_emit/src/capture/scanner.rs @@ -436,8 +436,10 @@ pub(crate) fn collect_capture_names_assign_target(target: &oxide_parser::Assignm oxide_parser::AssignmentTarget::ObjectAssignmentTarget(o) => { collect_capture_names_object_target(o, eng); } - // 无扫描需求变体:私有字段目标与 TS 类型断言目标。 - oxide_parser::AssignmentTarget::PrivateFieldExpression(_) => {} + oxide_parser::AssignmentTarget::PrivateFieldExpression(m) => { + collect_capture_names_expr(&m.object, eng); + } + // 无扫描需求变体:TS 类型断言目标。 oxide_parser::AssignmentTarget::TSAsExpression(_) => {} oxide_parser::AssignmentTarget::TSSatisfiesExpression(_) => {} oxide_parser::AssignmentTarget::TSNonNullExpression(_) => {} @@ -564,7 +566,7 @@ pub(crate) fn collect_capture_names_simple_target( collect_capture_names_expr(&m.object, eng); collect_capture_names_expr(&m.expression, eng); } - // 无扫描需求变体:私有字段目标与 TS 类型断言目标。 + // 无扫描需求变体:私有字段目标(更新发射面未支持,程序不可编译)与 TS 类型断言目标。 oxide_parser::SimpleAssignmentTarget::PrivateFieldExpression(_) => {} oxide_parser::SimpleAssignmentTarget::TSAsExpression(_) => {} oxide_parser::SimpleAssignmentTarget::TSSatisfiesExpression(_) => {} diff --git a/crates/oxide_emit/tests/emit_ir_tests.rs b/crates/oxide_emit/tests/emit_ir_tests.rs index b235452d..7d141431 100644 --- a/crates/oxide_emit/tests/emit_ir_tests.rs +++ b/crates/oxide_emit/tests/emit_ir_tests.rs @@ -536,3 +536,43 @@ fn string_fold_emission_stable() { assert_emission_stable("var s = \"a\" + 1 + true + null;", false); assert_emission_stable("var t = `a${1}b`;", false); } + +/// 按名递归查找嵌套函数(树序)。 +fn find_fn_by_name<'a>(ir: &'a IRFunction, name: &str) -> &'a IRFunction { + find_fn_by_name_opt(ir, name).unwrap_or_else(|| panic!("嵌套函数 {name} 未找到")) +} + +fn find_fn_by_name_opt<'a>(ir: &'a IRFunction, name: &str) -> Option<&'a IRFunction> { + ir.nested.iter().find_map(|f| { + if f.function_name.as_deref() == Some(name) { + Some(f) + } else { + find_fn_by_name_opt(f, name) + } + }) +} + +/// 面 20:类方法内嵌套函数对私有字段赋值目标,目标对象须入捕获集—— +/// 读路径本就扫对象,赋值目标臂同口径;不捕获则运行期回落全局对象, +/// brand 检查必失败。 +#[test] +fn private_field_assign_target_captures_object() { + let src = "class C { #m = 'Test262'; method() { let self = this; \ + function innerFunction() { self.#m = 'Test262'; } innerFunction(); } }"; + let ir = emit_ir(src); + let inner = find_fn_by_name(&ir, "innerFunction"); + let names: HashSet<&str> = inner.upvalue_captures.iter().map(|c| c.name.as_str()).collect(); + assert!(names.contains("self"), "私有字段赋值目标对象须入捕获集"); + assert!(tree_count(&ir, OpCode::SET_PRIVATE) >= 1, "私有字段写面应存在"); +} + +/// 面 20 对照:类方法内嵌套函数对私有字段读路径,目标对象已入捕获集(不回归)。 +#[test] +fn private_field_read_captures_object() { + let src = "class C { #m = 'Test262'; method() { let self = this; \ + function innerFunction() { return self.#m; } innerFunction(); } }"; + let ir = emit_ir(src); + let inner = find_fn_by_name(&ir, "innerFunction"); + let names: HashSet<&str> = inner.upvalue_captures.iter().map(|c| c.name.as_str()).collect(); + assert!(names.contains("self"), "私有字段读路径目标对象须入捕获集"); +}