Skip to content

Commit f07dc5c

Browse files
authored
fix corner case in merge_vars (#5773)
fixes #5772
1 parent 358faaa commit f07dc5c

File tree

2 files changed

+81
-14
lines changed

2 files changed

+81
-14
lines changed

lib/compress.js

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

66496649
function walk_cond(condition, consequent, alternative) {
66506650
var save = segment;
6651-
var segments = scan_branches(condition, consequent, alternative);
6651+
var segments = scan_branches(1, condition, consequent, alternative);
66526652
if (consequent) {
6653-
segment = segments[0];
6654-
pop();
6653+
segment = segments.consequent.segment;
6654+
for (var i = segments.consequent.level; --i >= 0;) pop();
66556655
if (segment !== save) return;
66566656
}
66576657
if (alternative) {
6658-
segment = segments[1];
6659-
pop();
6658+
segment = segments.alternative.segment;
6659+
for (var i = segments.alternative.level; --i >= 0;) pop();
66606660
if (segment !== save) return;
66616661
}
66626662
segment = save;
66636663
}
66646664

6665-
function scan_branches(condition, consequent, alternative) {
6666-
var segments = [ segment, segment ];
6665+
function scan_branches(level, condition, consequent, alternative) {
6666+
var segments = {
6667+
consequent: {
6668+
segment: segment,
6669+
level: level,
6670+
},
6671+
alternative: {
6672+
segment: segment,
6673+
level: level,
6674+
},
6675+
}
66676676
if (condition instanceof AST_Binary) switch (condition.operator) {
66686677
case "&&":
6669-
segments[0] = scan_branches(condition.left, condition.right)[0];
6678+
segments.consequent = scan_branches(level + 1, condition.left, condition.right).consequent;
66706679
break;
66716680
case "||":
66726681
case "??":
6673-
segments[1] = scan_branches(condition.left, null, condition.right)[1];
6682+
segments.alternative = scan_branches(level + 1, condition.left, null, condition.right).alternative;
66746683
break;
66756684
default:
66766685
condition.walk(tw);
66776686
break;
66786687
} else if (condition instanceof AST_Conditional) {
6679-
scan_branches(condition.condition, condition.consequent, condition.alternative);
6688+
scan_branches(level + 1, condition.condition, condition.consequent, condition.alternative);
66806689
} else {
66816690
condition.walk(tw);
66826691
}
66836692
if (consequent) {
6684-
segment = segments[0];
6693+
segment = segments.consequent.segment;
66856694
push();
66866695
consequent.walk(tw);
6687-
segments[0] = segment;
6696+
segments.consequent.segment = segment;
66886697
}
66896698
if (alternative) {
6690-
segment = segments[1];
6699+
segment = segments.alternative.segment;
66916700
push();
66926701
alternative.walk(tw);
6693-
segments[1] = segment;
6702+
segments.alternative.segment = segment;
66946703
}
66956704
return segments;
66966705
}

test/compress/merge_vars.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3942,3 +3942,61 @@ issue_5770_2: {
39423942
}
39433943
expect_stdout: "PASS"
39443944
}
3945+
3946+
issue_5772_1: {
3947+
options = {
3948+
dead_code: true,
3949+
merge_vars: true,
3950+
loops: true,
3951+
}
3952+
input: {
3953+
(function(a) {
3954+
while (--a)
3955+
return;
3956+
var b = console.log("foo") && (c = 42) ? 0 : console.log(c);
3957+
var c = b;
3958+
})();
3959+
}
3960+
expect: {
3961+
(function(a) {
3962+
if (--a)
3963+
return;
3964+
var a = console.log("foo") && (c = 42) ? 0 : console.log(c);
3965+
var c = a;
3966+
})();
3967+
}
3968+
expect_stdout: [
3969+
"foo",
3970+
"undefined",
3971+
]
3972+
}
3973+
3974+
issue_5772_2: {
3975+
options = {
3976+
dead_code: true,
3977+
merge_vars: true,
3978+
loops: true,
3979+
}
3980+
input: {
3981+
(function(a) {
3982+
while (--a)
3983+
return;
3984+
var b;
3985+
var c = console.log("foo") && (b = 1) ? 2 : 3;
3986+
console.log(b, c);
3987+
})();
3988+
}
3989+
expect: {
3990+
(function(a) {
3991+
if (--a)
3992+
return;
3993+
var b;
3994+
var a = console.log("foo") && (b = 1) ? 2 : 3;
3995+
console.log(b, a);
3996+
})();
3997+
}
3998+
expect_stdout: [
3999+
"foo",
4000+
"undefined 3",
4001+
]
4002+
}

0 commit comments

Comments
 (0)