summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-02-10 19:03:02 +0100
committerNikita Popov <nikic@php.net>2016-02-10 19:03:02 +0100
commitaa3f44a395f9197f112ced584539055fa836eac4 (patch)
treea82e55a46c4e977bf0e98958733c7f9ba5cc099b
parentdaf3d0c875634547748b791fb6291e78103bf6dc (diff)
downloadphp-git-aa3f44a395f9197f112ced584539055fa836eac4.tar.gz
Crude generator GC for value/key/retval
These values remain live after the generator has been closed, so they are particularly susceptible to leaking cycles.
-rw-r--r--Zend/tests/bug69989_1.phpt15
-rw-r--r--Zend/zend_generators.c10
2 files changed, 25 insertions, 0 deletions
diff --git a/Zend/tests/bug69989_1.phpt b/Zend/tests/bug69989_1.phpt
new file mode 100644
index 0000000000..816c55410e
--- /dev/null
+++ b/Zend/tests/bug69989_1.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #69989: Cycle collection for yielded values
+--FILE--
+<?php
+
+function gen() {
+ yield yield;
+}
+$gen = gen();
+$gen->send($gen);
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 4861e45919..c572a9cc35 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -193,6 +193,15 @@ static void zend_generator_free_storage(zend_object *object) /* {{{ */
}
/* }}} */
+static HashTable *zend_generator_get_gc(zval *object, zval **table, int *n) /* {{{ */
+{
+ zend_generator *generator = (zend_generator*) Z_OBJ_P(object);
+ *table = &generator->value;
+ *n = 3;
+ return NULL;
+}
+/* }}} */
+
static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ */
{
zend_generator *generator;
@@ -1128,6 +1137,7 @@ void zend_register_generator_ce(void) /* {{{ */
memcpy(&zend_generator_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
zend_generator_handlers.free_obj = zend_generator_free_storage;
zend_generator_handlers.dtor_obj = zend_generator_dtor_storage;
+ zend_generator_handlers.get_gc = zend_generator_get_gc;
zend_generator_handlers.clone_obj = NULL;
zend_generator_handlers.get_constructor = zend_generator_get_constructor;