]> git.kaiwu.me - njs.git/commitdiff
njs_array_realloc() has been changed to njs_array_expand().
authorIgor Sysoev <igor@sysoev.ru>
Mon, 24 Oct 2016 11:56:28 +0000 (14:56 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 24 Oct 2016 11:56:28 +0000 (14:56 +0300)
njs/njs_array.c
njs/njs_array.h
njs/njs_string.c
njs/njs_vm.c

index aa8f9e6841d2a3171693c75ff35c0a353be6b12e..7e402fc9264b8fb160ae96e91bb8153e86aba851 100644 (file)
@@ -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;
                 }
index 21539fcbcad33760ddaba334c708ecad7839145e..a4b05031df4574c5d7352351c4121234929bc999 100644 (file)
@@ -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);
index 3c414a531742e560ac2d64d444997903092acde6..c6cd3913e775e2615c26f0190e5741a1a8a44c36 100644 (file)
@@ -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 {
index 5090653a4a79e1601588cab5c6012ccb5d076d9d..8244437e7c5cea5d32ae1b60863970abb92d1505 100644 (file)
@@ -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);