@@ -501,6 +501,23 @@ Compressor.prototype.compress = function(node) {
501501 if (parent instanceof AST_VarDef) return parent.value === node;
502502 }
503503
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+
504521 var RE_POSITIVE_INTEGER = /^(0|[1-9][0-9]*)$/;
505522 (function(def) {
506523 def(AST_Node, noop);
@@ -705,22 +722,6 @@ Compressor.prototype.compress = function(node) {
705722 });
706723 }
707724
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-
724725 function ref_once(compressor, def) {
725726 return compressor.option("unused")
726727 && !def.scope.pinned()
@@ -1021,7 +1022,9 @@ Compressor.prototype.compress = function(node) {
10211022 };
10221023 left.fixed.assigns = !fixed || !fixed.assigns ? [ ld.orig[0] ] : fixed.assigns.slice();
10231024 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);
10251028 } else {
10261029 left.walk(tw);
10271030 ld.fixed = false;
@@ -1529,7 +1532,9 @@ Compressor.prototype.compress = function(node) {
15291532 });
15301533 };
15311534 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);
15331538 }
15341539 } else {
15351540 exp.walk(tw);
@@ -2156,7 +2161,7 @@ Compressor.prototype.compress = function(node) {
21562161 abort = true;
21572162 folded = make_node(AST_Binary, candidate, {
21582163 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,
21602165 right: rvalue,
21612166 });
21622167 }
@@ -2220,7 +2225,7 @@ Compressor.prototype.compress = function(node) {
22202225 }
22212226 if (candidate instanceof AST_UnaryPostfix) return make_node(AST_UnaryPrefix, candidate, {
22222227 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,
22242229 });
22252230 if (candidate instanceof AST_UnaryPrefix) {
22262231 clear_write_only(candidate);
@@ -12780,34 +12785,19 @@ Compressor.prototype.compress = function(node) {
1278012785 }
1278112786 if (compressor.option("assignments")) {
1278212787 if (self.operator == "=" && self.left instanceof AST_SymbolRef && self.right instanceof AST_Binary) {
12783- var ref;
1278412788 // 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
1278712791 && ASSIGN_OPS[self.right.operator]) {
1278812792 // 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);
1279712794 }
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
1280012797 && ASSIGN_OPS_COMMUTATIVE[self.right.operator]
1280112798 && !self.right.left.has_side_effects(compressor)) {
1280212799 // 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);
1281112801 }
1281212802 }
1281312803 if ((self.operator == "-=" || self.operator == "+="
@@ -12870,6 +12860,18 @@ Compressor.prototype.compress = function(node) {
1287012860 return find_try(compressor, level, node, scope, may_throw, sync);
1287112861 }
1287212862
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+
1287312875 function strip_assignment(def) {
1287412876 if (def) def.fixed = false;
1287512877 return (self.operator != "=" ? make_node(AST_Binary, self, {
0 commit comments