Skip to content

Commit 358faaa

Browse files
authored
fix corner case in merge_vars (#5771)
fixes #5770
1 parent c911704 commit 358faaa

File tree

3 files changed

+86
-11
lines changed

3 files changed

+86
-11
lines changed

lib/compress.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6648,36 +6648,50 @@ Compressor.prototype.compress = function(node) {
66486648

66496649
function walk_cond(condition, consequent, alternative) {
66506650
var save = segment;
6651-
var segments = [ save, save ];
6651+
var segments = scan_branches(condition, consequent, alternative);
6652+
if (consequent) {
6653+
segment = segments[0];
6654+
pop();
6655+
if (segment !== save) return;
6656+
}
6657+
if (alternative) {
6658+
segment = segments[1];
6659+
pop();
6660+
if (segment !== save) return;
6661+
}
6662+
segment = save;
6663+
}
6664+
6665+
function scan_branches(condition, consequent, alternative) {
6666+
var segments = [ segment, segment ];
66526667
if (condition instanceof AST_Binary) switch (condition.operator) {
66536668
case "&&":
6654-
segments[0] = walk_cond(condition.left, condition.right)[0];
6669+
segments[0] = scan_branches(condition.left, condition.right)[0];
66556670
break;
66566671
case "||":
66576672
case "??":
6658-
segments[1] = walk_cond(condition.left, null, condition.right)[1];
6673+
segments[1] = scan_branches(condition.left, null, condition.right)[1];
66596674
break;
66606675
default:
66616676
condition.walk(tw);
66626677
break;
66636678
} else if (condition instanceof AST_Conditional) {
6664-
walk_cond(condition.condition, condition.consequent, condition.alternative);
6679+
scan_branches(condition.condition, condition.consequent, condition.alternative);
66656680
} else {
66666681
condition.walk(tw);
66676682
}
6668-
segment = segments[0];
66696683
if (consequent) {
6684+
segment = segments[0];
66706685
push();
66716686
consequent.walk(tw);
6687+
segments[0] = segment;
66726688
}
6673-
segments[0] = segment;
6674-
segment = segments[1];
66756689
if (alternative) {
6690+
segment = segments[1];
66766691
push();
66776692
alternative.walk(tw);
6693+
segments[1] = segment;
66786694
}
6679-
segments[1] = segment;
6680-
segment = save;
66816695
return segments;
66826696
}
66836697
});

test/compress/merge_vars.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3889,3 +3889,56 @@ issue_5714: {
38893889
"42",
38903890
]
38913891
}
3892+
3893+
issue_5770_1: {
3894+
options = {
3895+
dead_code: true,
3896+
loops: true,
3897+
merge_vars: true,
3898+
toplevel: true,
3899+
}
3900+
input: {
3901+
L: do {
3902+
if (console)
3903+
for (var a = "FAIL 1"; a; a--)
3904+
continue L;
3905+
var b = "FAIL 2";
3906+
} while (console.log(b || "PASS"));
3907+
}
3908+
expect: {
3909+
L: do {
3910+
if (console) {
3911+
var a = "FAIL 1";
3912+
if (a)
3913+
continue L;
3914+
}
3915+
var b = "FAIL 2";
3916+
} while (console.log(b || "PASS"));
3917+
}
3918+
expect_stdout: "PASS"
3919+
}
3920+
3921+
issue_5770_2: {
3922+
options = {
3923+
conditionals: true,
3924+
dead_code: true,
3925+
if_return: true,
3926+
loops: true,
3927+
merge_vars: true,
3928+
toplevel: true,
3929+
}
3930+
input: {
3931+
L: do {
3932+
for (var a = "FAIL 1"; a; a--)
3933+
continue L;
3934+
var b = "FAIL 2";
3935+
} while (console.log(b || "PASS"));
3936+
}
3937+
expect: {
3938+
L: do {
3939+
var a = "FAIL 1";
3940+
var b;
3941+
} while (a || (b = "FAIL 2"), console.log(b || "PASS"));
3942+
}
3943+
expect_stdout: "PASS"
3944+
}

test/reduce.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,17 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
363363
node.condition,
364364
node.body,
365365
node.alternative,
366-
][ (node.start._permute * steps | 0) % 3 ];
366+
node,
367+
][ (node.start._permute * steps | 0) % 4 ];
367368
node.start._permute += step;
368-
if (expr) {
369+
if (expr === node) {
370+
if (node.alternative) {
371+
expr = node.clone();
372+
expr.alternative = null;
373+
CHANGED = true;
374+
return expr;
375+
}
376+
} else if (expr) {
369377
// replace if statement with its condition, then block or else block
370378
CHANGED = true;
371379
return to_statement(expr);

0 commit comments

Comments
 (0)