From 382b0dfdb7d2ae654f6aeba049ee80c3cd70ff9a Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Thu, 27 Feb 2014 19:19:02 +0800 Subject: [PATCH] Refactoring zend_iterator (incompleted) --- Zend/zend_generators.c | 33 ++++++++-------------- Zend/zend_generators.h | 10 +------ Zend/zend_interfaces.c | 31 ++++++++++---------- Zend/zend_interfaces.h | 2 +- Zend/zend_iterators.h | 2 +- ext/date/php_date.c | 13 +++------ ext/spl/spl_array.c | 36 +++++++++--------------- ext/spl/spl_directory.c | 32 ++++++++++----------- ext/spl/spl_directory.h | 1 - ext/spl/spl_dllist.c | 28 ++++++++---------- ext/spl/spl_fixedarray.c | 49 +++++++++++++------------------- ext/spl/spl_heap.c | 61 +++++++++++++++++----------------------- ext/spl/spl_iterators.c | 29 ++++++++----------- 13 files changed, 135 insertions(+), 192 deletions(-) diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 78cb346eb7..7fb12c3cc2 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -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; } /* }}} */ diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h index d466061457..1209bc2d62 100644 --- a/Zend/zend_generators.h +++ b/Zend/zend_generators.h @@ -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; diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index feacae7f0e..6d6e780751 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -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; } /* }}} */ diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h index a0d1cc329a..7fe0e4e2f0 100644 --- a/Zend/zend_interfaces.h +++ b/Zend/zend_interfaces.h @@ -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); diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h index d6cba7c892..9343382efd 100644 --- a/Zend/zend_iterators.h +++ b/Zend/zend_iterators.h @@ -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 */ }; diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 1489ac8184..82ee650b36 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -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; diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index e552ca8fb4..489b63ebf8 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -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; } diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 84ee3f823d..f8ec9efc49 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -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; } /* }}} */ diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h index b65133ff8c..0ce7815d42 100644 --- a/ext/spl/spl_directory.h +++ b/ext/spl/spl_directory.h @@ -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 { diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index 99863626bc..12aa2b42b9 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -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; } /* }}} */ diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 9e5e8b590c..acff4964f2 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -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; } /* }}} */ diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index 2afee6cd49..8523978584 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -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; } /* }}} */ diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 2891f3ce9b..b30dd4ed5e 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -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) { -- 2.40.0