Don't replace undefined, NaN and Infinity within with scope
This commit is contained in:
@@ -1056,31 +1056,37 @@ merge(Compressor.prototype, {
|
|||||||
throw def;
|
throw def;
|
||||||
});
|
});
|
||||||
def(AST_Binary, function(c){
|
def(AST_Binary, function(c){
|
||||||
var left = this.left, right = this.right;
|
var left = this.left, right = this.right, result;
|
||||||
switch (this.operator) {
|
switch (this.operator) {
|
||||||
case "&&" : return ev(left, c) && ev(right, c);
|
case "&&" : result = ev(left, c) && ev(right, c); break;
|
||||||
case "||" : return ev(left, c) || ev(right, c);
|
case "||" : result = ev(left, c) || ev(right, c); break;
|
||||||
case "|" : return ev(left, c) | ev(right, c);
|
case "|" : result = ev(left, c) | ev(right, c); break;
|
||||||
case "&" : return ev(left, c) & ev(right, c);
|
case "&" : result = ev(left, c) & ev(right, c); break;
|
||||||
case "^" : return ev(left, c) ^ ev(right, c);
|
case "^" : result = ev(left, c) ^ ev(right, c); break;
|
||||||
case "+" : return ev(left, c) + ev(right, c);
|
case "+" : result = ev(left, c) + ev(right, c); break;
|
||||||
case "*" : return ev(left, c) * ev(right, c);
|
case "*" : result = ev(left, c) * ev(right, c); break;
|
||||||
case "/" : return ev(left, c) / ev(right, c);
|
case "/" : result = ev(left, c) / ev(right, c); break;
|
||||||
case "%" : return ev(left, c) % ev(right, c);
|
case "%" : result = ev(left, c) % ev(right, c); break;
|
||||||
case "-" : return ev(left, c) - ev(right, c);
|
case "-" : result = ev(left, c) - ev(right, c); break;
|
||||||
case "<<" : return ev(left, c) << ev(right, c);
|
case "<<" : result = ev(left, c) << ev(right, c); break;
|
||||||
case ">>" : return ev(left, c) >> ev(right, c);
|
case ">>" : result = ev(left, c) >> ev(right, c); break;
|
||||||
case ">>>" : return ev(left, c) >>> ev(right, c);
|
case ">>>" : result = ev(left, c) >>> ev(right, c); break;
|
||||||
case "==" : return ev(left, c) == ev(right, c);
|
case "==" : result = ev(left, c) == ev(right, c); break;
|
||||||
case "===" : return ev(left, c) === ev(right, c);
|
case "===" : result = ev(left, c) === ev(right, c); break;
|
||||||
case "!=" : return ev(left, c) != ev(right, c);
|
case "!=" : result = ev(left, c) != ev(right, c); break;
|
||||||
case "!==" : return ev(left, c) !== ev(right, c);
|
case "!==" : result = ev(left, c) !== ev(right, c); break;
|
||||||
case "<" : return ev(left, c) < ev(right, c);
|
case "<" : result = ev(left, c) < ev(right, c); break;
|
||||||
case "<=" : return ev(left, c) <= ev(right, c);
|
case "<=" : result = ev(left, c) <= ev(right, c); break;
|
||||||
case ">" : return ev(left, c) > ev(right, c);
|
case ">" : result = ev(left, c) > ev(right, c); break;
|
||||||
case ">=" : return ev(left, c) >= ev(right, c);
|
case ">=" : result = ev(left, c) >= ev(right, c); break;
|
||||||
|
default:
|
||||||
|
throw def;
|
||||||
}
|
}
|
||||||
throw def;
|
if (isNaN(result) && c.find_parent(AST_With)) {
|
||||||
|
// leave original expression as is
|
||||||
|
throw def;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
});
|
});
|
||||||
def(AST_Conditional, function(compressor){
|
def(AST_Conditional, function(compressor){
|
||||||
return ev(this.condition, compressor)
|
return ev(this.condition, compressor)
|
||||||
@@ -2599,13 +2605,16 @@ merge(Compressor.prototype, {
|
|||||||
if (defines && HOP(defines, self.name)) {
|
if (defines && HOP(defines, self.name)) {
|
||||||
return make_node_from_constant(compressor, defines[self.name], self);
|
return make_node_from_constant(compressor, defines[self.name], self);
|
||||||
}
|
}
|
||||||
switch (self.name) {
|
// testing against !self.scope.uses_with first is an optimization
|
||||||
case "undefined":
|
if (!self.scope.uses_with || !compressor.find_parent(AST_With)) {
|
||||||
return make_node(AST_Undefined, self);
|
switch (self.name) {
|
||||||
case "NaN":
|
case "undefined":
|
||||||
return make_node(AST_NaN, self).transform(compressor);
|
return make_node(AST_Undefined, self);
|
||||||
case "Infinity":
|
case "NaN":
|
||||||
return make_node(AST_Infinity, self).transform(compressor);
|
return make_node(AST_NaN, self).transform(compressor);
|
||||||
|
case "Infinity":
|
||||||
|
return make_node(AST_Infinity, self).transform(compressor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
|
|||||||
@@ -145,3 +145,96 @@ check_drop_unused_in_peer_function: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Infinity_not_in_with_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { Infinity: 'oInfinity' };
|
||||||
|
var vInfinity = "Infinity";
|
||||||
|
vInfinity = Infinity;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { Infinity: 'oInfinity' }
|
||||||
|
var vInfinity = "Infinity"
|
||||||
|
vInfinity = 1/0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Infinity_in_with_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { Infinity: 'oInfinity' };
|
||||||
|
var vInfinity = "Infinity";
|
||||||
|
with (o) { vInfinity = Infinity; }
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { Infinity: 'oInfinity' }
|
||||||
|
var vInfinity = "Infinity"
|
||||||
|
with (o) vInfinity = Infinity
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assorted_Infinity_NaN_undefined_in_with_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
booleans: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
sequences: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
undefined : 3,
|
||||||
|
NaN : 4,
|
||||||
|
Infinity : 5,
|
||||||
|
}
|
||||||
|
if (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(2 + 7 + undefined, 2 + 7 + void 0);
|
||||||
|
}
|
||||||
|
with (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(2 + 7 + undefined, 2 + 7 + void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
undefined : 3,
|
||||||
|
NaN : 4,
|
||||||
|
Infinity : 5
|
||||||
|
}
|
||||||
|
if (o) {
|
||||||
|
f(void 0, void 0);
|
||||||
|
f(NaN, NaN);
|
||||||
|
f(1/0, 1/0);
|
||||||
|
f(-(1/0), -(1/0));
|
||||||
|
f(NaN, NaN);
|
||||||
|
}
|
||||||
|
with (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(9 + undefined, 9 + void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user