From: Igor Sysoev Date: Thu, 21 Apr 2016 15:23:16 +0000 (+0300) Subject: isFinite() function. X-Git-Tag: 0.1.0~24 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=826afe9470a4841671581094f799c0a835d663fe;p=njs.git isFinite() function. --- diff --git a/njs/njs_builtin.c b/njs/njs_builtin.c index 339b36cb..d320d3b9 100644 --- a/njs/njs_builtin.c +++ b/njs/njs_builtin.c @@ -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 = { diff --git a/njs/njs_generator.c b/njs/njs_generator.c index 580d0a4b..ce585c49 100644 --- a/njs/njs_generator.c +++ b/njs/njs_generator.c @@ -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: diff --git a/njs/njs_lexer_keyword.c b/njs/njs_lexer_keyword.c index e216f434..0f726e3b 100644 --- a/njs/njs_lexer_keyword.c +++ b/njs/njs_lexer_keyword.c @@ -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. */ diff --git a/njs/njs_number.c b/njs/njs_number.c index 8e7b4732..ed816788 100644 --- a/njs/njs_number.c +++ b/njs/njs_number.c @@ -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; +} diff --git a/njs/njs_number.h b/njs/njs_number.h index 2dee8a1c..d008168c 100644 --- a/njs/njs_number.h +++ b/njs/njs_number.h @@ -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; diff --git a/njs/njs_parser.c b/njs/njs_parser.c index d654eb43..dd316d2e 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -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: diff --git a/njs/njs_parser.h b/njs/njs_parser.h index 4e1e5e62..3f4b2001 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -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; diff --git a/njs/njs_vm.h b/njs/njs_vm.h index 0a0dcd08..e9d7f154 100644 --- a/njs/njs_vm.h +++ b/njs/njs_vm.h @@ -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) }; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index d7eaef6c..53b7409f 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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 }"),