]> granicus.if.org Git - php/commitdiff
Fixed a behavior break introduced by d7f2dc4ec651628e10213625db6aee3559e214a9
authorDmitry Stogov <dmitry@zend.com>
Thu, 22 Mar 2018 13:37:34 +0000 (16:37 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 22 Mar 2018 13:37:34 +0000 (16:37 +0300)
Zend/zend_hash.c
ext/standard/tests/array/current_variation6.phpt [new file with mode: 0644]

index d5de72e95a0989b53addcbaa4a9693ad479c3fe7..0824efa27b2d8955971e6ae927792b29bc951e3e 100644 (file)
@@ -1060,11 +1060,6 @@ static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx,
                }
        }
        idx = HT_HASH_TO_IDX(idx);
-       if (ht->nNumUsed - 1 == idx) {
-               do {
-                       ht->nNumUsed--;
-               } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF)));
-       }
        ht->nNumOfElements--;
        if (ht->nInternalPointer == idx || UNEXPECTED(HT_HAS_ITERATORS(ht))) {
                uint32_t new_idx;
@@ -1083,6 +1078,12 @@ static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx,
                }
                zend_hash_iterators_update(ht, idx, new_idx);
        }
+       if (ht->nNumUsed - 1 == idx) {
+               do {
+                       ht->nNumUsed--;
+               } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF)));
+               ht->nInternalPointer = MIN(ht->nInternalPointer, ht->nNumUsed);
+       }
        if (p->key) {
                zend_string_release(p->key);
        }
diff --git a/ext/standard/tests/array/current_variation6.phpt b/ext/standard/tests/array/current_variation6.phpt
new file mode 100644 (file)
index 0000000..970c7d4
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Test current() function : internal pointer maintenance at the end of array 
+--FILE--
+<?php
+$array = ["foo" => 1, "bar" => 2, "baz" => 3];
+reset($array);
+while ($cur = current($array)) {
+    var_dump($cur);
+    next($array);
+}
+
+unset($array["baz"]);
+$array[] = 4;
+var_dump(current($array));
+?>
+--EXPECT--
+int(1)
+int(2)
+int(3)
+int(4)