fix corner case in merge_vars (#5771)

fixes #5770
This commit is contained in:
Alex Lam S.L
2023-01-04 07:17:04 +02:00
committed by GitHub
parent c9117041fa
commit 358faaacaa
3 changed files with 86 additions and 11 deletions

View File

@@ -6648,36 +6648,50 @@ Compressor.prototype.compress = function(node) {
function walk_cond(condition, consequent, alternative) { function walk_cond(condition, consequent, alternative) {
var save = segment; var save = segment;
var segments = [ save, save ]; var segments = scan_branches(condition, consequent, alternative);
if (consequent) {
segment = segments[0];
pop();
if (segment !== save) return;
}
if (alternative) {
segment = segments[1];
pop();
if (segment !== save) return;
}
segment = save;
}
function scan_branches(condition, consequent, alternative) {
var segments = [ segment, segment ];
if (condition instanceof AST_Binary) switch (condition.operator) { if (condition instanceof AST_Binary) switch (condition.operator) {
case "&&": case "&&":
segments[0] = walk_cond(condition.left, condition.right)[0]; segments[0] = scan_branches(condition.left, condition.right)[0];
break; break;
case "||": case "||":
case "??": case "??":
segments[1] = walk_cond(condition.left, null, condition.right)[1]; segments[1] = scan_branches(condition.left, null, condition.right)[1];
break; break;
default: default:
condition.walk(tw); condition.walk(tw);
break; break;
} else if (condition instanceof AST_Conditional) { } else if (condition instanceof AST_Conditional) {
walk_cond(condition.condition, condition.consequent, condition.alternative); scan_branches(condition.condition, condition.consequent, condition.alternative);
} else { } else {
condition.walk(tw); condition.walk(tw);
} }
segment = segments[0];
if (consequent) { if (consequent) {
segment = segments[0];
push(); push();
consequent.walk(tw); consequent.walk(tw);
segments[0] = segment;
} }
segments[0] = segment;
segment = segments[1];
if (alternative) { if (alternative) {
segment = segments[1];
push(); push();
alternative.walk(tw); alternative.walk(tw);
segments[1] = segment;
} }
segments[1] = segment;
segment = save;
return segments; return segments;
} }
}); });

View File

@@ -3889,3 +3889,56 @@ issue_5714: {
"42", "42",
] ]
} }
issue_5770_1: {
options = {
dead_code: true,
loops: true,
merge_vars: true,
toplevel: true,
}
input: {
L: do {
if (console)
for (var a = "FAIL 1"; a; a--)
continue L;
var b = "FAIL 2";
} while (console.log(b || "PASS"));
}
expect: {
L: do {
if (console) {
var a = "FAIL 1";
if (a)
continue L;
}
var b = "FAIL 2";
} while (console.log(b || "PASS"));
}
expect_stdout: "PASS"
}
issue_5770_2: {
options = {
conditionals: true,
dead_code: true,
if_return: true,
loops: true,
merge_vars: true,
toplevel: true,
}
input: {
L: do {
for (var a = "FAIL 1"; a; a--)
continue L;
var b = "FAIL 2";
} while (console.log(b || "PASS"));
}
expect: {
L: do {
var a = "FAIL 1";
var b;
} while (a || (b = "FAIL 2"), console.log(b || "PASS"));
}
expect_stdout: "PASS"
}

View File

@@ -363,9 +363,17 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
node.condition, node.condition,
node.body, node.body,
node.alternative, node.alternative,
][ (node.start._permute * steps | 0) % 3 ]; node,
][ (node.start._permute * steps | 0) % 4 ];
node.start._permute += step; node.start._permute += step;
if (expr) { if (expr === node) {
if (node.alternative) {
expr = node.clone();
expr.alternative = null;
CHANGED = true;
return expr;
}
} else if (expr) {
// replace if statement with its condition, then block or else block // replace if statement with its condition, then block or else block
CHANGED = true; CHANGED = true;
return to_statement(expr); return to_statement(expr);