]> git.kaiwu.me - njs.git/commitdiff
parseInt() fixed for hexadecimal literals.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 25 May 2017 11:16:31 +0000 (14:16 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 25 May 2017 11:16:31 +0000 (14:16 +0300)
njs/njs_number.c
njs/test/njs_unit_test.c

index a11bae1fd592afe0c77db0b713cc687214ac1e65..d9371f881482cf40a2b5be4d53f07a6f9430f028 100644 (file)
@@ -662,7 +662,7 @@ njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     u_char             *p, *end;
     int64_t            n;
     uint8_t            radix;
-    nxt_bool_t         minus;
+    nxt_bool_t         minus, test_prefix;
     njs_string_prop_t  string;
 
     num = NAN;
@@ -693,25 +693,30 @@ njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             p++;
         }
 
-        if (end - p > 1 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
-            p += 2;
-            radix = 16;
+        test_prefix = (end - p > 1);
+
+        if (nargs > 2) {
+            radix = args[2].data.u.number;
+
+            if (radix < 2 || radix > 36) {
+                goto done;
+            }
+
+            if (radix != 16) {
+                test_prefix = 0;
+            }
 
         } else {
             radix = 10;
         }
 
-        if (nargs > 2) {
-            n = args[2].data.u.number;
-
-            if (n != 0) {
-
-                if (n < 2 || n > 36) {
-                    goto done;
-                }
+        if (test_prefix && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
+            p += 2;
+            radix = 16;
+        }
 
-                radix = n;
-            }
+        if (p == end) {
+            goto done;
         }
 
         n = njs_number_radix_parse(p, end, radix, 0);
index f6b38e46d294c429b20b1341aca902037b2da60a..bf588b8586aa64f184430200f8cd76e2b71dabaf 100644 (file)
@@ -7047,6 +7047,27 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("parseInt('njscript', 36)"),
       nxt_string("1845449130881") },
 
+    { nxt_string("parseInt('0x')"),
+      nxt_string("NaN") },
+
+    { nxt_string("parseInt('0x', 10)"),
+      nxt_string("0") },
+
+    { nxt_string("parseInt('0x', 16)"),
+      nxt_string("NaN") },
+
+    { nxt_string("parseInt('0x', 33)"),
+      nxt_string("0") },
+
+    { nxt_string("parseInt('0x', 34)"),
+      nxt_string("33") },
+
+    { nxt_string("parseInt('0', 1)"),
+      nxt_string("NaN") },
+
+    { nxt_string("parseInt('0', 37)"),
+      nxt_string("NaN") },
+
     { nxt_string("parseFloat('12345abc')"),
       nxt_string("12345") },