mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
fix: 捕获扫描器赋值目标私有字段臂改扫对象
This commit is contained in:
Generated
+21
-21
@@ -1160,7 +1160,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_builtins"
|
name = "oxide_builtins"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"fast-float",
|
"fast-float",
|
||||||
@@ -1185,7 +1185,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_bytecode"
|
name = "oxide_bytecode"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"oxide_log",
|
"oxide_log",
|
||||||
@@ -1193,7 +1193,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_cfg"
|
name = "oxide_cfg"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_emit",
|
"oxide_emit",
|
||||||
@@ -1204,7 +1204,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_cli"
|
name = "oxide_cli"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term",
|
"ansi_term",
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
@@ -1228,7 +1228,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_code_cache"
|
name = "oxide_code_cache"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lru",
|
"lru",
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
@@ -1237,7 +1237,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_compiler"
|
name = "oxide_compiler"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1258,7 +1258,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_dce"
|
name = "oxide_dce"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1272,7 +1272,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_emit"
|
name = "oxide_emit"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"oxc_allocator",
|
"oxc_allocator",
|
||||||
@@ -1288,7 +1288,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_engine"
|
name = "oxide_engine"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_compiler",
|
"oxide_compiler",
|
||||||
@@ -1300,7 +1300,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_fold"
|
name = "oxide_fold"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
@@ -1312,7 +1312,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_ir"
|
name = "oxide_ir"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_log",
|
"oxide_log",
|
||||||
@@ -1321,7 +1321,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_kernel"
|
name = "oxide_kernel"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@@ -1335,7 +1335,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_liveness"
|
name = "oxide_liveness"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1347,7 +1347,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_log"
|
name = "oxide_log"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-appender",
|
"tracing-appender",
|
||||||
@@ -1356,11 +1356,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_net"
|
name = "oxide_net"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_parser"
|
name = "oxide_parser"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxc_allocator",
|
"oxc_allocator",
|
||||||
"oxc_ast",
|
"oxc_ast",
|
||||||
@@ -1375,7 +1375,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_regalloc"
|
name = "oxide_regalloc"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1391,7 +1391,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_runtime_api"
|
name = "oxide_runtime_api"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
@@ -1404,7 +1404,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_test262"
|
name = "oxide_test262"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_compiler",
|
"oxide_compiler",
|
||||||
@@ -1424,7 +1424,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_types"
|
name = "oxide_types"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@@ -1437,7 +1437,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_vm"
|
name = "oxide_vm"
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ members = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.19.34"
|
version = "0.19.35"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
rust-version = "1.80"
|
rust-version = "1.80"
|
||||||
|
|||||||
@@ -436,8 +436,10 @@ pub(crate) fn collect_capture_names_assign_target(target: &oxide_parser::Assignm
|
|||||||
oxide_parser::AssignmentTarget::ObjectAssignmentTarget(o) => {
|
oxide_parser::AssignmentTarget::ObjectAssignmentTarget(o) => {
|
||||||
collect_capture_names_object_target(o, eng);
|
collect_capture_names_object_target(o, eng);
|
||||||
}
|
}
|
||||||
// 无扫描需求变体:私有字段目标与 TS 类型断言目标。
|
oxide_parser::AssignmentTarget::PrivateFieldExpression(m) => {
|
||||||
oxide_parser::AssignmentTarget::PrivateFieldExpression(_) => {}
|
collect_capture_names_expr(&m.object, eng);
|
||||||
|
}
|
||||||
|
// 无扫描需求变体:TS 类型断言目标。
|
||||||
oxide_parser::AssignmentTarget::TSAsExpression(_) => {}
|
oxide_parser::AssignmentTarget::TSAsExpression(_) => {}
|
||||||
oxide_parser::AssignmentTarget::TSSatisfiesExpression(_) => {}
|
oxide_parser::AssignmentTarget::TSSatisfiesExpression(_) => {}
|
||||||
oxide_parser::AssignmentTarget::TSNonNullExpression(_) => {}
|
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.object, eng);
|
||||||
collect_capture_names_expr(&m.expression, eng);
|
collect_capture_names_expr(&m.expression, eng);
|
||||||
}
|
}
|
||||||
// 无扫描需求变体:私有字段目标与 TS 类型断言目标。
|
// 无扫描需求变体:私有字段目标(更新发射面未支持,程序不可编译)与 TS 类型断言目标。
|
||||||
oxide_parser::SimpleAssignmentTarget::PrivateFieldExpression(_) => {}
|
oxide_parser::SimpleAssignmentTarget::PrivateFieldExpression(_) => {}
|
||||||
oxide_parser::SimpleAssignmentTarget::TSAsExpression(_) => {}
|
oxide_parser::SimpleAssignmentTarget::TSAsExpression(_) => {}
|
||||||
oxide_parser::SimpleAssignmentTarget::TSSatisfiesExpression(_) => {}
|
oxide_parser::SimpleAssignmentTarget::TSSatisfiesExpression(_) => {}
|
||||||
|
|||||||
@@ -536,3 +536,43 @@ fn string_fold_emission_stable() {
|
|||||||
assert_emission_stable("var s = \"a\" + 1 + true + null;", false);
|
assert_emission_stable("var s = \"a\" + 1 + true + null;", false);
|
||||||
assert_emission_stable("var t = `a${1}b`;", 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"), "私有字段读路径目标对象须入捕获集");
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user