From: Nikita Popov Date: Thu, 1 Oct 2020 14:18:23 +0000 (+0200) Subject: Support GC for AppendIterator X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2c1b5c43656336b6a19070a3529c411084f0304f;p=php Support GC for AppendIterator This also requires adding GC support for ArrayIterator internal iterators. --- diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index fb23939ca2..75668e2f0f 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -1079,6 +1079,13 @@ static void spl_array_it_rewind(zend_object_iterator *iter) /* {{{ */ } /* }}} */ +static HashTable *spl_array_it_get_gc(zend_object_iterator *iter, zval **table, int *n) +{ + *n = 1; + *table = &iter->data; + return NULL; +} + /* {{{ spl_array_set_array */ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *array, zend_long ar_flags, int just_array) { if (Z_TYPE_P(array) != IS_OBJECT && Z_TYPE_P(array) != IS_ARRAY) { @@ -1135,7 +1142,7 @@ static const zend_object_iterator_funcs spl_array_it_funcs = { spl_array_it_move_forward, spl_array_it_rewind, NULL, - NULL, /* get_gc */ + spl_array_it_get_gc, }; zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index c73134e9ae..40538cda8e 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -2140,11 +2140,10 @@ static HashTable *spl_dual_it_get_gc(zend_object *obj, zval **table, int *n) /* Nothing to do */ break; case DIT_AppendIterator: - // TODO - /*zend_get_gc_buffer_add_obj(gc_buffer, &object->u.append.iterator->std); + zend_get_gc_buffer_add_obj(gc_buffer, &object->u.append.iterator->std); if (Z_TYPE(object->u.append.zarrayit) != IS_UNDEF) { zend_get_gc_buffer_add_zval(gc_buffer, &object->u.append.zarrayit); - }*/ + } break; case DIT_CachingIterator: case DIT_RecursiveCachingIterator: diff --git a/ext/spl/tests/bug65387.phpt b/ext/spl/tests/bug65387.phpt index 75678254bd..a5b028954c 100644 --- a/ext/spl/tests/bug65387.phpt +++ b/ext/spl/tests/bug65387.phpt @@ -41,12 +41,10 @@ $it2[] = $it2; $it2->next(); // Append -/* TODO $it = new ArrayIterator(); $it2 = new AppendIterator(); $it[] = $it2; $it2->append($it); - */ ?> ===DONE===