fix corner case in sequences (#4798)
This commit is contained in:
@@ -9443,14 +9443,9 @@ merge(Compressor.prototype, {
|
||||
&& !(exp instanceof AST_SymbolRef
|
||||
|| exp instanceof AST_PropAccess
|
||||
|| is_identifier_atom(exp))) {
|
||||
if (exp instanceof AST_Sequence) {
|
||||
exp = exp.expressions.slice();
|
||||
exp.push(make_node(AST_True, self));
|
||||
return make_sequence(self, exp).optimize(compressor);
|
||||
}
|
||||
return make_sequence(self, [ exp, make_node(AST_True, self) ]).optimize(compressor);
|
||||
}
|
||||
if (compressor.option("sequences") && !(op == "typeof" && is_undeclared_ref(exp.tail_node()))) {
|
||||
if (compressor.option("sequences") && can_lift()) {
|
||||
var seq = lift_sequence_in_expression(self, compressor);
|
||||
if (seq !== self) return seq.optimize(compressor);
|
||||
}
|
||||
@@ -9500,6 +9495,17 @@ merge(Compressor.prototype, {
|
||||
// avoids infinite recursion of numerals
|
||||
return op == "-" && (exp instanceof AST_Number || exp instanceof AST_Infinity)
|
||||
? self : try_evaluate(compressor, self);
|
||||
|
||||
function can_lift() {
|
||||
switch (op) {
|
||||
case "delete":
|
||||
return !is_identifier_atom(exp.tail_node());
|
||||
case "typeof":
|
||||
return !is_undeclared_ref(exp.tail_node());
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
OPT(AST_Await, function(self, compressor) {
|
||||
|
||||
@@ -564,6 +564,34 @@ delete_seq_3: {
|
||||
}
|
||||
|
||||
delete_seq_4: {
|
||||
options = {
|
||||
booleans: true,
|
||||
evaluate: false,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
function f() {}
|
||||
console.log(delete (f(), undefined));
|
||||
console.log(delete (f(), void 0));
|
||||
console.log(delete (f(), Infinity));
|
||||
console.log(delete (f(), 1 / 0));
|
||||
console.log(delete (f(), NaN));
|
||||
console.log(delete (f(), 0 / 0));
|
||||
}
|
||||
expect: {
|
||||
function f() {}
|
||||
console.log(delete void f()),
|
||||
console.log(delete void f()),
|
||||
console.log((f(), delete (1 / 0))),
|
||||
console.log((f(), delete (1 / 0))),
|
||||
console.log(delete (f(), NaN)),
|
||||
console.log((f(), delete(0 / 0)));
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
delete_seq_4_evaluate: {
|
||||
options = {
|
||||
booleans: true,
|
||||
evaluate: true,
|
||||
@@ -592,6 +620,35 @@ delete_seq_4: {
|
||||
}
|
||||
|
||||
delete_seq_5: {
|
||||
options = {
|
||||
booleans: true,
|
||||
evaluate: false,
|
||||
keep_infinity: true,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
function f() {}
|
||||
console.log(delete (f(), undefined));
|
||||
console.log(delete (f(), void 0));
|
||||
console.log(delete (f(), Infinity));
|
||||
console.log(delete (f(), 1 / 0));
|
||||
console.log(delete (f(), NaN));
|
||||
console.log(delete (f(), 0 / 0));
|
||||
}
|
||||
expect: {
|
||||
function f() {}
|
||||
console.log(delete void f()),
|
||||
console.log(delete void f()),
|
||||
console.log(delete (f(), Infinity)),
|
||||
console.log((f(), delete (1 / 0))),
|
||||
console.log(delete (f(), NaN)),
|
||||
console.log((f(), delete (0 / 0)));
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
delete_seq_5_evaluate: {
|
||||
options = {
|
||||
booleans: true,
|
||||
evaluate: true,
|
||||
|
||||
Reference in New Issue
Block a user