summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_generators.c')
-rw-r--r--Zend/zend_generators.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 805bff38ab..3fbbd49c0a 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -340,6 +340,16 @@ static HashTable *zend_generator_get_gc(zval *object, zval **table, int *n) /* {
return NULL;
}
+ if (generator->flags & ZEND_GENERATOR_CURRENTLY_RUNNING) {
+ /* If the generator is currently running, we certainly won't be able to GC any values it
+ * holds on to. The execute_data state might be inconsistent during execution (e.g. because
+ * GC has been triggered in the middle of a variable reassignment), so we should not try
+ * to inspect it here. */
+ *table = NULL;
+ *n = 0;
+ return NULL;
+ }
+
op_array = &EX(func)->op_array;
gc_buffer_size = calc_gc_buffer_size(generator);
if (generator->gc_buffer_size < gc_buffer_size) {