From cf120c7cea2721626caa67767d720431becf7f62 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sat, 21 Nov 2020 00:57:59 +0000 Subject: [PATCH] fix corner case in `merge_vars` & `reduce_vars` (#4313) fixes #4312 --- lib/compress.js | 33 +++++++++++++++++++++++++-------- test/compress/destructured.js | 31 +++++++++++++++++++++++++++++++ test/compress/functions.js | 5 +++-- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 601f39f0..1161f3b6 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -752,14 +752,18 @@ merge(Compressor.prototype, { def(AST_Call, function(tw, descend) { tw.find_parent(AST_Scope).may_call_this(); var exp = this.expression; - if (exp instanceof AST_Function) { + var tail = exp.tail_node(); + if (tail instanceof AST_Function) { + if (exp !== tail) exp.expressions.slice(0, -1).forEach(function(node) { + node.walk(tw); + }); this.args.forEach(function(arg) { arg.walk(tw); }); - exp.walk(tw); + tail.walk(tw); return true; - } else if (exp instanceof AST_SymbolRef) { - var def = exp.definition(); + } else if (tail instanceof AST_SymbolRef) { + var def = tail.definition(); if (this.TYPE == "Call" && tw.in_boolean_context()) def.bool_fn++; if (!(def.fixed instanceof AST_Defun)) return; var defun = mark_defun(tw, def); @@ -768,11 +772,11 @@ merge(Compressor.prototype, { defun.walk(tw); return true; } else if (this.TYPE == "Call" - && exp instanceof AST_Assign - && exp.operator == "=" - && exp.left instanceof AST_SymbolRef + && tail instanceof AST_Assign + && tail.operator == "=" + && tail.left instanceof AST_SymbolRef && tw.in_boolean_context()) { - exp.left.definition().bool_fn++; + tail.left.definition().bool_fn++; } }); def(AST_Conditional, function(tw) { @@ -4681,6 +4685,19 @@ merge(Compressor.prototype, { if (!(target instanceof AST_IterationStatement)) insert(target); return true; } + if (node instanceof AST_Call) { + var exp = node.expression; + var tail = exp.tail_node(); + if (!(tail instanceof AST_Function)) return; + if (exp !== tail) exp.expressions.slice(0, -1).forEach(function(node) { + node.walk(tw); + }); + node.args.forEach(function(arg) { + arg.walk(tw); + }); + tail.walk(tw); + return true; + } if (node instanceof AST_Conditional) { node.condition.walk(tw); push(); diff --git a/test/compress/destructured.js b/test/compress/destructured.js index f8e8090d..e654847a 100644 --- a/test/compress/destructured.js +++ b/test/compress/destructured.js @@ -1616,3 +1616,34 @@ issue_4308: { expect_stdout: "PASS" node_version: ">=6" } + +issue_4312: { + options = { + collapse_vars: true, + inline: true, + merge_vars: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a; + (function f(b, c) { + return function({ + [a = b]: d, + }) {}(c && c); + })("PASS", "FAIL"); + console.log(a); + } + expect: { + var a; + b = "PASS", + (function({ + [a = b]: d, + }){})((c = "FAIL") && c); + var b, c; + console.log(a); + } + expect_stdout: "PASS" + node_version: ">=6" +} diff --git a/test/compress/functions.js b/test/compress/functions.js index 686e7a50..e06596b8 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -521,7 +521,7 @@ issue_2531_2: { options = { evaluate: true, inline: true, - passes: 3, + passes: 2, reduce_funcs: true, reduce_vars: true, side_effects: true, @@ -556,9 +556,10 @@ issue_2531_3: { options = { evaluate: true, inline: true, - passes: 3, + passes: 2, reduce_funcs: true, reduce_vars: true, + sequences: true, side_effects: true, toplevel: true, unused: true, -- 2.34.1