From 0201cb4b5291681ea0869498d9da051f45997575 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Fri, 18 Oct 2019 20:08:05 +0800 Subject: [PATCH] fix corner case in `unused` (#3499) fixes #3497 --- lib/compress.js | 22 +++++++++++++++------- test/compress/drop-unused.js | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 33b62daa..0888c107 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2303,7 +2303,14 @@ merge(Compressor.prototype, { return true; }); def(AST_Binary, function(compressor) { - return lazy_op[this.operator] && (this.left._dot_throw(compressor) || this.right._dot_throw(compressor)); + switch (this.operator) { + case "&&": + return this.left._dot_throw(compressor) || this.right._dot_throw(compressor); + case "||": + return this.right._dot_throw(compressor); + default: + return false; + } }); def(AST_Conditional, function(compressor) { return this.consequent._dot_throw(compressor) || this.alternative._dot_throw(compressor); @@ -3528,10 +3535,10 @@ merge(Compressor.prototype, { var drop_vars = !(self instanceof AST_Toplevel) || compressor.toplevel.vars; var assign_as_unused = /keep_assign/.test(compressor.option("unused")) ? return_false : function(node, props) { var sym; - if (node instanceof AST_Assign && (node.write_only || node.operator == "=")) { - sym = node.left; - } else if (node instanceof AST_Unary && node.write_only) { - sym = node.expression; + if (node instanceof AST_Assign) { + if (node.write_only || node.operator == "=") sym = node.left; + } else if (node instanceof AST_Unary) { + if (node.write_only) sym = node.expression; } if (!/strict/.test(compressor.option("pure_getters"))) return sym instanceof AST_SymbolRef && sym; while (sym instanceof AST_PropAccess && !sym.expression.may_throw_on_access(compressor)) { @@ -3637,7 +3644,7 @@ merge(Compressor.prototype, { if (sym) { var def = sym.definition(); var in_use = def.id in in_use_ids; - var value = null; + var value; if (node instanceof AST_Assign) { if (!in_use || node.left === sym && def.id in fixed_ids && fixed_ids[def.id] !== node) { value = get_rhs(node); @@ -3885,6 +3892,7 @@ merge(Compressor.prototype, { prop.walk(tw); }); if (node instanceof AST_Assign) { + if (node.write_only === "p" && node.right.may_throw_on_access(compressor)) return; var right = get_rhs(node); right.walk(tw); if (node.left === sym) { @@ -4215,7 +4223,7 @@ merge(Compressor.prototype, { if (left instanceof AST_PropAccess) { var expr = left.expression; if (expr instanceof AST_Assign && !expr.may_throw_on_access(compressor)) { - expr.write_only = true; + expr.write_only = "p"; } if (compressor.has_directive("use strict") && expr.is_constant()) return this; } diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index ea7ee02f..942762f9 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -2081,3 +2081,24 @@ issue_3495: { } expect_stdout: "undefined" } + +issue_3497: { + options = { + pure_getters: "strict", + side_effects: true, + unused: true, + } + input: { + var a; + console.log(function(b) { + (b += a).p = 0; + }()); + } + expect: { + var a; + console.log(function(b) { + (b += a).p = 0; + }()); + } + expect_stdout: "undefined" +} -- 2.34.1