@@ -607,10 +607,7 @@ merge(Compressor.prototype, {
607
607
return statements ;
608
608
609
609
function is_lvalue ( node , parent ) {
610
- return node instanceof AST_SymbolRef && (
611
- ( parent instanceof AST_Assign && node === parent . left )
612
- || ( parent instanceof AST_Unary && parent . expression === node
613
- && ( parent . operator == "++" || parent . operator == "--" ) ) ) ;
610
+ return node instanceof AST_SymbolRef && isLHS ( node , parent ) ;
614
611
}
615
612
function replace_var ( node , parent , is_constant ) {
616
613
if ( is_lvalue ( node , parent ) ) return node ;
@@ -1152,7 +1149,7 @@ merge(Compressor.prototype, {
1152
1149
} ) ;
1153
1150
1154
1151
function isLHS ( node , parent ) {
1155
- return parent instanceof AST_Unary && ( parent . operator === "++" || parent . operator = == "--" )
1152
+ return parent instanceof AST_Unary && ( parent . operator == "++" || parent . operator == "--" )
1156
1153
|| parent instanceof AST_Assign && parent . left === node ;
1157
1154
}
1158
1155
@@ -2832,21 +2829,35 @@ merge(Compressor.prototype, {
2832
2829
self . car = self . car . drop_side_effect_free ( compressor , first_in_statement ( compressor ) ) ;
2833
2830
if ( ! self . car ) return maintain_this_binding ( compressor . parent ( ) , self , self . cdr ) ;
2834
2831
if ( compressor . option ( "cascade" ) ) {
2832
+ var left ;
2835
2833
if ( self . car instanceof AST_Assign
2836
2834
&& ! self . car . left . has_side_effects ( compressor ) ) {
2837
- if ( self . car . left . equivalent_to ( self . cdr ) ) {
2838
- return self . car ;
2839
- }
2840
- if ( self . cdr instanceof AST_Call
2841
- && self . cdr . expression . equivalent_to ( self . car . left ) ) {
2842
- self . cdr . expression = self . car ;
2843
- return self . cdr ;
2835
+ left = self . car . left ;
2836
+ } else if ( self . car instanceof AST_UnaryPostfix
2837
+ && ( self . car . operator == "++" || self . car . operator == "--" ) ) {
2838
+ left = self . car . expression ;
2839
+ }
2840
+ if ( left ) {
2841
+ var parent , field ;
2842
+ var cdr = self . cdr ;
2843
+ while ( true ) {
2844
+ if ( cdr . equivalent_to ( left ) ) {
2845
+ if ( parent ) {
2846
+ parent [ field ] = self . car ;
2847
+ return self . cdr ;
2848
+ }
2849
+ return self . car ;
2850
+ }
2851
+ if ( cdr instanceof AST_Binary && ! ( cdr instanceof AST_Assign ) ) {
2852
+ field = cdr . left . is_constant ( ) ? "right" : "left" ;
2853
+ } else if ( cdr instanceof AST_Call
2854
+ || cdr instanceof AST_Unary && cdr . operator != "++" && cdr . operator != "--" ) {
2855
+ field = "expression" ;
2856
+ } else break ;
2857
+ parent = cdr ;
2858
+ cdr = cdr [ field ] ;
2844
2859
}
2845
2860
}
2846
- if ( ! self . car . has_side_effects ( compressor )
2847
- && self . car . equivalent_to ( self . cdr ) ) {
2848
- return self . car ;
2849
- }
2850
2861
}
2851
2862
if ( is_undefined ( self . cdr ) ) {
2852
2863
return make_node ( AST_UnaryPrefix , self , {
0 commit comments