details: https://hg.nginx.org/njs/rev/2a03cd71561a branches: changeset: 1364:2a03cd71561a user: Dmitry Volyntsev <xei...@nginx.com> date: Thu Mar 26 17:12:16 2020 +0300 description: Improved njs_object_length() and friends prototypes.
While object length is always non-negative it is simpler to work with signed value to avoid too many typecasts. diffstat: src/njs_array.c | 78 +++++++++++++++++++++------------------------ src/njs_function.c | 2 +- src/njs_json.c | 4 +- src/njs_number.c | 8 ++-- src/njs_number.h | 2 +- src/njs_object.c | 2 +- src/njs_object.h | 4 +- src/njs_regexp.c | 6 +- src/njs_string.c | 2 +- src/njs_typed_array.c | 8 ++-- src/njs_value.c | 5 +- src/njs_value.h | 10 ++-- src/njs_value_conversion.h | 2 +- 13 files changed, 65 insertions(+), 68 deletions(-) diffs (596 lines): diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_array.c --- a/src/njs_array.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_array.c Thu Mar 26 17:12:16 2020 +0300 @@ -24,7 +24,7 @@ typedef struct { typedef njs_int_t (*njs_array_iterator_handler_t)(njs_vm_t *vm, - njs_array_iterator_args_t *args, njs_value_t *entry, uint64_t n); + njs_array_iterator_args_t *args, njs_value_t *entry, int64_t n); static njs_int_t njs_array_prototype_slice_copy(njs_vm_t *vm, @@ -183,8 +183,8 @@ njs_array_length_set(njs_vm_t *vm, njs_v njs_object_prop_t *prev, njs_value_t *setval) { double num, idx; + int64_t prev_length; uint32_t i, length; - uint64_t prev_length; njs_int_t ret; njs_array_t *array, *keys; @@ -576,8 +576,7 @@ static njs_int_t njs_array_prototype_slice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - int64_t start, end, length; - uint64_t object_length; + int64_t start, end, length, object_length; njs_int_t ret; njs_value_t *this; @@ -823,7 +822,7 @@ static njs_int_t njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - uint64_t length; + int64_t length; njs_int_t ret; njs_uint_t i; njs_array_t *array; @@ -889,7 +888,7 @@ static njs_int_t njs_array_prototype_pop(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - uint64_t length; + int64_t length; njs_int_t ret; njs_array_t *array; njs_value_t *this, *entry; @@ -963,7 +962,7 @@ njs_array_prototype_unshift(njs_vm_t *vm njs_index_t unused) { double idx; - uint64_t from, to, length; + int64_t from, to, length; njs_int_t ret; njs_uint_t n; njs_array_t *array, *keys; @@ -1097,7 +1096,7 @@ static njs_int_t njs_array_prototype_shift(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - uint64_t i, length; + int64_t i, length; njs_int_t ret; njs_array_t *array; njs_value_t *this, *item, entry; @@ -1301,7 +1300,7 @@ static njs_int_t njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - uint64_t length; + int64_t length; njs_int_t ret; njs_uint_t i, n; njs_value_t value, *this; @@ -1382,8 +1381,7 @@ njs_array_prototype_join(njs_vm_t *vm, n njs_index_t unused) { u_char *p, *last; - int64_t size, length; - uint64_t i, len; + int64_t i, size, len, length; njs_int_t ret; njs_chb_t chain; njs_utf8_t utf8; @@ -1602,7 +1600,7 @@ njs_array_indices(njs_vm_t *vm, njs_valu njs_inline njs_int_t njs_array_object_handler(njs_vm_t *vm, njs_array_iterator_handler_t handler, - njs_array_iterator_args_t *args, njs_value_t *key, uint64_t i) + njs_array_iterator_args_t *args, njs_value_t *key, int64_t i) { njs_int_t ret; njs_value_t prop, *entry; @@ -1640,7 +1638,7 @@ njs_array_iterator(njs_vm_t *vm, njs_arr njs_array_iterator_handler_t handler) { double idx; - uint64_t length, i, from, to; + int64_t length, i, from, to; njs_int_t ret; njs_array_t *array, *keys; njs_value_t *value, *entry, prop, character, string_obj; @@ -1712,7 +1710,7 @@ njs_array_iterator(njs_vm_t *vm, njs_arr p = string_prop.start; end = p + string_prop.size; - if (length == string_prop.size) { + if ((size_t) length == string_prop.size) { /* Byte or ASCII string. */ for (i = from; i < to; i++) { @@ -1802,7 +1800,7 @@ njs_array_reverse_iterator(njs_vm_t *vm, njs_array_iterator_handler_t handler) { double idx; - uint64_t i, from, to, length; + int64_t i, from, to, length; njs_int_t ret; njs_array_t *array, *keys; njs_value_t *entry, *value, prop, character, string_obj; @@ -1874,7 +1872,7 @@ njs_array_reverse_iterator(njs_vm_t *vm, length = njs_string_prop(&string_prop, value); end = string_prop.start + string_prop.size; - if (length == string_prop.size) { + if ((size_t) length == string_prop.size) { /* Byte or ASCII string. */ p = string_prop.start + from; @@ -2005,8 +2003,9 @@ njs_array_prototype_concat(njs_vm_t *vm, njs_index_t unused) { double idx; - uint64_t i, k, len, length; + int64_t k, len, length; njs_int_t ret; + njs_uint_t i; njs_value_t this, retval, *value, *e; njs_array_t *array, *keys; @@ -2158,7 +2157,7 @@ njs_array_prototype_concat(njs_vm_t *vm, static njs_int_t njs_array_handler_index_of(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { if (njs_values_strict_equal(args->argument, entry)) { njs_set_number(&vm->retval, n); @@ -2174,8 +2173,7 @@ static njs_int_t njs_array_prototype_index_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - int64_t from; - uint64_t length; + int64_t from, length; njs_int_t ret; njs_array_iterator_args_t iargs; @@ -2230,8 +2228,7 @@ static njs_int_t njs_array_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - int64_t from; - uint64_t length; + int64_t from, length; njs_int_t ret; njs_array_iterator_args_t iargs; @@ -2264,7 +2261,7 @@ njs_array_prototype_last_index_of(njs_vm } if (from >= 0) { - from = njs_min((uint64_t) from, length - 1); + from = njs_min(from, length - 1); } else if (from < 0) { from += length; @@ -2292,7 +2289,7 @@ not_found: static njs_int_t njs_array_handler_includes(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { if (!njs_is_valid(entry)) { entry = njs_value_arg(&njs_value_undefined); @@ -2312,8 +2309,7 @@ static njs_int_t njs_array_prototype_includes(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - int64_t from; - uint64_t length; + int64_t from, length; njs_int_t ret; njs_array_iterator_args_t iargs; @@ -2387,7 +2383,7 @@ njs_array_prototype_fill(njs_vm_t *vm, n length = array->length; } else { - ret = njs_object_length(vm, this, (uint64_t *) &length); + ret = njs_object_length(vm, this, &length); if (njs_slow_path(ret == NJS_ERROR)) { return ret; } @@ -2469,7 +2465,7 @@ njs_array_validate_args(njs_vm_t *vm, nj return ret; } - ret = njs_value_length(vm, iargs->value, (uint64_t *) &iargs->to); + ret = njs_value_length(vm, iargs->value, &iargs->to); if (njs_slow_path(ret != NJS_OK)) { return ret; } @@ -2494,7 +2490,7 @@ failed: static njs_int_t njs_array_handler_for_each(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { if (njs_is_valid(entry)) { return njs_array_iterator_call(vm, args, entry, n); @@ -2529,7 +2525,7 @@ njs_array_prototype_for_each(njs_vm_t *v static njs_int_t njs_array_handler_some(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { njs_int_t ret; @@ -2577,7 +2573,7 @@ njs_array_prototype_some(njs_vm_t *vm, n static njs_int_t njs_array_handler_every(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { njs_int_t ret; @@ -2625,7 +2621,7 @@ njs_array_prototype_every(njs_vm_t *vm, static njs_int_t njs_array_handler_filter(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { njs_int_t ret; njs_value_t copy; @@ -2681,7 +2677,7 @@ njs_array_prototype_filter(njs_vm_t *vm, static njs_int_t njs_array_handler_find(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { njs_int_t ret; njs_value_t copy; @@ -2735,7 +2731,7 @@ njs_array_prototype_find(njs_vm_t *vm, n static njs_int_t njs_array_handler_find_index(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { njs_int_t ret; njs_value_t copy; @@ -2789,7 +2785,7 @@ njs_array_prototype_find_index(njs_vm_t static njs_int_t njs_array_handler_map(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { njs_int_t ret; njs_array_t *retval; @@ -2830,7 +2826,7 @@ static njs_int_t njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - uint64_t length, i; + int64_t i, length; njs_int_t ret; njs_array_t *array; njs_value_t *this; @@ -2896,7 +2892,7 @@ unexpected_args: njs_inline njs_int_t njs_array_iterator_reduce(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { njs_value_t arguments[5]; @@ -2914,7 +2910,7 @@ njs_array_iterator_reduce(njs_vm_t *vm, static njs_int_t njs_array_handler_reduce(njs_vm_t *vm, njs_array_iterator_args_t *args, - njs_value_t *entry, uint64_t n) + njs_value_t *entry, int64_t n) { njs_int_t ret; @@ -2986,7 +2982,7 @@ njs_array_prototype_reduce_right(njs_vm_ return ret; } - ret = njs_value_length(vm, iargs.value, (uint64_t *) &iargs.from); + ret = njs_value_length(vm, iargs.value, &iargs.from); if (njs_slow_path(ret != NJS_OK)) { return ret; } @@ -3080,7 +3076,7 @@ static njs_int_t njs_array_prototype_sort(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - uint64_t n, index, length, current; + int64_t n, index, length, current; njs_int_t ret; njs_array_t *array; njs_value_t retval, value, *this, *start, arguments[3]; @@ -3205,7 +3201,7 @@ njs_array_prototype_copy_within(njs_vm_t return ret; } - ret = njs_value_length(vm, this, (uint64_t *) &length); + ret = njs_value_length(vm, this, &length); if (njs_slow_path(ret != NJS_OK)) { return ret; } diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_function.c --- a/src/njs_function.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_function.c Thu Mar 26 17:12:16 2020 +0300 @@ -1076,7 +1076,7 @@ static njs_int_t njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - uint64_t i, length; + int64_t i, length; njs_int_t ret; njs_frame_t *frame; njs_value_t *this, *arr_like; diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_json.c --- a/src/njs_json.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_json.c Thu Mar 26 17:12:16 2020 +0300 @@ -28,8 +28,8 @@ typedef struct { NJS_JSON_ARRAY, } type:8; - uint64_t index; - uint64_t length; + int64_t index; + int64_t length; njs_array_t *keys; njs_value_t *key; njs_object_prop_t *prop; diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_number.c --- a/src/njs_number.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_number.c Thu Mar 26 17:12:16 2020 +0300 @@ -230,24 +230,24 @@ njs_number_to_string(njs_vm_t *vm, njs_v njs_int_t -njs_uint64_to_string(njs_vm_t *vm, njs_value_t *value, uint64_t u64) +njs_int64_to_string(njs_vm_t *vm, njs_value_t *value, int64_t i64) { size_t size; u_char *dst, *p; u_char buf[128]; - if (njs_fast_path(u64 < 0x3fffffffffffULL)) { + if (njs_fast_path(i64 >= 0 && i64 < 0x3fffffffffffLL)) { /* Fits to short_string. */ dst = njs_string_short_start(value); - p = njs_sprintf(dst, dst + NJS_STRING_SHORT, "%uL", u64); + p = njs_sprintf(dst, dst + NJS_STRING_SHORT, "%L", i64); njs_string_short_set(value, p - dst, p - dst); return NJS_OK; } - size = njs_dtoa(u64, (char *) buf); + size = njs_dtoa(i64, (char *) buf); return njs_string_new(vm, value, buf, size, size); } diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_number.h --- a/src/njs_number.h Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_number.h Thu Mar 26 17:12:16 2020 +0300 @@ -8,7 +8,7 @@ #define _NJS_NUMBER_H_INCLUDED_ -#define NJS_MAX_LENGTH (0x1fffffffffffffULL) +#define NJS_MAX_LENGTH (0x1fffffffffffffLL) double njs_key_to_index(const njs_value_t *value); diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_object.c --- a/src/njs_object.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_object.c Thu Mar 26 17:12:16 2020 +0300 @@ -2628,7 +2628,7 @@ const njs_object_init_t njs_object_prot njs_int_t -njs_object_length(njs_vm_t *vm, njs_value_t *value, uint64_t *length) +njs_object_length(njs_vm_t *vm, njs_value_t *value, int64_t *length) { njs_int_t ret; njs_value_t value_length; diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_object.h --- a/src/njs_object.h Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_object.h Thu Mar 26 17:12:16 2020 +0300 @@ -67,7 +67,7 @@ njs_value_t *njs_property_constructor_cr njs_value_t *constructor); njs_int_t njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused); -njs_int_t njs_object_length(njs_vm_t *vm, njs_value_t *value, uint64_t *dst); +njs_int_t njs_object_length(njs_vm_t *vm, njs_value_t *value, int64_t *dst); njs_int_t njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq); njs_object_prop_t *njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name, @@ -226,7 +226,7 @@ njs_key_string_get(njs_vm_t *vm, njs_val njs_inline njs_int_t -njs_object_length_set(njs_vm_t *vm, njs_value_t *value, uint64_t length) +njs_object_length_set(njs_vm_t *vm, njs_value_t *value, int64_t length) { njs_value_t index; diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_regexp.c --- a/src/njs_regexp.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_regexp.c Thu Mar 26 17:12:16 2020 +0300 @@ -871,7 +871,7 @@ njs_regexp_prototype_test(njs_vm_t *vm, njs_index_t unused) { int *captures; - uint64_t last_index; + int64_t last_index; njs_int_t ret, match; njs_uint_t n; njs_regex_t *regex; @@ -963,7 +963,7 @@ njs_int_t njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - uint64_t last_index; + int64_t last_index; njs_int_t ret; njs_utf8_t utf8; njs_value_t *value, lvalue; @@ -1002,7 +1002,7 @@ njs_regexp_prototype_exec(njs_vm_t *vm, (void) njs_string_prop(&string, value); - if (string.size >= last_index) { + if (string.size >= (size_t) last_index) { utf8 = NJS_STRING_BYTE; type = NJS_REGEXP_BYTE; diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_string.c --- a/src/njs_string.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_string.c Thu Mar 26 17:12:16 2020 +0300 @@ -1608,8 +1608,8 @@ static njs_int_t njs_string_bytes_from_array_like(njs_vm_t *vm, njs_value_t *value) { u_char *p; + int64_t length; uint32_t u32; - uint64_t length; njs_int_t ret; njs_array_t *array; njs_value_t *octet, index, prop; diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_typed_array.c --- a/src/njs_typed_array.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_typed_array.c Thu Mar 26 17:12:16 2020 +0300 @@ -13,8 +13,9 @@ njs_typed_array_constructor(njs_vm_t *vm njs_index_t magic) { double num; + int64_t i, length; uint32_t element_size; - uint64_t i, length, size, offset; + uint64_t size, offset; njs_int_t ret; njs_value_t *value, prop; njs_array_t *src_array; @@ -360,8 +361,7 @@ njs_typed_array_prototype_set(njs_vm_t * njs_uint_t nargs, njs_index_t unused) { double num; - uint32_t i; - int64_t length, src_length, offset; + int64_t i, length, src_length, offset; njs_int_t ret; njs_value_t *this, *src, *value, prop; njs_array_t *array; @@ -436,7 +436,7 @@ njs_typed_array_prototype_set(njs_vm_t * return ret; } - ret = njs_object_length(vm, src, (uint64_t *) &src_length); + ret = njs_object_length(vm, src, &src_length); if (njs_slow_path(ret == NJS_ERROR)) { return ret; } diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_value.c --- a/src/njs_value.c Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_value.c Thu Mar 26 17:12:16 2020 +0300 @@ -261,7 +261,7 @@ njs_value_own_enumerate(njs_vm_t *vm, nj njs_int_t -njs_value_length(njs_vm_t *vm, njs_value_t *value, uint64_t *length) +njs_value_length(njs_vm_t *vm, njs_value_t *value, int64_t *length) { njs_string_prop_t string_prop; @@ -697,7 +697,8 @@ static njs_int_t njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_array_t *array, uint32_t index) { - uint64_t size, length; + int64_t length; + uint64_t size; njs_int_t ret; njs_value_t *setval, value; njs_object_prop_t *prop; diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_value.h --- a/src/njs_value.h Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_value.h Thu Mar 26 17:12:16 2020 +0300 @@ -1002,7 +1002,7 @@ njs_array_t *njs_value_enumerate(njs_vm_ njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all); njs_array_t *njs_value_own_enumerate(njs_vm_t *vm, njs_value_t *value, njs_object_enum_t kind, njs_object_enum_type_t type, njs_bool_t all); -njs_int_t njs_value_length(njs_vm_t *vm, njs_value_t *value, uint64_t *dst); +njs_int_t njs_value_length(njs_vm_t *vm, njs_value_t *value, int64_t *dst); const char *njs_type_string(njs_value_type_t type); njs_int_t njs_primitive_value_to_string(njs_vm_t *vm, njs_value_t *dst, @@ -1010,7 +1010,7 @@ njs_int_t njs_primitive_value_to_string( njs_int_t njs_primitive_value_to_chain(njs_vm_t *vm, njs_chb_t *chain, const njs_value_t *src); double njs_string_to_number(const njs_value_t *value, njs_bool_t parse_float); -njs_int_t njs_uint64_to_string(njs_vm_t *vm, njs_value_t *value, uint64_t u64); +njs_int_t njs_int64_to_string(njs_vm_t *vm, njs_value_t *value, int64_t i64); njs_bool_t njs_string_eq(const njs_value_t *v1, const njs_value_t *v2); @@ -1041,7 +1041,7 @@ njs_value_property_i64(njs_vm_t *vm, njs /* FIXME: False-positive in MSAN?. */ njs_msan_unpoison(&key, sizeof(njs_value_t)); - ret = njs_uint64_to_string(vm, &key, index); + ret = njs_int64_to_string(vm, &key, index); if (njs_slow_path(ret != NJS_OK)) { return ret; } @@ -1060,7 +1060,7 @@ njs_value_property_i64_set(njs_vm_t *vm, /* FIXME: False-positive in MSAN?. */ njs_msan_unpoison(&key, sizeof(njs_value_t)); - ret = njs_uint64_to_string(vm, &key, index); + ret = njs_int64_to_string(vm, &key, index); if (njs_slow_path(ret != NJS_OK)) { return ret; } @@ -1079,7 +1079,7 @@ njs_value_property_i64_delete(njs_vm_t * /* FIXME: False-positive in MSAN?. */ njs_msan_unpoison(&key, sizeof(njs_value_t)); - ret = njs_uint64_to_string(vm, &key, index); + ret = njs_int64_to_string(vm, &key, index); if (njs_slow_path(ret != NJS_OK)) { return ret; } diff -r 94d6774e0c03 -r 2a03cd71561a src/njs_value_conversion.h --- a/src/njs_value_conversion.h Mon Mar 23 19:58:50 2020 +0300 +++ b/src/njs_value_conversion.h Thu Mar 26 17:12:16 2020 +0300 @@ -80,7 +80,7 @@ njs_value_to_integer(njs_vm_t *vm, njs_v njs_inline njs_int_t -njs_value_to_length(njs_vm_t *vm, njs_value_t *value, uint64_t *dst) +njs_value_to_length(njs_vm_t *vm, njs_value_t *value, int64_t *dst) { double num; njs_int_t ret; _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel