docs: 补充注释与格式化
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
//! 运行时等价对比(D-08):DCE 开/关两份字节码 lower + VM 执行结果一致。
|
||||
//! 运行时等价对比:DCE 开/关两份字节码 lower + VM 执行结果一致。
|
||||
//!
|
||||
//! 同一 JS 源码走两条管线:parse → emit →(dce 开/关)→ lower → `Vm::run`,
|
||||
//! 对比顶层执行结果。纯表读错 VM handler 也能被此兜底(D-08)。
|
||||
//! **不经 `Compiler::compile`**(D-10:测试层直调底层函数,不依赖开关)。
|
||||
//! 对比顶层执行结果。副作用纯表读错 VM handler 也能被此兜底。
|
||||
//! **不经 `Compiler::compile`**:测试层直调底层函数,不依赖编译器开关。
|
||||
|
||||
use oxide_vm::vm::Vm;
|
||||
use oxide_vm::JsValue;
|
||||
@@ -29,25 +29,25 @@ fn normalize(r: Result<JsValue, String>) -> (bool, String) {
|
||||
}
|
||||
}
|
||||
|
||||
/// 死代码样例集(04-RESEARCH.md Pattern 5 清单)。
|
||||
/// 死代码样例集(覆盖表达式丢弃、死分支、死闭包、coerce 抛错、const 重赋值等路径)。
|
||||
/// 对每个样例:DCE 开与关分别执行,断言结果一致。
|
||||
#[test]
|
||||
fn dead_code_removed_semantics_preserved() {
|
||||
// 覆盖:表达式语句丢弃结果、重复赋值只读最后值、if(false) 分支、死闭包、
|
||||
// try/catch 内死代码、对象操作数算术(D-05 coerce 风险兜底)、
|
||||
// 顶层表达式返回值(HALT reg0 链,Pitfall 2)、先调用后丢弃(CALL 隐式 reg0,Pitfall 1)、
|
||||
// const 重赋值抛错保留(Pitfall 5)。
|
||||
// try/catch 内死代码、对象操作数算术(coerce 抛错风险兜底)、
|
||||
// 顶层表达式返回值(HALT 隐式读 reg0 链)、先调用后丢弃(CALL 隐式写 reg0)、
|
||||
// const 重赋值抛错保留。
|
||||
let samples = [
|
||||
"1+2;3+4", // 语句丢弃结果
|
||||
"'a'+'b';5;", // 语句丢弃结果(字符串)
|
||||
"var x=1; x=2; x;", // 重复赋值只读最后值
|
||||
"function a(){return 1;} if(false){a();} 3;", // if(false) 分支
|
||||
"function f(){}; 1;", // 死闭包
|
||||
"try{1+2;}catch(e){3;} 4;", // try/catch 内死代码
|
||||
"({valueOf(){side=1; return 1}})+2;", // 对象操作数算术(coerce 兜底)
|
||||
"1+2", // 顶层表达式返回值(Pitfall 2)
|
||||
"function f(){return 1;} f(); 2+3;", // 先调用后丢弃(Pitfall 1)
|
||||
"const x=1; x=2;", // const 重赋值(Pitfall 5)
|
||||
"1+2;3+4", // 语句丢弃结果
|
||||
"'a'+'b';5;", // 语句丢弃结果(字符串)
|
||||
"var x=1; x=2; x;", // 重复赋值只读最后值
|
||||
"function a(){return 1;} if(false){a();} 3;", // if(false) 分支
|
||||
"function f(){}; 1;", // 死闭包
|
||||
"try{1+2;}catch(e){3;} 4;", // try/catch 内死代码
|
||||
"({valueOf(){side=1; return 1}})+2;", // 对象操作数算术(coerce 兜底)
|
||||
"1+2", // 顶层表达式返回值(HALT 隐式读 reg0 链)
|
||||
"function f(){return 1;} f(); 2+3;", // 先调用后丢弃(CALL 隐式写 reg0)
|
||||
"const x=1; x=2;", // const 重赋值(运行时抛错保留)
|
||||
];
|
||||
for src in samples {
|
||||
let a = normalize(run_source(src, true));
|
||||
@@ -65,7 +65,7 @@ fn single_sample_top_level_return_value() {
|
||||
assert_eq!(a, (true, "3".to_string()), "顶层 1+2 应返回 3");
|
||||
}
|
||||
|
||||
/// Pitfall 6 回归:脚本顶层变量赋值是全局可观察状态(class 计算属性名里的 `x = 1`
|
||||
/// 顶层变量赋值是全局可观察状态(class 计算属性名里的 `x = 1`
|
||||
/// 会被测试 harness 的 `assert.sameValue(x, 1)` 观察),即使本函数内无 use,
|
||||
/// DCE 也**不得删除**对应 STORE_VAR——删除会改变外部可观察语义。
|
||||
#[test]
|
||||
@@ -80,10 +80,7 @@ fn top_level_store_var_kept() {
|
||||
.bytecode
|
||||
.iter()
|
||||
.any(|&i| oxide_bytecode::opcode::opcode(i) == oxide_bytecode::opcode::OpCode::STORE_VAR);
|
||||
assert!(
|
||||
has_store_var,
|
||||
"顶层 x 赋值(全局可观察)不应被 DCE 删除: {src}"
|
||||
);
|
||||
assert!(has_store_var, "顶层 x 赋值(全局可观察)不应被 DCE 删除: {src}");
|
||||
|
||||
// 运行时兜底:DCE 开/关执行结果一致,且 x 最终值为 1(未被删赋值破坏)
|
||||
let a = normalize(run_source(src, true));
|
||||
|
||||
Reference in New Issue
Block a user