]> granicus.if.org Git - php/commitdiff
Add get_gc handle for object iterators
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 1 Jul 2020 09:49:44 +0000 (11:49 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 1 Jul 2020 13:17:22 +0000 (15:17 +0200)
Optional handler with the same semantics as the object handler.

20 files changed:
Zend/zend_generators.c
Zend/zend_interfaces.c
Zend/zend_iterators.c
Zend/zend_iterators.h
Zend/zend_weakrefs.c
ext/com_dotnet/com_iterator.c
ext/com_dotnet/com_saproxy.c
ext/date/php_date.c
ext/dom/dom_iterators.c
ext/ffi/ffi.c
ext/intl/resourcebundle/resourcebundle_iterator.c
ext/mysqli/mysqli_result_iterator.c
ext/pdo/pdo_stmt.c
ext/simplexml/simplexml.c
ext/spl/spl_array.c
ext/spl/spl_directory.c
ext/spl/spl_dllist.c
ext/spl/spl_fixedarray.c
ext/spl/spl_heap.c
ext/spl/spl_iterators.c

index b8730d282013d7be36b56245bb7f1ddb4c4e521e..b1abbd7f9bea36d9f85ac7028d920e7af129b199 100644 (file)
@@ -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) /* {{{ */
index a100176c367addc5dd011b47fc87b7a975c2df88..68d0077795367aa1e5282df4cf087f574c3c7410 100644 (file)
@@ -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 */
index 9823390a981cf239673ca2f18d204352972f493f..aa4391f2caa99a1a9a0763f6af13986377fa599b 100644 (file)
@@ -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;
index 941b260885f8e9b61b150237a775513b7028f46e..bce98a24ac93c2182aed35cebe7d4ae61d0ee2cd 100644 (file)
@@ -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 {
index 5ad84193fa5fd4fdec9a3f48e6f6b05365e3e7be..1f6f921ab77becc74a64cbca899c414d12aa6b29 100644 (file)
@@ -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(
index 0272d48cd36cf69a27623e259e14c879eac09471..6126e958d5a4d3a2a40a8574e026cb3e16ef662f 100644 (file)
@@ -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)
index 2b42315151bfeea0e6269f3dda95d11f6f6a9b19..d86fb75e3ede4b2febfdae4fee858382fd7cc846 100644 (file)
@@ -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 */
 };
 
 
index 6813b60e624c8061ef3d3a53f5da163f411e5dfe..bff52f178d393f3ffe75fa39b1e784656dd3ddce 100644 (file)
@@ -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) /* {{{ */
index c21cc92154bbb7583e0904329cb24e38d37e7fec..f56d2490341cee7686999af87d998a11498e0d0d 100644 (file)
@@ -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) /* {{{ */
index 946f6c984529975a661126801189cc83605ec05a..c06597283b668906f6132ca32f6016662aa54c36 100644 (file)
@@ -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) /* {{{ */
index ab10daf82dd2bbad7a34bc448541f38a1f373646..517f01b837d891308e067c77857483795bb0a9e1 100644 (file)
@@ -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 */
 };
 /* }}} */
 
index df36a840e41fba24aa1a5daa3e25134080f2377b..1388937816173c0162bde4d29894a20b800ad2dc 100644 (file)
@@ -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 */
 };
 /* }}} */
index d36788414800fd730da5472d1970fe7c2cfa26b6..5f0f4c74e7ed023ca16965f3f267f22f36bf4f29 100644 (file)
@@ -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)
index d39286757561f236de0ded14a8ecd940898e950b..6a2e2b95c22523533d733062adab7af5129ac658 100644 (file)
@@ -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 */
 };
 /* }}} */
 
index 86a1ad501c288022b352818edddc3403ba857b93..676d04ab93f7ef43598c6ad7499067d6307a6480 100644 (file)
@@ -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) /* {{{ */
index 55e3433637d7b4cd182928cf8c3f177bf7d1bdab..03b224a25bdb11025c4a1c386a3d8b8634ddb8bc 100644 (file)
@@ -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 */
 };
 /* }}} */
 
index adf3d354cccd8b2b1a584425b59fbe9dc69a4136..9479b9056acab4679b24ce0c9c6a9dc9c0edb011 100644 (file)
@@ -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) /* {{{ */
index 63a3ef78fa286e0311992db5b0ec9d7ad2ca6582..46536274b90df8fdb7d243015da9bef070ec9cae 100644 (file)
@@ -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) /* {{{ */
index 0a694f6e7882b69f2a3f3f2802e841cc7d632655..3e8a73d021f2d358cf797ba7ef6125854def42a9 100644 (file)
@@ -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) /* {{{ */
index 99e130e5d2ff8521205bfb82afa9bb16b4c77765..dfac8a48dfa9ee5ae735e4f34a24fc0fdfb44c6b 100644 (file)
@@ -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)