From 7ac6fdcc9923e173522c4b94b919ac09049024f9 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Fri, 1 Dec 2017 14:32:00 +0800 Subject: [PATCH] improve switch case compression (#2547) --- lib/compress.js | 20 +++++++++++++------- test/compress/issue-1750.js | 4 ++-- test/compress/switch.js | 27 +++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index dfee94fc..adfbb793 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3312,6 +3312,11 @@ merge(Compressor.prototype, { } } else if (!(value instanceof AST_Node)) { var exp = branch.expression.evaluate(compressor); + if (!(exp instanceof AST_Node) && exp !== value) { + eliminate_branch(branch, body[body.length - 1]); + continue; + } + if (exp instanceof AST_Node) exp = branch.expression.tail_node().evaluate(compressor); if (exp === value) { exact_match = branch; if (default_branch) { @@ -3320,9 +3325,6 @@ merge(Compressor.prototype, { eliminate_branch(default_branch, body[default_index - 1]); default_branch = null; } - } else if (exp !== branch.expression) { - eliminate_branch(branch, body[body.length - 1]); - continue; } } if (aborts(branch)) { @@ -3365,12 +3367,16 @@ merge(Compressor.prototype, { }); self.walk(tw); if (!has_break) { - body = body[0].body.slice(); - body.unshift(make_node(AST_SimpleStatement, self.expression, { - body: self.expression + var statements = body[0].body.slice(); + var exp = body[0].expression; + if (exp) statements.unshift(make_node(AST_SimpleStatement, exp, { + body: exp + })); + statements.unshift(make_node(AST_SimpleStatement, self.expression, { + body:self.expression })); return make_node(AST_BlockStatement, self, { - body: body + body: statements }).optimize(compressor); } } diff --git a/test/compress/issue-1750.js b/test/compress/issue-1750.js index d18bc49f..970cea12 100644 --- a/test/compress/issue-1750.js +++ b/test/compress/issue-1750.js @@ -7,7 +7,7 @@ case_1: { input: { var a = 0, b = 1; switch (true) { - case a, true: + case a || true: default: b = 2; case true: @@ -17,7 +17,7 @@ case_1: { expect: { var a = 0, b = 1; switch (true) { - case a, true: + case a || true: b = 2; } console.log(a, b); diff --git a/test/compress/switch.js b/test/compress/switch.js index b763d741..fbb86eda 100644 --- a/test/compress/switch.js +++ b/test/compress/switch.js @@ -833,7 +833,34 @@ issue_2535: { } expect: { w(), 42; + 42; y(); z(); } } + +issue_1750: { + options = { + dead_code: true, + evaluate: true, + switches: true, + } + input: { + var a = 0, b = 1; + switch (true) { + case a, true: + default: + b = 2; + case true: + } + console.log(a, b); + } + expect: { + var a = 0, b = 1; + true; + a, true; + b = 2; + console.log(a, b); + } + expect_stdout: "0 2" +} -- 2.34.1