diff options
Diffstat (limited to 'ext')
| -rwxr-xr-x | ext/spl/spl_foreach.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/ext/spl/spl_foreach.c b/ext/spl/spl_foreach.c index 6476a82461..ca3920a1b0 100755 --- a/ext/spl/spl_foreach.c +++ b/ext/spl/spl_foreach.c @@ -54,14 +54,16 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_FE_RESET) zval **obj, *retval; spl_foreach_proxy proxy; zend_class_entry *instance_ce; - spl_is_a is_a = 0; + spl_is_a is_a; obj = spl_get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); - if (obj && (instance_ce = spl_get_class_entry(*obj TSRMLS_CC)) != NULL) { - is_a = spl_implements(instance_ce); + if (!obj || (instance_ce = spl_get_class_entry(*obj TSRMLS_CC)) == NULL) { + ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_FE_RESET); } + is_a = spl_implements(instance_ce); + if (is_a & SPL_IS_A_ITERATOR) { spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); spl_begin_method_call_ex(obj, NULL, NULL, "new_iterator", sizeof("new_iterator")-1, &retval TSRMLS_CC); |
