avoid confusion of NaN & Infinity with catch symbol of the same name (#1763)
fixes #1760 fixes #1761
This commit is contained in:
@@ -409,6 +409,18 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function find_variable(compressor, name) {
|
||||||
|
var scope, i = 0;
|
||||||
|
while (scope = compressor.parent(i++)) {
|
||||||
|
if (scope instanceof AST_Scope) break;
|
||||||
|
if (scope instanceof AST_Catch) {
|
||||||
|
scope = scope.argname.definition().scope;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return scope.find_variable(name);
|
||||||
|
}
|
||||||
|
|
||||||
function make_node(ctor, orig, props) {
|
function make_node(ctor, orig, props) {
|
||||||
if (!props) props = {};
|
if (!props) props = {};
|
||||||
if (orig) {
|
if (orig) {
|
||||||
@@ -3517,12 +3529,11 @@ merge(Compressor.prototype, {
|
|||||||
|
|
||||||
OPT(AST_Undefined, function(self, compressor){
|
OPT(AST_Undefined, function(self, compressor){
|
||||||
if (compressor.option("unsafe")) {
|
if (compressor.option("unsafe")) {
|
||||||
var scope = compressor.find_parent(AST_Scope);
|
var undef = find_variable(compressor, "undefined");
|
||||||
var undef = scope.find_variable("undefined");
|
|
||||||
if (undef) {
|
if (undef) {
|
||||||
var ref = make_node(AST_SymbolRef, self, {
|
var ref = make_node(AST_SymbolRef, self, {
|
||||||
name : "undefined",
|
name : "undefined",
|
||||||
scope : scope,
|
scope : undef.scope,
|
||||||
thedef : undef
|
thedef : undef
|
||||||
});
|
});
|
||||||
ref.is_undefined = true;
|
ref.is_undefined = true;
|
||||||
@@ -3538,8 +3549,7 @@ merge(Compressor.prototype, {
|
|||||||
});
|
});
|
||||||
|
|
||||||
OPT(AST_Infinity, function(self, compressor){
|
OPT(AST_Infinity, function(self, compressor){
|
||||||
var retain = compressor.option("keep_infinity")
|
var retain = compressor.option("keep_infinity") && !find_variable(compressor, "Infinity");
|
||||||
&& !compressor.find_parent(AST_Scope).find_variable("Infinity");
|
|
||||||
return retain ? self : make_node(AST_Binary, self, {
|
return retain ? self : make_node(AST_Binary, self, {
|
||||||
operator: "/",
|
operator: "/",
|
||||||
left: make_node(AST_Number, self, {
|
left: make_node(AST_Number, self, {
|
||||||
@@ -3552,7 +3562,7 @@ merge(Compressor.prototype, {
|
|||||||
});
|
});
|
||||||
|
|
||||||
OPT(AST_NaN, function(self, compressor){
|
OPT(AST_NaN, function(self, compressor){
|
||||||
return compressor.find_parent(AST_Scope).find_variable("NaN") ? make_node(AST_Binary, self, {
|
return find_variable(compressor, "NaN") ? make_node(AST_Binary, self, {
|
||||||
operator: "/",
|
operator: "/",
|
||||||
left: make_node(AST_Number, self, {
|
left: make_node(AST_Number, self, {
|
||||||
value: 0
|
value: 0
|
||||||
|
|||||||
@@ -802,3 +802,58 @@ issue_1649: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "-2";
|
expect_stdout: "-2";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1760_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(a) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (NaN) {
|
||||||
|
a = +"foo";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(a) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (NaN) {
|
||||||
|
a = 0 / 0;
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1760_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(a) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (Infinity) {
|
||||||
|
a = 123456789 / 0;
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(a) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (Infinity) {
|
||||||
|
a = 1 / 0;
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "Infinity"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user