[njs] isNaN() function.
Igor Sysoev
igor at sysoev.ru
Wed Jun 1 12:50:30 UTC 2016
details: http://hg.nginx.org/njs/rev/a61f70d8874a
branches:
changeset: 107:a61f70d8874a
user: Igor Sysoev <igor at sysoev.ru>
date: Thu Apr 21 18:23:12 2016 +0300
description:
isNaN() function.
diffstat:
njs/njs_builtin.c | 2 ++
njs/njs_generator.c | 1 +
njs/njs_lexer_keyword.c | 1 +
njs/njs_number.c | 18 ++++++++++++++++++
njs/njs_number.h | 3 +++
njs/njs_parser.c | 1 +
njs/njs_parser.h | 1 +
njs/njs_string.c | 13 ++++++++++++-
njs/njs_vm.h | 3 ++-
njs/test/njs_unit_test.c | 18 ++++++++++++++++++
10 files changed, 59 insertions(+), 2 deletions(-)
diffs (175 lines):
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_builtin.c
--- a/njs/njs_builtin.c Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_builtin.c Thu Apr 21 18:23:12 2016 +0300
@@ -81,12 +81,14 @@ njs_builtin_objects_create(njs_vm_t *vm)
static const njs_object_init_t *function_init[] = {
&njs_eval_function_init,
NULL,
+ NULL,
};
static const njs_function_init_t native_functions[] = {
/* SunC does not allow empty array initialization. */
{ njs_eval_function, { 0 } },
{ njs_object_prototype_to_string, { 0 } },
+ { njs_number_is_nan, { NJS_SKIP_ARG, NJS_NUMBER_ARG } },
};
static const njs_object_prop_t null_proto_property = {
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_generator.c
--- a/njs/njs_generator.c Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_generator.c Thu Apr 21 18:23:12 2016 +0300
@@ -295,6 +295,7 @@ njs_generator(njs_vm_t *vm, njs_parser_t
case NJS_TOKEN_MATH:
case NJS_TOKEN_EVAL:
case NJS_TOKEN_TO_STRING:
+ case NJS_TOKEN_IS_NAN:
return njs_generate_builtin_object(vm, parser, node);
case NJS_TOKEN_FUNCTION:
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_lexer_keyword.c
--- a/njs/njs_lexer_keyword.c Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_lexer_keyword.c Thu Apr 21 18:23:12 2016 +0300
@@ -89,6 +89,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 },
/* Reserved words. */
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_number.c
--- a/njs/njs_number.c Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_number.c Thu Apr 21 18:23:12 2016 +0300
@@ -433,3 +433,21 @@ const njs_object_init_t njs_number_prot
njs_number_prototype_properties,
nxt_nitems(njs_number_prototype_properties),
};
+
+
+njs_ret_t
+njs_number_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ const njs_value_t *value;
+
+ value = &njs_value_true;
+
+ if (nargs > 1 && !njs_is_nan(args[1].data.u.number)) {
+ value = &njs_value_false;
+ }
+
+ vm->retval = *value;
+
+ return NXT_OK;
+}
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_number.h
--- a/njs/njs_number.h Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_number.h Thu Apr 21 18:23:12 2016 +0300
@@ -30,6 +30,9 @@ njs_ret_t njs_number_to_string(njs_vm_t
const njs_value_t *number);
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);
+
extern const njs_object_init_t njs_number_constructor_init;
extern const njs_object_init_t njs_number_prototype_init;
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_parser.c
--- a/njs/njs_parser.c Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_parser.c Thu Apr 21 18:23:12 2016 +0300
@@ -1645,6 +1645,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_pa
case NJS_TOKEN_EVAL:
case NJS_TOKEN_TO_STRING:
+ case NJS_TOKEN_IS_NAN:
return njs_parser_builtin_function(vm, parser, node);
default:
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_parser.h
--- a/njs/njs_parser.h Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_parser.h Thu Apr 21 18:23:12 2016 +0300
@@ -176,6 +176,7 @@ typedef enum {
NJS_TOKEN_EVAL,
NJS_TOKEN_TO_STRING,
+ NJS_TOKEN_IS_NAN,
NJS_TOKEN_RESERVED,
} njs_token_t;
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_string.c
--- a/njs/njs_string.c Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_string.c Thu Apr 21 18:23:12 2016 +0300
@@ -1685,6 +1685,8 @@ njs_string_to_number(njs_value_t *value)
nxt_bool_t minus;
const u_char *p, *end;
+ const size_t infinity = sizeof("Infinity") - 1;
+
size = value->short_string.size;
if (size != NJS_STRING_LONG) {
@@ -1719,11 +1721,20 @@ njs_string_to_number(njs_value_t *value)
minus = 1;
}
+ if (p == end) {
+ return NJS_NAN;
+ }
+
if (*p >= '0' && *p <= '9') {
num = njs_number_parse(&p, end);
} else {
- return NJS_NAN;
+ if (p + infinity > end || memcmp(p, "Infinity", infinity) != 0) {
+ return NJS_NAN;
+ }
+
+ num = NJS_INFINITY;
+ p += infinity;
}
while (p < end) {
diff -r a69b4eaebdcf -r a61f70d8874a njs/njs_vm.h
--- a/njs/njs_vm.h Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/njs_vm.h Thu Apr 21 18:23:12 2016 +0300
@@ -702,7 +702,8 @@ enum njs_object_e {
enum njs_function_e {
NJS_FUNCTION_EVAL = 0,
NJS_FUNCTION_TO_STRING = 1,
-#define NJS_FUNCTION_MAX (NJS_FUNCTION_TO_STRING + 1)
+ NJS_FUNCTION_IS_NAN = 2,
+#define NJS_FUNCTION_MAX (NJS_FUNCTION_IS_NAN + 1)
};
diff -r a69b4eaebdcf -r a61f70d8874a njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Thu Apr 21 15:57:05 2016 +0300
+++ b/njs/test/njs_unit_test.c Thu Apr 21 18:23:12 2016 +0300
@@ -4395,6 +4395,24 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math"),
nxt_string("[object Object]") },
+ { nxt_string("isNaN"),
+ nxt_string("[object Function]") },
+
+ { nxt_string("isNaN()"),
+ nxt_string("true") },
+
+ { nxt_string("isNaN(123)"),
+ nxt_string("false") },
+
+ { nxt_string("isNaN('123')"),
+ nxt_string("false") },
+
+ { nxt_string("isNaN('Infinity')"),
+ nxt_string("false") },
+
+ { nxt_string("isNaN('abc')"),
+ nxt_string("true") },
+
/* External interface. */
{ nxt_string("function f(req) { return req.uri }"),
More information about the nginx-devel
mailing list