From: Marcus Boerger Date: Thu, 18 Oct 2007 04:49:54 +0000 (+0000) Subject: - MFB #42654, #42704 X-Git-Tag: RELEASE_2_0_0a1~1576 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2e9b0225b8aa780d47297fa3b440515a3fb1f26a;p=php - MFB #42654, #42704 --- diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 75bab2dc41..6252c4d2c2 100755 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -1394,7 +1394,7 @@ SPL_METHOD(Array, hasChildren) Create a sub iterator for the current element (same class as $this) */ SPL_METHOD(Array, getChildren) { - zval *object = getThis(), **entry; + zval *object = getThis(), **entry, *flags; spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC); @@ -1416,7 +1416,10 @@ SPL_METHOD(Array, getChildren) RETURN_ZVAL(*entry, 0, 0); } + MAKE_STD_ZVAL(flags); + ZVAL_LONG(flags, SPL_ARRAY_USE_OTHER); spl_instantiate_arg_ex1(intern->std.ce, &return_value, 0, *entry TSRMLS_CC); + zval_ptr_dtor(&flags); } /* }}} */ diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index c983b4c879..632e5522fa 100755 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -1135,15 +1135,17 @@ static inline int spl_dual_it_fetch(spl_dual_it_object *intern, int check_more T spl_dual_it_free(intern TSRMLS_CC); if (!check_more || spl_dual_it_valid(intern TSRMLS_CC) == SUCCESS) { intern->inner.iterator->funcs->get_current_data(intern->inner.iterator, &data TSRMLS_CC); - intern->current.data = *data; - Z_ADDREF_P(intern->current.data); + if (data && *data) { + intern->current.data = *data; + Z_ADDREF_P(intern->current.data); + } if (intern->inner.iterator->funcs->get_current_key) { intern->current.key_type = intern->inner.iterator->funcs->get_current_key(intern->inner.iterator, &intern->current.str_key, &intern->current.str_key_len, &intern->current.int_key TSRMLS_CC); } else { intern->current.key_type = HASH_KEY_IS_LONG; intern->current.int_key = intern->current.pos; } - return SUCCESS; + return EG(exception) ? FAILURE : SUCCESS; } return FAILURE; }