From cb4a02949e14a8ffad88c327204f016407218ce9 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Tue, 22 Dec 2020 23:01:50 +0000 Subject: [PATCH] fix corner case with `NaN` (#4437) fixes #4436 --- lib/compress.js | 28 ++++++----- test/compress/destructured.js | 87 +++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 15 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 81fe8866..38342326 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -9297,10 +9297,9 @@ merge(Compressor.prototype, { OPT(AST_Infinity, function(self, compressor) { var lhs = is_lhs(compressor.self(), compressor.parent()); if (lhs && is_atomic(lhs, self)) return self; - if (compressor.option("keep_infinity") - && !(lhs && !is_atomic(lhs, self)) - && !find_scope(compressor).find_variable("Infinity")) + if (compressor.option("keep_infinity") && !lhs && !find_scope(compressor).find_variable("Infinity")) { return self; + } return make_node(AST_Binary, self, { operator: "/", left: make_node(AST_Number, self, { @@ -9314,18 +9313,17 @@ merge(Compressor.prototype, { OPT(AST_NaN, function(self, compressor) { var lhs = is_lhs(compressor.self(), compressor.parent()); - if (lhs && !is_atomic(lhs, self) || find_scope(compressor).find_variable("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; + if (lhs && is_atomic(lhs, self)) return self; + if (!lhs && !find_scope(compressor).find_variable("NaN")) return self; + return make_node(AST_Binary, self, { + operator: "/", + left: make_node(AST_Number, self, { + value: 0 + }), + right: make_node(AST_Number, self, { + value: 0 + }) + }); }); function is_reachable(self, defs) { diff --git a/test/compress/destructured.js b/test/compress/destructured.js index d36bbf33..17aa786a 100644 --- a/test/compress/destructured.js +++ b/test/compress/destructured.js @@ -2037,3 +2037,90 @@ issue_4425: { expect_stdout: "PASS" node_version: ">=8" } + +issue_4436_Infinity: { + options = { + unused: true, + } + input: { + console.log(function({ + [delete Infinity]: a, + }) { + var Infinity; + return a; + }({ + true: "FAIL", + false: "PASS", + })); + } + expect: { + console.log(function({ + [delete Infinity]: a, + }) { + return a; + }({ + true: "FAIL", + false: "PASS", + })); + } + expect_stdout: true + node_version: ">=6" +} + +issue_4436_NaN: { + options = { + unused: true, + } + input: { + console.log(function({ + [delete NaN]: a, + }) { + var NaN; + return a; + }({ + true: "FAIL", + false: "PASS", + })); + } + expect: { + console.log(function({ + [delete NaN]: a, + }) { + return a; + }({ + true: "FAIL", + false: "PASS", + })); + } + expect_stdout: true + node_version: ">=6" +} + +issue_4436_undefined: { + options = { + unused: true, + } + input: { + console.log(function({ + [delete undefined]: a, + }) { + var undefined; + return a; + }({ + true: "FAIL", + false: "PASS", + })); + } + expect: { + console.log(function({ + [delete undefined]: a, + }) { + return a; + }({ + true: "FAIL", + false: "PASS", + })); + } + expect_stdout: true + node_version: ">=6" +} -- 2.34.1