]> granicus.if.org Git - php/commitdiff
additional speedup for array_shift(). No need to rehash if the removed element's
authorAndrey Hristov <andrey@php.net>
Sat, 22 Feb 2003 13:55:11 +0000 (13:55 +0000)
committerAndrey Hristov <andrey@php.net>
Sat, 22 Feb 2003 13:55:11 +0000 (13:55 +0000)
key is not scalar and elements with scalar keys are already well numbered
(sequentially from 0) for some reason. This is the case if the leading
elements have no scalar indexes.

ext/standard/array.c

index cf4f1889cf88bbb7bbfb2d513972a3e8656d3fe4..2b1fead7c5cd35e662295d0247f3834789721ccd 100644 (file)
@@ -1858,15 +1858,21 @@ static void _phpi_pop(INTERNAL_FUNCTION_PARAMETERS, int off_the_end)
        /* If we did a shift... re-index like it did before */
        if (!off_the_end) {
                int k = 0;
+               int should_rehash = 0;
                Bucket *p = Z_ARRVAL_PP(stack)->pListHead;
                while (p != NULL) {
                        if (p->nKeyLength == 0) {
-                               p->h = k++;
+                               if (p->h != k) {
+                                       p->h = k++;
+                                       should_rehash = 1;
+                               } else {
+                                       k++;
+                               }
                        }
                        p = p->pListNext;
                }
                Z_ARRVAL_PP(stack)->nNextFreeElement = k;
-               if (k) {
+               if (should_rehash) {
                        zend_hash_rehash(Z_ARRVAL_PP(stack));
                }
        } else if (!key_len) {