From 77f6ea52c3af20627656e038a37dc4e6fa330a3f Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Tue, 6 Oct 2026 01:32:24 +0000 Subject: [PATCH] =?UTF-8?q?test:=20=E8=A1=A5=E8=A7=A3=E6=9E=84=E8=B5=8B?= =?UTF-8?q?=E5=80=BC=E5=86=99=E8=A2=AB=E6=8D=95=E8=8E=B7=E9=A1=B6=E5=B1=82?= =?UTF-8?q?=20let=20=E8=90=BD=20cell=20=E5=9B=9E=E5=BD=92=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 36 ++++++++-------- Cargo.toml | 2 +- .../tests/tdz_upvalue_capture_tests.rs | 41 +++++++++++++++++++ 3 files changed, 60 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c33c175..6ba9ca9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1095,7 +1095,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.8.17" +version = "0.8.18" dependencies = [ "chrono", "fast-float", @@ -1120,7 +1120,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.8.17" +version = "0.8.18" dependencies = [ "num-bigint", "oxide_log", @@ -1128,7 +1128,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.8.17" +version = "0.8.18" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1139,7 +1139,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.8.17" +version = "0.8.18" dependencies = [ "ansi_term", "bumpalo", @@ -1159,7 +1159,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.8.17" +version = "0.8.18" dependencies = [ "lru", "oxide_bytecode", @@ -1168,7 +1168,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.8.17" +version = "0.8.18" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1187,7 +1187,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.8.17" +version = "0.8.18" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1201,7 +1201,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.8.17" +version = "0.8.18" dependencies = [ "num-bigint", "oxc_allocator", @@ -1216,7 +1216,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.8.17" +version = "0.8.18" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1225,7 +1225,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bumpalo", "dashmap", @@ -1240,7 +1240,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.8.17" +version = "0.8.18" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1252,7 +1252,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.8.17" +version = "0.8.18" dependencies = [ "tracing", "tracing-appender", @@ -1261,7 +1261,7 @@ dependencies = [ [[package]] name = "oxide_parser" -version = "0.8.17" +version = "0.8.18" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1276,7 +1276,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.8.17" +version = "0.8.18" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1292,7 +1292,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.8.17" +version = "0.8.18" dependencies = [ "num-bigint", "num-traits", @@ -1304,7 +1304,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.8.17" +version = "0.8.18" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1321,7 +1321,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bumpalo", "hashbrown 0.14.5", @@ -1333,7 +1333,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 52754759..2d12ee27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ members = [ ] [workspace.package] -version = "0.8.17" +version = "0.8.18" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_vm/tests/tdz_upvalue_capture_tests.rs b/crates/oxide_vm/tests/tdz_upvalue_capture_tests.rs index 55221b5f..3a7137e0 100644 --- a/crates/oxide_vm/tests/tdz_upvalue_capture_tests.rs +++ b/crates/oxide_vm/tests/tdz_upvalue_capture_tests.rs @@ -286,3 +286,44 @@ fn typeof_captured_top_let_after_decl() { "typeof on a captured top-level let after initialization reports number" ); } + +// ── 解构赋值写被捕获顶层 let:标识符目标写须落 cell,闭包读新值 ── + +#[test] +fn captured_top_let_array_destructuring_assign() { + // 数组解构标识符目标:写只落寄存器而 cell 不更新时,闭包读旧值,此处判红。 + assert_eq!( + eval("let x = 1; function f() { return x; } [x] = [2]; f() === 2 && x === 2"), + "true", + "array destructuring assignment to a captured top-level let updates the cell" + ); +} + +#[test] +fn captured_top_let_object_destructuring_assign() { + assert_eq!( + eval("let x = 1; function f() { return x; } ({x} = {x: 3}); f() === 3 && x === 3"), + "true", + "object destructuring assignment to a captured top-level let updates the cell" + ); +} + +#[test] +fn captured_top_let_destructuring_default_assign() { + // 默认值路径:元素为 undefined 触发默认值,写同样须落 cell。 + assert_eq!( + eval("let x = 1; function f() { return x; } [x = 9] = [undefined]; f() === 9 && x === 9"), + "true", + "destructuring assignment with a default value to a captured top-level let updates the cell" + ); +} + +#[test] +fn captured_top_let_rest_destructuring_assign() { + // rest 元素须为末位,标识符目标在 rest 前:写落 cell 的判别与主形同。 + assert_eq!( + eval("let x = 1; function f() { return x; } [x, ...r] = [1, 2]; f() === 1 && x === 1"), + "true", + "rest destructuring assignment to a captured top-level let updates the cell" + ); +}