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) /* {{{ */

0 commit comments

Comments
 (0)