From: Dmitry Stogov Date: Wed, 26 Feb 2014 12:28:04 +0000 (+0400) Subject: Fixed user iterator creation X-Git-Tag: POST_PHPNG_MERGE~412^2~512 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=39c466147ad33b8cf052c1acb95c6cfbb6454265;p=php Fixed user iterator creation --- diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 47ca36026c..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); } /* }}} */ @@ -273,25 +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_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; } /* }}} */ diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h index 3c539ad563..a0d1cc329a 100644 --- a/Zend/zend_interfaces.h +++ b/Zend/zend_interfaces.h @@ -56,7 +56,7 @@ ZEND_API zval *zend_user_it_get_current_data(zend_object_iterator *_iter TSRMLS_ 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);