From: Alex Lam S.L Date: Mon, 18 Dec 2017 04:07:53 +0000 (+0800) Subject: drop property assignment to constants (#2612) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=0b0eac1d5dc6e1cc1e9bf3682871cafdda59066d;p=UglifyJS.git drop property assignment to constants (#2612) --- diff --git a/lib/compress.js b/lib/compress.js index 52c30964..735b4d2d 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1708,6 +1708,11 @@ merge(Compressor.prototype, { return this.consequent._dot_throw(compressor) || this.alternative._dot_throw(compressor); }) + def(AST_Dot, function(compressor) { + if (!is_strict(compressor)) return false; + if (this.expression instanceof AST_Function && this.property == "prototype") return false; + return true; + }); def(AST_Sequence, function(compressor) { return this.tail_node()._dot_throw(compressor); }); @@ -3184,8 +3189,14 @@ merge(Compressor.prototype, { } }); def(AST_Assign, function(compressor){ - this.write_only = !this.left.has_side_effects(compressor); - return this; + var left = this.left; + if (left.has_side_effects(compressor)) return this; + this.write_only = true; + while (left instanceof AST_PropAccess) { + left = left.expression; + } + if (left instanceof AST_Symbol) return this; + return this.right.drop_side_effect_free(compressor); }); def(AST_Conditional, function(compressor){ var consequent = this.consequent.drop_side_effect_free(compressor); diff --git a/test/compress/properties.js b/test/compress/properties.js index 6d4c0281..16374ef8 100644 --- a/test/compress/properties.js +++ b/test/compress/properties.js @@ -1054,3 +1054,43 @@ issue_2513: { "undefined undefined", ] } + +const_prop_assign_strict: { + options = { + pure_getters: "strict", + side_effects: true, + } + input: { + function Simulator() { + /abc/.index = 1; + this._aircraft = []; + } + (function() {}).prototype.destroy = x(); + } + expect: { + function Simulator() { + this._aircraft = []; + } + x(); + } +} + +const_prop_assign_pure: { + options = { + pure_getters: true, + side_effects: true, + } + input: { + function Simulator() { + /abc/.index = 1; + this._aircraft = []; + } + (function() {}).prototype.destroy = x(); + } + expect: { + function Simulator() { + this._aircraft = []; + } + x(); + } +}