Skip to content

Commit 88c57df

Browse files
committed
Remove dual_it dtor, add more GC roots
Move the dual_it_free call from the dtor_obj into the free_obj handler, allowing us to drop the dtor_obj handler entirely. This exposes another leak in bug65387.phpt, which is addressed by adding more GC roots in the get_gc handler.
1 parent 7d5a9dd commit 88c57df

File tree

1 file changed

+7
-16
lines changed

1 file changed

+7
-16
lines changed

ext/spl/spl_iterators.c

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,23 +2070,13 @@ PHP_METHOD(RecursiveRegexIterator, accept)
20702070
zend_call_method_with_0_params(Z_OBJ_P(ZEND_THIS), spl_ce_RegexIterator, NULL, "accept", return_value);
20712071
}
20722072

2073-
/* {{{ spl_dual_it_dtor */
2074-
static void spl_dual_it_dtor(zend_object *_object)
2075-
{
2076-
spl_dual_it_object *object = spl_dual_it_from_obj(_object);
2077-
2078-
/* call standard dtor */
2079-
zend_objects_destroy_object(_object);
2080-
2081-
spl_dual_it_free(object);
2082-
}
2083-
/* }}} */
2084-
20852073
/* {{{ spl_dual_it_free_storage */
20862074
static void spl_dual_it_free_storage(zend_object *_object)
20872075
{
20882076
spl_dual_it_object *object = spl_dual_it_from_obj(_object);
20892077

2078+
spl_dual_it_free(object);
2079+
20902080
if (object->inner.iterator) {
20912081
zend_iterator_dtor(object->inner.iterator);
20922082
}
@@ -2147,9 +2137,9 @@ static HashTable *spl_dual_it_get_gc(zend_object *obj, zval **table, int *n)
21472137
}
21482138
}
21492139

2150-
if (!Z_ISUNDEF(object->inner.zobject)) {
2151-
zend_get_gc_buffer_add_zval(gc_buffer, &object->inner.zobject);
2152-
}
2140+
zend_get_gc_buffer_add_zval(gc_buffer, &object->current.data);
2141+
zend_get_gc_buffer_add_zval(gc_buffer, &object->current.key);
2142+
zend_get_gc_buffer_add_zval(gc_buffer, &object->inner.zobject);
21532143

21542144
switch (object->dit_type) {
21552145
case DIT_Unknown:
@@ -2171,6 +2161,8 @@ static HashTable *spl_dual_it_get_gc(zend_object *obj, zval **table, int *n)
21712161
case DIT_CachingIterator:
21722162
case DIT_RecursiveCachingIterator:
21732163
zend_get_gc_buffer_add_zval(gc_buffer, &object->u.caching.zcache);
2164+
zend_get_gc_buffer_add_zval(gc_buffer, &object->u.caching.zstr);
2165+
zend_get_gc_buffer_add_zval(gc_buffer, &object->u.caching.zchildren);
21742166
break;
21752167
case DIT_CallbackFilterIterator:
21762168
case DIT_RecursiveCallbackFilterIterator:
@@ -3259,7 +3251,6 @@ PHP_MINIT_FUNCTION(spl_iterators)
32593251
spl_handlers_dual_it.offset = XtOffsetOf(spl_dual_it_object, std);
32603252
spl_handlers_dual_it.get_method = spl_dual_it_get_method;
32613253
spl_handlers_dual_it.clone_obj = NULL;
3262-
spl_handlers_dual_it.dtor_obj = spl_dual_it_dtor;
32633254
spl_handlers_dual_it.free_obj = spl_dual_it_free_storage;
32643255
spl_handlers_dual_it.get_gc = spl_dual_it_get_gc;
32653256

0 commit comments

Comments
 (0)