summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/array.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index cf4f1889cf..2b1fead7c5 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -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) {