parse out-of-range numerals correctly (#4781)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 15 Mar 2021 22:52:21 +0000 (22:52 +0000)
committerGitHub <noreply@github.com>
Mon, 15 Mar 2021 22:52:21 +0000 (06:52 +0800)
lib/parse.js
test/compress/numbers.js

index 06f3f84..aaaa714 100644 (file)
@@ -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;
     }
 
index d7c0360..dced3f1 100644 (file)
@@ -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,