[njs] Removed argument prototypes for built-in functions.
Alexander Borisov
alexander.borisov at nginx.com
Tue Oct 22 17:00:03 UTC 2019
details: https://hg.nginx.org/njs/rev/47cdd4680fc2
branches:
changeset: 1195:47cdd4680fc2
user: Alexander Borisov <alexander.borisov at nginx.com>
date: Tue Oct 22 19:58:52 2019 +0300
description:
Removed argument prototypes for built-in functions.
Many JS functions do not have fixed prototypes as in C. For example
String.prototype.replace() accepts RegExp or String as the first argument.
diffstat:
src/njs_array.c | 123 +++-
src/njs_boolean.c | 4 +-
src/njs_builtin.c | 89 +--
src/njs_crypto.c | 22 +-
src/njs_date.c | 692 +++++++++++++++++++++++++-----
src/njs_error.c | 21 +-
src/njs_fs.c | 51 +-
src/njs_function.c | 162 +------
src/njs_function.h | 11 -
src/njs_json.c | 25 +-
src/njs_math.c | 790 ++++++++++++++++++++-------------
src/njs_module.c | 8 +
src/njs_number.c | 253 ++++++----
src/njs_number.h | 2 +-
src/njs_object.c | 82 +-
src/njs_regexp.c | 39 +-
src/njs_string.c | 915 +++++++++++++++++++++++++++++----------
src/njs_value.c | 37 -
src/njs_value.h | 7 +-
src/test/njs_interactive_test.c | 2 +-
src/test/njs_unit_test.c | 18 +
21 files changed, 2161 insertions(+), 1192 deletions(-)
diffs (truncated from 6563 to 1000 lines):
diff -r 425cbc7d57b3 -r 47cdd4680fc2 src/njs_array.c
--- a/src/njs_array.c Tue Oct 22 14:43:30 2019 +0300
+++ b/src/njs_array.c Tue Oct 22 19:58:52 2019 +0300
@@ -304,7 +304,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("isArray"),
- .value = njs_native_function(njs_array_is_array, 1, 0),
+ .value = njs_native_function(njs_array_is_array, 1),
.writable = 1,
.configurable = 1,
},
@@ -314,7 +314,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("of"),
- .value = njs_native_function(njs_array_of, 0, 0),
+ .value = njs_native_function(njs_array_of, 0),
.writable = 1,
.configurable = 1,
},
@@ -423,6 +423,11 @@ njs_array_prototype_slice(njs_vm_t *vm,
uint32_t object_length;
njs_int_t ret;
+ if (njs_slow_path(njs_is_null_or_undefined(njs_arg(args, nargs, 0)))) {
+ njs_type_error(vm, "cannot convert undefined to object");
+ return NJS_ERROR;
+ }
+
ret = njs_object_length(vm, njs_arg(args, nargs, 0), &object_length);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
@@ -933,11 +938,17 @@ static njs_int_t
njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
+ int64_t n, start, length, items, delta, delete;
njs_int_t ret;
- njs_int_t n, start, length, items, delta, delete;
njs_uint_t i;
+ njs_value_t *value;
njs_array_t *array, *deleted;
+ if (njs_slow_path(njs_is_null_or_undefined(njs_arg(args, nargs, 0)))) {
+ njs_type_error(vm, "cannot convert undefined to object");
+ return NJS_ERROR;
+ }
+
array = NULL;
start = 0;
delete = 0;
@@ -947,7 +958,17 @@ njs_array_prototype_splice(njs_vm_t *vm,
length = array->length;
if (nargs > 1) {
- start = njs_number(&args[1]);
+ value = njs_argument(args, 1);
+
+ if (njs_slow_path(!njs_is_number(value))) {
+ ret = njs_value_to_integer(vm, value, &start);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
+ }
+
+ } else {
+ start = njs_number_to_integer(njs_number(value));
+ }
if (start < 0) {
start += length;
@@ -963,7 +984,17 @@ njs_array_prototype_splice(njs_vm_t *vm,
delete = length - start;
if (nargs > 2) {
- n = njs_number(&args[2]);
+ value = njs_argument(args, 2);
+
+ if (njs_slow_path(!njs_is_number(value))) {
+ ret = njs_value_to_integer(vm, value, &n);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
+ }
+
+ } else {
+ n = njs_number_to_integer(njs_number(value));
+ }
if (n < 0) {
delete = 0;
@@ -988,12 +1019,7 @@ njs_array_prototype_splice(njs_vm_t *vm,
deleted->start[i] = array->start[n];
}
- items = nargs - 3;
-
- if (items < 0) {
- items = 0;
- }
-
+ items = (nargs > 3) ? nargs - 3: 0;
delta = items - delete;
if (delta != 0) {
@@ -1037,6 +1063,11 @@ njs_array_prototype_reverse(njs_vm_t *vm
njs_value_t value;
njs_array_t *array;
+ if (njs_slow_path(njs_is_null_or_undefined(njs_arg(args, nargs, 0)))) {
+ njs_type_error(vm, "cannot convert undefined to object");
+ return NJS_ERROR;
+ }
+
if (njs_is_array(&args[0])) {
array = njs_array(&args[0]);
length = array->length;
@@ -1100,6 +1131,18 @@ njs_array_prototype_join(njs_vm_t *vm, n
njs_value_t *value, *values;
njs_string_prop_t separator, string;
+ if (njs_slow_path(njs_is_null_or_undefined(njs_arg(args, nargs, 0)))) {
+ njs_type_error(vm, "cannot convert undefined to object");
+ return NJS_ERROR;
+ }
+
+ if (nargs > 1 && !njs_is_string(&args[1])) {
+ ret = njs_value_to_string(vm, &args[1], &args[1]);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
+ }
+ }
+
if (!njs_is_array(&args[0]) || njs_array_len(&args[0]) == 0) {
vm->retval = njs_string_empty;
return NJS_OK;
@@ -2614,7 +2657,6 @@ njs_array_string_sort(njs_vm_t *vm, njs_
static const njs_function_t njs_array_string_sort_function = {
.object = { .type = NJS_FUNCTION, .shared = 1, .extensible = 1 },
.native = 1,
- .args_types = { NJS_SKIP_ARG, NJS_STRING_ARG, NJS_STRING_ARG },
.args_offset = 1,
.u.native = njs_array_string_sort,
};
@@ -2735,8 +2777,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("slice"),
- .value = njs_native_function(njs_array_prototype_slice, 2,
- NJS_OBJECT_ARG, NJS_INTEGER_ARG, NJS_INTEGER_ARG),
+ .value = njs_native_function(njs_array_prototype_slice, 2),
.writable = 1,
.configurable = 1,
},
@@ -2744,7 +2785,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("push"),
- .value = njs_native_function(njs_array_prototype_push, 1, 0),
+ .value = njs_native_function(njs_array_prototype_push, 1),
.writable = 1,
.configurable = 1,
},
@@ -2752,7 +2793,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("pop"),
- .value = njs_native_function(njs_array_prototype_pop, 0, 0),
+ .value = njs_native_function(njs_array_prototype_pop, 0),
.writable = 1,
.configurable = 1,
},
@@ -2760,7 +2801,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("unshift"),
- .value = njs_native_function(njs_array_prototype_unshift, 1, 0),
+ .value = njs_native_function(njs_array_prototype_unshift, 1),
.writable = 1,
.configurable = 1,
},
@@ -2768,7 +2809,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("shift"),
- .value = njs_native_function(njs_array_prototype_shift, 0, 0),
+ .value = njs_native_function(njs_array_prototype_shift, 0),
.writable = 1,
.configurable = 1,
},
@@ -2776,8 +2817,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("splice"),
- .value = njs_native_function(njs_array_prototype_splice, 2,
- NJS_OBJECT_ARG, NJS_INTEGER_ARG, NJS_INTEGER_ARG),
+ .value = njs_native_function(njs_array_prototype_splice, 2),
.writable = 1,
.configurable = 1,
},
@@ -2785,8 +2825,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("reverse"),
- .value = njs_native_function(njs_array_prototype_reverse, 0,
- NJS_OBJECT_ARG),
+ .value = njs_native_function(njs_array_prototype_reverse, 0),
.writable = 1,
.configurable = 1,
},
@@ -2794,7 +2833,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("toString"),
- .value = njs_native_function(njs_array_prototype_to_string, 0, 0),
+ .value = njs_native_function(njs_array_prototype_to_string, 0),
.writable = 1,
.configurable = 1,
},
@@ -2802,8 +2841,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("join"),
- .value = njs_native_function(njs_array_prototype_join, 1,
- NJS_OBJECT_ARG, NJS_STRING_ARG),
+ .value = njs_native_function(njs_array_prototype_join, 1),
.writable = 1,
.configurable = 1,
},
@@ -2811,7 +2849,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("concat"),
- .value = njs_native_function(njs_array_prototype_concat, 1, 0),
+ .value = njs_native_function(njs_array_prototype_concat, 1),
.writable = 1,
.configurable = 1,
},
@@ -2819,8 +2857,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("indexOf"),
- .value = njs_native_function(njs_array_prototype_index_of, 1,
- NJS_OBJECT_ARG, NJS_SKIP_ARG, NJS_INTEGER_ARG),
+ .value = njs_native_function(njs_array_prototype_index_of, 1),
.writable = 1,
.configurable = 1,
},
@@ -2828,8 +2865,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("lastIndexOf"),
- .value = njs_native_function(njs_array_prototype_last_index_of, 1,
- NJS_OBJECT_ARG, NJS_SKIP_ARG, NJS_INTEGER_ARG),
+ .value = njs_native_function(njs_array_prototype_last_index_of, 1),
.writable = 1,
.configurable = 1,
},
@@ -2838,8 +2874,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("includes"),
- .value = njs_native_function(njs_array_prototype_includes, 1,
- NJS_OBJECT_ARG, NJS_SKIP_ARG, NJS_INTEGER_ARG),
+ .value = njs_native_function(njs_array_prototype_includes, 1),
.writable = 1,
.configurable = 1,
},
@@ -2847,7 +2882,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("forEach"),
- .value = njs_native_function(njs_array_prototype_for_each, 1, 0),
+ .value = njs_native_function(njs_array_prototype_for_each, 1),
.writable = 1,
.configurable = 1,
},
@@ -2855,7 +2890,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("some"),
- .value = njs_native_function(njs_array_prototype_some, 1, 0),
+ .value = njs_native_function(njs_array_prototype_some, 1),
.writable = 1,
.configurable = 1,
},
@@ -2863,7 +2898,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("every"),
- .value = njs_native_function(njs_array_prototype_every, 1, 0),
+ .value = njs_native_function(njs_array_prototype_every, 1),
.writable = 1,
.configurable = 1,
},
@@ -2872,9 +2907,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("fill"),
- .value = njs_native_function(njs_array_prototype_fill, 1,
- NJS_OBJECT_ARG, NJS_SKIP_ARG, NJS_NUMBER_ARG,
- NJS_NUMBER_ARG),
+ .value = njs_native_function(njs_array_prototype_fill, 1),
.writable = 1,
.configurable = 1,
},
@@ -2882,7 +2915,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("filter"),
- .value = njs_native_function(njs_array_prototype_filter, 1, 0),
+ .value = njs_native_function(njs_array_prototype_filter, 1),
.writable = 1,
.configurable = 1,
},
@@ -2891,7 +2924,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("find"),
- .value = njs_native_function(njs_array_prototype_find, 1, 0),
+ .value = njs_native_function(njs_array_prototype_find, 1),
.writable = 1,
.configurable = 1,
},
@@ -2900,7 +2933,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("findIndex"),
- .value = njs_native_function(njs_array_prototype_find_index, 1, 0),
+ .value = njs_native_function(njs_array_prototype_find_index, 1),
.writable = 1,
.configurable = 1,
},
@@ -2908,7 +2941,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("map"),
- .value = njs_native_function(njs_array_prototype_map, 1, 0),
+ .value = njs_native_function(njs_array_prototype_map, 1),
.writable = 1,
.configurable = 1,
},
@@ -2916,7 +2949,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("reduce"),
- .value = njs_native_function(njs_array_prototype_reduce, 1, 0),
+ .value = njs_native_function(njs_array_prototype_reduce, 1),
.writable = 1,
.configurable = 1,
},
@@ -2924,7 +2957,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("reduceRight"),
- .value = njs_native_function(njs_array_prototype_reduce_right, 1, 0),
+ .value = njs_native_function(njs_array_prototype_reduce_right, 1),
.writable = 1,
.configurable = 1,
},
@@ -2932,7 +2965,7 @@ static const njs_object_prop_t njs_arra
{
.type = NJS_PROPERTY,
.name = njs_string("sort"),
- .value = njs_native_function(njs_array_prototype_sort, 1, 0),
+ .value = njs_native_function(njs_array_prototype_sort, 1),
.writable = 1,
.configurable = 1,
},
diff -r 425cbc7d57b3 -r 47cdd4680fc2 src/njs_boolean.c
--- a/src/njs_boolean.c Tue Oct 22 14:43:30 2019 +0300
+++ b/src/njs_boolean.c Tue Oct 22 19:58:52 2019 +0300
@@ -145,7 +145,7 @@ static const njs_object_prop_t njs_bool
{
.type = NJS_PROPERTY,
.name = njs_string("valueOf"),
- .value = njs_native_function(njs_boolean_prototype_value_of, 0, 0),
+ .value = njs_native_function(njs_boolean_prototype_value_of, 0),
.writable = 1,
.configurable = 1,
},
@@ -153,7 +153,7 @@ static const njs_object_prop_t njs_bool
{
.type = NJS_PROPERTY,
.name = njs_string("toString"),
- .value = njs_native_function(njs_boolean_prototype_to_string, 0, 0),
+ .value = njs_native_function(njs_boolean_prototype_to_string, 0),
.writable = 1,
.configurable = 1,
},
diff -r 425cbc7d57b3 -r 47cdd4680fc2 src/njs_builtin.c
--- a/src/njs_builtin.c Tue Oct 22 14:43:30 2019 +0300
+++ b/src/njs_builtin.c Tue Oct 22 19:58:52 2019 +0300
@@ -11,7 +11,6 @@
typedef struct {
njs_function_native_t native;
- uint8_t args_types[NJS_ARGS_TYPES_MAX];
} njs_function_init_t;
@@ -95,29 +94,25 @@ const njs_object_init_t *njs_constructo
const njs_function_init_t njs_native_constructors[] = {
/* SunC does not allow empty array initialization. */
- { njs_object_constructor, { 0 } },
- { njs_array_constructor, { 0 } },
- { njs_boolean_constructor, { 0 } },
- { njs_number_constructor, { NJS_SKIP_ARG, NJS_NUMBER_ARG } },
- { njs_string_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_function_constructor, { 0 } },
- { njs_regexp_constructor, { 0 } },
- { njs_date_constructor, { 0 } },
- { njs_hash_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_hmac_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG,
- NJS_STRING_ARG } },
- { njs_error_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_eval_error_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_internal_error_constructor,
- { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_range_error_constructor,
- { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_reference_error_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_syntax_error_constructor,
- { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_type_error_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_uri_error_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG } },
- { njs_memory_error_constructor, { NJS_SKIP_ARG, NJS_STRING_ARG } },
+ { njs_object_constructor },
+ { njs_array_constructor },
+ { njs_boolean_constructor },
+ { njs_number_constructor },
+ { njs_string_constructor },
+ { njs_function_constructor},
+ { njs_regexp_constructor },
+ { njs_date_constructor },
+ { njs_hash_constructor },
+ { njs_hmac_constructor },
+ { njs_error_constructor },
+ { njs_eval_error_constructor },
+ { njs_internal_error_constructor },
+ { njs_range_error_constructor },
+ { njs_reference_error_constructor },
+ { njs_syntax_error_constructor },
+ { njs_type_error_constructor },
+ { njs_uri_error_constructor },
+ { njs_memory_error_constructor },
};
@@ -331,8 +326,6 @@ njs_builtin_objects_create(njs_vm_t *vm)
func->u.native = f->native;
- memcpy(func->args_types, f->args_types, NJS_ARGS_TYPES_MAX);
-
ret = njs_object_hash_init(vm, &func->object.shared_hash, obj);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
@@ -1038,8 +1031,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("isFinite"),
- .value = njs_native_function(njs_number_is_finite, 1,
- NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ .value = njs_native_function(njs_number_global_is_finite, 1),
.writable = 1,
.configurable = 1,
},
@@ -1047,8 +1039,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("isNaN"),
- .value = njs_native_function(njs_number_global_is_nan, 1,
- NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ .value = njs_native_function(njs_number_global_is_nan, 1),
.writable = 1,
.configurable = 1,
},
@@ -1056,8 +1047,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("parseFloat"),
- .value = njs_native_function(njs_number_parse_float, 1,
- NJS_SKIP_ARG, NJS_STRING_ARG),
+ .value = njs_native_function(njs_number_parse_float, 1),
.writable = 1,
.configurable = 1,
},
@@ -1065,8 +1055,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("parseInt"),
- .value = njs_native_function(njs_number_parse_int, 2,
- NJS_SKIP_ARG, NJS_STRING_ARG, NJS_INTEGER_ARG),
+ .value = njs_native_function(njs_number_parse_int, 2),
.writable = 1,
.configurable = 1,
},
@@ -1074,7 +1063,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("toString"),
- .value = njs_native_function(njs_object_prototype_to_string, 0, 0),
+ .value = njs_native_function(njs_object_prototype_to_string, 0),
.writable = 1,
.configurable = 1,
},
@@ -1082,8 +1071,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("encodeURI"),
- .value = njs_native_function(njs_string_encode_uri, 1,
- NJS_SKIP_ARG, NJS_STRING_ARG),
+ .value = njs_native_function(njs_string_encode_uri, 1),
.writable = 1,
.configurable = 1,
},
@@ -1091,8 +1079,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_long_string("encodeURIComponent"),
- .value = njs_native_function(njs_string_encode_uri_component, 1,
- NJS_SKIP_ARG, NJS_STRING_ARG),
+ .value = njs_native_function(njs_string_encode_uri_component, 1),
.writable = 1,
.configurable = 1,
},
@@ -1100,8 +1087,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("decodeURI"),
- .value = njs_native_function(njs_string_decode_uri, 1,
- NJS_SKIP_ARG, NJS_STRING_ARG),
+ .value = njs_native_function(njs_string_decode_uri, 1),
.writable = 1,
.configurable = 1,
},
@@ -1109,8 +1095,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_long_string("decodeURIComponent"),
- .value = njs_native_function(njs_string_decode_uri_component, 1,
- NJS_SKIP_ARG, NJS_STRING_ARG),
+ .value = njs_native_function(njs_string_decode_uri_component, 1),
.writable = 1,
.configurable = 1,
},
@@ -1118,7 +1103,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("eval"),
- .value = njs_native_function(njs_eval_function, 1, 0),
+ .value = njs_native_function(njs_eval_function, 1),
.writable = 1,
.configurable = 1,
},
@@ -1126,9 +1111,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("setTimeout"),
- .value = njs_native_function(njs_set_timeout, 2,
- NJS_SKIP_ARG, NJS_FUNCTION_ARG,
- NJS_NUMBER_ARG),
+ .value = njs_native_function(njs_set_timeout, 2),
.writable = 1,
.configurable = 1,
},
@@ -1136,8 +1119,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("setImmediate"),
- .value = njs_native_function(njs_set_immediate, 4,
- NJS_SKIP_ARG, NJS_FUNCTION_ARG),
+ .value = njs_native_function(njs_set_immediate, 4),
.writable = 1,
.configurable = 1,
},
@@ -1145,8 +1127,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("clearTimeout"),
- .value = njs_native_function(njs_clear_timeout, 1,
- NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ .value = njs_native_function(njs_clear_timeout, 1),
.writable = 1,
.configurable = 1,
},
@@ -1154,8 +1135,7 @@ static const njs_object_prop_t njs_glob
{
.type = NJS_PROPERTY,
.name = njs_string("require"),
- .value = njs_native_function(njs_module_require, 1,
- NJS_SKIP_ARG, NJS_STRING_ARG),
+ .value = njs_native_function(njs_module_require, 1),
.writable = 1,
.configurable = 1,
},
@@ -1183,8 +1163,7 @@ static const njs_object_prop_t njs_njs_
{
.type = NJS_PROPERTY,
.name = njs_string("dump"),
- .value = njs_native_function(njs_dump_value, 0,
- NJS_SKIP_ARG, NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ .value = njs_native_function(njs_dump_value, 0),
.configurable = 1,
},
};
diff -r 425cbc7d57b3 -r 47cdd4680fc2 src/njs_crypto.c
--- a/src/njs_crypto.c Tue Oct 22 14:43:30 2019 +0300
+++ b/src/njs_crypto.c Tue Oct 22 19:58:52 2019 +0300
@@ -323,7 +323,7 @@ static const njs_object_prop_t njs_hash
{
.type = NJS_PROPERTY,
.name = njs_string("toString"),
- .value = njs_native_function(njs_hash_prototype_to_string, 0, 0),
+ .value = njs_native_function(njs_hash_prototype_to_string, 0),
.writable = 1,
.configurable = 1,
},
@@ -331,8 +331,7 @@ static const njs_object_prop_t njs_hash
{
.type = NJS_PROPERTY,
.name = njs_string("update"),
- .value = njs_native_function(njs_hash_prototype_update, 0,
- NJS_OBJECT_ARG, NJS_SKIP_ARG),
+ .value = njs_native_function(njs_hash_prototype_update, 0),
.writable = 1,
.configurable = 1,
},
@@ -340,8 +339,7 @@ static const njs_object_prop_t njs_hash
{
.type = NJS_PROPERTY,
.name = njs_string("digest"),
- .value = njs_native_function(njs_hash_prototype_digest, 0,
- NJS_OBJECT_ARG, NJS_SKIP_ARG),
+ .value = njs_native_function(njs_hash_prototype_digest, 0),
.writable = 1,
.configurable = 1,
},
@@ -585,7 +583,7 @@ static const njs_object_prop_t njs_hmac
{
.type = NJS_PROPERTY,
.name = njs_string("toString"),
- .value = njs_native_function(njs_hmac_prototype_to_string, 0, 0),
+ .value = njs_native_function(njs_hmac_prototype_to_string, 0),
.writable = 1,
.configurable = 1,
},
@@ -593,8 +591,7 @@ static const njs_object_prop_t njs_hmac
{
.type = NJS_PROPERTY,
.name = njs_string("update"),
- .value = njs_native_function(njs_hmac_prototype_update, 0,
- NJS_OBJECT_ARG, NJS_SKIP_ARG),
+ .value = njs_native_function(njs_hmac_prototype_update, 0),
.writable = 1,
.configurable = 1,
},
@@ -602,8 +599,7 @@ static const njs_object_prop_t njs_hmac
{
.type = NJS_PROPERTY,
.name = njs_string("digest"),
- .value = njs_native_function(njs_hmac_prototype_digest, 0,
- NJS_OBJECT_ARG, NJS_SKIP_ARG),
+ .value = njs_native_function(njs_hmac_prototype_digest, 0),
.writable = 1,
.configurable = 1,
},
@@ -650,8 +646,7 @@ static const njs_object_prop_t njs_cryp
{
.type = NJS_PROPERTY,
.name = njs_string("createHash"),
- .value = njs_native_function(njs_crypto_create_hash, 0,
- NJS_SKIP_ARG),
+ .value = njs_native_function(njs_crypto_create_hash, 0),
.writable = 1,
.configurable = 1,
},
@@ -659,8 +654,7 @@ static const njs_object_prop_t njs_cryp
{
.type = NJS_PROPERTY,
.name = njs_string("createHmac"),
- .value = njs_native_function(njs_crypto_create_hmac, 0,
- NJS_SKIP_ARG),
+ .value = njs_native_function(njs_crypto_create_hmac, 0),
.writable = 1,
.configurable = 1,
},
diff -r 425cbc7d57b3 -r 47cdd4680fc2 src/njs_date.c
--- a/src/njs_date.c Tue Oct 22 14:43:30 2019 +0300
+++ b/src/njs_date.c Tue Oct 22 19:58:52 2019 +0300
@@ -389,9 +389,17 @@ static njs_int_t
njs_date_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
- double time;
+ double time;
+ njs_int_t ret;
if (nargs > 1) {
+ if (njs_slow_path(!njs_is_string(&args[1]))) {
+ ret = njs_value_to_string(vm, &args[1], &args[1]);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
+ }
+ }
+
time = njs_date_string_parse(&args[1]);
} else {
@@ -1016,7 +1024,7 @@ static const njs_object_prop_t njs_date
{
.type = NJS_PROPERTY,
.name = njs_string("UTC"),
- .value = njs_native_function(njs_date_utc, 7, 0),
+ .value = njs_native_function(njs_date_utc, 7),
.writable = 1,
.configurable = 1,
},
@@ -1024,7 +1032,7 @@ static const njs_object_prop_t njs_date
{
.type = NJS_PROPERTY,
.name = njs_string("now"),
- .value = njs_native_function(njs_date_now, 0, 0),
+ .value = njs_native_function(njs_date_now, 0),
.writable = 1,
.configurable = 1,
},
@@ -1032,8 +1040,7 @@ static const njs_object_prop_t njs_date
{
.type = NJS_PROPERTY,
.name = njs_string("parse"),
- .value = njs_native_function(njs_date_parse, 1,
- NJS_SKIP_ARG, NJS_STRING_ARG),
+ .value = njs_native_function(njs_date_parse, 1),
.writable = 1,
.configurable = 1,
},
@@ -1051,6 +1058,13 @@ static njs_int_t
njs_date_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
njs_set_number(&vm->retval, njs_date(&args[0])->time);
return NJS_OK;
@@ -1061,6 +1075,13 @@ static njs_int_t
njs_date_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
return njs_date_string(vm, "%a %b %d %Y %T GMT%z (%Z)",
njs_date(&args[0])->time);
}
@@ -1070,6 +1091,13 @@ static njs_int_t
njs_date_prototype_to_date_string(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
return njs_date_string(vm, "%a %b %d %Y", njs_date(&args[0])->time);
}
@@ -1078,6 +1106,13 @@ static njs_int_t
njs_date_prototype_to_time_string(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
return njs_date_string(vm, "%T GMT%z (%Z)", njs_date(&args[0])->time);
}
@@ -1120,6 +1155,13 @@ njs_date_prototype_to_utc_string(njs_vm_
static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
time = njs_date(&args[0])->time;
if (!isnan(time)) {
@@ -1144,6 +1186,13 @@ static njs_int_t
njs_date_prototype_to_iso_string(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
return njs_date_to_string(vm, &vm->retval, &args[0]);
}
@@ -1189,6 +1238,13 @@ njs_date_prototype_get_full_year(njs_vm_
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1212,6 +1268,13 @@ njs_date_prototype_get_utc_full_year(njs
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1235,6 +1298,13 @@ njs_date_prototype_get_month(njs_vm_t *v
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1258,6 +1328,13 @@ njs_date_prototype_get_utc_month(njs_vm_
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1282,6 +1359,13 @@ njs_date_prototype_get_date(njs_vm_t *vm
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1305,6 +1389,13 @@ njs_date_prototype_get_utc_date(njs_vm_t
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1328,6 +1419,13 @@ njs_date_prototype_get_day(njs_vm_t *vm,
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1351,6 +1449,13 @@ njs_date_prototype_get_utc_day(njs_vm_t
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1374,6 +1479,13 @@ njs_date_prototype_get_hours(njs_vm_t *v
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1398,6 +1510,13 @@ njs_date_prototype_get_utc_hours(njs_vm_
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1421,6 +1540,13 @@ njs_date_prototype_get_minutes(njs_vm_t
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1445,6 +1571,13 @@ njs_date_prototype_get_utc_minutes(njs_v
time_t clock;
struct tm tm;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
+
value = njs_date(&args[0])->time;
if (njs_fast_path(!isnan(value))) {
@@ -1466,6 +1599,13 @@ njs_date_prototype_get_seconds(njs_vm_t
{
double value;
+ if (njs_slow_path(!njs_is_date(&args[0]))) {
+ njs_type_error(vm, "cannot convert %s to date",
+ njs_type_string(args[0].type));
+
+ return NJS_ERROR;
+ }
More information about the nginx-devel
mailing list