@@ -501,6 +501,23 @@ Compressor.prototype.compress = function(node) {
501
501
if (parent instanceof AST_VarDef) return parent.value === node;
502
502
}
503
503
504
+ function make_ref(ref, fixed) {
505
+ var node = make_node(AST_SymbolRef, ref);
506
+ node.fixed = fixed || make_node(AST_Undefined, ref);
507
+ return node;
508
+ }
509
+
510
+ function replace_ref(resolve, fixed) {
511
+ return function(node) {
512
+ var ref = resolve(node);
513
+ var node = make_ref(ref, fixed);
514
+ var def = ref.definition();
515
+ def.references.push(node);
516
+ def.replaced++;
517
+ return node;
518
+ };
519
+ }
520
+
504
521
var RE_POSITIVE_INTEGER = /^(0|[1-9][0-9]*)$/;
505
522
(function(def) {
506
523
def(AST_Node, noop);
@@ -705,22 +722,6 @@ Compressor.prototype.compress = function(node) {
705
722
});
706
723
}
707
724
708
- function make_ref(ref, fixed) {
709
- var node = make_node(AST_SymbolRef, ref);
710
- node.fixed = fixed || make_node(AST_Undefined, ref);
711
- return node;
712
- }
713
-
714
- function replace_ref(ref, fixed) {
715
- return function() {
716
- var node = make_ref(ref, fixed);
717
- var def = ref.definition();
718
- def.references.push(node);
719
- def.replaced++;
720
- return node;
721
- };
722
- }
723
-
724
725
function ref_once(compressor, def) {
725
726
return compressor.option("unused")
726
727
&& !def.scope.pinned()
@@ -1021,7 +1022,9 @@ Compressor.prototype.compress = function(node) {
1021
1022
};
1022
1023
left.fixed.assigns = !fixed || !fixed.assigns ? [ ld.orig[0] ] : fixed.assigns.slice();
1023
1024
left.fixed.assigns.push(node);
1024
- left.fixed.to_binary = replace_ref(left, fixed);
1025
+ left.fixed.to_binary = replace_ref(function(node) {
1026
+ return node.left;
1027
+ }, fixed);
1025
1028
} else {
1026
1029
left.walk(tw);
1027
1030
ld.fixed = false;
@@ -1529,7 +1532,9 @@ Compressor.prototype.compress = function(node) {
1529
1532
});
1530
1533
};
1531
1534
exp.fixed.assigns = fixed && fixed.assigns;
1532
- exp.fixed.to_prefix = replace_ref(exp, d.fixed);
1535
+ exp.fixed.to_prefix = replace_ref(function(node) {
1536
+ return node.expression;
1537
+ }, d.fixed);
1533
1538
}
1534
1539
} else {
1535
1540
exp.walk(tw);
@@ -2156,7 +2161,7 @@ Compressor.prototype.compress = function(node) {
2156
2161
abort = true;
2157
2162
folded = make_node(AST_Binary, candidate, {
2158
2163
operator: compound,
2159
- left: lhs.fixed && lhs.definition().fixed ? lhs.fixed.to_binary() : lhs,
2164
+ left: lhs.fixed && lhs.definition().fixed ? lhs.fixed.to_binary(candidate ) : lhs,
2160
2165
right: rvalue,
2161
2166
});
2162
2167
}
@@ -2220,7 +2225,7 @@ Compressor.prototype.compress = function(node) {
2220
2225
}
2221
2226
if (candidate instanceof AST_UnaryPostfix) return make_node(AST_UnaryPrefix, candidate, {
2222
2227
operator: candidate.operator,
2223
- expression: lhs.fixed && lhs.definition().fixed ? lhs.fixed.to_prefix() : lhs,
2228
+ expression: lhs.fixed && lhs.definition().fixed ? lhs.fixed.to_prefix(candidate ) : lhs,
2224
2229
});
2225
2230
if (candidate instanceof AST_UnaryPrefix) {
2226
2231
clear_write_only(candidate);
@@ -12780,34 +12785,19 @@ Compressor.prototype.compress = function(node) {
12780
12785
}
12781
12786
if (compressor.option("assignments")) {
12782
12787
if (self.operator == "=" && self.left instanceof AST_SymbolRef && self.right instanceof AST_Binary) {
12783
- var ref;
12784
12788
// x = expr1 OP expr2
12785
- if ((ref = self.right.left) instanceof AST_SymbolRef
12786
- && ref .name == self.left.name
12789
+ if (self.right.left instanceof AST_SymbolRef
12790
+ && self.right.left .name == self.left.name
12787
12791
&& ASSIGN_OPS[self.right.operator]) {
12788
12792
// x = x - 2 ---> x -= 2
12789
- if (self.left.fixed) self.left.fixed.to_binary = function() {
12790
- return ref;
12791
- };
12792
- return make_node(AST_Assign, self, {
12793
- operator: self.right.operator + "=",
12794
- left: self.left,
12795
- right: self.right.right,
12796
- });
12793
+ return make_compound(self.right.right);
12797
12794
}
12798
- if ((ref = self.right.right) instanceof AST_SymbolRef
12799
- && ref .name == self.left.name
12795
+ if (self.right.right instanceof AST_SymbolRef
12796
+ && self.right.right .name == self.left.name
12800
12797
&& ASSIGN_OPS_COMMUTATIVE[self.right.operator]
12801
12798
&& !self.right.left.has_side_effects(compressor)) {
12802
12799
// x = 2 & x ---> x &= 2
12803
- if (self.left.fixed) self.left.fixed.to_binary = function() {
12804
- return ref;
12805
- };
12806
- return make_node(AST_Assign, self, {
12807
- operator: self.right.operator + "=",
12808
- left: self.left,
12809
- right: self.right.left,
12810
- });
12800
+ return make_compound(self.right.left);
12811
12801
}
12812
12802
}
12813
12803
if ((self.operator == "-=" || self.operator == "+="
@@ -12870,6 +12860,18 @@ Compressor.prototype.compress = function(node) {
12870
12860
return find_try(compressor, level, node, scope, may_throw, sync);
12871
12861
}
12872
12862
12863
+ function make_compound(rhs) {
12864
+ var fixed = self.left.fixed;
12865
+ if (fixed) fixed.to_binary = replace_ref(function(node) {
12866
+ return node.left;
12867
+ }, fixed);
12868
+ return make_node(AST_Assign, self, {
12869
+ operator: self.right.operator + "=",
12870
+ left: self.left,
12871
+ right: rhs,
12872
+ });
12873
+ }
12874
+
12873
12875
function strip_assignment(def) {
12874
12876
if (def) def.fixed = false;
12875
12877
return (self.operator != "=" ? make_node(AST_Binary, self, {
0 commit comments