feat: 解构模式语义补齐(REST 枚举/getter/computed 排除、IteratorClose、RegAlloc def 干涉、for-in 捕获遮蔽)
This commit is contained in:
@@ -180,7 +180,7 @@ pub(super) fn build(
|
||||
at_i.push(fr.id);
|
||||
}
|
||||
}
|
||||
// 两两加边
|
||||
// 两两加边(基于 live_before:约束 use/def 与执行前存活值)
|
||||
for a in 0..at_i.len() {
|
||||
for b in a + 1..at_i.len() {
|
||||
let (x, y) = (at_i[a], at_i[b]);
|
||||
@@ -188,6 +188,22 @@ pub(super) fn build(
|
||||
adj_sets.entry(y).or_default().insert(x);
|
||||
}
|
||||
}
|
||||
// def 结果与执行后仍存活的值冲突(写覆盖):live_after 含 def 后存活者。
|
||||
// live_before 已 kill def 自身,纯写指令(FOR_OF_NEXT 等)的结果若与长活
|
||||
// 寄存器同色会覆盖其值(elision 解构返回值被覆盖),须补此干涉边。
|
||||
if let Some(d) = f.insts[i].def_reg() {
|
||||
if nodes.contains_key(&d) {
|
||||
for &v in &node_ids {
|
||||
if v == d {
|
||||
continue;
|
||||
}
|
||||
if live.inst_live_after[i].get(v as usize).copied().unwrap_or(false) {
|
||||
adj_sets.entry(d).or_default().insert(v);
|
||||
adj_sets.entry(v).or_default().insert(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (v, set) in adj_sets {
|
||||
if let Some(node) = nodes.get_mut(&v) {
|
||||
|
||||
@@ -54,6 +54,11 @@ fn regalloc_preserves_semantics() {
|
||||
"function f(n) { var s = 0; for (var i = 0; i < n; i++) { s += i * i; } return s; } f(10);",
|
||||
// 解构
|
||||
"function f() { var [a, b] = [1, 2]; var { c, d } = { c: 3, d: 4 }; return a + b + c + d; } f();",
|
||||
// elision 解构赋值:返回值寄存器与 FOR_OF_NEXT 结果须异色(def 干涉边回归)
|
||||
"var result; var vals = [1, 2, 3]; result = [,] = vals; result[0] + result[1] + result[2];",
|
||||
"var result; var vals = [1, 2, 3]; var x, y, z; result = [x, y, z] = vals; x + y + z;",
|
||||
// 嵌套数组解构(内层迭代器覆盖外层 last result,done 检查须正确)
|
||||
"var x; var vals = [[1]]; var result = [[x]] = vals; x;",
|
||||
// 闭包(upvalue cell 路径)
|
||||
"function f() { var x = 1; return function() { return x++; }; } var g = f(); var r = [g(), g(), g()]; r[0] + r[1] + r[2];",
|
||||
// 箭头函数
|
||||
|
||||
Reference in New Issue
Block a user