diff options
author | Nikita Popov <nikic@php.net> | 2015-12-17 20:59:57 +0100 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-12-17 20:59:57 +0100 |
commit | a3e19527004dc67dfd875e758007b8ae135d4ed1 (patch) | |
tree | 75251e60d504d2391e40e716c776d837c071be41 | |
parent | 9e44b6a61e7ca116c3ea6de4080276ef9a650d06 (diff) | |
download | php-git-a3e19527004dc67dfd875e758007b8ae135d4ed1.tar.gz |
Fixed bug #71153
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/spl/spl_array.c | 4 | ||||
-rw-r--r-- | ext/spl/tests/bug71153.phpt | 16 |
3 files changed, 22 insertions, 0 deletions
@@ -44,6 +44,8 @@ PHP NEWS - SPL: . Fixed bug #71077 (ReflectionMethod for ArrayObject constructor returns wrong number of parameters). (Laruence) + . Fixed bug #71153 (Performance Degradation in ArrayIterator with large + arrays). (Nikita) 17 Dec 2015, PHP 7.0.1 diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 0329270060..31d5beaa39 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -130,6 +130,10 @@ static zend_always_inline uint32_t *spl_array_get_pos_ptr(HashTable *ht, spl_arr static void spl_array_object_free_storage(zend_object *object) { spl_array_object *intern = spl_array_from_obj(object); + + if (intern->ht_iter != (uint32_t) -1) { + zend_hash_iterator_del(intern->ht_iter); + } zend_object_std_dtor(&intern->std); diff --git a/ext/spl/tests/bug71153.phpt b/ext/spl/tests/bug71153.phpt new file mode 100644 index 0000000000..bdd940cbee --- /dev/null +++ b/ext/spl/tests/bug71153.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #71153: Performance Degradation in ArrayIterator with large arrays +--FILE-- +<?php + +$n = 200000; + +for ($i = 0; $i < $n; ++$i) { + foreach (new ArrayIterator([]) as $v) {} +} + +echo "done\n"; + +?> +--EXPECT-- +done |