while (object->level > 0) {
sub_iter = object->iterators[object->level].iterator;
- sub_iter->funcs->dtor(sub_iter TSRMLS_CC);
+ zend_iterator_dtor(sub_iter TSRMLS_CC);
zval_ptr_dtor(&object->iterators[object->level--].zobject);
}
object->iterators = erealloc(object->iterators, sizeof(spl_sub_iterator));
zend_object_iterator *sub_iter;
int level = object->level;
- while (level >=0) {
+ while (level >= 0) {
sub_iter = object->iterators[level].iterator;
if (sub_iter->funcs->valid(sub_iter TSRMLS_CC) == SUCCESS) {
return SUCCESS;
}
}
}
- iterator->funcs->dtor(iterator TSRMLS_CC);
+ zend_iterator_dtor(iterator TSRMLS_CC);
zval_ptr_dtor(&object->iterators[object->level].zobject);
object->level--;
} else {
while (object->level) {
sub_iter = object->iterators[object->level].iterator;
- sub_iter->funcs->dtor(sub_iter TSRMLS_CC);
+ zend_iterator_dtor(sub_iter TSRMLS_CC);
zval_ptr_dtor(&object->iterators[object->level--].zobject);
if (!EG(exception) && (!object->endChildren || object->endChildren->common.scope != spl_ce_RecursiveIteratorIterator)) {
zend_call_method_with_0_params(zthis, object->ce, &object->endChildren, "endchildren", NULL);
static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *ce_base, zend_class_entry *ce_inner, recursive_it_it_type rit_type)
{
- zval *object = getThis();
- spl_recursive_it_object *intern;
- zval *iterator;
- zend_class_entry *ce_iterator;
- long mode, flags;
- int inc_refcount = 1;
- zend_error_handling error_handling;
+ zval *object = getThis();
+ spl_recursive_it_object *intern;
+ zval *iterator;
+ zend_class_entry *ce_iterator;
+ long mode, flags;
+ int inc_refcount = 1;
+ zend_error_handling error_handling;
zend_replace_error_handling(EH_THROW, spl_ce_InvalidArgumentException, &error_handling TSRMLS_CC);
- switch(rit_type) {
+ switch (rit_type) {
case RIT_RecursiveTreeIterator: {
zval caching_it, caching_it_flags, *user_caching_it_flags = NULL;
if (intern->nextElement->common.scope == ce_base) {
intern->nextElement = NULL;
}
+
ce_iterator = Z_OBJCE_P(iterator); /* respect inheritance, don't use spl_ce_RecursiveIterator */
intern->iterators[0].iterator = ce_iterator->get_iterator(ce_iterator, iterator, 0 TSRMLS_CC);
if (inc_refcount) {
- Z_ADDREF_P(iterator);
+ ZVAL_COPY(&intern->iterators[0].zobject, iterator);
+ } else {
+ ZVAL_COPY_VALUE(&intern->iterators[0].zobject, iterator);
}
- intern->iterators[0].zobject = *iterator;
intern->iterators[0].ce = ce_iterator;
intern->iterators[0].state = RS_START;
while (intern->level >= 0) {
sub_iter = intern->iterators[intern->level].iterator;
- sub_iter->funcs->dtor(sub_iter TSRMLS_CC);
+ zend_iterator_dtor(sub_iter TSRMLS_CC);
zval_ptr_dtor(&intern->iterators[intern->level--].zobject);
}
efree(intern->iterators);
if (object->iterators) {
while (object->level >= 0) {
sub_iter = object->iterators[object->level].iterator;
- sub_iter->funcs->dtor(sub_iter TSRMLS_CC);
+ zend_iterator_dtor(sub_iter TSRMLS_CC);
zval_ptr_dtor(&object->iterators[object->level--].zobject);
}
efree(object->iterators);
function_handler = std_object_handlers.get_method(object_ptr, method, key TSRMLS_CC);
if (!function_handler && intern->inner.ce) {
if ((function_handler = zend_hash_find_ptr(&intern->inner.ce->function_table, method)) == NULL) {
- if (Z_OBJ_HT_P(intern->inner.zobject)->get_method) {
+ if (Z_OBJ_HT(intern->inner.zobject)->get_method) {
//!!! maybe we really need a zval ** here?
//*object_ptr = &intern->inner.zobject?
- object_ptr = intern->inner.zobject;
+ object_ptr = &intern->inner.zobject;
function_handler = Z_OBJ_HT_P(object_ptr)->get_method(object_ptr, method, key TSRMLS_CC);
}
} else {
- object_ptr = intern->inner.zobject;
+ object_ptr = &intern->inner.zobject;
}
}
return function_handler;
zend_restore_error_handling(&error_handling TSRMLS_CC);
if (inc_refcount) {
- Z_ADDREF_P(zobject);
+ ZVAL_COPY(&intern->inner.zobject, zobject);
+ } else {
+ ZVAL_COPY_VALUE(&intern->inner.zobject, zobject);
}
- intern->inner.zobject = zobject;
+
intern->inner.ce = dit_type == DIT_IteratorIterator ? ce : Z_OBJCE_P(zobject);
intern->inner.object = Z_OBJ_P(zobject);
intern->inner.iterator = intern->inner.ce->get_iterator(intern->inner.ce, zobject, 0 TSRMLS_CC);
SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
- if (intern->inner.zobject) {
- RETVAL_ZVAL(intern->inner.zobject, 1, 0);
+ if (!ZVAL_IS_UNDEF(&intern->inner.zobject)) {
+ RETVAL_ZVAL(&intern->inner.zobject, 1, 0);
} else {
RETURN_NULL();
}
SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
- zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval);
+ zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval);
if (Z_TYPE(retval) != IS_UNDEF) {
RETURN_ZVAL(&retval, 0, 1);
} else {
SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
- zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
+ zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
if (!EG(exception) && Z_TYPE(retval) != IS_UNDEF) {
spl_instantiate_arg_ex1(Z_OBJCE_P(getThis()), return_value, &retval TSRMLS_CC);
}
intern = (spl_dual_it_object*)Z_OBJ_P(getThis());
- zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
+ zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
if (!EG(exception) && Z_TYPE(retval) != IS_UNDEF) {
spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), return_value, &retval, &intern->u.cbfilter->fci.function_name TSRMLS_CC);
}
ZVAL_COPY_VALUE(¶ms[0], &intern->current.data);
ZVAL_COPY_VALUE(¶ms[1], &intern->current.key);
- ZVAL_COPY_VALUE(¶ms[2], intern->inner.zobject);
+ ZVAL_COPY_VALUE(¶ms[2], &intern->inner.zobject);
fci->retval = &result;
fci->param_count = 3;
SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
- zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
+ zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
if (!EG(exception)) {
ZVAL_STR(®ex, STR_COPY(intern->u.regex.regex));
spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), return_value, &retval, ®ex TSRMLS_CC);
/* {{{ spl_dual_it_dtor */
static void spl_dual_it_dtor(zend_object *_object TSRMLS_DC)
{
- spl_dual_it_object *object = (spl_dual_it_object *)_object;
+ spl_dual_it_object *object = (spl_dual_it_object *)_object;
/* call standard dtor */
zend_objects_destroy_object(_object TSRMLS_CC);
spl_dual_it_free(object TSRMLS_CC);
if (object->inner.iterator) {
- object->inner.iterator->funcs->dtor(object->inner.iterator TSRMLS_CC);
+ zend_iterator_dtor(object->inner.iterator TSRMLS_CC);
}
}
/* }}} */
spl_dual_it_object *object = (spl_dual_it_object *)_object;
- if (object->inner.zobject) {
- zval_ptr_dtor(object->inner.zobject);
+ if (!ZVAL_IS_UNDEF(&object->inner.zobject)) {
+ zval_ptr_dtor(&object->inner.zobject);
}
if (object->dit_type == DIT_AppendIterator) {
- object->u.append.iterator->funcs->dtor(object->u.append.iterator TSRMLS_CC);
+ zend_iterator_dtor(object->u.append.iterator TSRMLS_CC);
if (Z_TYPE(object->u.append.zarrayit) != IS_UNDEF) {
zval_ptr_dtor(&object->u.append.zarrayit);
}
if (pos != intern->current.pos && instanceof_function(intern->inner.ce, spl_ce_SeekableIterator TSRMLS_CC)) {
ZVAL_LONG(&zpos, pos);
spl_dual_it_free(intern TSRMLS_CC);
- zend_call_method_with_1_params(intern->inner.zobject, intern->inner.ce, NULL, "seek", NULL, &zpos);
+ zend_call_method_with_1_params(&intern->inner.zobject, intern->inner.ce, NULL, "seek", NULL, &zpos);
zval_ptr_dtor(&zpos);
if (!EG(exception)) {
intern->current.pos = pos;
/* Recursion ? */
if (intern->dit_type == DIT_RecursiveCachingIterator) {
zval retval, zchildren, zflags;
- zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval);
+ zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval);
if (EG(exception)) {
zval_ptr_dtor(&retval);
if (intern->u.caching.flags & CIT_CATCH_GET_CHILD) {
}
} 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) {
int use_copy;
zval expr_copy;
if (intern->u.caching.flags & CIT_TOSTRING_USE_INNER) {
- ZVAL_COPY_VALUE(&intern->u.caching.zstr, intern->inner.zobject);
+ ZVAL_COPY_VALUE(&intern->u.caching.zstr, &intern->inner.zobject);
} else {
ZVAL_COPY_VALUE(&intern->u.caching.zstr, &intern->current.data);
}
{
spl_dual_it_free(intern TSRMLS_CC);
- if (intern->inner.zobject) {
- zval_ptr_dtor(intern->inner.zobject);
- intern->inner.zobject = NULL;
+ if (!ZVAL_IS_UNDEF(&intern->inner.zobject)) {
+ zval_ptr_dtor(&intern->inner.zobject);
+ ZVAL_UNDEF(&intern->inner.zobject);
intern->inner.ce = NULL;
- intern->inner.object = NULL;
if (intern->inner.iterator) {
- intern->inner.iterator->funcs->dtor(intern->inner.iterator TSRMLS_CC);
+ zend_iterator_dtor(intern->inner.iterator TSRMLS_CC);
intern->inner.iterator = NULL;
}
}
zval *it;
it = intern->u.append.iterator->funcs->get_current_data(intern->u.append.iterator TSRMLS_CC);
- Z_ADDREF_P(it);
- intern->inner.zobject = it;
+ ZVAL_COPY(&intern->inner.zobject, it);
intern->inner.ce = Z_OBJCE_P(it);
- intern->inner.object = Z_OBJ_P(it);
intern->inner.iterator = intern->inner.ce->get_iterator(intern->inner.ce, it, 0 TSRMLS_CC);
spl_dual_it_rewind(intern TSRMLS_CC);
return SUCCESS;
}
do {
spl_append_it_next_iterator(intern TSRMLS_CC);
- } while (intern->inner.zobject != it);
+ } while (Z_OBJ(intern->inner.zobject) != Z_OBJCE_P(it));
spl_append_it_fetch(intern TSRMLS_CC);
}
} /* }}} */
done:
if (iter) {
- iter->funcs->dtor(iter TSRMLS_CC);
+ zend_iterator_dtor(iter TSRMLS_CC);
}
return EG(exception) ? FAILURE : SUCCESS;
}