fix corner cases with delete (#1796)

`delete Infinity` returns `false` where as `delete (1/0)` returns `true`
This commit is contained in:
Alex Lam S.L
2017-04-07 15:39:59 +08:00
committed by GitHub
parent 0f4cd73dcc
commit e3c9c22c75
2 changed files with 55 additions and 11 deletions

View File

@@ -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 = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];

View File

@@ -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
}