summaryrefslogtreecommitdiff
path: root/Zend/zend_interfaces.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2005-01-24 19:18:37 +0000
committerMarcus Boerger <helly@php.net>2005-01-24 19:18:37 +0000
commit5206e9c9cf2703e21f4f5dec1bf2d9c8531c80d8 (patch)
tree2a0ed9fa57ddb055b68d2a31be990d7997ba58bd /Zend/zend_interfaces.c
parentbe86e1696eee134e993f2b45c738f457fa65fabd (diff)
downloadphp-git-5206e9c9cf2703e21f4f5dec1bf2d9c8531c80d8.tar.gz
- Allow getIterator() to fail
Diffstat (limited to 'Zend/zend_interfaces.c')
-rwxr-xr-xZend/zend_interfaces.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index 7ab33a5809..9905e25861 100755
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -270,11 +270,17 @@ static zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *ce,
zval *iterator = zend_user_it_new_iterator(ce, object TSRMLS_CC);
zend_object_iterator *new_iterator;
- zend_class_entry *ce_it = Z_TYPE_P(iterator) == IS_OBJECT ? Z_OBJCE_P(iterator) : NULL;
+ zend_class_entry *ce_it = iterator && Z_TYPE_P(iterator) == IS_OBJECT ? Z_OBJCE_P(iterator) : NULL;
if (!ce || !ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && iterator == object)) {
- zend_error(E_WARNING, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce->name);
- zval_ptr_dtor(&iterator);
+ if (!EG(exception))
+ {
+ zend_error(E_WARNING, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce->name);
+ }
+ if (iterator)
+ {
+ zval_ptr_dtor(&iterator);
+ }
return NULL;
}
new_iterator = ce_it->get_iterator(ce_it, iterator TSRMLS_CC);