From c0648b90142064d96a631a644f0d4d06d1c77e17 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 9 Oct 2026 12:11:02 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20import=20defer=20=E9=98=B6=E6=AE=B5?= =?UTF-8?q?=E6=A0=87=E5=BF=97=E7=BA=B3=E5=85=A5=E6=A8=A1=E5=9D=97=E5=93=88?= =?UTF-8?q?=E5=B8=8C=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 38 +++++++++---------- Cargo.toml | 2 +- crates/oxide_compiler/src/hash/statement.rs | 3 ++ .../tests/hash_collision_tests.rs | 21 ++++++++++ 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1aaa3133..ee5fae1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.8.102" +version = "0.8.103" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.8.102" +version = "0.8.103" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.8.102" +version = "0.8.103" dependencies = [ "ansi_term", "bumpalo", @@ -1226,7 +1226,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.8.102" +version = "0.8.103" dependencies = [ "lru", "oxide_bytecode", @@ -1235,7 +1235,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1255,7 +1255,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.8.102" +version = "0.8.103" dependencies = [ "num-bigint", "oxc_allocator", @@ -1284,7 +1284,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1296,7 +1296,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1305,7 +1305,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.8.102" +version = "0.8.103" dependencies = [ "bumpalo", "dashmap", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.8.102" +version = "0.8.103" dependencies = [ "tracing", "tracing-appender", @@ -1340,7 +1340,7 @@ dependencies = [ [[package]] name = "oxide_parser" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1371,7 +1371,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.8.102" +version = "0.8.103" dependencies = [ "num-bigint", "num-traits", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.8.102" +version = "0.8.103" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1402,7 +1402,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.8.102" +version = "0.8.103" dependencies = [ "bumpalo", "dashmap", @@ -1415,7 +1415,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.8.102" +version = "0.8.103" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 1a6bb881..e2827553 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ members = [ ] [workspace.package] -version = "0.8.102" +version = "0.8.103" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_compiler/src/hash/statement.rs b/crates/oxide_compiler/src/hash/statement.rs index ae99fa9a..1bf9583b 100644 --- a/crates/oxide_compiler/src/hash/statement.rs +++ b/crates/oxide_compiler/src/hash/statement.rs @@ -98,6 +98,9 @@ pub(super) fn hash_statement(stmt: &Statement, h: &mut rustc_hash::FxHasher, inc } Statement::ImportDeclaration(imp) => { imp.source.value.hash(h); + // import 阶段标志(import defer / source-phase imports):同源声明 + // 语义不同,须区分缓存键,防 defer 与非 defer 碰撞复用错误字节码。 + imp.phase.map(|p| p as u8).hash(h); if let Some(specifiers) = &imp.specifiers { (specifiers.len() as u32).hash(h); for spec in specifiers { diff --git a/crates/oxide_compiler/tests/hash_collision_tests.rs b/crates/oxide_compiler/tests/hash_collision_tests.rs index dd9cfcc8..429db4c1 100644 --- a/crates/oxide_compiler/tests/hash_collision_tests.rs +++ b/crates/oxide_compiler/tests/hash_collision_tests.rs @@ -86,6 +86,27 @@ fn import_expression_distinguished() { assert_ne!(compiled("import('./a.js')"), compiled("import('./a.js', { with: { type: 'json' } })")); } +#[test] +fn import_defer_distinguished() { + // import defer 与普通 namespace import 语义不同(defer 不触发依赖求值): + // 修复前 phase 不入 hash,两者哈希相同 → 缓存碰撞复用错误字节码。 + assert_ne!( + compiled("import defer * as ns from './x.js'"), + compiled("import * as ns from './x.js'"), + "import defer vs plain namespace import must differ" + ); + assert_ne!( + structural("import defer * as ns from './x.js'"), + structural("import * as ns from './x.js'"), + "defer flag must be part of the structural key too" + ); + // 同源等价回归 + assert_eq!( + compiled("import defer * as ns from './x.js'"), + compiled("import defer * as ns from './x.js'") + ); +} + #[test] fn structural_hash_ignores_binding_names() { // 结构哈希忽略绑定名:仅参数/变量改名后哈希相等。