mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-26 11:41:13 +08:00
fix: TLA 游走器补 export 声明顶层 await 判定
This commit is contained in:
Generated
+21
-21
@@ -1160,7 +1160,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_builtins"
|
name = "oxide_builtins"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"fast-float",
|
"fast-float",
|
||||||
@@ -1185,7 +1185,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_bytecode"
|
name = "oxide_bytecode"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lru",
|
"lru",
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
@@ -1237,7 +1237,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_compiler"
|
name = "oxide_compiler"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@@ -1335,7 +1335,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_liveness"
|
name = "oxide_liveness"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-appender",
|
"tracing-appender",
|
||||||
@@ -1356,11 +1356,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_net"
|
name = "oxide_net"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_parser"
|
name = "oxide_parser"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
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.18.6"
|
version = "0.18.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@@ -1437,7 +1437,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_vm"
|
name = "oxide_vm"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ members = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
rust-version = "1.80"
|
rust-version = "1.80"
|
||||||
|
|||||||
@@ -421,7 +421,23 @@ fn stmt_has_top_level_await(stmt: &Statement) -> bool {
|
|||||||
.any(|d| d.init.as_ref().is_some_and(|i| expr_has_top_level_await(i))),
|
.any(|d| d.init.as_ref().is_some_and(|i| expr_has_top_level_await(i))),
|
||||||
// 函数/类声明:体不进入(函数体是独立异步语义边界)。
|
// 函数/类声明:体不进入(函数体是独立异步语义边界)。
|
||||||
Statement::FunctionDeclaration(_) | Statement::ClassDeclaration(_) => false,
|
Statement::FunctionDeclaration(_) | Statement::ClassDeclaration(_) => false,
|
||||||
// import/export 与无子表达式的语句(break/continue/debugger/empty)不含顶层 await。
|
// `export const/let/var x = await ...` 是顶层 await;
|
||||||
|
// 函数/类声明形态不进入(体是独立异步语义边界,与裸声明臂同口径)。
|
||||||
|
Statement::ExportNamedDeclaration(exp) => {
|
||||||
|
exp.declaration.as_ref().is_some_and(|decl| match decl {
|
||||||
|
Declaration::VariableDeclaration(vd) => vd
|
||||||
|
.declarations
|
||||||
|
.iter()
|
||||||
|
.any(|d| d.init.as_ref().is_some_and(|i| expr_has_top_level_await(i))),
|
||||||
|
_ => false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// `export default await ...` 是顶层 await;函数/类声明形态不进入(同口径)。
|
||||||
|
Statement::ExportDefaultDeclaration(exp) => {
|
||||||
|
exp.declaration.as_expression().is_some_and(expr_has_top_level_await)
|
||||||
|
}
|
||||||
|
// import、`export *`、`export { x }`(无声明)与无子表达式的语句
|
||||||
|
// (break/continue/debugger/empty)不含顶层 await。
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -546,3 +546,42 @@ fn sync_dep_no_gate() {
|
|||||||
assert_eq!(native_calls_to(&ir, "__moduleWaitAll"), 0, "同步依赖不得发聚合 gate");
|
assert_eq!(native_calls_to(&ir, "__moduleWaitAll"), 0, "同步依赖不得发聚合 gate");
|
||||||
assert_eq!(ir.insts.iter().filter(|i| i.op == OpCode::AWAIT).count(), 0, "主身不得含 AWAIT");
|
assert_eq!(ir.insts.iter().filter(|i| i.op == OpCode::AWAIT).count(), 0, "主身不得含 AWAIT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 面 25:`export const x = await ...`(ExportNamedDeclaration 带变量声明)是
|
||||||
|
/// 顶层 await,模块标记异步、体 await 编译为 AWAIT。
|
||||||
|
#[test]
|
||||||
|
fn export_named_var_decl_await_makes_module_async() {
|
||||||
|
let (ir, _) = emit_module("export const x = await Promise.resolve(1);", "./entry.js", &[])
|
||||||
|
.expect("export const x = await 模块应编译成功");
|
||||||
|
assert!(ir.is_async, "export const x = await ... 应标记模块异步求值");
|
||||||
|
assert_eq!(
|
||||||
|
ir.insts.iter().filter(|i| i.op == OpCode::AWAIT).count(),
|
||||||
|
1,
|
||||||
|
"顶层 await 应编译为一条 AWAIT"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 面 26:`export default await ...`(ExportDefaultDeclaration 表达式形态)是
|
||||||
|
/// 顶层 await,模块标记异步、体 await 编译为 AWAIT。
|
||||||
|
#[test]
|
||||||
|
fn export_default_await_makes_module_async() {
|
||||||
|
let (ir, _) = emit_module("export default await Promise.resolve(1);", "./entry.js", &[])
|
||||||
|
.expect("export default await 模块应编译成功");
|
||||||
|
assert!(ir.is_async, "export default await ... 应标记模块异步求值");
|
||||||
|
assert_eq!(
|
||||||
|
ir.insts.iter().filter(|i| i.op == OpCode::AWAIT).count(),
|
||||||
|
1,
|
||||||
|
"顶层 await 应编译为一条 AWAIT"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 面 27:`export const f = async () => {}`(导出声明初始化器为异步函数表达式)
|
||||||
|
/// 不使模块异步——函数体是独立异步语义边界,不进入游走。
|
||||||
|
#[test]
|
||||||
|
fn export_named_async_fn_expr_not_tla() {
|
||||||
|
let (ir, _) =
|
||||||
|
emit_module("export const f = async () => { await Promise.resolve(1); };", "./entry.js", &[])
|
||||||
|
.expect("导出异步函数表达式模块应编译成功");
|
||||||
|
assert!(!ir.is_async, "异步函数表达式体不得使模块标记异步");
|
||||||
|
assert_eq!(ir.insts.iter().filter(|i| i.op == OpCode::AWAIT).count(), 0, "主身不得含 AWAIT");
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user