diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-04-20 04:18:38 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-20 04:18:38 +0800 |
commit | 88e7a542cd8a8406f54c53cefe72944452f5e013 (patch) | |
tree | 6f151532639bbaee59c0f3cfa33c13bb0ba3df2f | |
parent | 4dcff038cb1a6951a0b20d1345bfdb27d756301c (diff) | |
download | tracifyjs-88e7a542cd8a8406f54c53cefe72944452f5e013.tar.gz tracifyjs-88e7a542cd8a8406f54c53cefe72944452f5e013.zip |
fix `unused` on labeled for-loop (#1831)
fixes #1830
-rw-r--r-- | lib/compress.js | 34 | ||||
-rw-r--r-- | test/compress/drop-unused.js | 35 |
2 files changed, 55 insertions, 14 deletions
diff --git a/lib/compress.js b/lib/compress.js index 2612d9ab..7fa2b52b 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2090,26 +2090,32 @@ merge(Compressor.prototype, { return maintain_this_binding(tt.parent(), node, node.right.transform(tt)); } } + // certain combination of unused name + side effect leads to: + // https://github.com/mishoo/UglifyJS2/issues/44 + // https://github.com/mishoo/UglifyJS2/issues/1830 + // that's an invalid AST. + // We fix it at this stage by moving the `var` outside the `for`. if (node instanceof AST_For) { descend(node, this); - if (node.init instanceof AST_BlockStatement) { - // certain combination of unused name + side effect leads to: - // https://github.com/mishoo/UglifyJS2/issues/44 - // that's an invalid AST. - // We fix it at this stage by moving the `var` outside the `for`. - - var body = node.init.body.slice(0, -1); - node.init = node.init.body.slice(-1)[0].body; - body.push(node); - - return in_list ? MAP.splice(body) : make_node(AST_BlockStatement, node, { - body: body - }); + var block = node.init; + node.init = block.body.pop(); + block.body.push(node); + return in_list ? MAP.splice(block.body) : block; } else if (is_empty(node.init)) { node.init = null; - return node; } + return node; + } + if (node instanceof AST_LabeledStatement && node.body instanceof AST_For) { + descend(node, this); + if (node.body instanceof AST_BlockStatement) { + var block = node.body; + node.body = block.body.pop(); + block.body.push(node); + return in_list ? MAP.splice(block.body) : block; + } + return node; } if (node instanceof AST_Scope && node !== self) return node; diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index 2eefbe8d..8f0aa0bf 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -1056,3 +1056,38 @@ drop_var: { "3 2", ] } + +issue_1830_1: { + options = { + unused: true, + } + input: { + !function() { + L: for (var b = console.log(1); !1;) continue L; + }(); + } + expect: { + !function() { + L: for (console.log(1); !1;) continue L; + }(); + } + expect_stdout: "1" +} + +issue_1830_2: { + options = { + unused: true, + } + input: { + !function() { + L: for (var a = 1, b = console.log(a); --a;) continue L; + }(); + } + expect: { + !function() { + var a = 1; + L: for (console.log(a); --a;) continue L; + }(); + } + expect_stdout: "1" +} |