Skip to content

Commit 312201d

Browse files
committed
Add get_gc handle for object iterators
Optional handler with the same semantics as the object handler.
1 parent 8d9637b commit 312201d

20 files changed

+49
-21
lines changed

Zend/zend_generators.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1094,7 +1094,8 @@ static const zend_object_iterator_funcs zend_generator_iterator_functions = {
10941094
zend_generator_iterator_get_key,
10951095
zend_generator_iterator_move_forward,
10961096
zend_generator_iterator_rewind,
1097-
NULL
1097+
NULL,
1098+
NULL, /* get_gc */
10981099
};
10991100

11001101
zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */

Zend/zend_interfaces.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ static const zend_object_iterator_funcs zend_interface_iterator_funcs_iterator =
198198
zend_user_it_get_current_key,
199199
zend_user_it_move_forward,
200200
zend_user_it_rewind,
201-
zend_user_it_invalidate_current
201+
zend_user_it_invalidate_current,
202+
NULL, /* get_gc */
202203
};
203204

204205
/* {{{ zend_user_it_get_iterator */

Zend/zend_iterators.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ static void iter_wrapper_dtor(zend_object *object)
7070
}
7171

7272
static HashTable *iter_wrapper_get_gc(zend_object *object, zval **table, int *n) {
73-
/* TODO: We need a get_gc iterator handler */
73+
zend_object_iterator *iter = (zend_object_iterator*)object;
74+
if (iter->funcs->get_gc) {
75+
return iter->funcs->get_gc(iter, table, n);
76+
}
77+
7478
*table = NULL;
7579
*n = 0;
7680
return NULL;

Zend/zend_iterators.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ typedef struct _zend_object_iterator_funcs {
5050

5151
/* invalidate current value/key (optional, may be NULL) */
5252
void (*invalidate_current)(zend_object_iterator *iter);
53+
54+
/* Expose owned values to GC.
55+
* This has the same semantics as the corresponding object handler. */
56+
HashTable *(*get_gc)(zend_object_iterator *iter, zval **table, int *n);
5357
} zend_object_iterator_funcs;
5458

5559
struct _zend_object_iterator {

Zend/zend_weakrefs.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,8 @@ static const zend_object_iterator_funcs zend_weakmap_iterator_funcs = {
501501
zend_weakmap_iterator_get_current_key,
502502
zend_weakmap_iterator_move_forward,
503503
zend_weakmap_iterator_rewind,
504-
NULL
504+
NULL,
505+
NULL, /* get_gc */
505506
};
506507

507508
static zend_object_iterator *zend_weakmap_get_iterator(

ext/com_dotnet/com_iterator.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ static const zend_object_iterator_funcs com_iter_funcs = {
127127
com_iter_get_data,
128128
com_iter_get_key,
129129
com_iter_move_forwards,
130-
NULL
130+
NULL,
131+
NULL, /* get_gc */
131132
};
132133

133134
zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int by_ref)

ext/com_dotnet/com_saproxy.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,8 @@ static const zend_object_iterator_funcs saproxy_iter_funcs = {
512512
saproxy_iter_get_data,
513513
saproxy_iter_get_key,
514514
saproxy_iter_move_forwards,
515-
NULL
515+
NULL,
516+
NULL, /* get_gc */
516517
};
517518

518519

ext/date/php_date.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1526,7 +1526,8 @@ static const zend_object_iterator_funcs date_period_it_funcs = {
15261526
date_period_it_current_key,
15271527
date_period_it_move_forward,
15281528
date_period_it_rewind,
1529-
date_period_it_invalidate_current
1529+
date_period_it_invalidate_current,
1530+
NULL, /* get_gc */
15301531
};
15311532

15321533
zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */

ext/dom/dom_iterators.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,8 @@ static const zend_object_iterator_funcs php_dom_iterator_funcs = {
250250
php_dom_iterator_current_key,
251251
php_dom_iterator_move_forward,
252252
NULL,
253-
NULL
253+
NULL,
254+
NULL, /* get_gc */
254255
};
255256

256257
zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */

ext/ffi/ffi.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1874,7 +1874,8 @@ static const zend_object_iterator_funcs zend_ffi_cdata_it_funcs = {
18741874
zend_ffi_cdata_it_get_current_key,
18751875
zend_ffi_cdata_it_move_forward,
18761876
zend_ffi_cdata_it_rewind,
1877-
NULL
1877+
NULL,
1878+
NULL, /* get_gc */
18781879
};
18791880

18801881
static zend_object_iterator *zend_ffi_cdata_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */

ext/intl/resourcebundle/resourcebundle_iterator.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ static const zend_object_iterator_funcs resourcebundle_iterator_funcs = {
140140
resourcebundle_iterator_key,
141141
resourcebundle_iterator_step,
142142
resourcebundle_iterator_reset,
143-
resourcebundle_iterator_invalidate
143+
resourcebundle_iterator_invalidate,
144+
NULL, /* get_gc */
144145
};
145146
/* }}} */
146147

ext/mysqli/mysqli_result_iterator.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ const zend_object_iterator_funcs php_mysqli_result_iterator_funcs = {
150150
php_mysqli_result_iterator_current_key,
151151
php_mysqli_result_iterator_move_forward,
152152
php_mysqli_result_iterator_rewind,
153-
NULL
153+
NULL,
154+
NULL, /* get_gc */
154155
};
155156
/* }}} */

ext/pdo/pdo_stmt.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2304,7 +2304,8 @@ static const zend_object_iterator_funcs pdo_stmt_iter_funcs = {
23042304
pdo_stmt_iter_get_key,
23052305
pdo_stmt_iter_move_forwards,
23062306
NULL,
2307-
NULL
2307+
NULL,
2308+
NULL, /* get_gc */
23082309
};
23092310

23102311
zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object, int by_ref)

ext/simplexml/simplexml.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2470,7 +2470,8 @@ static const zend_object_iterator_funcs php_sxe_iterator_funcs = { /* {{{ */
24702470
php_sxe_iterator_current_key,
24712471
php_sxe_iterator_move_forward,
24722472
php_sxe_iterator_rewind,
2473-
NULL
2473+
NULL,
2474+
NULL, /* get_gc */
24742475
};
24752476
/* }}} */
24762477

ext/spl/spl_array.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1154,7 +1154,8 @@ static const zend_object_iterator_funcs spl_array_it_funcs = {
11541154
spl_array_it_get_current_key,
11551155
spl_array_it_move_forward,
11561156
spl_array_it_rewind,
1157-
NULL
1157+
NULL,
1158+
NULL, /* get_gc */
11581159
};
11591160

11601161
zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */

ext/spl/spl_directory.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,7 +1628,8 @@ static const zend_object_iterator_funcs spl_filesystem_dir_it_funcs = {
16281628
spl_filesystem_dir_it_current_key,
16291629
spl_filesystem_dir_it_move_forward,
16301630
spl_filesystem_dir_it_rewind,
1631-
NULL
1631+
NULL,
1632+
NULL, /* get_gc */
16321633
};
16331634
/* }}} */
16341635

@@ -1828,7 +1829,8 @@ static const zend_object_iterator_funcs spl_filesystem_tree_it_funcs = {
18281829
spl_filesystem_tree_it_current_key,
18291830
spl_filesystem_tree_it_move_forward,
18301831
spl_filesystem_tree_it_rewind,
1831-
NULL
1832+
NULL,
1833+
NULL, /* get_gc */
18321834
};
18331835
/* }}} */
18341836

ext/spl/spl_dllist.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1334,7 +1334,8 @@ static const zend_object_iterator_funcs spl_dllist_it_funcs = {
13341334
spl_dllist_it_get_current_key,
13351335
spl_dllist_it_move_forward,
13361336
spl_dllist_it_rewind,
1337-
NULL
1337+
NULL,
1338+
NULL, /* get_gc */
13381339
}; /* }}} */
13391340

13401341
zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */

ext/spl/spl_fixedarray.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,8 @@ static const zend_object_iterator_funcs spl_fixedarray_it_funcs = {
964964
spl_fixedarray_it_get_current_key,
965965
spl_fixedarray_it_move_forward,
966966
spl_fixedarray_it_rewind,
967-
NULL
967+
NULL,
968+
NULL, /* get_gc */
968969
};
969970

970971
zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */

ext/spl/spl_heap.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,8 @@ static const zend_object_iterator_funcs spl_heap_it_funcs = {
10681068
spl_heap_it_get_current_key,
10691069
spl_heap_it_move_forward,
10701070
spl_heap_it_rewind,
1071-
NULL
1071+
NULL,
1072+
NULL, /* get_gc */
10721073
};
10731074

10741075
static const zend_object_iterator_funcs spl_pqueue_it_funcs = {
@@ -1078,7 +1079,8 @@ static const zend_object_iterator_funcs spl_pqueue_it_funcs = {
10781079
spl_heap_it_get_current_key,
10791080
spl_heap_it_move_forward,
10801081
spl_heap_it_rewind,
1081-
NULL
1082+
NULL,
1083+
NULL, /* get_gc */
10821084
};
10831085

10841086
zend_object_iterator *spl_heap_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */

ext/spl/spl_iterators.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,8 @@ static const zend_object_iterator_funcs spl_recursive_it_iterator_funcs = {
438438
spl_recursive_it_get_current_key,
439439
spl_recursive_it_move_forward,
440440
spl_recursive_it_rewind,
441-
NULL
441+
NULL,
442+
NULL, /* get_gc */
442443
};
443444

444445
static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce, zval *zobject, int by_ref)

0 commit comments

Comments
 (0)