From: Alex Lam S.L Date: Fri, 7 Apr 2017 07:39:59 +0000 (+0800) Subject: fix corner cases with `delete` (#1796) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=e3c9c22c757112327b83f598b124690baf13ac52;p=UglifyJS.git fix corner cases with `delete` (#1796) `delete Infinity` returns `false` where as `delete (1/0)` returns `true` --- diff --git a/lib/compress.js b/lib/compress.js index c199d13f..b001d35c 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3620,6 +3620,11 @@ merge(Compressor.prototype, { return ref; } } + var parent = compressor.parent(); + if (parent instanceof AST_UnaryPrefix + && parent.operator == "delete" + && (parent.expression instanceof AST_SymbolRef + || parent.expression.TYPE === self.TYPE)) return self; return make_node(AST_UnaryPrefix, self, { operator: "void", expression: make_node(AST_Number, self, { @@ -3629,8 +3634,16 @@ merge(Compressor.prototype, { }); OPT(AST_Infinity, function(self, compressor){ - var retain = compressor.option("keep_infinity") && !find_variable(compressor, "Infinity"); - return retain ? self : make_node(AST_Binary, self, { + var parent = compressor.parent(); + if (parent instanceof AST_UnaryPrefix + && parent.operator == "delete" + && (parent.expression instanceof AST_SymbolRef + || parent.expression.TYPE === self.TYPE)) + return self; + if (compressor.option("keep_infinity") + && !find_variable(compressor, "Infinity")) + return self; + return make_node(AST_Binary, self, { operator: "/", left: make_node(AST_Number, self, { value: 1 @@ -3642,15 +3655,23 @@ merge(Compressor.prototype, { }); OPT(AST_NaN, function(self, compressor){ - return find_variable(compressor, "NaN") ? make_node(AST_Binary, self, { - operator: "/", - left: make_node(AST_Number, self, { - value: 0 - }), - right: make_node(AST_Number, self, { - value: 0 - }) - }) : self; + var parent = compressor.parent(); + if (parent instanceof AST_UnaryPrefix + && parent.operator == "delete" + && !(parent.expression instanceof AST_SymbolRef + || parent.expression.TYPE === self.TYPE) + || find_variable(compressor, "NaN")) { + return make_node(AST_Binary, self, { + operator: "/", + left: make_node(AST_Number, self, { + value: 0 + }), + right: make_node(AST_Number, self, { + value: 0 + }) + }); + } + return self; }); var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ]; diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index fa432c46..e660071d 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -857,3 +857,26 @@ issue_1760_2: { } expect_stdout: "Infinity" } + +delete_expr: { + options = { + evaluate: true, + } + input: { + console.log(delete undefined); + console.log(delete void 0); + console.log(delete Infinity); + console.log(delete (1 / 0)); + console.log(delete NaN); + console.log(delete (0 / 0)); + } + expect: { + console.log(delete undefined); + console.log(delete void 0); + console.log(delete Infinity); + console.log(delete (1 / 0)); + console.log(delete NaN); + console.log(delete (0 / 0)); + } + expect_stdout: true +}