diff --git a/lib/parse.js b/lib/parse.js index 06f3f840b5..aaaa714802 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -1763,40 +1763,45 @@ function parse($TEXT, options) { }; function as_atom_node() { - var tok = S.token, ret; + var ret, tok = S.token, value = tok.value; switch (tok.type) { case "num": - ret = new AST_Number({ start: tok, end: tok, value: tok.value }); + if (isFinite(value)) { + ret = new AST_Number({ value: value }); + } else { + ret = new AST_Infinity(); + if (value < 0) ret = new AST_UnaryPrefix({ operator: "-", expression: ret }); + } break; case "bigint": - ret = new AST_BigInt({ start: tok, end: tok, value: tok.value }); + ret = new AST_BigInt({ value: value }); break; case "string": - ret = new AST_String({ - start : tok, - end : tok, - value : tok.value, - quote : tok.quote - }); + ret = new AST_String({ value : value, quote : tok.quote }); break; case "regexp": - ret = new AST_RegExp({ start: tok, end: tok, value: tok.value }); + ret = new AST_RegExp({ value: value }); break; case "atom": - switch (tok.value) { + switch (value) { case "false": - ret = new AST_False({ start: tok, end: tok }); + ret = new AST_False(); break; case "true": - ret = new AST_True({ start: tok, end: tok }); + ret = new AST_True(); break; case "null": - ret = new AST_Null({ start: tok, end: tok }); + ret = new AST_Null(); break; + default: + unexpected(); } break; + default: + unexpected(); } next(); + ret.start = ret.end = tok; return ret; } diff --git a/test/compress/numbers.js b/test/compress/numbers.js index d7c0360c89..dced3f1634 100644 --- a/test/compress/numbers.js +++ b/test/compress/numbers.js @@ -1,3 +1,10 @@ +literal_infinity: { + input: { + console.log(2e308, -1e2345); + } + expect_exact: "console.log(1/0,-(1/0));" +} + parentheses_for_prototype_functions: { beautify = { beautify: true,