From 44116c6d2bf80f08195f2a7568e80cc57113953f Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Fri, 6 Apr 2018 05:39:07 +0800 Subject: [PATCH] fix AST corruption during `inline` of simple `return` (#3056) fixes #3054 --- lib/compress.js | 7 ++++++- test/compress/functions.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/compress.js b/lib/compress.js index 55584fc5..ddba6245 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4576,7 +4576,12 @@ merge(Compressor.prototype, { if (compressor.option("inline") && stat instanceof AST_Return) { var value = stat.value; if (!value || value.is_constant_expression()) { - var args = self.args.concat(value || make_node(AST_Undefined, self)); + if (value) { + value = value.clone(true); + } else { + value = make_node(AST_Undefined, self); + } + var args = self.args.concat(value); return make_sequence(self, args).optimize(compressor); } } diff --git a/test/compress/functions.js b/test/compress/functions.js index ceaf0643..471ebf7f 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -2237,3 +2237,33 @@ issue_3018: { } expect_stdout: "PASS" } + +issue_3054: { + options = { + booleans: true, + collapse_vars: true, + inline: 1, + reduce_vars: true, + toplevel: true, + } + input: { + "use strict"; + function f() { + return { a: true }; + } + console.log(function(b) { + b = false; + return f(); + }().a, f.call().a); + } + expect: { + "use strict"; + function f() { + return { a: !0 }; + } + console.log(function(b) { + return { a: !(b = !1) }; + }().a, f.call().a); + } + expect_stdout: "true true" +} -- 2.34.1