From 9eb9fb681057a4afa0bee80bc5381e6d47d2a1aa Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Mon, 24 Oct 2016 14:56:28 +0300 Subject: [PATCH] njs_array_realloc() has been changed to njs_array_expand(). --- njs/njs_array.c | 58 +++++++++++++++++++++++------------------------- njs/njs_array.h | 2 +- njs/njs_string.c | 8 +++---- njs/njs_vm.c | 15 +++++-------- 4 files changed, 38 insertions(+), 45 deletions(-) diff --git a/njs/njs_array.c b/njs/njs_array.c index aa8f9e68..7e402fc9 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -148,17 +148,14 @@ njs_array_add(njs_vm_t *vm, njs_array_t *array, njs_value_t *value) { njs_ret_t ret; - if (array->size == array->length) { - ret = njs_array_realloc(vm, array, 0, array->size + 1); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; - } - } + ret = njs_array_expand(vm, array, 0, 1); - /* GC: retain value. */ - array->start[array->length++] = *value; + if (nxt_fast_path(ret == NXT_OK)) { + /* GC: retain value. */ + array->start[array->length++] = *value; + } - return NXT_OK; + return ret; } @@ -168,31 +165,34 @@ njs_array_string_add(njs_vm_t *vm, njs_array_t *array, u_char *start, { njs_ret_t ret; - if (array->size == array->length) { - ret = njs_array_realloc(vm, array, 0, array->size + 1); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; - } + ret = njs_array_expand(vm, array, 0, 1); + + if (nxt_fast_path(ret == NXT_OK)) { + return njs_string_create(vm, &array->start[array->length++], + start, size, length); } - return njs_string_create(vm, &array->start[array->length++], - start, size, length); + return ret; } njs_ret_t -njs_array_realloc(njs_vm_t *vm, njs_array_t *array, uint32_t prepend, +njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend, uint32_t size) { njs_value_t *start, *old; - if (size != array->size) { - if (size < 16) { - size *= 2; + size += array->length; - } else { - size += size / 2; - } + if (nxt_fast_path(size <= array->size && prepend == 0)) { + return NXT_OK; + } + + if (size < 16) { + size *= 2; + + } else { + size += size / 2; } start = nxt_mem_cache_align(vm->mem_cache_pool, sizeof(njs_value_t), @@ -438,11 +438,9 @@ njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, array = args[0].data.u.array; if (nargs != 0) { - if (nargs > array->size - array->length) { - ret = njs_array_realloc(vm, array, 0, array->size + nargs); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; - } + ret = njs_array_expand(vm, array, 0, nargs); + if (nxt_slow_path(ret != NXT_OK)) { + return ret; } for (i = 1; i < nargs; i++) { @@ -500,7 +498,7 @@ njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, if (n != 0) { if ((intptr_t) n > (array->start - array->data)) { - ret = njs_array_realloc(vm, array, n, 0); + ret = njs_array_expand(vm, array, n, 0); if (nxt_slow_path(ret != NXT_OK)) { return ret; } @@ -627,7 +625,7 @@ njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, * Index of the first item is in "n". */ if (delta > 0) { - ret = njs_array_realloc(vm, array, 0, array->size + delta); + ret = njs_array_expand(vm, array, 0, delta); if (nxt_slow_path(ret != NXT_OK)) { return ret; } diff --git a/njs/njs_array.h b/njs/njs_array.h index 21539fcb..a4b05031 100644 --- a/njs/njs_array.h +++ b/njs/njs_array.h @@ -14,7 +14,7 @@ njs_array_t *njs_array_alloc(njs_vm_t *vm, uint32_t length, uint32_t spare); njs_ret_t njs_array_string_add(njs_vm_t *vm, njs_array_t *array, u_char *start, size_t size, size_t length); -njs_ret_t njs_array_realloc(njs_vm_t *vm, njs_array_t *array, uint32_t prepend, +njs_ret_t njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend, uint32_t size); njs_ret_t njs_array_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); diff --git a/njs/njs_string.c b/njs/njs_string.c index 3c414a53..c6cd3913 100644 --- a/njs/njs_string.c +++ b/njs/njs_string.c @@ -1659,11 +1659,9 @@ njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args, string.size, vm->single_match_data); if (ret >= 0) { if (array != NULL) { - if (array->length == array->size) { - ret = njs_array_realloc(vm, array, 0, array->size + 1); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; - } + ret = njs_array_expand(vm, array, 0, 1); + if (nxt_slow_path(ret != NXT_OK)) { + return ret; } } else { diff --git a/njs/njs_vm.c b/njs/njs_vm.c index 5090653a..8244437e 100644 --- a/njs/njs_vm.c +++ b/njs/njs_vm.c @@ -1047,28 +1047,25 @@ static njs_ret_t njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *object, int32_t index) { - size_t size; + int32_t size; njs_ret_t ret; njs_value_t *value; njs_array_t *array; array = object->data.u.array; + size = index - array->length; - if ((uint32_t) index >= array->length) { - + if (size >= 0) { if (pq->query != NJS_PROPERTY_QUERY_SET) { return NXT_DECLINED; } - if ((uint32_t) index >= array->size) { - ret = njs_array_realloc(vm, array, 0, index + 1); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; - } + ret = njs_array_expand(vm, array, 0, size + 1); + if (nxt_slow_path(ret != NXT_OK)) { + return ret; } value = &array->start[array->length]; - size = index - array->length; while (size != 0) { njs_set_invalid(value); -- 2.47.3