diff --git a/lib/compress.js b/lib/compress.js index 5776fb88afa..763490a7bbc 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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) { if (!props) props = {}; if (orig) { @@ -3517,12 +3529,11 @@ merge(Compressor.prototype, { OPT(AST_Undefined, function(self, compressor){ if (compressor.option("unsafe")) { - var scope = compressor.find_parent(AST_Scope); - var undef = scope.find_variable("undefined"); + var undef = find_variable(compressor, "undefined"); if (undef) { var ref = make_node(AST_SymbolRef, self, { name : "undefined", - scope : scope, + scope : undef.scope, thedef : undef }); ref.is_undefined = true; @@ -3538,8 +3549,7 @@ merge(Compressor.prototype, { }); OPT(AST_Infinity, function(self, compressor){ - var retain = compressor.option("keep_infinity") - && !compressor.find_parent(AST_Scope).find_variable("Infinity"); + var retain = compressor.option("keep_infinity") && !find_variable(compressor, "Infinity"); return retain ? self : make_node(AST_Binary, self, { operator: "/", left: make_node(AST_Number, self, { @@ -3552,7 +3562,7 @@ merge(Compressor.prototype, { }); 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: "/", left: make_node(AST_Number, self, { value: 0 diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 0d26e749862..fa432c4617a 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -802,3 +802,58 @@ issue_1649: { } 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" +}