Skip to content

Commit bb22536

Browse files
authored
fix corner case collapse_vars (#4921)
fixes #4920
1 parent bbca9de commit bb22536

File tree

2 files changed

+54
-22
lines changed

2 files changed

+54
-22
lines changed

lib/compress.js

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2446,6 +2446,25 @@ merge(Compressor.prototype, {
24462446
return node;
24472447
}
24482448

2449+
function find_stop_expr(expr, cont, node, parent, level) {
2450+
var replace = can_replace;
2451+
can_replace = false;
2452+
var after = stop_after;
2453+
var if_hit = stop_if_hit;
2454+
var stack = scanner.stack;
2455+
scanner.stack = [ parent ];
2456+
expr.transform(scanner);
2457+
scanner.stack = stack;
2458+
stop_if_hit = if_hit;
2459+
stop_after = after;
2460+
can_replace = replace;
2461+
if (abort) {
2462+
abort = false;
2463+
return node;
2464+
}
2465+
return cont(parent, level + 1);
2466+
}
2467+
24492468
function find_stop_value(node, level) {
24502469
var parent = scanner.parent(level);
24512470
if (parent instanceof AST_Array) return find_stop_value(parent, level + 1);
@@ -2497,7 +2516,11 @@ merge(Compressor.prototype, {
24972516
return prop instanceof AST_ObjectKeyVal;
24982517
}) ? find_stop_value(obj, level + 2) : obj;
24992518
}
2500-
if (parent instanceof AST_PropAccess) return find_stop_value(parent, level + 1);
2519+
if (parent instanceof AST_PropAccess) {
2520+
var exp = parent.expression;
2521+
if (exp === node) return find_stop_value(parent, level + 1);
2522+
return find_stop_expr(exp, find_stop_value, node, parent, level);
2523+
}
25012524
if (parent instanceof AST_Sequence) {
25022525
return (parent.tail_node() === node ? find_stop_value : find_stop_unused)(parent, level + 1);
25032526
}
@@ -2546,7 +2569,7 @@ merge(Compressor.prototype, {
25462569
if (parent instanceof AST_PropAccess) {
25472570
var exp = parent.expression;
25482571
if (exp === node) return find_stop_unused(parent, level + 1);
2549-
return check_expr(exp);
2572+
return find_stop_expr(exp, find_stop_unused, node, parent, level);
25502573
}
25512574
if (parent instanceof AST_Sequence) return find_stop_unused(parent, level + 1);
25522575
if (parent instanceof AST_SimpleStatement) return find_stop_unused(parent, level + 1);
@@ -2557,28 +2580,11 @@ merge(Compressor.prototype, {
25572580
if (parent instanceof AST_Yield) return node;
25582581
return null;
25592582

2560-
function check_expr(expr) {
2561-
var replace = can_replace;
2562-
can_replace = false;
2563-
var after = stop_after;
2564-
var if_hit = stop_if_hit;
2565-
var stack = scanner.stack;
2566-
scanner.stack = [ parent ];
2567-
expr.transform(scanner);
2568-
scanner.stack = stack;
2569-
stop_if_hit = if_hit;
2570-
stop_after = after;
2571-
can_replace = replace;
2572-
if (abort) {
2573-
abort = false;
2574-
return node;
2575-
}
2576-
return find_stop_unused(parent, level + 1);
2577-
}
2578-
25792583
function check_assignment(lhs) {
25802584
if (may_throw(parent)) return node;
2581-
if (lhs !== node && lhs instanceof AST_Destructured) return check_expr(lhs);
2585+
if (lhs !== node && lhs instanceof AST_Destructured) {
2586+
return find_stop_expr(lhs, find_stop_unused, node, parent, level);
2587+
}
25822588
return find_stop_unused(parent, level + 1);
25832589
}
25842590
}

test/compress/collapse_vars.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9194,3 +9194,29 @@ issue_4918: {
91949194
}
91959195
expect_stdout: "PASS"
91969196
}
9197+
9198+
issue_4920: {
9199+
options = {
9200+
collapse_vars: true,
9201+
toplevel: true,
9202+
}
9203+
input: {
9204+
var a = "PASS", b;
9205+
({
9206+
get PASS() {
9207+
a = "FAIL";
9208+
},
9209+
})[b = a];
9210+
console.log(b);
9211+
}
9212+
expect: {
9213+
var a = "PASS", b;
9214+
({
9215+
get PASS() {
9216+
a = "FAIL";
9217+
},
9218+
})[b = a];
9219+
console.log(b);
9220+
}
9221+
expect_stdout: "PASS"
9222+
}

0 commit comments

Comments
 (0)