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_SymbolRef
|
||||||
|| exp instanceof AST_PropAccess
|
|| exp instanceof AST_PropAccess
|
||||||
|| is_identifier_atom(exp))) {
|
|| 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);
|
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);
|
var seq = lift_sequence_in_expression(self, compressor);
|
||||||
if (seq !== self) return seq.optimize(compressor);
|
if (seq !== self) return seq.optimize(compressor);
|
||||||
}
|
}
|
||||||
@@ -9500,6 +9495,17 @@ merge(Compressor.prototype, {
|
|||||||
// avoids infinite recursion of numerals
|
// avoids infinite recursion of numerals
|
||||||
return op == "-" && (exp instanceof AST_Number || exp instanceof AST_Infinity)
|
return op == "-" && (exp instanceof AST_Number || exp instanceof AST_Infinity)
|
||||||
? self : try_evaluate(compressor, self);
|
? 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) {
|
OPT(AST_Await, function(self, compressor) {
|
||||||
|
|||||||
@@ -564,6 +564,34 @@ delete_seq_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete_seq_4: {
|
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 = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -592,6 +620,35 @@ delete_seq_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete_seq_5: {
|
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 = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user