aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-06-13 01:40:14 +0800
committerGitHub <noreply@github.com>2017-06-13 01:40:14 +0800
commit2bdc8802ddd913a8b3b921426e898fc2f2257265 (patch)
tree8ae7323ea65471a23575fea7b3f337bdf3c0891b
parent5ef7cb372abf82f28d7f1b014fd0ddb2ef5bdec8 (diff)
downloadtracifyjs-2bdc8802ddd913a8b3b921426e898fc2f2257265.tar.gz
tracifyjs-2bdc8802ddd913a8b3b921426e898fc2f2257265.zip
fix variable accounting in `inline` (#2085)
fixes #2084
-rw-r--r--lib/compress.js34
-rw-r--r--test/compress/functions.js39
-rw-r--r--test/compress/issue-281.js14
3 files changed, 67 insertions, 20 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 5f2ac2b0..4d768781 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -3171,16 +3171,16 @@ merge(Compressor.prototype, {
&& !exp.uses_arguments
&& !exp.uses_eval
&& !self.has_pure_annotation(compressor)) {
- var body;
+ var value;
if (stat instanceof AST_Return) {
- body = stat.value.clone(true);
+ value = stat.value.clone(true);
} else if (stat instanceof AST_SimpleStatement) {
- body = [];
- merge_sequence(body, stat.body.clone(true));
- merge_sequence(body, make_node(AST_Undefined, self));
- body = make_sequence(self, body);
+ value = make_node(AST_UnaryPrefix, stat, {
+ operator: "void",
+ expression: stat.body.clone(true)
+ });
}
- if (body) {
+ if (value) {
var fn = exp.clone();
fn.argnames = [];
fn.body = [];
@@ -3200,17 +3200,25 @@ merge(Compressor.prototype, {
}));
}
fn.body.push(make_node(AST_Return, self, {
- value: body
+ value: value
}));
- body = fn.transform(compressor).body;
+ var body = fn.transform(compressor).body;
if (body.length == 0) return make_node(AST_Undefined, self);
if (body.length == 1 && body[0] instanceof AST_Return) {
- if (!body[0].value) return make_node(AST_Undefined, self);
- body = best_of(compressor, body[0].value, self);
+ value = body[0].value;
+ if (!value) return make_node(AST_Undefined, self);
+ value.walk(new TreeWalker(function(node) {
+ if (value === self) return true;
+ if (node instanceof AST_SymbolRef && exp.variables.has(node.name)) {
+ value = self;
+ return true;
+ }
+ }));
+ if (value !== self) value = best_of(compressor, value, self);
} else {
- body = self;
+ value = self;
}
- if (body !== self) return body;
+ if (value !== self) return value;
}
}
if (compressor.option("side_effects") && all(exp.body, is_empty)) {
diff --git a/test/compress/functions.js b/test/compress/functions.js
index 180bb11a..1359670e 100644
--- a/test/compress/functions.js
+++ b/test/compress/functions.js
@@ -297,3 +297,42 @@ webkit: {
expect_exact: "console.log((function(){1+1}).a=1);"
expect_stdout: "1"
}
+
+issue_2084: {
+ options = {
+ collapse_vars: true,
+ conditionals: true,
+ evaluate: true,
+ inline: true,
+ passes: 2,
+ reduce_vars: true,
+ sequences: true,
+ side_effects: true,
+ unused: true,
+ }
+ input: {
+ var c = 0;
+ !function() {
+ !function(c) {
+ c = 1 + c;
+ var c = 0;
+ function f14(a_1) {
+ if (c = 1 + c, 0 !== 23..toString())
+ c = 1 + c, a_1 && (a_1[0] = 0);
+ }
+ f14();
+ }(-1);
+ }();
+ console.log(c);
+ }
+ expect: {
+ var c = 0;
+ !function(c) {
+ c = 1 + c,
+ c = 1 + (c = 0),
+ 0 !== 23..toString() && (c = 1 + c);
+ }(-1),
+ console.log(c);
+ }
+ expect_stdout: "0"
+}
diff --git a/test/compress/issue-281.js b/test/compress/issue-281.js
index 7a6c03bc..9b8c8bfd 100644
--- a/test/compress/issue-281.js
+++ b/test/compress/issue-281.js
@@ -151,7 +151,7 @@ negate_iife_4: {
})();
}
expect: {
- t ? console.log(true) : console.log(false), console.log("something"), void 0;
+ t ? console.log(true) : console.log(false), void console.log("something");
}
}
@@ -174,7 +174,7 @@ negate_iife_5: {
})();
}
expect: {
- t ? foo(true) : bar(false), console.log("something"), void 0;
+ t ? foo(true) : bar(false), void console.log("something");
}
}
@@ -197,7 +197,7 @@ negate_iife_5_off: {
})();
}
expect: {
- t ? foo(true) : bar(false), console.log("something"), void 0;
+ t ? foo(true) : bar(false), void console.log("something");
}
}
@@ -214,7 +214,7 @@ issue_1254_negate_iife_true: {
};
})()();
}
- expect_exact: 'console.log("test"),void 0;'
+ expect_exact: 'void console.log("test");'
expect_stdout: true
}
@@ -231,7 +231,7 @@ issue_1254_negate_iife_nested: {
};
})()()()()();
}
- expect_exact: '(console.log("test"),void 0)()()();'
+ expect_exact: '(void console.log("test"))()()();'
}
negate_iife_issue_1073: {
@@ -382,7 +382,7 @@ wrap_iife: {
};
})()();
}
- expect_exact: 'console.log("test"),void 0;'
+ expect_exact: 'void console.log("test");'
}
wrap_iife_in_expression: {
@@ -416,7 +416,7 @@ wrap_iife_in_return_call: {
})();
})()();
}
- expect_exact: '(console.log("test"),void 0)();'
+ expect_exact: '(void console.log("test"))();'
}
pure_annotation: {