From: Richard van Velzen Date: Wed, 31 Dec 2014 11:23:00 +0000 (+0100) Subject: Fix #597 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=c75f5a1fd85368edb3456637c544dee0cad1011e;p=UglifyJS.git Fix #597 NaN and Infinity were replaced in the output generation, instead of during compression. This could lead to results where `1/0` was inserted without parens leading to invalid output. The nodes are replaced in the compression step now, and the output generation returns their regular names. This should not be a problem, since they're already only constructed from the original name. --- diff --git a/lib/compress.js b/lib/compress.js index e63ce148..f8030722 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2203,14 +2203,30 @@ merge(Compressor.prototype, { case "undefined": return make_node(AST_Undefined, self); case "NaN": - return make_node(AST_NaN, self); + return make_node(AST_NaN, self).transform(compressor); case "Infinity": - return make_node(AST_Infinity, self); + return make_node(AST_Infinity, self).transform(compressor); } } return self; }); + OPT(AST_Infinity, function (self, compressor) { + return make_node(AST_Binary, self, { + operator : '/', + left : make_node(AST_Number, null, {value: 1}), + right : make_node(AST_Number, null, {value: 0}) + }); + }); + + OPT(AST_NaN, function (self, compressor) { + return make_node(AST_Binary, self, { + operator : '/', + left : make_node(AST_Number, null, {value: 0}), + right : make_node(AST_Number, null, {value: 0}) + }); + }); + OPT(AST_Undefined, function(self, compressor){ if (compressor.option("unsafe")) { var scope = compressor.find_parent(AST_Scope); diff --git a/lib/output.js b/lib/output.js index 7fe61af3..5a8f603c 100644 --- a/lib/output.js +++ b/lib/output.js @@ -549,12 +549,6 @@ function OutputStream(options) { return true; }); - PARENS(AST_NaN, function(output){ - var p = output.parent(); - if (p instanceof AST_PropAccess && p.expression === this) - return true; - }); - PARENS([ AST_Assign, AST_Conditional ], function (output){ var p = output.parent(); // !(a = false) → true @@ -1109,10 +1103,10 @@ function OutputStream(options) { }); DEFPRINT(AST_Hole, noop); DEFPRINT(AST_Infinity, function(self, output){ - output.print("1/0"); + output.print("Infinity"); }); DEFPRINT(AST_NaN, function(self, output){ - output.print("0/0"); + output.print("NaN"); }); DEFPRINT(AST_This, function(self, output){ output.print("this"); diff --git a/test/compress/issue-597.js b/test/compress/issue-597.js new file mode 100644 index 00000000..3c651a4c --- /dev/null +++ b/test/compress/issue-597.js @@ -0,0 +1,25 @@ +NaN_and_Infinity_must_have_parens: { + options = {}; + input: { + Infinity.toString(); + NaN.toString(); + } + expect: { + (1/0).toString(); + (0/0).toString(); + } +} + +NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined: { + options = {}; + input: { + var Infinity, NaN; + Infinity.toString(); + NaN.toString(); + } + expect: { + var Infinity, NaN; + Infinity.toString(); + NaN.toString(); + } +}