diff --git a/lib/compress.js b/lib/compress.js index ad4c28ab..3c680401 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3240,9 +3240,11 @@ merge(Compressor.prototype, { if (var_defs.length > 1 && (!def.value || sym.orig.indexOf(def.name) > sym.eliminated)) { compressor.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name)); if (def.value) { + var ref = make_node(AST_SymbolRef, def.name, def.name); + sym.references.push(ref); var assign = make_node(AST_Assign, def, { operator: "=", - left: make_node(AST_SymbolRef, def.name, def.name), + left: ref, right: def.value }); if (fixed_ids[sym.id] === def) { @@ -3694,8 +3696,10 @@ merge(Compressor.prototype, { while (left instanceof AST_PropAccess) { left = left.expression; } - if (left instanceof AST_Symbol) return this; - return this.right.drop_side_effect_free(compressor); + if (left.is_constant_expression(compressor.find_parent(AST_Scope))) { + return this.right.drop_side_effect_free(compressor); + } + return this; }); def(AST_Conditional, function(compressor){ var consequent = this.consequent.drop_side_effect_free(compressor); diff --git a/lib/scope.js b/lib/scope.js index be4ad02b..7b2e4c02 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -411,7 +411,7 @@ AST_Scope.DEFMETHOD("find_variable", function(name){ AST_Scope.DEFMETHOD("def_function", function(symbol, init){ var def = this.def_variable(symbol, init); - if (!def.init) def.init = init; + if (!def.init || def.init instanceof AST_Defun) def.init = init; this.functions.set(symbol.name, def); return def; }); diff --git a/package.json b/package.json index be6cbf19..a36cae3b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "homepage": "https://github.com/mishoo/UglifyJS2/tree/harmony", "author": "Mihai Bazon (http://lisperator.net/)", "license": "BSD-2-Clause", - "version": "3.3.8", + "version": "3.3.9", "engines": { "node": ">=0.8.0" }, diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index 0324d722..4f629e51 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -2066,3 +2066,30 @@ issue_2768: { } expect_stdout: "PASS undefined" } + +issue_2846: { + options = { + collapse_vars: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function f(a, b) { + var a = 0; + b && b(a); + return a++; + } + var c = f(); + console.log(c); + } + expect: { + var c = function(a, b) { + a = 0; + b && b(a); + return a++; + }(); + console.log(c); + } + expect_stdout: "0" +} diff --git a/test/compress/pure_getters.js b/test/compress/pure_getters.js index 55fce16e..9a9a7816 100644 --- a/test/compress/pure_getters.js +++ b/test/compress/pure_getters.js @@ -818,3 +818,30 @@ issue_2678: { } expect_stdout: "PASS" } + +issue_2838: { + options = { + pure_getters: true, + side_effects: true, + } + input: { + function f(a, b) { + (a || b).c = "PASS"; + (function() { + return f(a, b); + }).prototype.foo = "bar"; + } + var o = {}; + f(null, o); + console.log(o.c); + } + expect: { + function f(a, b) { + (a || b).c = "PASS"; + } + var o = {}; + f(null, o); + console.log(o.c); + } + expect_stdout: "PASS" +} diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index 5194f242..311ad7c4 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -5950,3 +5950,26 @@ issue_2799_2: { } expect_stdout: "PASS" } + +issue_2836: { + options = { + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function f() { + return "FAIL"; + } + console.log(f()); + function f() { + return "PASS"; + } + } + expect: { + console.log(function() { + return "PASS"; + }()); + } + expect_stdout: "PASS" +}