diff --git a/lib/compress.js b/lib/compress.js index 1ea3b553..196f2445 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1552,6 +1552,12 @@ Compressor.prototype.compress = function(node) { AST_SymbolDeclaration.DEFMETHOD("convert_symbol", convert_symbol); AST_SymbolRef.DEFMETHOD("convert_symbol", convert_symbol); + function process_to_assign(ref) { + var def = ref.definition(); + def.assignments++; + def.references.push(ref); + } + function mark_destructured(process, tw) { var marker = new TreeWalker(function(node) { if (node instanceof AST_DefaultValue) { @@ -3539,9 +3545,7 @@ Compressor.prototype.compress = function(node) { if (!var_def.value) return; exprs.push(make_node(AST_Assign, var_def, { operator: "=", - left: var_def.name.convert_symbol(AST_SymbolRef, function(ref) { - ref.definition().references.push(ref); - }), + left: var_def.name.convert_symbol(AST_SymbolRef, process_to_assign), right: var_def.value, })); }); @@ -9084,9 +9088,7 @@ Compressor.prototype.compress = function(node) { body: make_sequence(self.body, body_exprs), }); } - body_refs.forEach(function(ref) { - ref.definition().references.push(ref); - }); + body_refs.forEach(process_to_assign); } if (alt_exprs) { [].push.apply(body, alt_defuns); @@ -9100,9 +9102,7 @@ Compressor.prototype.compress = function(node) { body: make_sequence(self.alternative, alt_exprs), }); } - alt_refs.forEach(function(ref) { - ref.definition().references.push(ref); - }); + alt_refs.forEach(process_to_assign); } if (var_defs.length > 0) body.push(make_node(AST_Var, self, { definitions: var_defs })); if (body.length > 0) { @@ -9146,12 +9146,8 @@ Compressor.prototype.compress = function(node) { }), }).optimize(compressor)); } - body_refs.forEach(function(ref) { - ref.definition().references.push(ref); - }); - alt_refs.forEach(function(ref) { - ref.definition().references.push(ref); - }); + body_refs.forEach(process_to_assign); + alt_refs.forEach(process_to_assign); return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor); } if (is_empty(self.body)) self = make_node(AST_If, self, { @@ -10450,6 +10446,7 @@ Compressor.prototype.compress = function(node) { scope.enclosed.push(def); if (!value) return; var sym = make_node(AST_SymbolRef, name, name); + def.assignments++; def.references.push(sym); expressions.push(make_node(AST_Assign, self, { operator: "=", @@ -10523,6 +10520,7 @@ Compressor.prototype.compress = function(node) { function process(ref, name) { var def = name.definition(); + def.assignments++; def.references.push(ref); var symbol = make_node(AST_SymbolVar, name, name); def.orig.push(symbol); diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index a7a96078..1075def5 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -2007,3 +2007,58 @@ issue_5232_3: { "undefined", ] } + +issue_5334_1: { + options = { + conditionals: true, + hoist_props: true, + reduce_vars: true, + side_effects: true, + toplevel: true, + unused: true, + } + input: { + function f() { + if (console.log("PASS")) + var o = true, o = { + p: o += console.log("FAIL"), + }; + } + f(); + } + expect: { + (function() { + var o; + console.log("PASS") && (o = true, o = { + p: o += console.log("FAIL"), + }); + })(); + } + expect_stdout: "PASS" +} + +issue_5334_2: { + options = { + conditionals: true, + hoist_props: true, + inline: true, + passes: 3, + reduce_vars: true, + side_effects: true, + toplevel: true, + unused: true, + } + input: { + function f() { + if (console.log("PASS")) + var o = true, o = { + p: o += console.log("FAIL"), + }; + } + f(); + } + expect: { + console.log("PASS") && console.log("FAIL"); + } + expect_stdout: "PASS" +}