fix corner cases with new.target (#4784)

This commit is contained in:
Alex Lam S.L
2021-03-16 06:34:36 +00:00
committed by GitHub
parent 77c9116c91
commit 352a944868
5 changed files with 126 additions and 30 deletions

View File

@@ -916,7 +916,7 @@ merge(Compressor.prototype, {
tw.find_parent(AST_Scope).may_call_this();
var exp = this.expression;
if (exp instanceof AST_LambdaExpression) {
var iife = !exp.name;
var iife = is_iife_single(this);
this.args.forEach(function(arg) {
arg.walk(tw);
if (arg instanceof AST_Spread) iife = false;
@@ -1591,6 +1591,19 @@ merge(Compressor.prototype, {
return node instanceof AST_LambdaExpression ? !is_arrow(node) : is_iife_call(node);
}
function is_iife_single(call) {
var exp = call.expression;
if (exp.name) return false;
if (!(call instanceof AST_New)) return true;
var found = false;
exp.walk(new TreeWalker(function(node) {
if (found) return true;
if (node instanceof AST_NewTarget) return found = true;
if (node instanceof AST_Scope && node !== exp) return true;
}));
return !found;
}
function is_undeclared_ref(node) {
return node instanceof AST_SymbolRef && node.definition().undeclared;
}
@@ -2127,11 +2140,11 @@ merge(Compressor.prototype, {
var iife, fn = compressor.self();
if (fn instanceof AST_LambdaExpression
&& !is_generator(fn)
&& !fn.name
&& !fn.uses_arguments
&& !fn.pinned()
&& (iife = compressor.parent()) instanceof AST_Call
&& iife.expression === fn
&& is_iife_single(iife)
&& all(iife.args, function(arg) {
return !(arg instanceof AST_Spread);
})) {