diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2021-02-10 12:40:57 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-10 20:40:57 +0800 |
commit | c6e287331d8bf547e1d8dc578847224b137e866b (patch) | |
tree | da25c66d90200dd456163afbbac5479b46a56ec5 /lib | |
parent | a98ec7e4df148fd8fb745e25ac3e1da4bf87159b (diff) | |
download | tracifyjs-c6e287331d8bf547e1d8dc578847224b137e866b.tar.gz tracifyjs-c6e287331d8bf547e1d8dc578847224b137e866b.zip |
fix corner cases in `inline` (#4640)
fixes #4639
Diffstat (limited to 'lib')
-rw-r--r-- | lib/compress.js | 28 | ||||
-rw-r--r-- | lib/parse.js | 3 |
2 files changed, 20 insertions, 11 deletions
diff --git a/lib/compress.js b/lib/compress.js index 5a2a0543..94719afa 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -8336,7 +8336,7 @@ merge(Compressor.prototype, { var can_inline = can_drop && compressor.option("inline") && !self.is_expr_pure(compressor); if (can_inline && stat instanceof AST_Return) { var value = stat.value; - if (exp === fn && (!value || value.is_constant_expression() && safe_from_await(value))) { + if (exp === fn && (!value || value.is_constant_expression() && safe_from_await_yield(value))) { return make_sequence(self, convert_args(value)).optimize(compressor); } } @@ -8506,8 +8506,17 @@ merge(Compressor.prototype, { return args; } - function safe_from_await(node) { - if (!is_async(scope || compressor.find_parent(AST_Scope))) return true; + function avoid_await_yield() { + var avoid = []; + var parent_scope = scope || compressor.find_parent(AST_Scope); + if (is_async(parent_scope)) avoid.push("await"); + if (is_generator(parent_scope)) avoid.push("yield"); + return avoid.length && makePredicate(avoid); + } + + function safe_from_await_yield(node) { + var avoid = avoid_await_yield(); + if (!avoid) return true; var safe = true; var tw = new TreeWalker(function(node) { if (!safe) return true; @@ -8515,12 +8524,12 @@ merge(Compressor.prototype, { if (node === fn) return; if (is_arrow(node)) { for (var i = 0; safe && i < node.argnames.length; i++) node.argnames[i].walk(tw); - } else if (node instanceof AST_LambdaDefinition && node.name.name == "await") { + } else if (node instanceof AST_LambdaDefinition && avoid[node.name.name]) { safe = false; } return true; } - if (node instanceof AST_Symbol && node.name == "await" && node !== fn.name) safe = false; + if (node instanceof AST_Symbol && avoid[node.name] && node !== fn.name) safe = false; }); node.walk(tw); return safe; @@ -8579,10 +8588,10 @@ merge(Compressor.prototype, { return def.references.length - def.replaced < 2 && def.orig[0] instanceof AST_SymbolFunarg; })) return; var abort = false; + var avoid = avoid_await_yield(); var begin; var in_order = []; var side_effects = false; - var verify_await = true; value.walk(new TreeWalker(function(node, descend) { if (abort) return true; if (node instanceof AST_Binary && lazy_op[node.operator] @@ -8591,10 +8600,7 @@ merge(Compressor.prototype, { return; } if (node instanceof AST_Scope) return abort = true; - if (verify_await && node instanceof AST_Symbol && node.name == "await") { - if (is_async(compressor.find_parent(AST_Scope))) return abort = true; - verify_await = false; - } + if (avoid && node instanceof AST_Symbol && avoid[node.name]) return abort = true; if (node instanceof AST_SymbolRef) { var def = node.definition(); if (fn.variables.get(node.name) !== def) { @@ -8697,7 +8703,7 @@ merge(Compressor.prototype, { } while (!(scope instanceof AST_Scope)); insert = scope.body.indexOf(child) + 1; if (!insert) return false; - if (!safe_from_await(fn)) return false; + if (!safe_from_await_yield(fn)) return false; var safe_to_inject = exp !== fn || fn.parent_scope.resolve() === scope; if (scope instanceof AST_Toplevel) { if (compressor.toplevel.vars) { diff --git a/lib/parse.js b/lib/parse.js index ef0fc49a..27803f2e 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -1166,7 +1166,9 @@ function parse($TEXT, options) { function arrow(exprs, start, async) { var was_async = S.in_async; + var was_gen = S.in_generator; S.in_async = async; + S.in_generator = false; var was_funarg = S.in_funarg; S.in_funarg = S.in_function; var argnames = exprs.map(to_funarg); @@ -1196,6 +1198,7 @@ function parse($TEXT, options) { --S.in_function; S.in_loop = loop; S.labels = labels; + S.in_generator = was_gen; S.in_async = was_async; return new (async ? AST_AsyncArrow : AST_Arrow)({ start: start, |