static void spl_filesystem_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC)
{
spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
+ zval *zfree = (zval*)iterator->intern.data;
- zval_ptr_dtor(&iterator->current);
- zval_ptr_dtor((zval**)&iterator->intern.data);
iterator->intern.data = NULL; /* mark as unused */
+ zval_ptr_dtor(&iterator->current);
+ zval_ptr_dtor(&zfree);
}
/* }}} */
static void spl_filesystem_tree_it_dtor(zend_object_iterator *iter TSRMLS_DC)
{
spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
+ zval *zfree = (zval*)iterator->intern.data;
if (iterator->current) {
zval_ptr_dtor(&iterator->current);
}
- zval_ptr_dtor((zval**)&iterator->intern.data);
iterator->intern.data = NULL; /* mark as unused */
+ /* free twice as we add ref twice */
+ zval_ptr_dtor(&zfree);
+ zval_ptr_dtor(&zfree);
}
/* }}} */
dir_object = (spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
iterator = spl_filesystem_object_to_iterator(dir_object);
- Z_ADDREF_P(object);
+ Z_SET_REFCOUNT_P(object, Z_REFCOUNT_P(object) + 2);
iterator->intern.data = (void*)object;
iterator->intern.funcs = &spl_filesystem_tree_it_funcs;
iterator->current = NULL;
--- /dev/null
+--TEST--
+SPL: FilesystemIterator and foreach
+--SKIPIF--
+<?php if (!extension_loaded("spl")) print "skip"; ?>
+--FILE--
+<?php
+$count = 0;
+foreach(new FilesystemIterator('CVS') as $ent)
+{
+ ++$count;
+}
+var_dump($count > 0);
+?>
+===DONE===
+--EXPECTF--
+bool(true)
+===DONE===