Skip to content

Commit a0f0f7b

Browse files
committed
fix delete on sequence
1 parent e3c9c22 commit a0f0f7b

File tree

2 files changed

+88
-14
lines changed

2 files changed

+88
-14
lines changed

lib/compress.js

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3032,7 +3032,11 @@ merge(Compressor.prototype, {
30323032
if (!compressor.option("side_effects"))
30333033
return self;
30343034
self.car = self.car.drop_side_effect_free(compressor, first_in_statement(compressor));
3035-
if (!self.car) return maintain_this_binding(compressor.parent(), self, self.cdr);
3035+
if (!self.car) {
3036+
if (self.cdr instanceof AST_NaN || self.cdr instanceof AST_Infinity)
3037+
return self.cdr.clone().optimize(compressor);
3038+
return maintain_this_binding(compressor.parent(), self, self.cdr);
3039+
}
30363040
if (compressor.option("cascade")) {
30373041
var left;
30383042
if (self.car instanceof AST_Assign
@@ -3607,6 +3611,14 @@ merge(Compressor.prototype, {
36073611
return self;
36083612
});
36093613

3614+
function in_delete(parent) {
3615+
return parent instanceof AST_UnaryPrefix && parent.operator == "delete";
3616+
}
3617+
3618+
function is_atomic(parent, self) {
3619+
return parent.expression instanceof AST_SymbolRef || parent.expression.TYPE === self.TYPE;
3620+
}
3621+
36103622
OPT(AST_Undefined, function(self, compressor){
36113623
if (compressor.option("unsafe")) {
36123624
var undef = find_variable(compressor, "undefined");
@@ -3621,10 +3633,7 @@ merge(Compressor.prototype, {
36213633
}
36223634
}
36233635
var parent = compressor.parent();
3624-
if (parent instanceof AST_UnaryPrefix
3625-
&& parent.operator == "delete"
3626-
&& (parent.expression instanceof AST_SymbolRef
3627-
|| parent.expression.TYPE === self.TYPE)) return self;
3636+
if (in_delete(parent) && is_atomic(parent, self)) return self;
36283637
return make_node(AST_UnaryPrefix, self, {
36293638
operator: "void",
36303639
expression: make_node(AST_Number, self, {
@@ -3635,12 +3644,10 @@ merge(Compressor.prototype, {
36353644

36363645
OPT(AST_Infinity, function(self, compressor){
36373646
var parent = compressor.parent();
3638-
if (parent instanceof AST_UnaryPrefix
3639-
&& parent.operator == "delete"
3640-
&& (parent.expression instanceof AST_SymbolRef
3641-
|| parent.expression.TYPE === self.TYPE))
3642-
return self;
3647+
var del = in_delete(parent);
3648+
if (del && is_atomic(parent, self)) return self;
36433649
if (compressor.option("keep_infinity")
3650+
&& !(del && !is_atomic(parent, self))
36443651
&& !find_variable(compressor, "Infinity"))
36453652
return self;
36463653
return make_node(AST_Binary, self, {
@@ -3656,10 +3663,7 @@ merge(Compressor.prototype, {
36563663

36573664
OPT(AST_NaN, function(self, compressor){
36583665
var parent = compressor.parent();
3659-
if (parent instanceof AST_UnaryPrefix
3660-
&& parent.operator == "delete"
3661-
&& !(parent.expression instanceof AST_SymbolRef
3662-
|| parent.expression.TYPE === self.TYPE)
3666+
if (in_delete(parent) && !is_atomic(parent, self)
36633667
|| find_variable(compressor, "NaN")) {
36643668
return make_node(AST_Binary, self, {
36653669
operator: "/",

test/compress/sequences.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,73 @@ issue_1758: {
466466
}
467467
expect_stdout: "undefined"
468468
}
469+
470+
delete_seq_1: {
471+
options = {
472+
side_effects: true,
473+
}
474+
input: {
475+
console.log(delete (1, undefined));
476+
console.log(delete (1, void 0));
477+
console.log(delete (1, Infinity));
478+
console.log(delete (1, 1 / 0));
479+
console.log(delete (1, NaN));
480+
console.log(delete (1, 0 / 0));
481+
}
482+
expect: {
483+
console.log(delete void 0);
484+
console.log(delete void 0);
485+
console.log(delete (1 / 0));
486+
console.log(delete (1 / 0));
487+
console.log(delete (0 / 0));
488+
console.log(delete (0 / 0));
489+
}
490+
expect_stdout: true
491+
}
492+
493+
delete_seq_2: {
494+
options = {
495+
side_effects: true,
496+
}
497+
input: {
498+
console.log(delete (1, 2, undefined));
499+
console.log(delete (1, 2, void 0));
500+
console.log(delete (1, 2, Infinity));
501+
console.log(delete (1, 2, 1 / 0));
502+
console.log(delete (1, 2, NaN));
503+
console.log(delete (1, 2, 0 / 0));
504+
}
505+
expect: {
506+
console.log(delete void 0);
507+
console.log(delete void 0);
508+
console.log(delete (1 / 0));
509+
console.log(delete (1 / 0));
510+
console.log(delete (0 / 0));
511+
console.log(delete (0 / 0));
512+
}
513+
expect_stdout: true
514+
}
515+
516+
delete_seq_3: {
517+
options = {
518+
keep_infinity: true,
519+
side_effects: true,
520+
}
521+
input: {
522+
console.log(delete (1, 2, undefined));
523+
console.log(delete (1, 2, void 0));
524+
console.log(delete (1, 2, Infinity));
525+
console.log(delete (1, 2, 1 / 0));
526+
console.log(delete (1, 2, NaN));
527+
console.log(delete (1, 2, 0 / 0));
528+
}
529+
expect: {
530+
console.log(delete void 0);
531+
console.log(delete void 0);
532+
console.log(delete (1 / 0));
533+
console.log(delete (1 / 0));
534+
console.log(delete (0 / 0));
535+
console.log(delete (0 / 0));
536+
}
537+
expect_stdout: true
538+
}

0 commit comments

Comments
 (0)