@@ -1235,7 +1235,7 @@ merge(Compressor.prototype, {
1235
1235
var lvalues = get_lvalues ( candidate ) ;
1236
1236
var lhs_local = is_lhs_local ( lhs ) ;
1237
1237
if ( ! side_effects ) side_effects = value_has_side_effects ( candidate ) ;
1238
- var replace_all = replace_all_symbols ( ) ;
1238
+ var replace_all = replace_all_symbols ( candidate ) ;
1239
1239
var may_throw = candidate . may_throw ( compressor ) ? in_try ? function ( node ) {
1240
1240
return node . has_side_effects ( compressor ) ;
1241
1241
} : side_effects_external : return_false ;
@@ -1312,6 +1312,7 @@ merge(Compressor.prototype, {
1312
1312
1313
1313
function in_conditional ( node , parent ) {
1314
1314
if ( parent instanceof AST_Binary ) return lazy_op [ parent . operator ] && parent . left !== node ;
1315
+ if ( parent instanceof AST_Case ) return parent . expression !== node ;
1315
1316
if ( parent instanceof AST_Conditional ) return parent . condition !== node ;
1316
1317
return parent instanceof AST_If && parent . condition !== node ;
1317
1318
}
@@ -1477,19 +1478,43 @@ merge(Compressor.prototype, {
1477
1478
if ( parent instanceof AST_Call ) return node ;
1478
1479
if ( parent instanceof AST_Case ) return node ;
1479
1480
if ( parent instanceof AST_Conditional ) return node ;
1480
- if ( parent instanceof AST_Definitions ) return find_stop ( parent , level + 1 ) ;
1481
+ if ( parent instanceof AST_Definitions ) return find_stop_unused ( parent , level + 1 ) ;
1481
1482
if ( parent instanceof AST_Exit ) return node ;
1482
1483
if ( parent instanceof AST_If ) return node ;
1483
1484
if ( parent instanceof AST_IterationStatement ) return node ;
1484
1485
if ( parent instanceof AST_PropAccess ) return node ;
1485
- if ( parent instanceof AST_Sequence ) return find_stop ( parent , level + 1 ) ;
1486
- if ( parent instanceof AST_SimpleStatement ) return find_stop ( parent , level + 1 ) ;
1486
+ if ( parent instanceof AST_Sequence ) {
1487
+ return ( parent . tail_node ( ) === node ? find_stop : find_stop_unused ) ( parent , level + 1 ) ;
1488
+ }
1489
+ if ( parent instanceof AST_SimpleStatement ) return find_stop_unused ( parent , level + 1 ) ;
1487
1490
if ( parent instanceof AST_Switch ) return node ;
1488
1491
if ( parent instanceof AST_Unary ) return node ;
1489
1492
if ( parent instanceof AST_VarDef ) return node ;
1490
1493
return null ;
1491
1494
}
1492
1495
1496
+ function find_stop_unused ( node , level ) {
1497
+ var parent = scanner . parent ( level ) ;
1498
+ if ( is_last_node ( node , parent ) ) return node ;
1499
+ if ( in_conditional ( node , parent ) ) return node ;
1500
+ if ( parent instanceof AST_Assign ) return find_stop_unused ( parent , level + 1 ) ;
1501
+ if ( parent instanceof AST_Binary ) return find_stop_unused ( parent , level + 1 ) ;
1502
+ if ( parent instanceof AST_Call ) return find_stop_unused ( parent , level + 1 ) ;
1503
+ if ( parent instanceof AST_Case ) return find_stop_unused ( parent , level + 1 ) ;
1504
+ if ( parent instanceof AST_Conditional ) return find_stop_unused ( parent , level + 1 ) ;
1505
+ if ( parent instanceof AST_Definitions ) return find_stop_unused ( parent , level + 1 ) ;
1506
+ if ( parent instanceof AST_Exit ) return find_stop_unused ( parent , level + 1 ) ;
1507
+ if ( parent instanceof AST_If ) return find_stop_unused ( parent , level + 1 ) ;
1508
+ if ( parent instanceof AST_IterationStatement ) return node ;
1509
+ if ( parent instanceof AST_PropAccess ) return find_stop_unused ( parent , level + 1 ) ;
1510
+ if ( parent instanceof AST_Sequence ) return find_stop_unused ( parent , level + 1 ) ;
1511
+ if ( parent instanceof AST_SimpleStatement ) return find_stop_unused ( parent , level + 1 ) ;
1512
+ if ( parent instanceof AST_Switch ) return find_stop_unused ( parent , level + 1 ) ;
1513
+ if ( parent instanceof AST_Unary ) return find_stop_unused ( parent , level + 1 ) ;
1514
+ if ( parent instanceof AST_VarDef ) return find_stop_unused ( parent , level + 1 ) ;
1515
+ return null ;
1516
+ }
1517
+
1493
1518
function mangleable_var ( var_def ) {
1494
1519
var value = var_def . value ;
1495
1520
if ( ! ( value instanceof AST_SymbolRef ) ) return ;
@@ -1656,7 +1681,8 @@ merge(Compressor.prototype, {
1656
1681
return get_rvalue ( expr ) . has_side_effects ( compressor ) ;
1657
1682
}
1658
1683
1659
- function replace_all_symbols ( ) {
1684
+ function replace_all_symbols ( expr ) {
1685
+ if ( expr instanceof AST_Unary ) return false ;
1660
1686
if ( side_effects ) return false ;
1661
1687
if ( value_def ) return true ;
1662
1688
if ( lhs instanceof AST_SymbolRef ) {
0 commit comments