@@ -120,16 +120,6 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */
120
120
spl_filesystem_file_free_line (intern TSRMLS_CC ) ;
121
121
break ;
122
122
}
123
-
124
- {
125
- zend_object_iterator * iterator ;
126
- iterator = (zend_object_iterator * )
127
- spl_filesystem_object_to_iterator (intern );
128
- if (iterator -> data != NULL ) {
129
- iterator -> data = NULL ;
130
- iterator -> funcs -> dtor (iterator TSRMLS_CC );
131
- }
132
- }
133
123
efree (object );
134
124
} /* }}} */
135
125
@@ -1648,15 +1638,10 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
1648
1638
dir_object = (spl_filesystem_object * )zend_object_store_get_object (object TSRMLS_CC );
1649
1639
iterator = spl_filesystem_object_to_iterator (dir_object );
1650
1640
1651
- /* initialize iterator if it wasn't gotten before */
1652
- if (iterator -> intern .data == NULL ) {
1653
- iterator -> intern .data = object ;
1654
- iterator -> intern .funcs = & spl_filesystem_dir_it_funcs ;
1655
- /* ->current must be initialized; rewind doesn't set it and valid
1656
- * doesn't check whether it's set */
1657
- iterator -> current = object ;
1658
- }
1659
- zval_add_ref (& object );
1641
+ Z_SET_REFCOUNT_P (object , Z_REFCOUNT_P (object ) + 2 );
1642
+ iterator -> intern .data = (void * )object ;
1643
+ iterator -> intern .funcs = & spl_filesystem_dir_it_funcs ;
1644
+ iterator -> current = object ;
1660
1645
1661
1646
return (zend_object_iterator * )iterator ;
1662
1647
}
@@ -1735,15 +1720,15 @@ static void spl_filesystem_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC)
1735
1720
static void spl_filesystem_tree_it_dtor (zend_object_iterator * iter TSRMLS_DC )
1736
1721
{
1737
1722
spl_filesystem_iterator * iterator = (spl_filesystem_iterator * )iter ;
1723
+ zval * zfree = (zval * )iterator -> intern .data ;
1738
1724
1739
- if (iterator -> intern .data ) {
1740
- zval * object = iterator -> intern .data ;
1741
- zval_ptr_dtor (& object );
1742
- } else {
1743
- if (iterator -> current ) {
1744
- zval_ptr_dtor (& iterator -> current );
1745
- }
1725
+ if (iterator -> current ) {
1726
+ zval_ptr_dtor (& iterator -> current );
1746
1727
}
1728
+ iterator -> intern .data = NULL ; /* mark as unused */
1729
+ /* free twice as we add ref twice */
1730
+ zval_ptr_dtor (& zfree );
1731
+ zval_ptr_dtor (& zfree );
1747
1732
}
1748
1733
/* }}} */
1749
1734
@@ -1854,12 +1839,10 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
1854
1839
dir_object = (spl_filesystem_object * )zend_object_store_get_object (object TSRMLS_CC );
1855
1840
iterator = spl_filesystem_object_to_iterator (dir_object );
1856
1841
1857
- /* initialize iterator if wasn't gotten before */
1858
- if (iterator -> intern .data == NULL ) {
1859
- iterator -> intern .data = object ;
1860
- iterator -> intern .funcs = & spl_filesystem_tree_it_funcs ;
1861
- }
1862
- zval_add_ref (& object );
1842
+ Z_SET_REFCOUNT_P (object , Z_REFCOUNT_P (object ) + 2 );
1843
+ iterator -> intern .data = (void * )object ;
1844
+ iterator -> intern .funcs = & spl_filesystem_tree_it_funcs ;
1845
+ iterator -> current = NULL ;
1863
1846
1864
1847
return (zend_object_iterator * )iterator ;
1865
1848
}
0 commit comments