{
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;
}
{
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),
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++) {
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;
}
* 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;
}
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);
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);