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) {
- generator->gc_buffer = safe_erealloc(generator->gc_buffer, sizeof(zval), gc_buffer_size, 0);
- generator->gc_buffer_size = gc_buffer_size;
- }
- *n = gc_buffer_size;
- *table = gc_buffer = generator->gc_buffer;
-
- ZVAL_COPY_VALUE(gc_buffer++, &generator->value);
- ZVAL_COPY_VALUE(gc_buffer++, &generator->key);
- ZVAL_COPY_VALUE(gc_buffer++, &generator->retval);
- ZVAL_COPY_VALUE(gc_buffer++, &generator->values);
+ zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
+ zend_get_gc_buffer_add_zval(gc_buffer, &generator->value);
+ zend_get_gc_buffer_add_zval(gc_buffer, &generator->key);
+ zend_get_gc_buffer_add_zval(gc_buffer, &generator->retval);
+ zend_get_gc_buffer_add_zval(gc_buffer, &generator->values);
if (!(EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE)) {
uint32_t i, num_cvs = EX(func)->op_array.last_var;