aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-02-10 12:40:57 +0000
committerGitHub <noreply@github.com>2021-02-10 20:40:57 +0800
commitc6e287331d8bf547e1d8dc578847224b137e866b (patch)
treeda25c66d90200dd456163afbbac5479b46a56ec5 /lib
parenta98ec7e4df148fd8fb745e25ac3e1da4bf87159b (diff)
downloadtracifyjs-c6e287331d8bf547e1d8dc578847224b137e866b.tar.gz
tracifyjs-c6e287331d8bf547e1d8dc578847224b137e866b.zip
fix corner cases in `inline` (#4640)
fixes #4639
Diffstat (limited to 'lib')
-rw-r--r--lib/compress.js28
-rw-r--r--lib/parse.js3
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,