diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2018-01-07 15:31:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-07 15:31:24 +0800 |
commit | 1ee8be8d91dd94a983e853b7abcc64d6dbc6214b (patch) | |
tree | 0253b10d38140d81bd5b80571ef0a43411178dc3 | |
parent | 8430c2f9f85e7217e87cad6756a2d8a083b137bc (diff) | |
download | tracifyjs-1ee8be8d91dd94a983e853b7abcc64d6dbc6214b.tar.gz tracifyjs-1ee8be8d91dd94a983e853b7abcc64d6dbc6214b.zip |
fix recursive function `inline` (#2738)
fixes #2737
-rw-r--r-- | lib/compress.js | 5 | ||||
-rw-r--r-- | test/compress/functions.js | 46 |
2 files changed, 49 insertions, 2 deletions
diff --git a/lib/compress.js b/lib/compress.js index 28d6a1c4..011bb1b4 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4075,9 +4075,10 @@ merge(Compressor.prototype, { if (compressor.option("inline") && !fn.uses_arguments && !fn.uses_eval + && !(fn.name && fn instanceof AST_Function) && (value = can_flatten_body(stat)) - && (exp === fn ? !fn.name - : compressor.option("unused") + && (exp === fn + || compressor.option("unused") && (def = exp.definition()).references.length == 1 && !recursive_ref(compressor, def) && fn.is_constant_expression(exp.scope)) diff --git a/test/compress/functions.js b/test/compress/functions.js index f4662082..222aa0ca 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -1905,3 +1905,49 @@ duplicate_arg_var: { } expect_stdout: "PASS" } + +issue_2737_1: { + options = { + inline: true, + reduce_vars: true, + unused: true, + } + input: { + (function(a) { + while (a()); + })(function f() { + console.log(typeof f); + }); + } + expect: { + (function(a) { + while (a()); + })(function f() { + console.log(typeof f); + }); + } + expect_stdout: "function" +} + +issue_2737_2: { + options = { + inline: true, + reduce_vars: true, + unused: true, + } + input: { + (function(bar) { + for (;bar(); ) break; + })(function qux() { + return console.log("PASS"), qux; + }); + } + expect: { + (function(bar) { + for (;bar(); ) break; + })(function qux() { + return console.log("PASS"), qux; + }); + } + expect_stdout: "PASS" +} |