]> git.kaiwu.me - njs.git/commitdiff
isFinite() function.
authorIgor Sysoev <igor@sysoev.ru>
Thu, 21 Apr 2016 15:23:16 +0000 (18:23 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Thu, 21 Apr 2016 15:23:16 +0000 (18:23 +0300)
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_vm.h
njs/test/njs_unit_test.c

index 339b36cbb31ce594339dca70cd35ec678f88ec3a..d320d3b967b4ca42d13970b70d6af2a4390bf660 100644 (file)
@@ -82,6 +82,7 @@ njs_builtin_objects_create(njs_vm_t *vm)
         &njs_eval_function_init,
         NULL,
         NULL,
+        NULL,
     };
 
     static const njs_function_init_t  native_functions[] = {
@@ -89,6 +90,7 @@ njs_builtin_objects_create(njs_vm_t *vm)
         { njs_eval_function,               { 0 } },
         { njs_object_prototype_to_string,  { 0 } },
         { njs_number_is_nan,               { NJS_SKIP_ARG, NJS_NUMBER_ARG } },
+        { njs_number_is_finite,            { NJS_SKIP_ARG, NJS_NUMBER_ARG } },
     };
 
     static const njs_object_prop_t    null_proto_property = {
index 580d0a4b1209893f6a7c33add70ecb7c664f8ddb..ce585c49cbfe35e76accaf44e369a96b32baa5e3 100644 (file)
@@ -296,6 +296,7 @@ njs_generator(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node)
     case NJS_TOKEN_EVAL:
     case NJS_TOKEN_TO_STRING:
     case NJS_TOKEN_IS_NAN:
+    case NJS_TOKEN_IS_FINITE:
         return njs_generate_builtin_object(vm, parser, node);
 
     case NJS_TOKEN_FUNCTION:
index e216f434af29776eef8ccb0ad9f006ce26cb8459..0f726e3be2b4e97f50529141d8c583aacf88a6b1 100644 (file)
@@ -90,6 +90,7 @@ static const njs_keyword_t  njs_keywords[] = {
     { nxt_string("eval"),          NJS_TOKEN_EVAL, 0 },
     { nxt_string("toString"),      NJS_TOKEN_TO_STRING, 0 },
     { nxt_string("isNaN"),         NJS_TOKEN_IS_NAN, 0 },
+    { nxt_string("isFinite"),      NJS_TOKEN_IS_FINITE, 0 },
 
     /* Reserved words. */
 
index 8e7b47328310a6a1c9f2d85facff1ba568338743..ed816788915b3a81de5186934a1230be3adac278 100644 (file)
@@ -451,3 +451,26 @@ njs_number_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     return NXT_OK;
 }
+
+
+njs_ret_t
+njs_number_is_finite(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+    njs_index_t unused)
+{
+    double             num;
+    const njs_value_t  *value;
+
+    value = &njs_value_false;
+
+    if (nargs > 1) {
+        num = args[1].data.u.number;
+
+        if (!njs_is_nan(num) && !njs_is_infinity(num)) {
+            value = &njs_value_true;
+        }
+    }
+
+    vm->retval = *value;
+
+    return NXT_OK;
+}
index 2dee8a1c85a4cfe34f34f1d25f79b65722d67a9c..d008168c127d024ac1048abbcb4c1cf4e6a4c2dc 100644 (file)
@@ -32,6 +32,8 @@ njs_ret_t njs_number_constructor(njs_vm_t *vm, njs_value_t *args,
     nxt_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_number_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_index_t unused);
+njs_ret_t njs_number_is_finite(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 d654eb43c8be46a055173899eaa3192dd141cf62..dd316d2ed67e42df346dbde87d7717c856862d31 100644 (file)
@@ -1646,6 +1646,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
     case NJS_TOKEN_EVAL:
     case NJS_TOKEN_TO_STRING:
     case NJS_TOKEN_IS_NAN:
+    case NJS_TOKEN_IS_FINITE:
         return njs_parser_builtin_function(vm, parser, node);
 
     default:
index 4e1e5e62308c5d199ecd7a622e1fb1bed7097dfc..3f4b20013a44dcd7a4c25ca4186e77d76bce499f 100644 (file)
@@ -177,6 +177,7 @@ typedef enum {
     NJS_TOKEN_EVAL,
     NJS_TOKEN_TO_STRING,
     NJS_TOKEN_IS_NAN,
+    NJS_TOKEN_IS_FINITE,
 
     NJS_TOKEN_RESERVED,
 } njs_token_t;
index 0a0dcd08bd566c0b5e5da7072ab9dfeebb20abcd..e9d7f154afba7663eb3c62a2a10186d8ed83bce3 100644 (file)
@@ -703,7 +703,8 @@ enum njs_function_e {
     NJS_FUNCTION_EVAL =        0,
     NJS_FUNCTION_TO_STRING =   1,
     NJS_FUNCTION_IS_NAN =      2,
-#define NJS_FUNCTION_MAX       (NJS_FUNCTION_IS_NAN + 1)
+    NJS_FUNCTION_IS_FINITE =   3,
+#define NJS_FUNCTION_MAX       (NJS_FUNCTION_IS_FINITE + 1)
 };
 
 
index d7eaef6c484ac777fa89c6ad628fcb35b756d934..53b7409f12a75ada4517ab7e167c9b4e354cbaa7 100644 (file)
@@ -4413,6 +4413,24 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("isNaN('abc')"),
       nxt_string("true") },
 
+    { nxt_string("isFinite"),
+      nxt_string("[object Function]") },
+
+    { nxt_string("isFinite()"),
+      nxt_string("false") },
+
+    { nxt_string("isFinite(123)"),
+      nxt_string("true") },
+
+    { nxt_string("isFinite('123')"),
+      nxt_string("true") },
+
+    { nxt_string("isFinite('Infinity')"),
+      nxt_string("false") },
+
+    { nxt_string("isFinite('abc')"),
+      nxt_string("false") },
+
     /* External interface. */
 
     { nxt_string("function f(req) { return req.uri }"),