aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-04-20 04:18:38 +0800
committerGitHub <noreply@github.com>2017-04-20 04:18:38 +0800
commit88e7a542cd8a8406f54c53cefe72944452f5e013 (patch)
tree6f151532639bbaee59c0f3cfa33c13bb0ba3df2f
parent4dcff038cb1a6951a0b20d1345bfdb27d756301c (diff)
downloadtracifyjs-88e7a542cd8a8406f54c53cefe72944452f5e013.tar.gz
tracifyjs-88e7a542cd8a8406f54c53cefe72944452f5e013.zip
fix `unused` on labeled for-loop (#1831)
fixes #1830
-rw-r--r--lib/compress.js34
-rw-r--r--test/compress/drop-unused.js35
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"
+}