From: Alex Lam S.L Date: Sun, 26 Mar 2017 11:14:30 +0000 (+0800) Subject: fix `delete` related issues in `collapse_vars` and `reduce_vars` (#1689) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=861a79ac9fdb2cdbb54054306eb896e2c134af73;p=UglifyJS.git fix `delete` related issues in `collapse_vars` and `reduce_vars` (#1689) --- diff --git a/lib/compress.js b/lib/compress.js index a617adbe..83486b61 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1207,8 +1207,10 @@ merge(Compressor.prototype, { node.DEFMETHOD("is_string", func); }); + var unary_side_effects = makePredicate("delete ++ --"); + function isLHS(node, parent) { - return parent instanceof AST_Unary && (parent.operator == "++" || parent.operator == "--") + return parent instanceof AST_Unary && unary_side_effects(parent.operator) || parent instanceof AST_Assign && parent.left === node; } @@ -1643,9 +1645,7 @@ merge(Compressor.prototype, { || this.alternative.has_side_effects(compressor); }); def(AST_Unary, function(compressor){ - return this.operator == "delete" - || this.operator == "++" - || this.operator == "--" + return unary_side_effects(this.operator) || this.expression.has_side_effects(compressor); }); def(AST_SymbolRef, function(compressor){ @@ -2196,26 +2196,19 @@ merge(Compressor.prototype, { return node; }); def(AST_Unary, function(compressor, first_in_statement){ - switch (this.operator) { - case "delete": - case "++": - case "--": - return this; - case "typeof": - if (this.expression instanceof AST_SymbolRef) return null; - default: - var expression = this.expression.drop_side_effect_free(compressor, first_in_statement); - if (first_in_statement - && this instanceof AST_UnaryPrefix - && is_iife_call(expression)) { - if (expression === this.expression && this.operator.length === 1) return this; - return make_node(AST_UnaryPrefix, this, { - operator: this.operator.length === 1 ? this.operator : "!", - expression: expression - }); - } - return expression; + if (unary_side_effects(this.operator)) return this; + if (this.operator == "typeof" && this.expression instanceof AST_SymbolRef) return null; + var expression = this.expression.drop_side_effect_free(compressor, first_in_statement); + if (first_in_statement + && this instanceof AST_UnaryPrefix + && is_iife_call(expression)) { + if (expression === this.expression && this.operator.length === 1) return this; + return make_node(AST_UnaryPrefix, this, { + operator: this.operator.length === 1 ? this.operator : "!", + expression: expression + }); } + return expression; }); def(AST_SymbolRef, function() { return this.undeclared() ? this : null; @@ -2945,10 +2938,7 @@ merge(Compressor.prototype, { field = "left"; } } else if (cdr instanceof AST_Call - || cdr instanceof AST_Unary - && cdr.operator != "delete" - && cdr.operator != "++" - && cdr.operator != "--") { + || cdr instanceof AST_Unary && !unary_side_effects(cdr.operator)) { field = "expression"; } else break; parent = cdr; diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 2437ca5f..4107707b 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -894,7 +894,8 @@ collapse_vars_unary: { } expect: { function f0(o, p) { - delete o[p]; + var x = o[p]; + delete x; } function f1(n) { return n > +!!n diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index 943dd290..f4dd68d2 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -1544,3 +1544,30 @@ issue_1670_6: { } expect_stdout: "1" } + +unary_delete: { + options = { + evaluate: true, + reduce_vars: true, + unused: true, + } + input: { + var b = 10; + function f() { + var a; + if (delete a) b--; + } + f(); + console.log(b); + } + expect: { + var b = 10; + function f() { + var a; + if (delete a) b--; + } + f(); + console.log(b); + } + expect_stdout: true +}