From aa3f44a395f9197f112ced584539055fa836eac4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 10 Feb 2016 19:03:02 +0100 Subject: [PATCH] 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. --- Zend/tests/bug69989_1.phpt | 15 +++++++++++++++ Zend/zend_generators.c | 10 ++++++++++ 2 files changed, 25 insertions(+) create mode 100644 Zend/tests/bug69989_1.phpt 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-- +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; -- 2.40.0