details: http://hg.nginx.org/njs/rev/ad4b6e0b5014 branches: changeset: 241:ad4b6e0b5014 user: Valentin Bartenev <vb...@nginx.com> date: Sun Nov 06 16:03:29 2016 +0300 description: Various Number methods.
diffstat: njs/njs_builtin.c | 2 +- njs/njs_number.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++- njs/njs_number.h | 4 +- njs/test/njs_unit_test.c | 89 ++++++++++++++++++++++++++++++++++++ 4 files changed, 206 insertions(+), 5 deletions(-) diffs (272 lines): diff -r 8722dc4bdeb4 -r ad4b6e0b5014 njs/njs_builtin.c --- a/njs/njs_builtin.c Sun Nov 06 16:03:03 2016 +0300 +++ b/njs/njs_builtin.c Sun Nov 06 16:03:29 2016 +0300 @@ -143,7 +143,7 @@ njs_builtin_objects_create(njs_vm_t *vm) /* 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 } }, + { njs_number_global_is_nan, { NJS_SKIP_ARG, NJS_NUMBER_ARG } }, { njs_number_is_finite, { NJS_SKIP_ARG, NJS_NUMBER_ARG } }, { njs_number_parse_int, { NJS_SKIP_ARG, NJS_STRING_ARG, NJS_INTEGER_ARG } }, diff -r 8722dc4bdeb4 -r ad4b6e0b5014 njs/njs_number.c --- a/njs/njs_number.c Sun Nov 06 16:03:03 2016 +0300 +++ b/njs/njs_number.c Sun Nov 06 16:03:29 2016 +0300 @@ -260,6 +260,74 @@ njs_number_constructor(njs_vm_t *vm, njs } +static njs_ret_t +njs_number_is_integer(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 && njs_is_number(&args[1])) { + num = args[1].data.u.number; + + if (num == trunc(num) && !isinf(num)) { + value = &njs_value_true; + } + } + + vm->retval = *value; + + return NXT_OK; +} + + + +static njs_ret_t +njs_number_is_safe_integer(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 && njs_is_number(&args[1])) { + num = args[1].data.u.number; + + if (num == (int64_t) num && fabs(num) <= NJS_MAX_SAFE_INTEGER) { + value = &njs_value_true; + } + } + + vm->retval = *value; + + return NXT_OK; +} + + +static 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_false; + + if (nargs > 1 + && njs_is_number(&args[1]) + && isnan(args[1].data.u.number)) + { + value = &njs_value_true; + } + + vm->retval = *value; + + return NXT_OK; +} + + static const njs_object_prop_t njs_number_constructor_properties[] = { /* Number.name == "Number". */ @@ -333,6 +401,50 @@ static const njs_object_prop_t njs_numb .name = njs_long_string("NEGATIVE_INFINITY"), .value = njs_value(NJS_NUMBER, 1, -INFINITY), }, + + /* ES6. */ + { + .type = NJS_METHOD, + .name = njs_string("isFinite"), + .value = njs_native_function(njs_number_is_finite, 0, 0), + }, + + /* ES6. */ + { + .type = NJS_METHOD, + .name = njs_string("isInteger"), + .value = njs_native_function(njs_number_is_integer, 0, 0), + }, + + /* ES6. */ + { + .type = NJS_METHOD, + .name = njs_string("isSafeInteger"), + .value = njs_native_function(njs_number_is_safe_integer, 0, 0), + }, + + /* ES6. */ + { + .type = NJS_METHOD, + .name = njs_string("isNaN"), + .value = njs_native_function(njs_number_is_nan, 0, 0), + }, + + /* ES6. */ + { + .type = NJS_METHOD, + .name = njs_string("parseFloat"), + .value = njs_native_function(njs_number_parse_float, 0, + NJS_SKIP_ARG, NJS_STRING_ARG), + }, + + /* ES6. */ + { + .type = NJS_METHOD, + .name = njs_string("parseInt"), + .value = njs_native_function(njs_number_parse_int, 0, + NJS_SKIP_ARG, NJS_STRING_ARG, NJS_INTEGER_ARG), + }, }; @@ -498,7 +610,7 @@ const njs_object_init_t njs_number_prot njs_ret_t -njs_number_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, +njs_number_global_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { const njs_value_t *value; @@ -524,7 +636,7 @@ njs_number_is_finite(njs_vm_t *vm, njs_v value = &njs_value_false; - if (nargs > 1) { + if (nargs > 1 && njs_is_number(&args[1])) { num = args[1].data.u.number; if (!isnan(num) && !isinf(num)) { diff -r 8722dc4bdeb4 -r ad4b6e0b5014 njs/njs_number.h --- a/njs/njs_number.h Sun Nov 06 16:03:03 2016 +0300 +++ b/njs/njs_number.h Sun Nov 06 16:03:29 2016 +0300 @@ -19,8 +19,8 @@ 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); +njs_ret_t njs_number_global_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); njs_ret_t njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, diff -r 8722dc4bdeb4 -r ad4b6e0b5014 njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Sun Nov 06 16:03:03 2016 +0300 +++ b/njs/test/njs_unit_test.c Sun Nov 06 16:03:29 2016 +0300 @@ -4766,6 +4766,95 @@ static njs_unit_test_t njs_test[] = { nxt_string("var n = new Number(1); n.__proto__ === Number.prototype"), nxt_string("true") }, + { nxt_string("Number.isFinite()"), + nxt_string("false") }, + + { nxt_string("Number.isFinite(123)"), + nxt_string("true") }, + + { nxt_string("Number.isFinite('123')"), + nxt_string("false") }, + + { nxt_string("Number.isFinite(Infinity)"), + nxt_string("false") }, + + { nxt_string("Number.isFinite(NaN)"), + nxt_string("false") }, + + { nxt_string("Number.isInteger()"), + nxt_string("false") }, + + { nxt_string("Number.isInteger('123')"), + nxt_string("false") }, + + { nxt_string("Number.isInteger(123)"), + nxt_string("true") }, + + { nxt_string("Number.isInteger(-123.0)"), + nxt_string("true") }, + + { nxt_string("Number.isInteger(123.4)"), + nxt_string("false") }, + + { nxt_string("Number.isInteger(Infinity)"), + nxt_string("false") }, + + { nxt_string("Number.isInteger(NaN)"), + nxt_string("false") }, + + { nxt_string("Number.isSafeInteger()"), + nxt_string("false") }, + + { nxt_string("Number.isSafeInteger('123')"), + nxt_string("false") }, + + { nxt_string("Number.isSafeInteger(9007199254740991)"), + nxt_string("true") }, + + { nxt_string("Number.isSafeInteger(-9007199254740991.0)"), + nxt_string("true") }, + + { nxt_string("Number.isSafeInteger(9007199254740992)"), + nxt_string("false") }, + + { nxt_string("Number.isSafeInteger(-9007199254740992.0)"), + nxt_string("false") }, + + { nxt_string("Number.isSafeInteger(123.4)"), + nxt_string("false") }, + + { nxt_string("Number.isSafeInteger(Infinity)"), + nxt_string("false") }, + + { nxt_string("Number.isSafeInteger(-Infinity)"), + nxt_string("false") }, + + { nxt_string("Number.isSafeInteger(NaN)"), + nxt_string("false") }, + + { nxt_string("Number.isNaN()"), + nxt_string("false") }, + + { nxt_string("Number.isNaN('NaN')"), + nxt_string("false") }, + + { nxt_string("Number.isNaN(NaN)"), + nxt_string("true") }, + + { nxt_string("Number.isNaN(123)"), + nxt_string("false") }, + + { nxt_string("Number.isNaN(Infinity)"), + nxt_string("false") }, + +#if 0 + { nxt_string("parseFloat === Number.parseFloat"), + nxt_string("true") }, + + { nxt_string("parseInt === Number.parseInt"), + nxt_string("true") }, +#endif + { nxt_string("String()"), nxt_string("") }, _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel