]> granicus.if.org Git - php/commitdiff
Refactoring zend_iterator (incompleted)
authorXinchen Hui <laruence@gmail.com>
Thu, 27 Feb 2014 11:19:02 +0000 (19:19 +0800)
committerXinchen Hui <laruence@gmail.com>
Thu, 27 Feb 2014 11:19:02 +0000 (19:19 +0800)
13 files changed:
Zend/zend_generators.c
Zend/zend_generators.h
Zend/zend_interfaces.c
Zend/zend_interfaces.h
Zend/zend_iterators.h
ext/date/php_date.c
ext/spl/spl_array.c
ext/spl/spl_directory.c
ext/spl/spl_directory.h
ext/spl/spl_dllist.c
ext/spl/spl_fixedarray.c
ext/spl/spl_heap.c
ext/spl/spl_iterators.c

index 78cb346eb741761e818b6d3d714d31a06c6d1646..7fb12c3cc28c62d365c8ed368c46a1597e365153 100644 (file)
@@ -589,15 +589,13 @@ ZEND_METHOD(Generator, __wakeup)
 
 static void zend_generator_iterator_dtor(zend_object_iterator *iterator TSRMLS_DC) /* {{{ */
 {
-       zval *object = ((zend_generator_iterator *) iterator)->object;
-
-       zval_ptr_dtor(object);
+       zval_ptr_dtor(&iterator->data);
 }
 /* }}} */
 
 static int zend_generator_iterator_valid(zend_object_iterator *iterator TSRMLS_DC) /* {{{ */
 {
-       zend_generator *generator = (zend_generator *) iterator->data;
+       zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data);
 
        zend_generator_ensure_initialized(generator TSRMLS_CC);
 
