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);
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);
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);
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);
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);
}
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);
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;
}
/* }}} */
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;
{
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);
}
}
/* }}} */
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);
{
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;
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;
}
/* }}} */
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);
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);
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);
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;
}
/* }}} */
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);
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 */
};
/* define an overloaded iterator structure */
typedef struct {
zend_object_iterator intern;
- zval *date_period_zval;
zval current;
php_period_obj *object;
int current_index;
date_period_it_invalidate_current(iter TSRMLS_CC);
- zval_ptr_dtor(iterator->date_period_zval);
+ zval_ptr_dtor(&iterator->intern.data);
efree(iterator);
}
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 */
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;
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");
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;
/* 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) /* {{{ */
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);
}
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);
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) {
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);
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);
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);
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;
}
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);
}
}
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;
}
/* }}} */
{
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
{
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)) {
}
return &iterator->current;
} else {
- return (zval*)iterator->intern.data;
+ return &iterator->intern.data;
}
}
/* }}} */
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;
}
/* }}} */
typedef struct {
zend_object_iterator intern;
zval current;
- spl_filesystem_object *object;
} spl_filesystem_iterator;
struct _spl_filesystem_object {
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;
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);
}
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);
}
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);
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) {
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;
}
/* }}} */
typedef struct _spl_fixedarray_it { /* {{{ */
zend_user_iterator intern;
- spl_fixedarray_object *object;
} spl_fixedarray_it;
/* }}} */
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);
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);
}
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;
}
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) {
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++;
}
}
/* }}} */
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);
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;
}
/* }}} */
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) { /* {{{ */
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);
}
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;
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");
}
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);
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;
}
/* }}} */
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;
}
/* }}} */
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;
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) {
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);
}
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);
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");
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;
}
}
} 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) {