From: Nikita Popov Date: Wed, 1 Jul 2020 09:49:44 +0000 (+0200) Subject: Add get_gc handle for object iterators X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=312201dce4daca2770fd507af4a9a541bfe83fc0;p=php Add get_gc handle for object iterators Optional handler with the same semantics as the object handler. --- diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index b8730d2820..b1abbd7f9b 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -1094,7 +1094,8 @@ static const zend_object_iterator_funcs zend_generator_iterator_functions = { zend_generator_iterator_get_key, zend_generator_iterator_move_forward, zend_generator_iterator_rewind, - NULL + NULL, + NULL, /* get_gc */ }; zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index a100176c36..68d0077795 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -198,7 +198,8 @@ static const zend_object_iterator_funcs zend_interface_iterator_funcs_iterator = zend_user_it_get_current_key, zend_user_it_move_forward, zend_user_it_rewind, - zend_user_it_invalidate_current + zend_user_it_invalidate_current, + NULL, /* get_gc */ }; /* {{{ zend_user_it_get_iterator */ diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c index 9823390a98..aa4391f2ca 100644 --- a/Zend/zend_iterators.c +++ b/Zend/zend_iterators.c @@ -70,7 +70,11 @@ static void iter_wrapper_dtor(zend_object *object) } static HashTable *iter_wrapper_get_gc(zend_object *object, zval **table, int *n) { - /* TODO: We need a get_gc iterator handler */ + zend_object_iterator *iter = (zend_object_iterator*)object; + if (iter->funcs->get_gc) { + return iter->funcs->get_gc(iter, table, n); + } + *table = NULL; *n = 0; return NULL; diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h index 941b260885..bce98a24ac 100644 --- a/Zend/zend_iterators.h +++ b/Zend/zend_iterators.h @@ -50,6 +50,10 @@ typedef struct _zend_object_iterator_funcs { /* invalidate current value/key (optional, may be NULL) */ void (*invalidate_current)(zend_object_iterator *iter); + + /* Expose owned values to GC. + * This has the same semantics as the corresponding object handler. */ + HashTable *(*get_gc)(zend_object_iterator *iter, zval **table, int *n); } zend_object_iterator_funcs; struct _zend_object_iterator { diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index 5ad84193fa..1f6f921ab7 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -501,7 +501,8 @@ static const zend_object_iterator_funcs zend_weakmap_iterator_funcs = { zend_weakmap_iterator_get_current_key, zend_weakmap_iterator_move_forward, zend_weakmap_iterator_rewind, - NULL + NULL, + NULL, /* get_gc */ }; static zend_object_iterator *zend_weakmap_get_iterator( diff --git a/ext/com_dotnet/com_iterator.c b/ext/com_dotnet/com_iterator.c index 0272d48cd3..6126e958d5 100644 --- a/ext/com_dotnet/com_iterator.c +++ b/ext/com_dotnet/com_iterator.c @@ -127,7 +127,8 @@ static const zend_object_iterator_funcs com_iter_funcs = { com_iter_get_data, com_iter_get_key, com_iter_move_forwards, - NULL + NULL, + NULL, /* get_gc */ }; zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int by_ref) diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index 2b42315151..d86fb75e3e 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -512,7 +512,8 @@ static const zend_object_iterator_funcs saproxy_iter_funcs = { saproxy_iter_get_data, saproxy_iter_get_key, saproxy_iter_move_forwards, - NULL + NULL, + NULL, /* get_gc */ }; diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 6813b60e62..bff52f178d 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1526,7 +1526,8 @@ static const zend_object_iterator_funcs date_period_it_funcs = { date_period_it_current_key, date_period_it_move_forward, date_period_it_rewind, - date_period_it_invalidate_current + date_period_it_invalidate_current, + NULL, /* get_gc */ }; zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/ext/dom/dom_iterators.c b/ext/dom/dom_iterators.c index c21cc92154..f56d249034 100644 --- a/ext/dom/dom_iterators.c +++ b/ext/dom/dom_iterators.c @@ -250,7 +250,8 @@ static const zend_object_iterator_funcs php_dom_iterator_funcs = { php_dom_iterator_current_key, php_dom_iterator_move_forward, NULL, - NULL + NULL, + NULL, /* get_gc */ }; zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index 946f6c9845..c06597283b 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -1874,7 +1874,8 @@ static const zend_object_iterator_funcs zend_ffi_cdata_it_funcs = { zend_ffi_cdata_it_get_current_key, zend_ffi_cdata_it_move_forward, zend_ffi_cdata_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; static zend_object_iterator *zend_ffi_cdata_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.c b/ext/intl/resourcebundle/resourcebundle_iterator.c index ab10daf82d..517f01b837 100644 --- a/ext/intl/resourcebundle/resourcebundle_iterator.c +++ b/ext/intl/resourcebundle/resourcebundle_iterator.c @@ -140,7 +140,8 @@ static const zend_object_iterator_funcs resourcebundle_iterator_funcs = { resourcebundle_iterator_key, resourcebundle_iterator_step, resourcebundle_iterator_reset, - resourcebundle_iterator_invalidate + resourcebundle_iterator_invalidate, + NULL, /* get_gc */ }; /* }}} */ diff --git a/ext/mysqli/mysqli_result_iterator.c b/ext/mysqli/mysqli_result_iterator.c index df36a840e4..1388937816 100644 --- a/ext/mysqli/mysqli_result_iterator.c +++ b/ext/mysqli/mysqli_result_iterator.c @@ -150,6 +150,7 @@ const zend_object_iterator_funcs php_mysqli_result_iterator_funcs = { php_mysqli_result_iterator_current_key, php_mysqli_result_iterator_move_forward, php_mysqli_result_iterator_rewind, - NULL + NULL, + NULL, /* get_gc */ }; /* }}} */ diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index d367884148..5f0f4c74e7 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -2304,7 +2304,8 @@ static const zend_object_iterator_funcs pdo_stmt_iter_funcs = { pdo_stmt_iter_get_key, pdo_stmt_iter_move_forwards, NULL, - NULL + NULL, + NULL, /* get_gc */ }; zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object, int by_ref) diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index d392867575..6a2e2b95c2 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -2470,7 +2470,8 @@ static const zend_object_iterator_funcs php_sxe_iterator_funcs = { /* {{{ */ php_sxe_iterator_current_key, php_sxe_iterator_move_forward, php_sxe_iterator_rewind, - NULL + NULL, + NULL, /* get_gc */ }; /* }}} */ diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 86a1ad501c..676d04ab93 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -1154,7 +1154,8 @@ static const zend_object_iterator_funcs spl_array_it_funcs = { spl_array_it_get_current_key, spl_array_it_move_forward, spl_array_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 55e3433637..03b224a25b 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1628,7 +1628,8 @@ static const zend_object_iterator_funcs spl_filesystem_dir_it_funcs = { spl_filesystem_dir_it_current_key, spl_filesystem_dir_it_move_forward, spl_filesystem_dir_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; /* }}} */ @@ -1828,7 +1829,8 @@ static const zend_object_iterator_funcs spl_filesystem_tree_it_funcs = { spl_filesystem_tree_it_current_key, spl_filesystem_tree_it_move_forward, spl_filesystem_tree_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; /* }}} */ diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index adf3d354cc..9479b9056a 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -1334,7 +1334,8 @@ static const zend_object_iterator_funcs spl_dllist_it_funcs = { spl_dllist_it_get_current_key, spl_dllist_it_move_forward, spl_dllist_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; /* }}} */ zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 63a3ef78fa..46536274b9 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -964,7 +964,8 @@ static const zend_object_iterator_funcs spl_fixedarray_it_funcs = { spl_fixedarray_it_get_current_key, spl_fixedarray_it_move_forward, spl_fixedarray_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index 0a694f6e78..3e8a73d021 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -1068,7 +1068,8 @@ static const zend_object_iterator_funcs spl_heap_it_funcs = { spl_heap_it_get_current_key, spl_heap_it_move_forward, spl_heap_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; static const zend_object_iterator_funcs spl_pqueue_it_funcs = { @@ -1078,7 +1079,8 @@ static const zend_object_iterator_funcs spl_pqueue_it_funcs = { spl_heap_it_get_current_key, spl_heap_it_move_forward, spl_heap_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; zend_object_iterator *spl_heap_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 99e130e5d2..dfac8a48df 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -438,7 +438,8 @@ static const zend_object_iterator_funcs spl_recursive_it_iterator_funcs = { spl_recursive_it_get_current_key, spl_recursive_it_move_forward, spl_recursive_it_rewind, - NULL + NULL, + NULL, /* get_gc */ }; static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce, zval *zobject, int by_ref)