@@ -607,7 +605,7 @@ static int zend_generator_iterator_valid(zend_object_iterator *iterator TSRMLS_D
 
 static zval *zend_generator_iterator_get_data(zend_object_iterator *iterator TSRMLS_DC) /* {{{ */
 {
-       zend_generator *generator = (zend_generator *) iterator->data;
+       zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data);
 
        zend_generator_ensure_initialized(generator TSRMLS_CC);
 
@@ -617,7 +615,7 @@ static zval *zend_generator_iterator_get_data(zend_object_iterator *iterator TSR
 
 static void zend_generator_iterator_get_key(zend_object_iterator *iterator, zval *key TSRMLS_DC) /* {{{ */
 {
-       zend_generator *generator = (zend_generator *) iterator->data;
+       zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data);
 
        zend_generator_ensure_initialized(generator TSRMLS_CC);
 
@@ -631,7 +629,7 @@ static void zend_generator_iterator_get_key(zend_object_iterator *iterator, zval
 
 static void zend_generator_iterator_move_forward(zend_object_iterator *iterator TSRMLS_DC) /* {{{ */
 {
-       zend_generator *generator = (zend_generator *) iterator->data;
+       zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data);
 
        zend_generator_ensure_initialized(generator TSRMLS_CC);
 
@@ -641,7 +639,7 @@ static void zend_generator_iterator_move_forward(zend_object_iterator *iterator
 
 static void zend_generator_iterator_rewind(zend_object_iterator *iterator TSRMLS_DC) /* {{{ */
 {
-       zend_generator *generator = (zend_generator *) iterator->data;
+       zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data);
 
        zend_generator_rewind(generator TSRMLS_CC);
 }
@@ -658,10 +656,8 @@ static zend_object_iterator_funcs zend_generator_iterator_functions = {
 
 zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) /* {{{ */
 {
-       zend_generator_iterator *iterator;
-       zend_generator *generator;
-
-       generator = (zend_generator *) Z_OBJ_P(object);
+       zend_object_iterator *iterator;
+       zend_generator *generator = (zend_generator*)Z_OBJ_P(object);
 
        if (!generator->execute_data) {
                zend_throw_exception(NULL, "Cannot traverse an already closed generator", 0 TSRMLS_CC);
@@ -675,17 +671,12 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob
 
        iterator = &generator->iterator;
        
-       zend_iterator_init(&iterator->intern TSRMLS_CC);
-
-       iterator->intern.funcs = &zend_generator_iterator_functions;
-       iterator->intern.data = (void *) generator;
+       zend_iterator_init(&iterator TSRMLS_CC);
 
-       /* We have to keep a reference to the generator object zval around,
-        * otherwise the generator may be destroyed during iteration. */
-       Z_ADDREF_P(object);
-       iterator->object = object;
+       iterator->funcs = &zend_generator_iterator_functions;
+       ZVAL_COPY(&iterator->data, object);
 
-       return (zend_object_iterator *) iterator;
+       return iterator;
 }
 /* }}} */
 
index d46606145768bdf53cf5f204a9c7755db8185d76..1209bc2d6254e4789f5f43bfed874940065a7675 100644 (file)
@@ -25,18 +25,10 @@ BEGIN_EXTERN_C()
 
 extern ZEND_API zend_class_entry *zend_ce_generator;
 
-typedef struct _zend_generator_iterator {
-       zend_object_iterator intern;
-
-       /* The generator object zval has to be stored, because the iterator is
-        * holding a ref to it, which has to be dtored. */
-       zval *object;
-} zend_generator_iterator;
-
 typedef struct _zend_generator {
        zend_object std;
 
-       zend_generator_iterator iterator;
+       zend_object_iterator iterator;
 
        /* The suspended execution context. */
        zend_execute_data *execute_data;
index feacae7f0edefec4952c79692852799d4c485a97..6d6e78075110f35de0eba8ee3fd8e7705e780172 100644 (file)
@@ -131,9 +131,9 @@ ZEND_API void zend_user_it_invalidate_current(zend_object_iterator *_iter TSRMLS
 {
        zend_user_iterator *iter = (zend_user_iterator*)_iter;
 
-       if (iter->value) {
-               zval_ptr_dtor(iter->value);
-               iter->value = NULL;
+       if (!ZVAL_IS_UNDEF(&iter->value)) {
+               zval_ptr_dtor(&iter->value);
+               ZVAL_UNDEF(&iter->value);
        }
 }
 /* }}} */
@@ -142,7 +142,7 @@ ZEND_API void zend_user_it_invalidate_current(zend_object_iterator *_iter TSRMLS
 static void zend_user_it_dtor(zend_object_iterator *_iter TSRMLS_DC)
 {
        zend_user_iterator *iter = (zend_user_iterator*)_iter;
-       zval *object = (zval*)iter->it.data;
+       zval *object = &iter->it.data;
 
        zend_user_it_invalidate_current(_iter TSRMLS_CC);
        zval_ptr_dtor(object);
@@ -155,7 +155,7 @@ ZEND_API int zend_user_it_valid(zend_object_iterator *_iter TSRMLS_DC)
 {
        if (_iter) {
                zend_user_iterator *iter = (zend_user_iterator*)_iter;
-               zval *object = (zval*)iter->it.data;
+               zval *object = &iter->it.data;
                zval more;
                int result;
 
@@ -174,12 +174,13 @@ ZEND_API int zend_user_it_valid(zend_object_iterator *_iter TSRMLS_DC)
 ZEND_API zval *zend_user_it_get_current_data(zend_object_iterator *_iter TSRMLS_DC)
 {
        zend_user_iterator *iter = (zend_user_iterator*)_iter;
-       zval *object = (zval*)iter->it.data;
+       zval *object = &iter->it.data;
 
-       if (!iter->value) {
-               zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_current, "current", iter->value);
+       if (!ZVAL_IS_UNDEF(&iter->value)) {
+               zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_current, "current", &iter->value);
        }
-       return iter->value;
+
+       return &iter->value;
 }
 /* }}} */
 
@@ -197,7 +198,7 @@ static int zend_user_it_get_current_key_default(zend_object_iterator *_iter, cha
 ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *key TSRMLS_DC)
 {
        zend_user_iterator *iter = (zend_user_iterator*)_iter;
-       zval *object = (zval*)iter->it.data;
+       zval *object = &iter->it.data;
        zval retval;
 
        zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_key, "key", &retval);
@@ -212,12 +213,13 @@ ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *ke
                ZVAL_LONG(key, 0);
        }
 }
+/* }}} */
 
 /* {{{ zend_user_it_move_forward */
 ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter TSRMLS_DC)
 {
        zend_user_iterator *iter = (zend_user_iterator*)_iter;
-       zval *object = (zval*)iter->it.data;
+       zval *object = &iter->it.data;
 
        zend_user_it_invalidate_current(_iter TSRMLS_CC);
        zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_next, "next", NULL);
@@ -228,7 +230,7 @@ ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter TSRMLS_DC)
 ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter TSRMLS_DC)
 {
        zend_user_iterator *iter = (zend_user_iterator*)_iter;
-       zval *object = (zval*)iter->it.data;
+       zval *object = &iter->it.data;
 
        zend_user_it_invalidate_current(_iter TSRMLS_CC);
        zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs.zf_rewind, "rewind", NULL);
@@ -258,11 +260,10 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva
 
        zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
 
-       Z_ADDREF_P(object);
-       iterator->it.data = (void*)object;
+       ZVAL_COPY(&iterator->it.data, object);
        iterator->it.funcs = ce->iterator_funcs.funcs;
        iterator->ce = Z_OBJCE_P(object);
-       iterator->value = NULL;
+       ZVAL_UNDEF(&iterator->value);
        return (zend_object_iterator*)iterator;
 }
 /* }}} */
index a0d1cc329a076510680291f9442c81c3f77cb8f8..7fe0e4e2f0a7534aa25f177cd8ddb2e5a06b00b9 100644 (file)
@@ -35,7 +35,7 @@ extern ZEND_API zend_class_entry *zend_ce_serializable;
 typedef struct _zend_user_iterator {
        zend_object_iterator     it;
        zend_class_entry         *ce;
-       zval                     *value;
+       zval                     value;
 } zend_user_iterator;
 
 ZEND_API zval* zend_call_method(zval *object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, const char *function_name, int function_name_len, zval *retval, int param_count, zval* arg1, zval* arg2 TSRMLS_DC);
index d6cba7c892102a65abebe60090fae94b4671366e..9343382efd795147ee674aed4721442a78b53ab8 100644 (file)
@@ -56,7 +56,7 @@ typedef struct _zend_object_iterator_funcs {
 
 struct _zend_object_iterator {
        zend_object std;
-       void *data;
+       zval data;
        zend_object_iterator_funcs *funcs;
        ulong index; /* private to fe_reset/fe_fetch opcodes */
 };
index 1489ac8184194d3c8906b6d669933151e969b5a7..82ee650b36c11efda9073e68b02788b749907bf7 100644 (file)
@@ -1836,7 +1836,6 @@ PHP_FUNCTION(getdate)
 /* define an overloaded iterator structure */
 typedef struct {
        zend_object_iterator  intern;
-       zval                 *date_period_zval;
        zval                  current;
        php_period_obj       *object;
        int                   current_index;
@@ -1862,7 +1861,7 @@ static void date_period_it_dtor(zend_object_iterator *iter TSRMLS_DC)
 
        date_period_it_invalidate_current(iter TSRMLS_CC);
 
-       zval_ptr_dtor(iterator->date_period_zval);
+       zval_ptr_dtor(&iterator->intern.data);
 
        efree(iterator);
 }
@@ -1873,7 +1872,7 @@ static void date_period_it_dtor(zend_object_iterator *iter TSRMLS_DC)
 static int date_period_it_has_more(zend_object_iterator *iter TSRMLS_DC)
 {
        date_period_it *iterator = (date_period_it *)iter;
-       php_period_obj *object   = iterator->object;
+       php_period_obj *object   = (php_period_obj *)Z_OBJ(iterator->intern.data);
        timelib_time   *it_time = object->current;
 
        /* apply modification if it's not the first iteration */
@@ -1898,7 +1897,7 @@ static int date_period_it_has_more(zend_object_iterator *iter TSRMLS_DC)
 static zval *date_period_it_current_data(zend_object_iterator *iter TSRMLS_DC)
 {
        date_period_it *iterator = (date_period_it *)iter;
-       php_period_obj *object   = iterator->object;
+       php_period_obj *object   = (php_period_obj *)Z_OBJ(iterator->intern.data);
        timelib_time   *it_time = object->current;
        php_date_obj   *newdateobj;
 
@@ -1970,7 +1969,6 @@ zend_object_iterator_funcs date_period_it_funcs = {
 zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC)
 {
        date_period_it  *iterator = emalloc(sizeof(date_period_it));
-       php_period_obj  *dpobj    = (php_period_obj *)Z_OBJ_P(object);
 
        if (by_ref) {
                zend_error(E_ERROR, "An iterator cannot be used with foreach by reference");
@@ -1978,11 +1976,8 @@ zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval
 
        zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
 
-       Z_ADDREF_P(object);
-       iterator->intern.data = (void*) dpobj;
+       ZVAL_COPY(&iterator->intern.data, object);
        iterator->intern.funcs = &date_period_it_funcs;
-       iterator->date_period_zval = object;
-       iterator->object = dpobj;
        ZVAL_UNDEF(&iterator->current);
 
        return (zend_object_iterator*)iterator;
index e552ca8fb4bf7a11e0d5e53eafec862f30b88d50..489b63ebf87ce99c1f2f130ad9835a39c31a1998 100644 (file)
@@ -960,7 +960,6 @@ static int spl_array_next(spl_array_object *intern TSRMLS_DC) /* {{{ */
 /* define an overloaded iterator structure */
 typedef struct {
        zend_user_iterator    intern;
-       spl_array_object      *object;
 } spl_array_it;
 
 static void spl_array_it_dtor(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
@@ -968,7 +967,7 @@ static void spl_array_it_dtor(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
        spl_array_it *iterator = (spl_array_it *)iter;
 
        zend_user_it_invalidate_current(iter TSRMLS_CC);
-       zval_ptr_dtor((zval*)iterator->intern.it.data);
+       zval_ptr_dtor(&iterator->intern.it.data);
 
        efree(iterator);
 }
@@ -976,9 +975,8 @@ static void spl_array_it_dtor(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 
 static int spl_array_it_valid(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_array_it       *iterator = (spl_array_it *)iter;
-       spl_array_object   *object   = iterator->object;
-       HashTable          *aht      = spl_array_get_hash_table(object, 0 TSRMLS_CC);
+       spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
+       HashTable *aht = spl_array_get_hash_table(object, 0 TSRMLS_CC);
 
        if (object->ar_flags & SPL_ARRAY_OVERLOADED_VALID) {
                return zend_user_it_valid(iter TSRMLS_CC);
@@ -994,8 +992,7 @@ static int spl_array_it_valid(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 
 static zval *spl_array_it_get_current_data(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_array_it       *iterator = (spl_array_it *)iter;
-       spl_array_object   *object   = iterator->object;
+       spl_array_object   *object   = (spl_array_object*)Z_OBJ(iter->data);
        HashTable          *aht      = spl_array_get_hash_table(object, 0 TSRMLS_CC);
 
        if (object->ar_flags & SPL_ARRAY_OVERLOADED_CURRENT) {
@@ -1008,9 +1005,8 @@ static zval *spl_array_it_get_current_data(zend_object_iterator *iter TSRMLS_DC)
 
 static void spl_array_it_get_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC) /* {{{ */
 {
-       spl_array_it       *iterator = (spl_array_it *)iter;
-       spl_array_object   *object   = iterator->object;
-       HashTable          *aht      = spl_array_get_hash_table(object, 0 TSRMLS_CC);
+       spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
+       HashTable *aht = spl_array_get_hash_table(object, 0 TSRMLS_CC);
 
        if (object->ar_flags & SPL_ARRAY_OVERLOADED_KEY) {
                zend_user_it_get_current_key(iter, key TSRMLS_CC);
@@ -1026,9 +1022,8 @@ static void spl_array_it_get_current_key(zend_object_iterator *iter, zval *key T
 
 static void spl_array_it_move_forward(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_array_it       *iterator = (spl_array_it *)iter;
-       spl_array_object   *object   = iterator->object;
-       HashTable          *aht      = spl_array_get_hash_table(object, 0 TSRMLS_CC);
+       spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
+       HashTable *aht = spl_array_get_hash_table(object, 0 TSRMLS_CC);
 
        if (object->ar_flags & SPL_ARRAY_OVERLOADED_NEXT) {
                zend_user_it_move_forward(iter TSRMLS_CC);
@@ -1072,8 +1067,7 @@ static void spl_array_rewind(spl_array_object *intern TSRMLS_DC) /* {{{ */
 
 static void spl_array_it_rewind(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_array_it       *iterator = (spl_array_it *)iter;
-       spl_array_object   *object   = iterator->object;
+       spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
 
        if (object->ar_flags & SPL_ARRAY_OVERLOADED_REWIND) {
                zend_user_it_rewind(iter TSRMLS_CC);
@@ -1139,23 +1133,21 @@ zend_object_iterator_funcs spl_array_it_funcs = {
 
 zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) /* {{{ */
 {
-       spl_array_it       *iterator;
-       spl_array_object   *array_object = (spl_array_object*)Z_OBJ_P(object);
+       spl_array_it *iterator;
+       spl_array_object *array_object = (spl_array_object*)Z_OBJ_P(object);
 
        if (by_ref && (array_object->ar_flags & SPL_ARRAY_OVERLOADED_CURRENT)) {
                zend_error(E_ERROR, "An iterator cannot be used with foreach by reference");
        }
 
-       iterator     = emalloc(sizeof(spl_array_it));
+       iterator = emalloc(sizeof(spl_array_it));
 
        zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
 
-       Z_ADDREF_P(object);
-       iterator->intern.it.data = (void*)object;
+       ZVAL_COPY(&iterator->intern.it.data, object);
        iterator->intern.it.funcs = &spl_array_it_funcs;
        iterator->intern.ce = ce;
-       iterator->intern.value = NULL;
-       iterator->object = array_object;
+       ZVAL_UNDEF(&iterator->intern.value);
 
        return (zend_object_iterator*)iterator;
 }
index 84ee3f823de3e11bbb5cae4d86e1e7ac42ce5ffe..f8ec9efc49df0152708cced5e942ffac52dda1e9 100644 (file)
@@ -127,8 +127,8 @@ static void spl_filesystem_object_free_storage(zend_object *object TSRMLS_DC) /*
                zend_object_iterator *iterator;
                iterator = (zend_object_iterator*)
                                spl_filesystem_object_to_iterator(intern);
-               if (iterator->data != NULL) {
-                       iterator->data = NULL;
+               if (!ZVAL_IS_UNDEF(&iterator->data)) {
+                       ZVAL_UNDEF(&iterator->data);
                        iterator->funcs->dtor(iterator TSRMLS_CC);
                }
        }
@@ -1645,19 +1645,19 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
                zend_error(E_ERROR, "An iterator cannot be used with foreach by reference");
        }
        dir_object = (spl_filesystem_object*)Z_OBJ_P(object);
-       iterator   = spl_filesystem_object_to_iterator(dir_object);
+       iterator = spl_filesystem_object_to_iterator(dir_object);
 
+       Z_ADDREF_P(object);
        /* initialize iterator if it wasn't gotten before */
-       if (iterator->intern.data == NULL) {
-               iterator->intern.data = object;
+       if (ZVAL_IS_UNDEF(&iterator->intern.data)) {
+               ZVAL_COPY_VALUE(&iterator->intern.data, object);
                iterator->intern.funcs = &spl_filesystem_dir_it_funcs;
                /* ->current must be initialized; rewind doesn't set it and valid
                 * doesn't check whether it's set */
                iterator->current = *object;
        }
-       zval_add_ref(object);
        
-       return (zend_object_iterator*)iterator;
+       return &iterator->intern;
 }
 /* }}} */
 
@@ -1666,8 +1666,8 @@ static void spl_filesystem_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC)
 {
        spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
 
-       if (iterator->intern.data) {
-               zval *object = iterator->intern.data;
+       if (!ZVAL_IS_UNDEF(&iterator->intern.data)) {
+               zval *object = &iterator->intern.data;
                zval_ptr_dtor(object);
        }
        /* Otherwise we were called from the owning object free storage handler as
@@ -1737,8 +1737,8 @@ static void spl_filesystem_tree_it_dtor(zend_object_iterator *iter TSRMLS_DC)
 {
        spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
 
-       if (iterator->intern.data) {
-               zval *object = iterator->intern.data;
+       if (!ZVAL_IS_UNDEF(&iterator->intern.data)) {
+               zval *object = &iterator->intern.data;
                zval_ptr_dtor(object);
        } else {
                if (!ZVAL_IS_UNDEF(&iterator->current)) {
@@ -1768,7 +1768,7 @@ static zval *spl_filesystem_tree_it_current_data(zend_object_iterator *iter TSRM
                }
                return &iterator->current;
        } else {
-               return (zval*)iterator->intern.data;
+               return &iterator->intern.data;
        }
 }
 /* }}} */
@@ -1851,14 +1851,14 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
        dir_object = (spl_filesystem_object*)Z_OBJ_P(object);
        iterator   = spl_filesystem_object_to_iterator(dir_object);
 
+       Z_ADDREF_P(object);
        /* initialize iterator if wasn't gotten before */
-       if (iterator->intern.data == NULL) {
-               iterator->intern.data = object;
+       if (ZVAL_IS_UNDEF(&iterator->intern.data)) {
+               ZVAL_COPY_VALUE(&iterator->intern.data, object);
                iterator->intern.funcs = &spl_filesystem_tree_it_funcs;
        }
-       zval_add_ref(object);
        
-       return (zend_object_iterator*)iterator;
+       return &iterator->intern;
 }
 /* }}} */
 
index b65133ff8c4419a24896ca8f81cfcdd33381d7c5..0ce7815d42f941a03c122a69785eed103d8937dd 100644 (file)
@@ -56,7 +56,6 @@ typedef struct _spl_other_handler {
 typedef struct {
        zend_object_iterator  intern;
        zval                  current;
-       spl_filesystem_object *object;
 } spl_filesystem_iterator;
 
 struct _spl_filesystem_object {
index 99863626bcedea2145e57963d8231e3effa0db56..12aa2b42b9874b108c2ec84c3103b15bbc921712 100644 (file)
@@ -318,7 +318,7 @@ static void spl_ptr_llist_shift(spl_ptr_llist *llist, zval *ret TSRMLS_DC) /* {{
 static void spl_ptr_llist_copy(spl_ptr_llist *from, spl_ptr_llist *to TSRMLS_DC) /* {{{ */
 {
        spl_ptr_llist_element *current = from->head, *next;
-       spl_ptr_llist_ctor_func  ctor    = from->ctor;
+       spl_ptr_llist_ctor_func ctor = from->ctor;
 
        while (current) {
                next = current->next;
@@ -913,7 +913,7 @@ static void spl_dllist_it_dtor(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
        SPL_LLIST_CHECK_DELREF(iterator->traverse_pointer);
 
        zend_user_it_invalidate_current(iter TSRMLS_CC);
-       zval_ptr_dtor(iterator->intern.it.data);
+       zval_ptr_dtor(&iterator->intern.it.data);
 
        efree(iterator);
 }
@@ -971,9 +971,9 @@ static void spl_dllist_it_helper_move_forward(spl_ptr_llist_element **traverse_p
 
 static void spl_dllist_it_rewind(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_dllist_it     *iterator = (spl_dllist_it *)iter;
-       spl_dllist_object *object   = iterator->object;
-       spl_ptr_llist     *llist    = object->llist;
+       spl_dllist_it *iterator = (spl_dllist_it *)iter;
+       spl_dllist_object *object = (spl_dllist_object*)Z_OBJ(iter->data);
+       spl_ptr_llist *llist = object->llist;
 
        spl_dllist_it_helper_rewind(&iterator->traverse_pointer, &iterator->traverse_position, llist, object->flags TSRMLS_CC);
 }
@@ -1011,8 +1011,8 @@ static void spl_dllist_it_get_current_key(zend_object_iterator *iter, zval *key
 
 static void spl_dllist_it_move_forward(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_dllist_it     *iterator = (spl_dllist_it *)iter;
-       spl_dllist_object *object   = iterator->object;
+       spl_dllist_it *iterator = (spl_dllist_it *)iter;
+       spl_dllist_object *object = (spl_dllist_object*)Z_OBJ(iter->data);
 
        zend_user_it_invalidate_current(iter TSRMLS_CC);
 
@@ -1280,7 +1280,7 @@ zend_object_iterator_funcs spl_dllist_it_funcs = {
 
 zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) /* {{{ */
 {
-       spl_dllist_it     *iterator;
+       spl_dllist_it *iterator;
        spl_dllist_object *dllist_object = (spl_dllist_object*)Z_OBJ_P(object);
 
        if (by_ref) {
@@ -1288,25 +1288,21 @@ zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object
                return NULL;
        }
 
-       Z_ADDREF_P(object);
-
-       iterator                     = emalloc(sizeof(spl_dllist_it));
+       iterator = emalloc(sizeof(spl_dllist_it));
 
        zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
        
-       iterator->intern.it.data     = (void*)object;
+       ZVAL_COPY(&iterator->intern.it.data, object);
        iterator->intern.it.funcs    = &spl_dllist_it_funcs;
        iterator->intern.ce          = ce;
-       iterator->intern.value       = NULL;
        iterator->traverse_position  = dllist_object->traverse_position;
        iterator->traverse_pointer   = dllist_object->traverse_pointer;
        iterator->flags              = dllist_object->flags & SPL_DLLIST_IT_MASK;
-       iterator->object             = dllist_object;
+       ZVAL_UNDEF(&iterator->intern.value);
 
        SPL_LLIST_CHECK_ADDREF(iterator->traverse_pointer);
 
-
-       return (zend_object_iterator*)iterator;
+       return &iterator->intern.it;
 }
 /* }}} */
 
index 9e5e8b590c07c618b59a9b7c1674e2a349f5e470..acff4964f248521ce2e1ecb82511f40603dfc8b1 100644 (file)
@@ -65,7 +65,6 @@ typedef struct _spl_fixedarray_object { /* {{{ */
 
 typedef struct _spl_fixedarray_it { /* {{{ */
        zend_user_iterator     intern;
-       spl_fixedarray_object  *object;
 } spl_fixedarray_it;
 /* }}} */
 
@@ -354,7 +353,6 @@ static inline zval *spl_fixedarray_object_read_dimension_helper(spl_fixedarray_o
 static zval *spl_fixedarray_object_read_dimension(zval *object, zval *offset, int type TSRMLS_DC) /* {{{ */
 {
        spl_fixedarray_object *intern;
-       zval *retval;
 
        intern = (spl_fixedarray_object*)Z_OBJ_P(object);
 
@@ -862,7 +860,7 @@ static void spl_fixedarray_it_dtor(zend_object_iterator *iter TSRMLS_DC) /* {{{
        spl_fixedarray_it  *iterator = (spl_fixedarray_it *)iter;
 
        zend_user_it_invalidate_current(iter TSRMLS_CC);
-       zval_ptr_dtor(iterator->intern.it.data);
+       zval_ptr_dtor(&iterator->intern.it.data);
 
        efree(iterator);
 }
@@ -870,27 +868,25 @@ static void spl_fixedarray_it_dtor(zend_object_iterator *iter TSRMLS_DC) /* {{{
 
 static void spl_fixedarray_it_rewind(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_fixedarray_it     *iterator = (spl_fixedarray_it *)iter;
-       spl_fixedarray_object *intern   = iterator->object;
+       spl_fixedarray_object *object = (spl_fixedarray_object*)Z_OBJ(iter->data);
 
-       if (intern->flags & SPL_FIXEDARRAY_OVERLOADED_REWIND) {
+       if (object->flags & SPL_FIXEDARRAY_OVERLOADED_REWIND) {
                zend_user_it_rewind(iter TSRMLS_CC);
        } else {
-               iterator->object->current = 0;
+               object->current = 0;
        }
 }
 /* }}} */
 
 static int spl_fixedarray_it_valid(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_fixedarray_it     *iterator = (spl_fixedarray_it *)iter;
-       spl_fixedarray_object *intern   = iterator->object;
+       spl_fixedarray_object *object = (spl_fixedarray_object*)Z_OBJ(iter->data);
 
-       if (intern->flags & SPL_FIXEDARRAY_OVERLOADED_VALID) {
+       if (object->flags & SPL_FIXEDARRAY_OVERLOADED_VALID) {
                return zend_user_it_valid(iter TSRMLS_CC);
        }
 
-       if (iterator->object->current >= 0 && iterator->object->array && iterator->object->current < iterator->object->array->size) {
+       if (object->current >= 0 && object->array && object->current < object->array->size) {
                return SUCCESS;
        }
 
@@ -901,17 +897,16 @@ static int spl_fixedarray_it_valid(zend_object_iterator *iter TSRMLS_DC) /* {{{
 static zval *spl_fixedarray_it_get_current_data(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
        zval zindex;
-       spl_fixedarray_it *iterator = (spl_fixedarray_it *)iter;
-       spl_fixedarray_object *intern   = iterator->object;
+       spl_fixedarray_object *object = (spl_fixedarray_object*)Z_OBJ(iter->data);
 
-       if (intern->flags & SPL_FIXEDARRAY_OVERLOADED_CURRENT) {
+       if (object->flags & SPL_FIXEDARRAY_OVERLOADED_CURRENT) {
                return zend_user_it_get_current_data(iter TSRMLS_CC);
        } else {
                zval *data;
 
-               ZVAL_LONG(&zindex, iterator->object->current);
+               ZVAL_LONG(&zindex, object->current);
 
-               data = spl_fixedarray_object_read_dimension_helper(intern, &zindex TSRMLS_CC);
+               data = spl_fixedarray_object_read_dimension_helper(object, &zindex TSRMLS_CC);
                zval_ptr_dtor(&zindex);
 
                if (data == NULL) {
@@ -924,27 +919,25 @@ static zval *spl_fixedarray_it_get_current_data(zend_object_iterator *iter TSRML
 
 static void spl_fixedarray_it_get_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC) /* {{{ */
 {
-       spl_fixedarray_it  *iterator = (spl_fixedarray_it *)iter;
-       spl_fixedarray_object *intern   = iterator->object;
+       spl_fixedarray_object *object = (spl_fixedarray_object*)Z_OBJ(iter->data);
 
-       if (intern->flags & SPL_FIXEDARRAY_OVERLOADED_KEY) {
+       if (object->flags & SPL_FIXEDARRAY_OVERLOADED_KEY) {
                zend_user_it_get_current_key(iter, key TSRMLS_CC);
        } else {
-               ZVAL_LONG(key, iterator->object->current);
+               ZVAL_LONG(key, object->current);
        }
 }
 /* }}} */
 
 static void spl_fixedarray_it_move_forward(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_fixedarray_it     *iterator = (spl_fixedarray_it *)iter;
-       spl_fixedarray_object *intern   = iterator->object;
+       spl_fixedarray_object *object = (spl_fixedarray_object*)Z_OBJ(iter->data);
 
-       if (intern->flags & SPL_FIXEDARRAY_OVERLOADED_NEXT) {
+       if (object->flags & SPL_FIXEDARRAY_OVERLOADED_NEXT) {
                zend_user_it_move_forward(iter TSRMLS_CC);
        } else {
                zend_user_it_invalidate_current(iter TSRMLS_CC);
-               iterator->object->current++;
+               object->current++;
        }
 }
 /* }}} */
@@ -1042,7 +1035,6 @@ zend_object_iterator_funcs spl_fixedarray_it_funcs = {
 zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) /* {{{ */
 {
        spl_fixedarray_it      *iterator;
-       spl_fixedarray_object  *fixedarray_object = (spl_fixedarray_object*)Z_OBJ_P(object);
 
        if (by_ref) {
                zend_throw_exception(spl_ce_RuntimeException, "An iterator cannot be used with foreach by reference", 0 TSRMLS_CC);
@@ -1055,13 +1047,12 @@ zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *ob
 
        zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
        
-       iterator->intern.it.data = object;
+       ZVAL_COPY(&iterator->intern.it.data, object);
        iterator->intern.it.funcs = &spl_fixedarray_it_funcs;
        iterator->intern.ce = ce;
-       iterator->intern.value = NULL;
-       iterator->object = fixedarray_object;
+       ZVAL_UNDEF(&iterator->intern.value);
 
-       return (zend_object_iterator*)iterator;
+       return &iterator->intern.it;
 }
 /* }}} */
 
index 2afee6cd49127e86f7157d33ebd59632fab11d7c..8523978584a41e8678a862a10b586dec2aed3d3b 100644 (file)
@@ -82,7 +82,6 @@ struct _spl_heap_object {
 struct _spl_heap_it {
        zend_user_iterator  intern;
        int                 flags;
-       spl_heap_object    *object;
 };
 
 static void spl_ptr_heap_zval_dtor(zval *elem TSRMLS_DC) { /* {{{ */
@@ -869,7 +868,7 @@ static void spl_heap_it_dtor(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
        spl_heap_it *iterator = (spl_heap_it *)iter;
 
        zend_user_it_invalidate_current(iter TSRMLS_CC);
-       zval_ptr_dtor(iterator->intern.it.data);
+       zval_ptr_dtor(&iterator->intern.it.data);
 
        efree(iterator);
 }
@@ -883,23 +882,21 @@ static void spl_heap_it_rewind(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 
 static int spl_heap_it_valid(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_heap_it         *iterator = (spl_heap_it *)iter;
-
-       return (iterator->object->heap->count != 0 ? SUCCESS : FAILURE);
+       return (((spl_heap_object *)Z_OBJ(iter->data))->heap->count != 0 ? SUCCESS : FAILURE);
 }
 /* }}} */
 
 static zval *spl_heap_it_get_current_data(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_heap_it *iterator = (spl_heap_it *)iter;
-       zval *element = &iterator->object->heap->elements[0];
+       spl_heap_object *object = (spl_heap_object*)Z_OBJ(iter->data);
+       zval *element = &object->heap->elements[0];
 
-       if (iterator->object->heap->flags & SPL_HEAP_CORRUPTED) {
+       if (object->heap->flags & SPL_HEAP_CORRUPTED) {
                zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0 TSRMLS_CC);
                return NULL;
        }
 
-       if (iterator->object->heap->count == 0 || ZVAL_IS_UNDEF(element)) {
+       if (object->heap->count == 0 || ZVAL_IS_UNDEF(element)) {
                return NULL;
        } else {
                return element;
@@ -909,18 +906,18 @@ static zval *spl_heap_it_get_current_data(zend_object_iterator *iter TSRMLS_DC)
 
 static zval *spl_pqueue_it_get_current_data(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       spl_heap_it  *iterator = (spl_heap_it *)iter;
-       zval *element  = &iterator->object->heap->elements[0];
+       spl_heap_object *object = (spl_heap_object*)Z_OBJ(iter->data);
+       zval *element = &object->heap->elements[0];
 
-       if (iterator->object->heap->flags & SPL_HEAP_CORRUPTED) {
+       if (object->heap->flags & SPL_HEAP_CORRUPTED) {
                zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0 TSRMLS_CC);
                return NULL;
        }
 
-       if (iterator->object->heap->count == 0 || ZVAL_IS_UNDEF(element)) {
+       if (object->heap->count == 0 || ZVAL_IS_UNDEF(element)) {
                return NULL;
        } else {
-               zval *data = spl_pqueue_extract_helper(element, iterator->object->flags);
+               zval *data = spl_pqueue_extract_helper(element, object->flags);
                if (!data) {
                        zend_error(E_RECOVERABLE_ERROR, "Unable to extract from the PriorityQueue node");
                }
@@ -931,24 +928,23 @@ static zval *spl_pqueue_it_get_current_data(zend_object_iterator *iter TSRMLS_DC
 
 static void spl_heap_it_get_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC) /* {{{ */
 {
-       spl_heap_it *iterator = (spl_heap_it *)iter;
+       spl_heap_object *object = (spl_heap_object*)Z_OBJ(iter->data);
 
-       ZVAL_LONG(key, iterator->object->heap->count - 1);
+       ZVAL_LONG(key, object->heap->count - 1);
 }
 /* }}} */
 
 static void spl_heap_it_move_forward(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
 {
-       zval *object = (zval*)((zend_user_iterator *)iter)->it.data;
-       spl_heap_it *iterator = (spl_heap_it *)iter;
+       spl_heap_object *object = (spl_heap_object*)Z_OBJ(iter->data);
        zval *elem;
 
-       if (iterator->object->heap->flags & SPL_HEAP_CORRUPTED) {
+       if (object->heap->flags & SPL_HEAP_CORRUPTED) {
                zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0 TSRMLS_CC);
                return;
        }
 
-       elem = spl_ptr_heap_delete_top(iterator->object->heap, object TSRMLS_CC);
+       elem = spl_ptr_heap_delete_top(object->heap, &iter->data TSRMLS_CC);
 
        if (elem != NULL) {
                zval_ptr_dtor(elem);
@@ -1088,20 +1084,17 @@ zend_object_iterator *spl_heap_get_iterator(zend_class_entry *ce, zval *object,
                return NULL;
        }
 
-       Z_ADDREF_P(object);
-
-       iterator                  = emalloc(sizeof(spl_heap_it));
+       iterator = emalloc(sizeof(spl_heap_it));
        
-       zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+       zend_iterator_init(&iterator->intern.it TSRMLS_CC);
 
-       iterator->intern.it.data  = (void*)object;
+       ZVAL_COPY(&iterator->intern.it.data, object);
        iterator->intern.it.funcs = &spl_heap_it_funcs;
        iterator->intern.ce       = ce;
-       iterator->intern.value    = NULL;
        iterator->flags           = heap_object->flags;
-       iterator->object          = heap_object;
+       ZVAL_UNDEF(&iterator->intern.value);
 
-       return (zend_object_iterator*)iterator;
+       return &iterator->intern.it;
 }
 /* }}} */
 
@@ -1115,20 +1108,18 @@ zend_object_iterator *spl_pqueue_get_iterator(zend_class_entry *ce, zval *object
                return NULL;
        }
 
-       Z_ADDREF_P(object);
-
-       iterator                  = emalloc(sizeof(spl_heap_it));
+       iterator = emalloc(sizeof(spl_heap_it));
 
        zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
 
-       iterator->intern.it.data  = (void*)object;
+       ZVAL_COPY(&iterator->intern.it.data, object);
        iterator->intern.it.funcs = &spl_pqueue_it_funcs;
        iterator->intern.ce       = ce;
-       iterator->intern.value    = NULL;
        iterator->flags           = heap_object->flags;
-       iterator->object          = heap_object;
 
-       return (zend_object_iterator*)iterator;
+       ZVAL_UNDEF(&iterator->intern.value);
+
+       return &iterator->intern.it;
 }
 /* }}} */
 
index 2891f3ce9b2d72401461435b08c2bca4e766c53c..b30dd4ed5ea87627f132de5ae214467991d6759e 100644 (file)
@@ -122,7 +122,6 @@ typedef struct _spl_recursive_it_object {
 
 typedef struct _spl_recursive_it_iterator {
        zend_object_iterator   intern;
-       zval                   zobject;
 } spl_recursive_it_iterator;
 
 static zend_object_handlers spl_handlers_rec_it_it;
@@ -142,7 +141,7 @@ static zend_object_handlers spl_handlers_dual_it;
 static void spl_recursive_it_dtor(zend_object_iterator *_iter TSRMLS_DC)
 {
        spl_recursive_it_iterator *iter   = (spl_recursive_it_iterator*)_iter;
-       spl_recursive_it_object   *object = (spl_recursive_it_object*)_iter->data;
+       spl_recursive_it_object   *object = (spl_recursive_it_object*)Z_OBJ(iter->intern.data);
        zend_object_iterator      *sub_iter;
 
        while (object->level > 0) {
@@ -153,7 +152,7 @@ static void spl_recursive_it_dtor(zend_object_iterator *_iter TSRMLS_DC)
        object->iterators = erealloc(object->iterators, sizeof(spl_sub_iterator));
        object->level = 0;
 
-       zval_ptr_dtor(&iter->zobject);
+       zval_ptr_dtor(&iter->intern.data);
        efree(iter);
 }
 
@@ -178,23 +177,21 @@ static int spl_recursive_it_valid_ex(spl_recursive_it_object *object, zval *zthi
 
 static int spl_recursive_it_valid(zend_object_iterator *iter TSRMLS_DC)
 {
-       spl_recursive_it_object   *object = (spl_recursive_it_object*)iter->data;
-       
-       return spl_recursive_it_valid_ex(object, &((spl_recursive_it_iterator*)iter)->zobject TSRMLS_CC);
+       return spl_recursive_it_valid_ex((spl_recursive_it_object*)Z_OBJ(iter->data), &iter->data TSRMLS_CC);
 }
 
 static zval *spl_recursive_it_get_current_data(zend_object_iterator *iter TSRMLS_DC)
 {
-       spl_recursive_it_object   *object = (spl_recursive_it_object*)iter->data;
-       zend_object_iterator      *sub_iter = object->iterators[object->level].iterator;
+       spl_recursive_it_object *object = (spl_recursive_it_object*)Z_OBJ(iter->data);
+       zend_object_iterator *sub_iter = object->iterators[object->level].iterator;
        
        return sub_iter->funcs->get_current_data(sub_iter TSRMLS_CC);
 }
 
 static void spl_recursive_it_get_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC)
 {
-       spl_recursive_it_object   *object = (spl_recursive_it_object*)iter->data;
-       zend_object_iterator      *sub_iter = object->iterators[object->level].iterator;
+       spl_recursive_it_object *object = (spl_recursive_it_object*)Z_OBJ(iter->data);
+       zend_object_iterator *sub_iter = object->iterators[object->level].iterator;
 
        if (sub_iter->funcs->get_current_key) {
                sub_iter->funcs->get_current_key(sub_iter, key TSRMLS_CC);
@@ -400,18 +397,18 @@ static void spl_recursive_it_rewind_ex(spl_recursive_it_object *object, zval *zt
 
 static void spl_recursive_it_move_forward(zend_object_iterator *iter TSRMLS_DC)
 {
-       spl_recursive_it_move_forward_ex((spl_recursive_it_object*)iter->data, &((spl_recursive_it_iterator*)iter)->zobject TSRMLS_CC);
+       spl_recursive_it_move_forward_ex((spl_recursive_it_object*)Z_OBJ(iter->data), &iter->data TSRMLS_CC);
 }
 
 static void spl_recursive_it_rewind(zend_object_iterator *iter TSRMLS_DC)
 {
-       spl_recursive_it_rewind_ex((spl_recursive_it_object*)iter->data, &((spl_recursive_it_iterator*)iter)->zobject TSRMLS_CC);
+       spl_recursive_it_rewind_ex((spl_recursive_it_object*)Z_OBJ(iter->data), &iter->data TSRMLS_CC);
 }
 
 static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce, zval *zobject, int by_ref TSRMLS_DC)
 {
        spl_recursive_it_iterator *iterator;
-       spl_recursive_it_object   *object;
+       spl_recursive_it_object *object;
 
        if (by_ref) {
                zend_error(E_ERROR, "An iterator cannot be used with foreach by reference");
@@ -425,10 +422,8 @@ static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce,
 
        zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
        
-       Z_ADDREF_P(zobject);
-       iterator->intern.data = (void*)object;
+       ZVAL_COPY(&iterator->intern.data, zobject);
        iterator->intern.funcs = ce->iterator_funcs.funcs;
-       iterator->zobject = *zobject;
        return (zend_object_iterator*)iterator;
 }
 
@@ -2577,7 +2572,7 @@ static inline void spl_caching_it_next(spl_dual_it_object *intern TSRMLS_DC)
                                }
                        } else {
                                if (zend_is_true(&retval TSRMLS_CC)) {
-                                       zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &zchildren);
+                                       zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &zchildren);
                                        if (EG(exception)) {
                                                zval_ptr_dtor(&zchildren);
                                                if (intern->u.caching.flags & CIT_CATCH_GET_CHILD) {