From bdfcbf496b1b7be16dfd8a55c72bad8e5a33cf82 Mon Sep 17 00:00:00 2001 From: Mihai Bazon Date: Wed, 14 Nov 2012 12:21:43 +0200 Subject: better solution for the last test in constant switch folding --- lib/compress.js | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) (limited to 'lib/compress.js') diff --git a/lib/compress.js b/lib/compress.js index 89be0cea..66375be8 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1368,7 +1368,8 @@ merge(Compressor.prototype, { self.expression = exp[0]; if (!compressor.option("dead_code")) break out; var value = exp[1]; - var in_substat = false; + var in_if = false; + var in_block = false; var started = false; var stopped = false; var ruined = false; @@ -1377,32 +1378,36 @@ merge(Compressor.prototype, { // no need to descend these node types return node; } - else if (node instanceof AST_Switch) { - if (node === self) { - node = node.clone(); - descend(node, this); - return ruined ? node : make_node(AST_BlockStatement, node, { - body: node.body.reduce(function(a, branch){ - return a.concat(branch.body); - }, []) - }).transform(compressor); - } + else if (node instanceof AST_Switch && node === self) { + node = node.clone(); + descend(node, this); + return ruined ? node : make_node(AST_BlockStatement, node, { + body: node.body.reduce(function(a, branch){ + return a.concat(branch.body); + }, []) + }).transform(compressor); } - else if (node instanceof AST_StatementWithBody || node instanceof AST_Switch || node instanceof AST_Try) { - var save_substat = in_substat; - in_substat = true; + else if (node instanceof AST_If || node instanceof AST_Try) { + var save = in_if; + in_if = !in_block; descend(node, this); - in_substat = save_substat; + in_if = save; + return node; + } + else if (node instanceof AST_StatementWithBody || node instanceof AST_Switch) { + var save = in_block; + in_block = true; + descend(node, this); + in_block = save; return node; } else if (node instanceof AST_Break && this.loopcontrol_target(node.label) === self) { - if (in_substat) { - // won't handle situations like if (foo) break; + if (in_if) { ruined = true; return node; - } else { - stopped = true; } + if (in_block) return node; + stopped = true; return in_list ? MAP.skip : make_node(AST_EmptyStatement, node); } else if (node instanceof AST_SwitchBranch && this.parent() === self) { -- cgit v1.2.3