--- /dev/null
+--TEST--
+A generator iterator wrapper involved in a cycle should not leak
+--FILE--
+<?php
+
+class Test {
+ public function method() {
+ $this->gen1 = (function () {
+ yield 1;
+ yield 2;
+ yield 3;
+ })();
+ $gen2 = function() {
+ foreach ($this->gen1 as $x) {
+ echo "$x\n";
+ yield $x;
+ }
+ };
+ $this->gen2 = $gen2();
+ foreach ($this->gen2 as $x) {
+ if ($x == 2) {
+ break;
+ }
+ }
+ }
+}
+(new Test)->method();
+gc_collect_cycles();
+
+?>
+--EXPECT--
+1
+2
}
/* }}} */
+static HashTable *zend_generator_iterator_get_gc(
+ zend_object_iterator *iterator, zval **table, int *n)
+{
+ *table = &iterator->data;
+ *n = 1;
+ return NULL;
+}
+
static const zend_object_iterator_funcs zend_generator_iterator_functions = {
zend_generator_iterator_dtor,
zend_generator_iterator_valid,
zend_generator_iterator_move_forward,
zend_generator_iterator_rewind,
NULL,
- NULL, /* get_gc */
+ zend_generator_iterator_get_gc,
};
zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */