From c0c04c33bb1652014365fa893cc9b7d29684e59a Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Tue, 13 Oct 2020 17:09:17 +0100 Subject: [PATCH] fix corner cases in `dead_code` & `reduce_vars` (#4213) fixes #4212 --- lib/compress.js | 9 ++++++--- test/compress/const.js | 46 ++++++++++++++++++++++++++++++++++++++++++ test/ufuzz/index.js | 35 ++++++++++++++++---------------- 3 files changed, 70 insertions(+), 20 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index e36fcaa7..5dd10c6c 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -485,9 +485,10 @@ merge(Compressor.prototype, { } function safe_to_assign(tw, def, declare) { - if (def.fixed === undefined) return declare || all(def.orig, function(sym) { + if (!(declare || all(def.orig, function(sym) { return !(sym instanceof AST_SymbolConst); - }); + }))) return false; + if (def.fixed === undefined) return true; if (def.fixed === null && def.safe_ids) { def.safe_ids[def.id] = false; delete def.safe_ids; @@ -8557,7 +8558,9 @@ merge(Compressor.prototype, { ]).optimize(compressor); } } - } else if (self.left instanceof AST_SymbolRef) { + } else if (self.left instanceof AST_SymbolRef && all(self.left.definition().orig, function(sym) { + return !(sym instanceof AST_SymbolConst); + })) { var parent; if (self.operator == "=" && self.left.equivalent_to(self.right) && !((parent = compressor.parent()) instanceof AST_UnaryPrefix && parent.operator == "delete")) { diff --git a/test/compress/const.js b/test/compress/const.js index b161e876..4411cbf8 100644 --- a/test/compress/const.js +++ b/test/compress/const.js @@ -963,3 +963,49 @@ issue_4210: { } expect_stdout: true } + +issue_4212_1: { + options = { + dead_code: true, + } + input: { + console.log({ + get b() { + const a = 0; + return a /= 0; + } + }.b); + } + expect: { + console.log({ + get b() { + const a = 0; + return a /= 0; + } + }.b); + } + expect_stdout: true +} + +issue_4212_2: { + options = { + reduce_vars: true, + } + input: { + console.log({ + get b() { + const a = 0; + return a /= 0; + } + }.b); + } + expect: { + console.log({ + get b() { + const a = 0; + return a /= 0; + } + }.b); + } + expect_stdout: true +} diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js index 3e2d865d..e650a46f 100644 --- a/test/ufuzz/index.js +++ b/test/ufuzz/index.js @@ -899,21 +899,22 @@ function getDotKey(assign) { function createAccessor(recurmax, stmtDepth, canThrow) { var namesLenBefore = VAR_NAMES.length; var s; - var prop1 = getDotKey(); - if (rng(2) == 0) { - s = [ - "get " + prop1 + "(){", - strictMode(), - createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth), - createStatement(recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth, STMT_RETURN_ETC), - "}," - ]; - } else { - var prop2; - do { - prop2 = getDotKey(); - } while (prop1 == prop2); - createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) { + createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) { + var prop1 = getDotKey(); + if (rng(2) == 0) { + s = [ + "get " + prop1 + "(){", + strictMode(), + defns(), + _createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth), + createStatement(recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth, STMT_RETURN_ETC), + "}," + ]; + } else { + var prop2; + do { + prop2 = getDotKey(); + } while (prop1 == prop2); s = [ "set " + prop1 + "(" + createVarName(MANDATORY) + "){", strictMode(), @@ -922,8 +923,8 @@ function createAccessor(recurmax, stmtDepth, canThrow) { "this." + prop2 + createAssignment() + _createBinaryExpr(recurmax, COMMA_OK, stmtDepth, canThrow) + ";", "}," ]; - }); - } + } + }); VAR_NAMES.length = namesLenBefore; return filterDirective(s).join("\n"); } -- 2.34.1