From f001e4cb9d5bfe56e25db552bb7ab0951a142a99 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Mon, 27 Mar 2017 01:58:21 +0800 Subject: fix `cascade` on anonymous function reference (#1693) Unlike normal variables and even function definitions, these cannot be reassigned, even though assignment expressions would "leak" the assigned value as normal. --- lib/compress.js | 4 +- test/compress/sequences.js | 110 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/lib/compress.js b/lib/compress.js index 590015ff..8350ba25 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2922,7 +2922,9 @@ merge(Compressor.prototype, { && (self.car.operator == "++" || self.car.operator == "--")) { left = self.car.expression; } - if (left) { + if (left + && !(left instanceof AST_SymbolRef + && left.definition().orig[0] instanceof AST_SymbolLambda)) { var parent, field; var cdr = self.cdr; while (true) { diff --git a/test/compress/sequences.js b/test/compress/sequences.js index af6e0c36..f1fa0e87 100644 --- a/test/compress/sequences.js +++ b/test/compress/sequences.js @@ -330,3 +330,113 @@ issue_1685: { } expect_stdout: true } + +func_def_1: { + options = { + cascade: true, + side_effects: true, + } + input: { + function f() { + return f = 0, !!f; + } + console.log(f()); + } + expect: { + function f() { + return !!(f = 0); + } + console.log(f()); + } + expect_stdout: "false" +} + +func_def_2: { + options = { + cascade: true, + side_effects: true, + } + input: { + console.log(function f() { + return f = 0, !!f; + }()); + } + expect: { + console.log(function f() { + return f = 0, !!f; + }()); + } + expect_stdout: "true" +} + +func_def_3: { + options = { + cascade: true, + side_effects: true, + } + input: { + function f() { + function g() {} + return g = 0, !!g; + } + console.log(f()); + } + expect: { + function f() { + function g() {} + return !!(g = 0); + } + console.log(f()); + } + expect_stdout: "false" +} + +func_def_4: { + options = { + cascade: true, + side_effects: true, + } + input: { + function f() { + function g() { + return g = 0, !!g; + } + return g(); + } + console.log(f()); + } + expect: { + function f() { + function g() { + return !!(g = 0); + } + return g(); + } + console.log(f()); + } + expect_stdout: "false" +} + +func_def_5: { + options = { + cascade: true, + side_effects: true, + } + input: { + function f() { + return function g(){ + return g = 0, !!g; + }(); + } + console.log(f()); + } + expect: { + function f() { + return function g(){ + return g = 0, !!g; + }(); + } + console.log(f()); + } + expect_stdout: "true" +} -- cgit v1.2.3