summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-12-17 20:59:57 +0100
committerNikita Popov <nikic@php.net>2015-12-17 20:59:57 +0100
commita3e19527004dc67dfd875e758007b8ae135d4ed1 (patch)
tree75251e60d504d2391e40e716c776d837c071be41
parent9e44b6a61e7ca116c3ea6de4080276ef9a650d06 (diff)
downloadphp-git-a3e19527004dc67dfd875e758007b8ae135d4ed1.tar.gz
Fixed bug #71153
-rw-r--r--NEWS2
-rw-r--r--ext/spl/spl_array.c4
-rw-r--r--ext/spl/tests/bug71153.phpt16
3 files changed, 22 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 86a6345953..16a91ab5a3 100644
--- a/NEWS
+++ b/NEWS
@@ -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