@@ -538,6 +538,20 @@ static int spl_get_iterator_from_aggregate(zval *retval, zend_class_entry *ce, z
538
538
return SUCCESS ;
539
539
}
540
540
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
+
541
555
static 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 )
542
556
{
543
557
zval * object = ZEND_THIS ;
@@ -604,6 +618,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
604
618
}
605
619
606
620
intern = Z_SPLRECURSIVE_IT_P (object );
621
+ spl_RecursiveIteratorIterator_free_iterators (intern );
607
622
intern -> iterators = emalloc (sizeof (spl_sub_iterator ));
608
623
intern -> level = 0 ;
609
624
intern -> mode = mode ;
@@ -650,6 +665,7 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
650
665
intern -> iterators [0 ].getchildren = NULL ;
651
666
652
667
if (EG (exception )) {
668
+ // TODO: use spl_RecursiveIteratorIterator_free_iterators
653
669
zend_object_iterator * sub_iter ;
654
670
655
671
while (intern -> level >= 0 ) {
@@ -958,16 +974,7 @@ static void spl_RecursiveIteratorIterator_free_storage(zend_object *_object)
958
974
{
959
975
spl_recursive_it_object * object = spl_recursive_it_from_obj (_object );
960
976
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 );
971
978
972
979
zend_object_std_dtor (& object -> std );
973
980
for (size_t i = 0 ; i < 6 ; i ++ ) {
0 commit comments