@@ -2446,6 +2446,25 @@ merge(Compressor.prototype, {
2446
2446
return node;
2447
2447
}
2448
2448
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
+
2449
2468
function find_stop_value(node, level) {
2450
2469
var parent = scanner.parent(level);
2451
2470
if (parent instanceof AST_Array) return find_stop_value(parent, level + 1);
@@ -2497,7 +2516,11 @@ merge(Compressor.prototype, {
2497
2516
return prop instanceof AST_ObjectKeyVal;
2498
2517
}) ? find_stop_value(obj, level + 2) : obj;
2499
2518
}
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
+ }
2501
2524
if (parent instanceof AST_Sequence) {
2502
2525
return (parent.tail_node() === node ? find_stop_value : find_stop_unused)(parent, level + 1);
2503
2526
}
@@ -2546,7 +2569,7 @@ merge(Compressor.prototype, {
2546
2569
if (parent instanceof AST_PropAccess) {
2547
2570
var exp = parent.expression;
2548
2571
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 );
2550
2573
}
2551
2574
if (parent instanceof AST_Sequence) return find_stop_unused(parent, level + 1);
2552
2575
if (parent instanceof AST_SimpleStatement) return find_stop_unused(parent, level + 1);
@@ -2557,28 +2580,11 @@ merge(Compressor.prototype, {
2557
2580
if (parent instanceof AST_Yield) return node;
2558
2581
return null;
2559
2582
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
-
2579
2583
function check_assignment(lhs) {
2580
2584
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
+ }
2582
2588
return find_stop_unused(parent, level + 1);
2583
2589
}
2584
2590
}
0 commit comments