aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2020-05-01 02:06:40 +0100
committerGitHub <noreply@github.com>2020-05-01 09:06:40 +0800
commit74801de315df085b0657660dcb9615cca67743e1 (patch)
tree9e45d47a8f12d69e09e3c07758eacdd3d197a519
parentf80d5b8c9ec0de7b3e7f99981da9f2d39ece66c4 (diff)
downloadtracifyjs-74801de315df085b0657660dcb9615cca67743e1.tar.gz
tracifyjs-74801de315df085b0657660dcb9615cca67743e1.zip
fix corner cases in `inline` (#3834)
fixes #3833 fixes #3835
-rw-r--r--lib/compress.js7
-rw-r--r--test/compress/functions.js47
2 files changed, 54 insertions, 0 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 15db2332..79f52783 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -3991,10 +3991,17 @@ merge(Compressor.prototype, {
if (!call || call.TYPE != "Call") break;
var fn = call.expression;
if (fn instanceof AST_SymbolRef) {
+ if (self.name && self.name.definition() === fn.definition()) break;
fn = fn.fixed_value();
}
if (!(fn instanceof AST_Lambda)) break;
if (fn.uses_arguments) break;
+ if (fn === call.expression) {
+ if (fn.parent_scope !== self) break;
+ if (!all(fn.enclosed, function(def) {
+ return def.scope !== self;
+ })) break;
+ }
if (fn.contains_this()) break;
var j = fn.argnames.length;
if (j > 0 && compressor.option("inline") < 2) break;
diff --git a/test/compress/functions.js b/test/compress/functions.js
index 262bb6ac..f5ad08b4 100644
--- a/test/compress/functions.js
+++ b/test/compress/functions.js
@@ -4590,3 +4590,50 @@ substitude_use_strict: {
"PASS",
]
}
+
+issue_3833: {
+ options = {
+ inline: true,
+ keep_fargs: "strict",
+ reduce_vars: true,
+ toplevel: true,
+ unused: true,
+ }
+ input: {
+ function f(a) {
+ return function() {
+ while (a);
+ console.log("PASS");
+ }();
+ }
+ f();
+ }
+ expect: {
+ (function() {
+ while (a);
+ console.log("PASS");
+ })();
+ var a;
+ }
+ expect_stdout: "PASS"
+}
+
+issue_3835: {
+ options = {
+ inline: true,
+ reduce_vars: true,
+ }
+ input: {
+ (function f() {
+ return function() {
+ return f();
+ }();
+ })();
+ }
+ expect: {
+ (function f() {
+ return f();
+ })();
+ }
+ expect_stdout: true
+}