/* iterator interface, c-level functions used by engine */
/* {{{ zend_user_it_new_iterator */
-ZEND_API zval *zend_user_it_new_iterator(zend_class_entry *ce, zval *object TSRMLS_DC)
+ZEND_API void zend_user_it_new_iterator(zend_class_entry *ce, zval *object, zval *retval TSRMLS_DC)
{
- zval retval;
-
- return zend_call_method_with_0_params(object, ce, &ce->iterator_funcs.zf_new_iterator, "getiterator", &retval);
-
+ zend_call_method_with_0_params(object, ce, &ce->iterator_funcs.zf_new_iterator, "getiterator", retval);
}
/* }}} */
/* {{{ zend_user_it_get_new_iterator */
ZEND_API zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC)
{
- zval *iterator = zend_user_it_new_iterator(ce, object TSRMLS_CC);
+ zval iterator;
zend_object_iterator *new_iterator;
- zend_class_entry *ce_it = (iterator &&
- Z_TYPE_P(iterator) == IS_OBJECT &&
- Z_OBJ_HT_P(iterator)->get_class_entry) ? Z_OBJCE_P(iterator) : NULL;
+ zend_user_it_new_iterator(ce, object, &iterator TSRMLS_CC);
+ zend_class_entry *ce_it = (Z_TYPE(iterator) == IS_OBJECT &&
+ Z_OBJ_HT(iterator)->get_class_entry) ? Z_OBJCE(iterator) : NULL;
- if (!ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && iterator == object)) {
+ if (!ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && Z_OBJ(iterator) == Z_OBJ_P(object))) {
if (!EG(exception)) {
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce ? ce->name->val : Z_OBJCE_P(object)->name->val);
}
- if (iterator) {
- zval_ptr_dtor(iterator);
- }
+ zval_ptr_dtor(&iterator);
return NULL;
}
- new_iterator = ce_it->get_iterator(ce_it, iterator, by_ref TSRMLS_CC);
- zval_ptr_dtor(iterator);
+ new_iterator = ce_it->get_iterator(ce_it, &iterator, by_ref TSRMLS_CC);
+ zval_ptr_dtor(&iterator);
return new_iterator;
}
/* }}} */
ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter TSRMLS_DC);
ZEND_API void zend_user_it_invalidate_current(zend_object_iterator *_iter TSRMLS_DC);
-ZEND_API zval *zend_user_it_new_iterator(zend_class_entry *ce, zval *object TSRMLS_DC);
+ZEND_API void zend_user_it_new_iterator(zend_class_entry *ce, zval *object, zval *iterator TSRMLS_DC);
ZEND_API zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC);
ZEND_API void zend_register_interfaces(TSRMLS_D);