fix corner cases with delete (#1796)
`delete Infinity` returns `false` where as `delete (1/0)` returns `true`
This commit is contained in:
@@ -3620,6 +3620,11 @@ merge(Compressor.prototype, {
|
||||
return ref;
|
||||
}
|
||||
}
|
||||
var parent = compressor.parent();
|
||||
if (parent instanceof AST_UnaryPrefix
|
||||
&& parent.operator == "delete"
|
||||
&& (parent.expression instanceof AST_SymbolRef
|
||||
|| parent.expression.TYPE === self.TYPE)) return self;
|
||||
return make_node(AST_UnaryPrefix, self, {
|
||||
operator: "void",
|
||||
expression: make_node(AST_Number, self, {
|
||||
@@ -3629,8 +3634,16 @@ merge(Compressor.prototype, {
|
||||
});
|
||||
|
||||
OPT(AST_Infinity, function(self, compressor){
|
||||
var retain = compressor.option("keep_infinity") && !find_variable(compressor, "Infinity");
|
||||
return retain ? self : make_node(AST_Binary, self, {
|
||||
var parent = compressor.parent();
|
||||
if (parent instanceof AST_UnaryPrefix
|
||||
&& parent.operator == "delete"
|
||||
&& (parent.expression instanceof AST_SymbolRef
|
||||
|| parent.expression.TYPE === self.TYPE))
|
||||
return self;
|
||||
if (compressor.option("keep_infinity")
|
||||
&& !find_variable(compressor, "Infinity"))
|
||||
return self;
|
||||
return make_node(AST_Binary, self, {
|
||||
operator: "/",
|
||||
left: make_node(AST_Number, self, {
|
||||
value: 1
|
||||
@@ -3642,15 +3655,23 @@ merge(Compressor.prototype, {
|
||||
});
|
||||
|
||||
OPT(AST_NaN, function(self, compressor){
|
||||
return find_variable(compressor, "NaN") ? make_node(AST_Binary, self, {
|
||||
operator: "/",
|
||||
left: make_node(AST_Number, self, {
|
||||
value: 0
|
||||
}),
|
||||
right: make_node(AST_Number, self, {
|
||||
value: 0
|
||||
})
|
||||
}) : self;
|
||||
var parent = compressor.parent();
|
||||
if (parent instanceof AST_UnaryPrefix
|
||||
&& parent.operator == "delete"
|
||||
&& !(parent.expression instanceof AST_SymbolRef
|
||||
|| parent.expression.TYPE === self.TYPE)
|
||||
|| find_variable(compressor, "NaN")) {
|
||||
return make_node(AST_Binary, self, {
|
||||
operator: "/",
|
||||
left: make_node(AST_Number, self, {
|
||||
value: 0
|
||||
}),
|
||||
right: make_node(AST_Number, self, {
|
||||
value: 0
|
||||
})
|
||||
});
|
||||
}
|
||||
return self;
|
||||
});
|
||||
|
||||
var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];
|
||||
|
||||
@@ -857,3 +857,26 @@ issue_1760_2: {
|
||||
}
|
||||
expect_stdout: "Infinity"
|
||||
}
|
||||
|
||||
delete_expr: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
}
|
||||
input: {
|
||||
console.log(delete undefined);
|
||||
console.log(delete void 0);
|
||||
console.log(delete Infinity);
|
||||
console.log(delete (1 / 0));
|
||||
console.log(delete NaN);
|
||||
console.log(delete (0 / 0));
|
||||
}
|
||||
expect: {
|
||||
console.log(delete undefined);
|
||||
console.log(delete void 0);
|
||||
console.log(delete Infinity);
|
||||
console.log(delete (1 / 0));
|
||||
console.log(delete NaN);
|
||||
console.log(delete (0 / 0));
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user