@@ -538,6 +538,20 @@ static int spl_get_iterator_from_aggregate(zval *retval, zend_class_entry *ce, z
538538 return SUCCESS ;
539539}
540540
541+ static void spl_RecursiveIteratorIterator_free_iterators (spl_recursive_it_object * object )
542+ {
543+ if (object -> iterators ) {
544+ while (object -> level >= 0 ) {
545+ zend_object_iterator * sub_iter = object -> iterators [object -> level ].iterator ;
546+ zend_iterator_dtor (sub_iter );
547+ zval_ptr_dtor (& object -> iterators [object -> level ].zobject );
548+ object -> level -- ;
549+ }
550+ efree (object -> iterators );
551+ object -> iterators = NULL ;
552+ }
553+ }
554+
541555static 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 )
542556{
543557 zval * object = ZEND_THIS ;
@@ -604,6 +618,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
604618 }
605619
606620 intern = Z_SPLRECURSIVE_IT_P (object );
621+ spl_RecursiveIteratorIterator_free_iterators (intern );
607622 intern -> iterators = emalloc (sizeof (spl_sub_iterator ));
608623 intern -> level = 0 ;
609624 intern -> mode = mode ;
@@ -650,6 +665,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
650665 intern -> iterators [0 ].getchildren = NULL ;
651666
652667 if (EG (exception )) {
668+ // TODO: use spl_RecursiveIteratorIterator_free_iterators
653669 zend_object_iterator * sub_iter ;
654670
655671 while (intern -> level >= 0 ) {
@@ -958,16 +974,7 @@ static void spl_RecursiveIteratorIterator_free_storage(zend_object *_object)
958974{
959975 spl_recursive_it_object * object = spl_recursive_it_from_obj (_object );
960976
961- if (object -> iterators ) {
962- while (object -> level >= 0 ) {
963- zend_object_iterator * sub_iter = object -> iterators [object -> level ].iterator ;
964- zend_iterator_dtor (sub_iter );
965- zval_ptr_dtor (& object -> iterators [object -> level ].zobject );
966- object -> level -- ;
967- }
968- efree (object -> iterators );
969- object -> iterators = NULL ;
970- }
977+ spl_RecursiveIteratorIterator_free_iterators (object );
971978
972979 zend_object_std_dtor (& object -> std );
973980 for (size_t i = 0 ; i < 6 ; i ++ ) {
0 commit comments