diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2018-03-22 23:46:26 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-22 23:46:26 +0800 |
commit | 5c169615a84201b707e77c1b72b56908ca369d40 (patch) | |
tree | 6a6139fe1f972da85930461d8e748c3760c782b9 | |
parent | 73d77f4f642b3830f7d83bb329c9a631eb09856f (diff) | |
download | tracifyjs-5c169615a84201b707e77c1b72b56908ca369d40.tar.gz tracifyjs-5c169615a84201b707e77c1b72b56908ca369d40.zip |
fix corner case in `inline` (#3017)
fixes #3016
-rw-r--r-- | lib/compress.js | 3 | ||||
-rw-r--r-- | test/compress/functions.js | 157 |
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", + ] +} |