njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
uint32_t append)
{
+ uint32_t free_before, free_after;
uint64_t size;
njs_value_t *start, *old;
- size = (uint64_t) append + array->length;
+ free_before = array->start - array->data;
+ free_after = array->size - array->length - free_before;
- if (nxt_fast_path(size <= array->size && prepend == 0)) {
+ if (nxt_fast_path(free_before >= prepend && free_after >= append)) {
return NXT_OK;
}
+ size = (uint64_t) prepend + array->length + append;
+
if (size < 16) {
size *= 2;
size += size / 2;
}
- if (nxt_slow_path((prepend + size) > NJS_ARRAY_MAX_LENGTH)) {
+ if (nxt_slow_path(size > NJS_ARRAY_MAX_LENGTH)) {
goto memory_error;
}
start = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
- (prepend + size) * sizeof(njs_value_t));
+ size * sizeof(njs_value_t));
if (nxt_slow_path(start == NULL)) {
goto memory_error;
}
n = nargs - 1;
if (n != 0) {
- if ((intptr_t) n > (array->start - array->data)) {
- ret = njs_array_expand(vm, array, n, 0);
- if (nxt_slow_path(ret != NXT_OK)) {
- return ret;
- }
+ ret = njs_array_expand(vm, array, n, 0);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
}
array->length += n;
"len +' '+ a +' '+ a.shift()"),
nxt_string("5 3,4,5,1,2 3") },
+ { nxt_string("var a=[0], n = 64; while(--n) {a.push(n); a.shift()}; a"),
+ nxt_string("1") },
+
{ nxt_string("var a = []; a.splice()"),
nxt_string("") },