aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2018-03-22 23:46:26 +0800
committerGitHub <noreply@github.com>2018-03-22 23:46:26 +0800
commit5c169615a84201b707e77c1b72b56908ca369d40 (patch)
tree6a6139fe1f972da85930461d8e748c3760c782b9
parent73d77f4f642b3830f7d83bb329c9a631eb09856f (diff)
downloadtracifyjs-5c169615a84201b707e77c1b72b56908ca369d40.tar.gz
tracifyjs-5c169615a84201b707e77c1b72b56908ca369d40.zip
fix corner case in `inline` (#3017)
fixes #3016
-rw-r--r--lib/compress.js3
-rw-r--r--test/compress/functions.js157
2 files changed, 159 insertions, 1 deletions
diff --git a/lib/compress.js b/lib/compress.js
index f9fe3c63..fba88f42 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -4774,7 +4774,8 @@ merge(Compressor.prototype, {
var name = var_def.name;
append_var(decls, expressions, name, var_def.value);
if (in_loop) {
- var def = name.definition();
+ var def = fn.variables.get(name.name);
+ if (def.orig[0] instanceof AST_SymbolFunarg) continue;
var sym = make_node(AST_SymbolRef, name, name);
def.references.push(sym);
expressions.splice(pos++, 0, make_node(AST_Assign, var_def, {
diff --git a/test/compress/functions.js b/test/compress/functions.js
index ddf5fe05..bbe94ebf 100644
--- a/test/compress/functions.js
+++ b/test/compress/functions.js
@@ -2051,3 +2051,160 @@ drop_lone_use_strict: {
}
}
}
+
+issue_3016_1: {
+ options = {
+ inline: true,
+ toplevel: true,
+ }
+ input: {
+ var b = 1;
+ do {
+ (function(a) {
+ return a[b];
+ var a;
+ })(3);
+ } while (0);
+ console.log(b);
+ }
+ expect: {
+ var b = 1;
+ do {
+ a = 3,
+ a[b];
+ } while(0);
+ var a;
+ console.log(b);
+ }
+ expect_stdout: "1"
+}
+
+issue_3016_2: {
+ options = {
+ dead_code: true,
+ inline: true,
+ toplevel: true,
+ }
+ input: {
+ var b = 1;
+ do {
+ (function(a) {
+ return a[b];
+ try {
+ a = 2;
+ } catch (a) {
+ var a;
+ }
+ })(3);
+ } while (0);
+ console.log(b);
+ }
+ expect: {
+ var b = 1;
+ do {
+ a = 3,
+ a[b];
+ } while(0);
+ var a;
+ console.log(b);
+ }
+ expect_stdout: "1"
+}
+
+issue_3016_2_ie8: {
+ options = {
+ dead_code: true,
+ ie8: true,
+ inline: true,
+ toplevel: true,
+ }
+ input: {
+ var b = 1;
+ do {
+ (function(a) {
+ return a[b];
+ try {
+ a = 2;
+ } catch (a) {
+ var a;
+ }
+ })(3);
+ } while (0);
+ console.log(b);
+ }
+ expect: {
+ var b = 1;
+ do {
+ a = 3,
+ a[b];
+ } while(0);
+ var a;
+ console.log(b);
+ }
+ expect_stdout: "1"
+}
+
+issue_3016_3: {
+ options = {
+ dead_code: true,
+ inline: true,
+ toplevel: true,
+ }
+ input: {
+ var b = 1;
+ do {
+ console.log(function() {
+ return a ? "FAIL" : a = "PASS";
+ try {
+ a = 2;
+ } catch (a) {
+ var a;
+ }
+ }());
+ } while (b--);
+ }
+ expect: {
+ var b = 1;
+ do {
+ console.log((a = void 0, a ? "FAIL" : a = "PASS"));
+ } while(b--);
+ var a;
+ }
+ expect_stdout: [
+ "PASS",
+ "PASS",
+ ]
+}
+
+issue_3016_3_ie8: {
+ options = {
+ dead_code: true,
+ ie8: true,
+ inline: true,
+ toplevel: true,
+ }
+ input: {
+ var b = 1;
+ do {
+ console.log(function() {
+ return a ? "FAIL" : a = "PASS";
+ try {
+ a = 2;
+ } catch (a) {
+ var a;
+ }
+ }());
+ } while (b--);
+ }
+ expect: {
+ var b = 1;
+ do {
+ console.log((a = void 0, a ? "FAIL" : a = "PASS"));
+ } while(b--);
+ var a;
+ }
+ expect_stdout: [
+ "PASS",
+ "PASS",
+ ]
+}