summaryrefslogtreecommitdiff
path: root/Zend/zend_interfaces.c
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-02-27 16:56:17 +0800
committerXinchen Hui <laruence@gmail.com>2014-02-27 16:56:17 +0800
commit122cc5f495b46e8d85a98ee7c25500c4cef4ced1 (patch)
tree4ca47423b68d42c54ad1db681371c3954a66316e /Zend/zend_interfaces.c
parent95320f1f468f7576c3536f42d5c03e118e45be23 (diff)
parent054917619af45870602b3ee669c86397b8162bda (diff)
downloadphp-git-122cc5f495b46e8d85a98ee7c25500c4cef4ced1.tar.gz
Merge branch 'refactoring2' of github.com:zendtech/php into refactoring2
Diffstat (limited to 'Zend/zend_interfaces.c')
-rw-r--r--Zend/zend_interfaces.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index 87b3f723c0..feacae7f0e 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -120,12 +120,9 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
/* 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);
}
/* }}} */
@@ -259,6 +256,8 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva
iterator = emalloc(sizeof(zend_user_iterator));
+ zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+
Z_ADDREF_P(object);
iterator->it.data = (void*)object;
iterator->it.funcs = ce->iterator_funcs.funcs;
@@ -271,23 +270,23 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva
/* {{{ 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_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;
}
/* }}} */