@@ -532,6 +532,20 @@ static zend_result spl_get_iterator_from_aggregate(zval *retval, zend_class_entr
532532 return SUCCESS ;
533533}
534534
535+ static void spl_RecursiveIteratorIterator_free_iterators (spl_recursive_it_object * object )
536+ {
537+ if (object -> iterators ) {
538+ while (object -> level >= 0 ) {
539+ zend_object_iterator * sub_iter = object -> iterators [object -> level ].iterator ;
540+ zend_iterator_dtor (sub_iter );
541+ zval_ptr_dtor (& object -> iterators [object -> level ].zobject );
542+ object -> level -- ;
543+ }
544+ efree (object -> iterators );
545+ object -> iterators = NULL ;
546+ }
547+ }
548+
535549static void spl_recursive_it_it_construct (INTERNAL_FUNCTION_PARAMETERS , zend_class_entry * ce_base , zend_class_entry * ce_inner , recursive_it_it_type rit_type )
536550{
537551 zval * object = ZEND_THIS ;
@@ -598,6 +612,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
598612 }
599613
600614 intern = Z_SPLRECURSIVE_IT_P (object );
615+ spl_RecursiveIteratorIterator_free_iterators (intern );
601616 intern -> iterators = emalloc (sizeof (spl_sub_iterator ));
602617 intern -> level = 0 ;
603618 intern -> mode = mode ;
@@ -644,6 +659,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
644659 intern -> iterators [0 ].getchildren = NULL ;
645660
646661 if (EG (exception )) {
662+ // TODO: use spl_RecursiveIteratorIterator_free_iterators
647663 zend_object_iterator * sub_iter ;
648664
649665 while (intern -> level >= 0 ) {
@@ -952,16 +968,7 @@ static void spl_RecursiveIteratorIterator_free_storage(zend_object *_object)
952968{
953969 spl_recursive_it_object * object = spl_recursive_it_from_obj (_object );
954970
955- if (object -> iterators ) {
956- while (object -> level >= 0 ) {
957- zend_object_iterator * sub_iter = object -> iterators [object -> level ].iterator ;
958- zend_iterator_dtor (sub_iter );
959- zval_ptr_dtor (& object -> iterators [object -> level ].zobject );
960- object -> level -- ;
961- }
962- efree (object -> iterators );
963- object -> iterators = NULL ;
964- }
971+ spl_RecursiveIteratorIterator_free_iterators (object );
965972
966973 zend_object_std_dtor (& object -> std );
967974 for (size_t i = 0 ; i < 6 ; i ++ ) {
0 commit comments