From: Marcus Boerger Date: Thu, 13 Nov 2003 08:23:49 +0000 (+0000) Subject: IteratorAggregate::getIterator() cannot return anythingy else than objects X-Git-Tag: php-5.0.0b3RC1~700 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=58246412a7b653ce33c5026df3215878f96b82d4;p=php IteratorAggregate::getIterator() cannot return anythingy else than objects --- diff --git a/Zend/ZEND_CHANGES b/Zend/ZEND_CHANGES index 3d3d015820..302b80f606 100644 --- a/Zend/ZEND_CHANGES +++ b/Zend/ZEND_CHANGES @@ -743,9 +743,9 @@ Changes in the Zend Engine 2.0 The interfaces 'IteratorAggregate' and 'Iterator' allow to specify how class objects are iterated in PHP code. The first of them simply - has a method 'getIterator' which must return an array or an object - that either implements the interface 'Iterator' or is instantiated - from an internal class that can be iterated. + has a method 'getIterator' which must return an object that either + implements the interface 'Iterator' or is instantiated from an + internal class that can be iterated. Example: diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index b1cb5e4e5f..aa857af396 100755 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -109,6 +109,7 @@ static zval *zend_user_new_iterator(zend_class_entry *ce, zval *object TSRMLS_DC zval *retval; return zend_call_method_with_0_params(&object, ce, &ce->iterator_funcs.zf_new_iterator, "getiterator", &retval); + } /* }}} */ @@ -265,9 +266,11 @@ static zend_object_iterator *zend_user_get_new_iterator(zend_class_entry *ce, zv { zval *iterator = zend_user_new_iterator(ce, object TSRMLS_CC); - zend_class_entry *ce_it = Z_OBJCE_P(iterator); - if (!ce || !ce_it->get_iterator) { + zend_class_entry *ce_it = Z_TYPE_P(iterator) == IS_OBJECT ? Z_OBJCE_P(iterator) : NULL; + + if (!ce || !ce_it || !ce_it->get_iterator) { zend_error(E_WARNING, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce->name); + zval_ptr_dtor(&iterator); return NULL; } iterator->refcount--; /* from return */