mirror of
https://github.com/php/php-src.git
synced 2024-11-23 18:04:36 +08:00
Add dummy get_gc handler for iterator wrapper
get_gc is assumed to be non-NULL in master, and get_gc can be called on the iterator wrapper if during generator GC, so we need to define this handler. For now it's just a dummy, though for full support we'd have to also add a get_gc iterator handler that is called here.
This commit is contained in:
parent
48ca2c0833
commit
97fc84ca06
21
Zend/tests/generators/gc_with_iterator_in_foreach.phpt
Normal file
21
Zend/tests/generators/gc_with_iterator_in_foreach.phpt
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
--TEST--
|
||||||
|
Generator GC triggered with live iterator in foreach
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
function gen($iter, &$gen) {
|
||||||
|
foreach ($iter as $v) {
|
||||||
|
yield;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$iter = new ArrayIterator([1, 2, 3]);
|
||||||
|
$gen = gen($iter, $gen);
|
||||||
|
$gen->next();
|
||||||
|
unset($gen);
|
||||||
|
gc_collect_cycles();
|
||||||
|
|
||||||
|
?>
|
||||||
|
===DONE===
|
||||||
|
--EXPECT--
|
||||||
|
===DONE===
|
@ -24,6 +24,7 @@ static zend_class_entry zend_iterator_class_entry;
|
|||||||
|
|
||||||
static void iter_wrapper_free(zend_object *object);
|
static void iter_wrapper_free(zend_object *object);
|
||||||
static void iter_wrapper_dtor(zend_object *object);
|
static void iter_wrapper_dtor(zend_object *object);
|
||||||
|
static HashTable *iter_wrapper_get_gc(zval *object, zval **table, int *n);
|
||||||
|
|
||||||
static const zend_object_handlers iterator_object_handlers = {
|
static const zend_object_handlers iterator_object_handlers = {
|
||||||
0,
|
0,
|
||||||
@ -51,7 +52,7 @@ static const zend_object_handlers iterator_object_handlers = {
|
|||||||
NULL, /* count */
|
NULL, /* count */
|
||||||
NULL, /* get_debug_info */
|
NULL, /* get_debug_info */
|
||||||
NULL, /* get_closure */
|
NULL, /* get_closure */
|
||||||
NULL, /* get_gc */
|
iter_wrapper_get_gc,
|
||||||
NULL, /* do_operation */
|
NULL, /* do_operation */
|
||||||
NULL /* compare */
|
NULL /* compare */
|
||||||
};
|
};
|
||||||
@ -71,6 +72,13 @@ static void iter_wrapper_dtor(zend_object *object)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HashTable *iter_wrapper_get_gc(zval *object, zval **table, int *n) {
|
||||||
|
/* TODO: We need a get_gc iterator handler */
|
||||||
|
*table = NULL;
|
||||||
|
*n = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ZEND_API void zend_iterator_init(zend_object_iterator *iter)
|
ZEND_API void zend_iterator_init(zend_object_iterator *iter)
|
||||||
{
|
{
|
||||||
zend_object_std_init(&iter->std, &zend_iterator_class_entry);
|
zend_object_std_init(&iter->std, &zend_iterator_class_entry);
|
||||||
|
Loading…
Reference in New Issue
Block a user