]> git.kaiwu.me - njs.git/commitdiff
parseFloat() function.
authorIgor Sysoev <igor@sysoev.ru>
Mon, 25 Apr 2016 16:30:27 +0000 (19:30 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 25 Apr 2016 16:30:27 +0000 (19:30 +0300)
12 files changed:
njs/njs_builtin.c
njs/njs_generator.c
njs/njs_lexer_keyword.c
njs/njs_number.c
njs/njs_number.h
njs/njs_parser.c
njs/njs_parser.h
njs/njs_string.c
njs/njs_string.h
njs/njs_vm.c
njs/njs_vm.h
njs/test/njs_unit_test.c

index 895deb2b68b1f9be9a7bdcd18f760194a7a76df8..c53a0047a53d43421990f2c2de5e7e5bdc61edaf 100644 (file)
@@ -84,6 +84,7 @@ njs_builtin_objects_create(njs_vm_t *vm)
         NULL,
         NULL,
         NULL,
+        NULL,
     };
 
     static const njs_function_init_t  native_functions[] = {
@@ -94,6 +95,7 @@ njs_builtin_objects_create(njs_vm_t *vm)
         { njs_number_is_finite,            { NJS_SKIP_ARG, NJS_NUMBER_ARG } },
         { njs_number_parse_int,
           { NJS_SKIP_ARG, NJS_STRING_ARG, NJS_INTEGER_ARG } },
+        { njs_number_parse_float,          { NJS_SKIP_ARG, NJS_STRING_ARG } },
     };
 
     static const njs_object_prop_t    null_proto_property = {
index 5deb1ded3e85e23c579e9b6df60c5d0626165a5d..eb18e45b618d6b1c978cab6553d62ea21b9dc41b 100644 (file)
@@ -298,6 +298,7 @@ njs_generator(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node)
     case NJS_TOKEN_IS_NAN:
     case NJS_TOKEN_IS_FINITE:
     case NJS_TOKEN_PARSE_INT:
+    case NJS_TOKEN_PARSE_FLOAT:
         return njs_generate_builtin_object(vm, parser, node);
 
     case NJS_TOKEN_FUNCTION:
index 53d84cd888a2a503e89696228c4598660b535801..0a3a6228fea9e3bdb01fd29af4a4e5091e46b520 100644 (file)
@@ -92,6 +92,7 @@ static const njs_keyword_t  njs_keywords[] = {
     { nxt_string("isNaN"),         NJS_TOKEN_IS_NAN, 0 },
     { nxt_string("isFinite"),      NJS_TOKEN_IS_FINITE, 0 },
     { nxt_string("parseInt"),      NJS_TOKEN_PARSE_INT, 0 },
+    { nxt_string("parseFloat"),    NJS_TOKEN_PARSE_FLOAT, 0 },
 
     /* Reserved words. */
 
index 5fa81452b4745089e9e2c358c5b8ba1305c9fcac..51b0785c15acb40f1e124559d42ab34437bb9eb6 100644 (file)
@@ -36,7 +36,7 @@ njs_value_to_number(njs_value_t *value)
     }
 
     if (njs_is_string(value)) {
-        return njs_string_to_number(value);
+        return njs_string_to_number(value, 1);
     }
 
     if (njs_is_array(value)) {
@@ -549,3 +549,21 @@ done:
 
     return NXT_OK;
 }
+
+
+njs_ret_t
+njs_number_parse_float(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+    njs_index_t unused)
+{
+    double  num;
+
+    num = NJS_NAN;
+
+    if (nargs > 1) {
+        num = njs_string_to_number(&args[1], 0);
+    }
+
+    njs_number_set(&vm->retval, num);
+
+    return NXT_OK;
+}
index 4fa27804889b899b648308c7421438e49776184b..c63ff05c0112bd0e76415ade22a7e712d44930d7 100644 (file)
@@ -37,6 +37,8 @@ njs_ret_t njs_number_is_finite(njs_vm_t *vm, njs_value_t *args,
     nxt_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_number_parse_int(njs_vm_t *vm, njs_value_t *args,
     nxt_uint_t nargs, njs_index_t unused);
+njs_ret_t njs_number_parse_float(njs_vm_t *vm, njs_value_t *args,
+    nxt_uint_t nargs, njs_index_t unused);
 
 
 extern const njs_object_init_t  njs_number_constructor_init;
index 575c2e6a6b4e3cbc10ade5fa95a5d0e7f6391fda..cadfc3ceb07610025cf551083dc4ce41a71f2818 100644 (file)
@@ -1648,6 +1648,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
     case NJS_TOKEN_IS_NAN:
     case NJS_TOKEN_IS_FINITE:
     case NJS_TOKEN_PARSE_INT:
+    case NJS_TOKEN_PARSE_FLOAT:
         return njs_parser_builtin_function(vm, parser, node);
 
     default:
index 3d35f096aa70c663caf3d3aeca14a813c212a2a9..f8d4ca981ecd60ab6266d3064472c91dec60c63a 100644 (file)
@@ -179,6 +179,7 @@ typedef enum {
     NJS_TOKEN_IS_NAN,
     NJS_TOKEN_IS_FINITE,
     NJS_TOKEN_PARSE_INT,
+    NJS_TOKEN_PARSE_FLOAT,
 
     NJS_TOKEN_RESERVED,
 } njs_token_t;
index d5bc353cf6739bfd6b0bb95069bc0154d5a46467..2f979b8dbb499e2fd5fd8ceb823ec40b0063bb60 100644 (file)
@@ -1678,7 +1678,7 @@ njs_primitive_value_to_string(njs_vm_t *vm, njs_value_t *dst,
 
 
 double
-njs_string_to_number(njs_value_t *value)
+njs_string_to_number(njs_value_t *value, nxt_bool_t exact)
 {
     double        num;
     size_t        size;
@@ -1737,12 +1737,14 @@ njs_string_to_number(njs_value_t *value)
         p += infinity;
     }
 
-    while (p < end) {
-        if (*p != ' ' && *p != '\t') {
-            return NJS_NAN;
-        }
+    if (exact) {
+        while (p < end) {
+            if (*p != ' ' && *p != '\t') {
+                return NJS_NAN;
+            }
 
-        p++;
+            p++;
+        }
     }
 
     return minus ? -num : num;
index d4d398a2be1c7f3223797f948d1dce04c25150b6..e651c7056328a2c1fa493a207b8fe2b7817210bd 100644 (file)
@@ -103,7 +103,7 @@ nxt_noinline uint32_t njs_string_index(njs_string_prop_t *string,
     uint32_t offset);
 njs_ret_t njs_primitive_value_to_string(njs_vm_t *vm, njs_value_t *dst,
     const njs_value_t *src);
-double njs_string_to_number(njs_value_t *value);
+double njs_string_to_number(njs_value_t *value, nxt_bool_t exact);
 
 njs_index_t njs_value_index(njs_vm_t *vm, njs_parser_t *parser,
     const njs_value_t *src);
index 046ce6926e51d5606a02172a85e83466d6b8aec9..c2729036949041273f41df359f89a612a6494afb 100644 (file)
@@ -2915,7 +2915,7 @@ njs_vmcode_number_primitive(njs_vm_t *vm, njs_value_t *invld, njs_value_t *narg)
             num = NJS_NAN;
 
             if (njs_is_string(value)) {
-                num = njs_string_to_number(value);
+                num = njs_string_to_number(value, 1);
             }
 
             njs_number_set(value, num);
@@ -2968,7 +2968,7 @@ njs_vmcode_number_argument(njs_vm_t *vm, njs_value_t *invld1,
             num = NJS_NAN;
 
             if (njs_is_string(value)) {
-                num = njs_string_to_number(value);
+                num = njs_string_to_number(value, 1);
             }
 
             njs_number_set(value, num);
index 9e9fb69c229173b014989c5b1bb5f68d0054c437..00748208322e0358c383a488dc8c1ee5c9606fc1 100644 (file)
@@ -705,7 +705,8 @@ enum njs_function_e {
     NJS_FUNCTION_IS_NAN =      2,
     NJS_FUNCTION_IS_FINITE =   3,
     NJS_FUNCTION_PARSE_INT =   4,
-#define NJS_FUNCTION_MAX       (NJS_FUNCTION_PARSE_INT + 1)
+    NJS_FUNCTION_PARSE_FLOAT = 5,
+#define NJS_FUNCTION_MAX       (NJS_FUNCTION_PARSE_FLOAT + 1)
 };
 
 
index f4b8b66ac99ba9e22f42ad077a2195293325b89a..59f80c512397f1044f086df66717a08795b9832c 100644 (file)
@@ -4449,6 +4449,9 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("parseInt('njscript', 36)"),
       nxt_string("1845449130881") },
 
+    { nxt_string("parseFloat('12345abc')"),
+      nxt_string("12345") },
+
     /* External interface. */
 
     { nxt_string("function f(req) { return req.uri }"),