]> granicus.if.org Git - php/commitdiff
Fixed user iterator creation
authorDmitry Stogov <dmitry@zend.com>
Wed, 26 Feb 2014 12:28:04 +0000 (16:28 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 26 Feb 2014 12:28:04 +0000 (16:28 +0400)
Zend/zend_interfaces.c
Zend/zend_interfaces.h

index 47ca36026c4edad777ea2da6e8d61aabd366cc07..feacae7f0edefec4952c79692852799d4c485a97 100644 (file)
@@ -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;
 }
 /* }}} */
index 3c539ad563b05abd976006b48f283d461731caa1..a0d1cc329a076510680291f9442c81c3f77cb8f8 100644 (file)
@@ -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);