From: Alex Lam S.L Date: Tue, 4 Aug 2020 12:05:10 +0000 (+0800) Subject: fix corner case in `evaluate` (#4036) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=a4002ef46799438614ff0b902551fa7fedf2c884;p=UglifyJS.git fix corner case in `evaluate` (#4036) fixes #4035 --- diff --git a/lib/compress.js b/lib/compress.js index fbc2bf7d..650a7634 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -7436,56 +7436,58 @@ merge(Compressor.prototype, { } break; } - if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) { - // 0 + n => n - case "+": - if (self.left.value == 0) { - if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, { - operator: "+", - expression: self.right - }).optimize(compressor); - if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right; - } - break; - // 1 * n => n - case "*": - if (self.left.value == 1) { - return self.right.is_number(compressor) ? self.right : make_node(AST_UnaryPrefix, self, { - operator: "+", - expression: self.right - }).optimize(compressor); - } - break; - } - if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) { - // n + 0 => n - case "+": - if (self.right.value == 0) { - if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, { - operator: "+", - expression: self.left - }).optimize(compressor); - if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left; - } - break; - // n - 0 => n - case "-": - if (self.right.value == 0) { - return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, { - operator: "+", - expression: self.left - }).optimize(compressor); + if (!(parent instanceof AST_UnaryPrefix && parent.operator == "delete")) { + if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) { + // 0 + n => n + case "+": + if (self.left.value == 0) { + if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, { + operator: "+", + expression: self.right + }).optimize(compressor); + if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right; + } + break; + // 1 * n => n + case "*": + if (self.left.value == 1) { + return self.right.is_number(compressor) ? self.right : make_node(AST_UnaryPrefix, self, { + operator: "+", + expression: self.right + }).optimize(compressor); + } + break; } - break; - // n / 1 => n - case "/": - if (self.right.value == 1) { - return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, { - operator: "+", - expression: self.left - }).optimize(compressor); + if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) { + // n + 0 => n + case "+": + if (self.right.value == 0) { + if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, { + operator: "+", + expression: self.left + }).optimize(compressor); + if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left; + } + break; + // n - 0 => n + case "-": + if (self.right.value == 0) { + return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, { + operator: "+", + expression: self.left + }).optimize(compressor); + } + break; + // n / 1 => n + case "/": + if (self.right.value == 1) { + return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, { + operator: "+", + expression: self.left + }).optimize(compressor); + } + break; } - break; } } if (compressor.option("typeofs")) switch (self.operator) { diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index dd94f613..b5b74ac0 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -2833,3 +2833,39 @@ issue_3997: { } expect_stdout: "string" } + +issue_4035: { + options = { + evaluate: true, + reduce_vars: true, + } + input: { + var a = 0; + (function() { + var b = --a; + console.log(delete (0 + b)); + console.log(delete (1 * b)); + console.log(delete (b + 0)); + console.log(delete (b - 0)); + console.log(delete (b / 1)); + })(); + } + expect: { + var a = 0; + (function() { + var b = --a; + console.log((0 + b, true)); + console.log((1 * b, true)); + console.log((0 + b, true)); + console.log((b - 0, true)); + console.log((b / 1, true)); + })(); + } + expect_stdout: [ + "true", + "true", + "true", + "true", + "true", + ] +}