diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-08-19 10:22:38 +0200 |
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-08-19 10:22:38 +0200 |
| commit | f452a2b3e4e4279b27594a8ddb66525442d59227 (patch) | |
| tree | d05cb62c5515ada33076d3cc3e49b664733a478c /ext/spl | |
| parent | 038ba12e8724d537040e88ec794354b0c063f0a6 (diff) | |
| download | php-upstream/5.3.7.tar.gz | |
Imported Upstream version 5.3.7upstream/5.3.7
Diffstat (limited to 'ext/spl')
| -rwxr-xr-x | ext/spl/internal/appenditerator.inc | 4 | ||||
| -rwxr-xr-x | ext/spl/internal/cachingiterator.inc | 4 | ||||
| -rwxr-xr-x | ext/spl/internal/regexiterator.inc | 2 | ||||
| -rwxr-xr-x | ext/spl/php_spl.c | 4 | ||||
| -rwxr-xr-x | ext/spl/spl_array.c | 8 | ||||
| -rwxr-xr-x | ext/spl/spl_directory.c | 79 | ||||
| -rw-r--r-- | ext/spl/spl_dllist.c | 6 | ||||
| -rw-r--r-- | ext/spl/spl_fixedarray.c | 16 | ||||
| -rwxr-xr-x | ext/spl/spl_iterators.c | 180 | ||||
| -rw-r--r-- | ext/spl/tests/DirectoryIterator_getGroup_basic.phpt | 20 | ||||
| -rw-r--r-- | ext/spl/tests/DirectoryIterator_getOwner_basic.phpt | 35 | ||||
| -rw-r--r-- | ext/spl/tests/SplFileInfo_getGroup_basic.phpt | 36 | ||||
| -rw-r--r-- | ext/spl/tests/SplFileInfo_getOwner_basic.phpt | 36 | ||||
| -rw-r--r-- | ext/spl/tests/bug54281.phpt | 15 | ||||
| -rw-r--r-- | ext/spl/tests/bug54291.phpt | 13 | ||||
| -rw-r--r-- | ext/spl/tests/bug54292.phpt | 14 | ||||
| -rw-r--r-- | ext/spl/tests/bug54384.phpt | 171 | ||||
| -rw-r--r-- | ext/spl/tests/bug54970.phpt | 33 | ||||
| -rw-r--r-- | ext/spl/tests/bug54971.phpt | 45 | ||||
| -rwxr-xr-x | ext/spl/tests/iterator_031.phpt | 4 |
20 files changed, 543 insertions, 182 deletions
diff --git a/ext/spl/internal/appenditerator.inc b/ext/spl/internal/appenditerator.inc index 5db080425..28e32b15f 100755 --- a/ext/spl/internal/appenditerator.inc +++ b/ext/spl/internal/appenditerator.inc @@ -31,7 +31,7 @@ class AppendIterator implements OuterIterator * @param $it Iterator to append * * If the current state is invalid but the appended iterator is valid - * the the AppendIterator itself becomes valid. However there will be no + * the AppendIterator itself becomes valid. However there will be no * call to $it->rewind(). Also if the current state is invalid the inner * ArrayIterator will be rewound und forwarded to the appended element. */ @@ -119,4 +119,4 @@ class AppendIterator implements OuterIterator } } -?>
\ No newline at end of file +?> diff --git a/ext/spl/internal/cachingiterator.inc b/ext/spl/internal/cachingiterator.inc index 7262564f2..33258ab95 100755 --- a/ext/spl/internal/cachingiterator.inc +++ b/ext/spl/internal/cachingiterator.inc @@ -86,7 +86,7 @@ class CachingIterator implements OuterIterator $this->it->next(); } - /** @return whether teh iterator is valid + /** @return whether the iterator is valid */ function valid() { @@ -154,4 +154,4 @@ class CachingIterator implements OuterIterator } } -?>
\ No newline at end of file +?> diff --git a/ext/spl/internal/regexiterator.inc b/ext/spl/internal/regexiterator.inc index 8b4ffe9da..96b8f8112 100755 --- a/ext/spl/internal/regexiterator.inc +++ b/ext/spl/internal/regexiterator.inc @@ -19,7 +19,7 @@ */ class RegexIterator extends FilterIterator { - const USE_KEY = 0x00000001; /**< If present in $flags the the key is + const USE_KEY = 0x00000001; /**< If present in $flags the key is used rather then the current value. */ const MATCH = 0; /**< Mode: Executed a plain match only */ diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index 965d0d3af..8e172efde 100755 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_spl.c 306939 2011-01-01 02:19:59Z felipe $ */ +/* $Id: php_spl.c 313665 2011-07-25 11:42:53Z felipe $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -877,7 +877,7 @@ const zend_function_entry spl_functions[] = { PHP_FE(iterator_count, arginfo_iterator) PHP_FE(iterator_apply, arginfo_iterator_apply) #endif /* SPL_ITERATORS_H */ - {NULL, NULL, NULL} + PHP_FE_END }; /* }}} */ diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 99a098228..be24d48ed 100755 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_array.c 306939 2011-01-01 02:19:59Z felipe $ */ +/* $Id: spl_array.c 313665 2011-07-25 11:42:53Z felipe $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -1929,7 +1929,7 @@ static const zend_function_entry spl_funcs_ArrayObject[] = { SPL_ME(Array, exchangeArray, arginfo_array_exchangeArray, ZEND_ACC_PUBLIC) SPL_ME(Array, setIteratorClass, arginfo_array_setIteratorClass, ZEND_ACC_PUBLIC) SPL_ME(Array, getIteratorClass, arginfo_array_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; static const zend_function_entry spl_funcs_ArrayIterator[] = { @@ -1958,13 +1958,13 @@ static const zend_function_entry spl_funcs_ArrayIterator[] = { SPL_ME(Array, next, arginfo_array_void, ZEND_ACC_PUBLIC) SPL_ME(Array, valid, arginfo_array_void, ZEND_ACC_PUBLIC) SPL_ME(Array, seek, arginfo_array_seek, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; static const zend_function_entry spl_funcs_RecursiveArrayIterator[] = { SPL_ME(Array, hasChildren, arginfo_array_void, ZEND_ACC_PUBLIC) SPL_ME(Array, getChildren, arginfo_array_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* }}} */ diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index b91fa5e52..b7560915c 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c 309035 2011-03-08 19:56:29Z felipe $ */ +/* $Id: spl_directory.c 313665 2011-07-25 11:42:53Z felipe $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -48,6 +48,8 @@ /* declare the class handlers */ static zend_object_handlers spl_filesystem_object_handlers; +/* includes handler to validate object state when retrieving methods */ +static zend_object_handlers spl_filesystem_object_check_handlers; /* decalre the class entry */ PHPAPI zend_class_entry *spl_ce_SplFileInfo; @@ -162,6 +164,16 @@ static zend_object_value spl_filesystem_object_new(zend_class_entry *class_type } /* }}} */ +/* {{{ spl_filesystem_object_new_ex */ +static zend_object_value spl_filesystem_object_new_check(zend_class_entry *class_type TSRMLS_DC) +{ + zend_object_value ret = spl_filesystem_object_new_ex(class_type, NULL TSRMLS_CC); + ret.handlers = &spl_filesystem_object_check_handlers; + return ret; +} +/* }}} */ + + PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len TSRMLS_DC) /* {{{ */ { #ifdef HAVE_GLOB @@ -233,8 +245,12 @@ static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path TS intern->u.dir.index = 0; if (EG(exception) || intern->u.dir.dirp == NULL) { - /* throw exception: should've been already happened */ intern->u.dir.entry.d_name[0] = '\0'; + if (!EG(exception)) { + /* open failed w/out notice (turned to exception due to EH_THROW) */ + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 + TSRMLS_CC, "Failed to open directory \"%s\"", path); + } } else { do { spl_filesystem_dir_read(intern TSRMLS_CC); @@ -613,6 +629,19 @@ static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T } /* }}} */ +zend_function *spl_filesystem_object_get_method_check(zval **object_ptr, char *method, int method_len TSRMLS_DC) /* {{{ */ +{ + spl_filesystem_object *fsobj = zend_object_store_get_object(*object_ptr TSRMLS_CC); + + if (fsobj->u.dir.entry.d_name[0] == '\0' && fsobj->orig_path == NULL) { + method = "_bad_state_ex"; + method_len = sizeof("_bad_state_ex") - 1; + } + + return zend_get_std_object_handlers()->get_method(object_ptr, method, method_len TSRMLS_CC); +} +/* }}} */ + #define DIT_CTOR_FLAGS 0x00000001 #define DIT_CTOR_GLOB 0x00000002 @@ -1350,6 +1379,15 @@ SPL_METHOD(SplFileInfo, getPathInfo) } /* }}} */ +/* {{{ */ +SPL_METHOD(SplFileInfo, _bad_state_ex) +{ + zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, + "The parent constructor was not called: the object is in an " + "invalid state "); +} +/* }}} */ + /* {{{ proto void FilesystemIterator::__construct(string path [, int flags]) Cronstructs a new dir iterator from a path. */ SPL_METHOD(FilesystemIterator, __construct) @@ -1887,8 +1925,9 @@ static const zend_function_entry spl_SplFileInfo_functions[] = { SPL_ME(SplFileInfo, openFile, arginfo_info_openFile, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, setFileClass, arginfo_info_optinalFileClass, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, setInfoClass, arginfo_info_optinalFileClass, ZEND_ACC_PUBLIC) + SPL_ME(SplFileInfo, _bad_state_ex, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) SPL_MA(SplFileInfo, __toString, SplFileInfo, getPathname, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; ZEND_BEGIN_ARG_INFO(arginfo_dir___construct, 0) @@ -1914,7 +1953,7 @@ static const zend_function_entry spl_DirectoryIterator_functions[] = { SPL_ME(DirectoryIterator, next, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) SPL_ME(DirectoryIterator, seek, arginfo_dir_it_seek, ZEND_ACC_PUBLIC) SPL_MA(DirectoryIterator, __toString, DirectoryIterator, getFilename, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; ZEND_BEGIN_ARG_INFO_EX(arginfo_r_dir___construct, 0, 0, 1) @@ -1938,7 +1977,7 @@ static const zend_function_entry spl_FilesystemIterator_functions[] = { SPL_ME(FilesystemIterator, current, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) SPL_ME(FilesystemIterator, getFlags, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) SPL_ME(FilesystemIterator, setFlags, arginfo_r_dir_setFlags, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; static const zend_function_entry spl_RecursiveDirectoryIterator_functions[] = { @@ -1947,14 +1986,14 @@ static const zend_function_entry spl_RecursiveDirectoryIterator_functions[] = { SPL_ME(RecursiveDirectoryIterator, getChildren, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) SPL_ME(RecursiveDirectoryIterator, getSubPath, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) SPL_ME(RecursiveDirectoryIterator, getSubPathname,arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; #ifdef HAVE_GLOB static const zend_function_entry spl_GlobIterator_functions[] = { SPL_ME(GlobIterator, __construct, arginfo_r_dir___construct, ZEND_ACC_PUBLIC) SPL_ME(GlobIterator, count, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; #endif /* }}} */ @@ -2205,17 +2244,24 @@ SPL_METHOD(SplFileObject, __construct) zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling TSRMLS_CC); - intern->u.file.open_mode = "r"; - intern->u.file.open_mode_len = 1; + intern->u.file.open_mode = NULL; + intern->u.file.open_mode_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sbr", &intern->file_name, &intern->file_name_len, &intern->u.file.open_mode, &intern->u.file.open_mode_len, - &use_include_path, &intern->u.file.zcontext) == FAILURE) { + &use_include_path, &intern->u.file.zcontext) == FAILURE) { + intern->u.file.open_mode = NULL; + intern->file_name = NULL; zend_restore_error_handling(&error_handling TSRMLS_CC); return; } + if (intern->u.file.open_mode == NULL) { + intern->u.file.open_mode = "r"; + intern->u.file.open_mode_len = 1; + } + if (spl_filesystem_file_open(intern, use_include_path, 0 TSRMLS_CC) == SUCCESS) { tmp_path_len = strlen(intern->u.file.stream->orig_path); @@ -2862,7 +2908,7 @@ static const zend_function_entry spl_SplFileObject_functions[] = { /* mappings */ SPL_MA(SplFileObject, getCurrentLine, SplFileObject, fgets, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) SPL_MA(SplFileObject, __toString, SplFileObject, current, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; ZEND_BEGIN_ARG_INFO_EX(arginfo_temp_file_object___construct, 0, 0, 0) @@ -2871,7 +2917,7 @@ ZEND_END_ARG_INFO() static const zend_function_entry spl_SplTempFileObject_functions[] = { SPL_ME(SplTempFileObject, __construct, arginfo_temp_file_object___construct, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* }}} */ @@ -2911,13 +2957,16 @@ PHP_MINIT_FUNCTION(spl_directory) REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, FilesystemIterator, spl_filesystem_object_new, spl_RecursiveDirectoryIterator_functions); REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator); + + memcpy(&spl_filesystem_object_check_handlers, &spl_filesystem_object_handlers, sizeof(zend_object_handlers)); + spl_filesystem_object_check_handlers.get_method = spl_filesystem_object_get_method_check; #ifdef HAVE_GLOB - REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator, spl_filesystem_object_new, spl_GlobIterator_functions); + REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator, spl_filesystem_object_new_check, spl_GlobIterator_functions); REGISTER_SPL_IMPLEMENTS(GlobIterator, Countable); #endif - REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo, spl_filesystem_object_new, spl_SplFileObject_functions); + REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo, spl_filesystem_object_new_check, spl_SplFileObject_functions); REGISTER_SPL_IMPLEMENTS(SplFileObject, RecursiveIterator); REGISTER_SPL_IMPLEMENTS(SplFileObject, SeekableIterator); @@ -2926,7 +2975,7 @@ PHP_MINIT_FUNCTION(spl_directory) REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "SKIP_EMPTY", SPL_FILE_OBJECT_SKIP_EMPTY); REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "READ_CSV", SPL_FILE_OBJECT_READ_CSV); - REGISTER_SPL_SUB_CLASS_EX(SplTempFileObject, SplFileObject, spl_filesystem_object_new, spl_SplTempFileObject_functions); + REGISTER_SPL_SUB_CLASS_EX(SplTempFileObject, SplFileObject, spl_filesystem_object_new_check, spl_SplTempFileObject_functions); return SUCCESS; } /* }}} */ diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index da7effcd4..7db3885c2 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_dllist.c 306939 2011-01-01 02:19:59Z felipe $ */ +/* $Id: spl_dllist.c 313665 2011-07-25 11:42:53Z felipe $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -1191,7 +1191,7 @@ ZEND_END_ARG_INFO() static const zend_function_entry spl_funcs_SplQueue[] = { SPL_MA(SplQueue, enqueue, SplDoublyLinkedList, push, arginfo_dllist_push, ZEND_ACC_PUBLIC) SPL_MA(SplQueue, dequeue, SplDoublyLinkedList, shift, arginfo_dllist_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; static const zend_function_entry spl_funcs_SplDoublyLinkedList[] = { @@ -1215,7 +1215,7 @@ static const zend_function_entry spl_funcs_SplDoublyLinkedList[] = { SPL_ME(SplDoublyLinkedList, next, arginfo_dllist_void, ZEND_ACC_PUBLIC) SPL_ME(SplDoublyLinkedList, prev, arginfo_dllist_void, ZEND_ACC_PUBLIC) SPL_ME(SplDoublyLinkedList, valid, arginfo_dllist_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* }}} */ diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 71a12befe..54b457b50 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_fixedarray.c 306939 2011-01-01 02:19:59Z felipe $ */ +/* $Id: spl_fixedarray.c 313665 2011-07-25 11:42:53Z felipe $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -152,19 +152,23 @@ static HashTable* spl_fixedarray_object_get_properties(zval *obj TSRMLS_DC) /* { spl_fixedarray_object *intern = (spl_fixedarray_object*)zend_object_store_get_object(obj TSRMLS_CC); int i = 0; - if (intern->array) { + if (intern->array && !GC_G(gc_active)) { + int j = zend_hash_num_elements(intern->std.properties); + for (i = 0; i < intern->array->size; i++) { if (intern->array->elements[i]) { zend_hash_index_update(intern->std.properties, i, (void *)&intern->array->elements[i], sizeof(zval *), NULL); Z_ADDREF_P(intern->array->elements[i]); } else { - if (GC_G(gc_active)) { - return NULL; - } zend_hash_index_update(intern->std.properties, i, (void *)&EG(uninitialized_zval_ptr), sizeof(zval *), NULL); Z_ADDREF_P(EG(uninitialized_zval_ptr)); } } + if (j > intern->array->size) { + for (i = intern->array->size; i < j; ++i) { + zend_hash_index_del(intern->std.properties, i); + } + } } return intern->std.properties; @@ -1069,7 +1073,7 @@ static zend_function_entry spl_funcs_SplFixedArray[] = { /* {{{ */ SPL_ME(SplFixedArray, key, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC) SPL_ME(SplFixedArray, next, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC) SPL_ME(SplFixedArray, valid, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* }}} */ diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index e69eb8102..3ef0595c3 100755 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_iterators.c 308503 2011-02-20 16:09:50Z felipe $ */ +/* $Id: spl_iterators.c 313665 2011-07-25 11:42:53Z felipe $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -67,7 +67,7 @@ ZEND_END_ARG_INFO() const zend_function_entry spl_funcs_RecursiveIterator[] = { SPL_ABSTRACT_ME(RecursiveIterator, hasChildren, arginfo_recursive_it_void) SPL_ABSTRACT_ME(RecursiveIterator, getChildren, arginfo_recursive_it_void) - {NULL, NULL, NULL} + PHP_FE_END }; typedef enum { @@ -125,6 +125,17 @@ typedef struct _spl_recursive_it_iterator { static zend_object_handlers spl_handlers_rec_it_it; static zend_object_handlers spl_handlers_dual_it; +#define SPL_FETCH_AND_CHECK_DUAL_IT(var, objzval) \ + do { \ + spl_dual_it_object *it = zend_object_store_get_object((objzval) TSRMLS_CC); \ + if (it->dit_type == DIT_Unknown) { \ + zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, \ + "The object is in an invalid state as the parent constructor was not called"); \ + return; \ + } \ + (var) = it; \ + } while (0) + static void spl_recursive_it_dtor(zend_object_iterator *_iter TSRMLS_DC) { spl_recursive_it_iterator *iter = (spl_recursive_it_iterator*)_iter; @@ -360,6 +371,10 @@ next_step: static void spl_recursive_it_rewind_ex(spl_recursive_it_object *object, zval *zthis TSRMLS_DC) { zend_object_iterator *sub_iter; + + if (!object->iterators) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "The %s instance wasn't initialized properly", Z_OBJCE_P(zthis)->name); + } while (object->level) { sub_iter = object->iterators[object->level].iterator; @@ -402,6 +417,10 @@ static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce, } iterator = emalloc(sizeof(spl_recursive_it_iterator)); object = (spl_recursive_it_object*)zend_object_store_get_object(zobject TSRMLS_CC); + if (object->iterators == NULL) { + zend_error(E_ERROR, "The object to be iterated is in an invalid state: " + "the parent constructor has not been called"); + } Z_ADDREF_P(zobject); iterator->intern.data = (void*)object; @@ -957,7 +976,7 @@ static const zend_function_entry spl_funcs_RecursiveIteratorIterator[] = { SPL_ME(RecursiveIteratorIterator, nextElement, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(RecursiveIteratorIterator, setMaxDepth, arginfo_recursive_it_setMaxDepth, ZEND_ACC_PUBLIC) SPL_ME(RecursiveIteratorIterator, getMaxDepth, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; static void spl_recursive_tree_iterator_get_prefix(spl_recursive_it_object *object, zval *return_value TSRMLS_DC) @@ -1235,7 +1254,7 @@ static const zend_function_entry spl_funcs_RecursiveTreeIterator[] = { SPL_ME(RecursiveTreeIterator, setPrefixPart, arginfo_recursive_tree_it_setPrefixPart, ZEND_ACC_PUBLIC) SPL_ME(RecursiveTreeIterator, getEntry, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(RecursiveTreeIterator, getPostfix, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; #if MBO_0 @@ -1512,12 +1531,12 @@ SPL_METHOD(FilterIterator, __construct) SPL_METHOD(dual_it, getInnerIterator) { spl_dual_it_object *intern; - - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); if (zend_parse_parameters_none() == FAILURE) { return; } + + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (intern->inner.zobject) { RETVAL_ZVAL(intern->inner.zobject, 1, 0); @@ -1616,13 +1635,13 @@ static inline void spl_dual_it_next(spl_dual_it_object *intern, int do_free TSRM SPL_METHOD(dual_it, rewind) { spl_dual_it_object *intern; - - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); if (zend_parse_parameters_none() == FAILURE) { return; } + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); + spl_dual_it_rewind(intern TSRMLS_CC); spl_dual_it_fetch(intern, 1 TSRMLS_CC); } /* }}} */ @@ -1640,7 +1659,7 @@ SPL_METHOD(dual_it, valid) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); RETURN_BOOL(intern->current.data); } /* }}} */ @@ -1661,7 +1680,7 @@ SPL_METHOD(dual_it, key) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (intern->current.data) { if (intern->current.key_type == HASH_KEY_IS_STRING) { @@ -1689,7 +1708,7 @@ SPL_METHOD(dual_it, current) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (intern->current.data) { RETVAL_ZVAL(intern->current.data, 1, 0); @@ -1710,7 +1729,7 @@ SPL_METHOD(dual_it, next) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_dual_it_next(intern, 1 TSRMLS_CC); spl_dual_it_fetch(intern, 1 TSRMLS_CC); @@ -1759,7 +1778,7 @@ SPL_METHOD(FilterIterator, rewind) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_filter_it_rewind(getThis(), intern TSRMLS_CC); } /* }}} */ @@ -1773,7 +1792,7 @@ SPL_METHOD(FilterIterator, next) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_filter_it_next(getThis(), intern TSRMLS_CC); } /* }}} */ @@ -1795,7 +1814,7 @@ SPL_METHOD(RecursiveFilterIterator, hasChildren) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval); if (retval) { @@ -1816,7 +1835,7 @@ SPL_METHOD(RecursiveFilterIterator, getChildren) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); if (!EG(exception) && retval) { @@ -1846,7 +1865,7 @@ SPL_METHOD(RegexIterator, __construct) Match (string)current() against regular expression */ SPL_METHOD(RegexIterator, accept) { - spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + spl_dual_it_object *intern; char *subject, tmp[32], *result; int subject_len, use_copy, count = 0, result_len; zval subject_copy, zcount, *replacement; @@ -1855,6 +1874,8 @@ SPL_METHOD(RegexIterator, accept) return; } + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); + if (intern->current.data == NULL) { RETURN_FALSE; } @@ -1946,12 +1967,14 @@ SPL_METHOD(RegexIterator, accept) Returns current operation mode */ SPL_METHOD(RegexIterator, getMode) { - spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + spl_dual_it_object *intern; if (zend_parse_parameters_none() == FAILURE) { return; } + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); + RETURN_LONG(intern->u.regex.mode); } /* }}} */ @@ -1959,7 +1982,7 @@ SPL_METHOD(RegexIterator, getMode) Set new operation mode */ SPL_METHOD(RegexIterator, setMode) { - spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + spl_dual_it_object *intern; long mode; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &mode) == FAILURE) { @@ -1970,6 +1993,8 @@ SPL_METHOD(RegexIterator, setMode) zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Illegal mode %ld", mode); return;/* NULL */ } + + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); intern->u.regex.mode = mode; } /* }}} */ @@ -1978,12 +2003,14 @@ SPL_METHOD(RegexIterator, setMode) Returns current operation flags */ SPL_METHOD(RegexIterator, getFlags) { - spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + spl_dual_it_object *intern; if (zend_parse_parameters_none() == FAILURE) { return; } + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); + RETURN_LONG(intern->u.regex.flags); } /* }}} */ @@ -1991,12 +2018,14 @@ SPL_METHOD(RegexIterator, getFlags) Set operation flags */ SPL_METHOD(RegexIterator, setFlags) { - spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + spl_dual_it_object *intern; long flags; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &flags) == FAILURE) { return; } + + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); intern->u.regex.flags = flags; } /* }}} */ @@ -2005,11 +2034,13 @@ SPL_METHOD(RegexIterator, setFlags) Returns current PREG flags (if in use or NULL) */ SPL_METHOD(RegexIterator, getPregFlags) { - spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + spl_dual_it_object *intern; if (zend_parse_parameters_none() == FAILURE) { return; } + + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (intern->u.regex.use_flags) { RETURN_LONG(intern->u.regex.preg_flags); @@ -2022,12 +2053,14 @@ SPL_METHOD(RegexIterator, getPregFlags) Set PREG flags */ SPL_METHOD(RegexIterator, setPregFlags) { - spl_dual_it_object *intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + spl_dual_it_object *intern; long preg_flags; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &preg_flags) == FAILURE) { return; } + + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); intern->u.regex.preg_flags = preg_flags; intern->u.regex.use_flags = 1; @@ -2051,7 +2084,7 @@ SPL_METHOD(RecursiveRegexIterator, getChildren) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); if (!EG(exception)) { @@ -2156,7 +2189,7 @@ static const zend_function_entry spl_funcs_FilterIterator[] = { SPL_ME(FilterIterator, next, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(dual_it, getInnerIterator, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ABSTRACT_ME(FilterIterator, accept, arginfo_recursive_it_void) - {NULL, NULL, NULL} + PHP_FE_END }; ZEND_BEGIN_ARG_INFO(arginfo_parent_it___construct, 0) @@ -2167,13 +2200,13 @@ static const zend_function_entry spl_funcs_RecursiveFilterIterator[] = { SPL_ME(RecursiveFilterIterator, __construct, arginfo_parent_it___construct, ZEND_ACC_PUBLIC) SPL_ME(RecursiveFilterIterator, hasChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(RecursiveFilterIterator, getChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; static const zend_function_entry spl_funcs_ParentIterator[] = { SPL_ME(ParentIterator, __construct, arginfo_parent_it___construct, ZEND_ACC_PUBLIC) SPL_MA(ParentIterator, accept, RecursiveFilterIterator, hasChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; #if HAVE_PCRE || HAVE_BUNDLED_PCRE @@ -2206,7 +2239,7 @@ static const zend_function_entry spl_funcs_RegexIterator[] = { SPL_ME(RegexIterator, setFlags, arginfo_regex_it_set_flags, ZEND_ACC_PUBLIC) SPL_ME(RegexIterator, getPregFlags, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(RegexIterator, setPregFlags, arginfo_regex_it_set_preg_flags, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; ZEND_BEGIN_ARG_INFO_EX(arginfo_rec_regex_it___construct, 0, 0, 2) @@ -2221,7 +2254,7 @@ static const zend_function_entry spl_funcs_RecursiveRegexIterator[] = { SPL_ME(RecursiveRegexIterator, __construct, arginfo_rec_regex_it___construct, ZEND_ACC_PUBLIC) SPL_ME(RecursiveFilterIterator, hasChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(RecursiveRegexIterator, getChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; #endif @@ -2288,7 +2321,7 @@ SPL_METHOD(LimitIterator, rewind) { spl_dual_it_object *intern; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_dual_it_rewind(intern TSRMLS_CC); spl_limit_it_seek(intern, intern->u.limit.offset TSRMLS_CC); } /* }}} */ @@ -2299,7 +2332,7 @@ SPL_METHOD(LimitIterator, valid) { spl_dual_it_object *intern; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); /* RETURN_BOOL(spl_limit_it_valid(intern TSRMLS_CC) == SUCCESS);*/ RETURN_BOOL((intern->u.limit.count == -1 || intern->current.pos < intern->u.limit.offset + intern->u.limit.count) && intern->current.data); @@ -2311,7 +2344,7 @@ SPL_METHOD(LimitIterator, next) { spl_dual_it_object *intern; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_dual_it_next(intern, 1 TSRMLS_CC); if (intern->u.limit.count == -1 || intern->current.pos < intern->u.limit.offset + intern->u.limit.count) { @@ -2330,7 +2363,7 @@ SPL_METHOD(LimitIterator, seek) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_limit_it_seek(intern, pos TSRMLS_CC); RETURN_LONG(intern->current.pos); } /* }}} */ @@ -2340,7 +2373,7 @@ SPL_METHOD(LimitIterator, seek) SPL_METHOD(LimitIterator, getPosition) { spl_dual_it_object *intern; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); RETURN_LONG(intern->current.pos); } /* }}} */ @@ -2350,7 +2383,7 @@ ZEND_END_ARG_INFO(); static const zend_function_entry spl_funcs_SeekableIterator[] = { SPL_ABSTRACT_ME(SeekableIterator, seek, arginfo_seekable_it_seek) - {NULL, NULL, NULL} + PHP_FE_END }; ZEND_BEGIN_ARG_INFO_EX(arginfo_limit_it___construct, 0, 0, 1) @@ -2373,7 +2406,7 @@ static const zend_function_entry spl_funcs_LimitIterator[] = { SPL_ME(LimitIterator, seek, arginfo_limit_it_seek, ZEND_ACC_PUBLIC) SPL_ME(LimitIterator, getPosition, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(dual_it, getInnerIterator, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; static inline int spl_caching_it_valid(spl_dual_it_object *intern TSRMLS_DC) @@ -2495,7 +2528,7 @@ SPL_METHOD(CachingIterator, rewind) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_caching_it_rewind(intern TSRMLS_CC); } /* }}} */ @@ -2510,7 +2543,7 @@ SPL_METHOD(CachingIterator, valid) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); RETURN_BOOL(spl_caching_it_valid(intern TSRMLS_CC) == SUCCESS); } /* }}} */ @@ -2525,7 +2558,7 @@ SPL_METHOD(CachingIterator, next) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_caching_it_next(intern TSRMLS_CC); } /* }}} */ @@ -2540,7 +2573,7 @@ SPL_METHOD(CachingIterator, hasNext) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); RETURN_BOOL(spl_caching_it_has_next(intern TSRMLS_CC) == SUCCESS); } /* }}} */ @@ -2551,7 +2584,7 @@ SPL_METHOD(CachingIterator, __toString) { spl_dual_it_object *intern; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (!(intern->u.caching.flags & (CIT_CALL_TOSTRING|CIT_TOSTRING_USE_KEY|CIT_TOSTRING_USE_CURRENT|CIT_TOSTRING_USE_INNER))) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not fetch string value (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name); @@ -2586,7 +2619,7 @@ SPL_METHOD(CachingIterator, offsetSet) uint nKeyLength; zval *value; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (!(intern->u.caching.flags & CIT_FULL_CACHE)) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name); @@ -2611,7 +2644,7 @@ SPL_METHOD(CachingIterator, offsetGet) uint nKeyLength; zval **value; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (!(intern->u.caching.flags & CIT_FULL_CACHE)) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name); @@ -2639,7 +2672,7 @@ SPL_METHOD(CachingIterator, offsetUnset) char *arKey; uint nKeyLength; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (!(intern->u.caching.flags & CIT_FULL_CACHE)) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name); @@ -2662,7 +2695,7 @@ SPL_METHOD(CachingIterator, offsetExists) char *arKey; uint nKeyLength; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (!(intern->u.caching.flags & CIT_FULL_CACHE)) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%s does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name); @@ -2687,7 +2720,7 @@ SPL_METHOD(CachingIterator, getCache) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (!(intern->u.caching.flags & CIT_FULL_CACHE)) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%v does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name); @@ -2708,7 +2741,7 @@ SPL_METHOD(CachingIterator, getFlags) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); RETURN_LONG(intern->u.caching.flags); } @@ -2721,7 +2754,7 @@ SPL_METHOD(CachingIterator, setFlags) spl_dual_it_object *intern; long flags; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &flags) == FAILURE) { return; @@ -2757,7 +2790,7 @@ SPL_METHOD(CachingIterator, count) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (!(intern->u.caching.flags & CIT_FULL_CACHE)) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%v does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name); @@ -2804,7 +2837,7 @@ static const zend_function_entry spl_funcs_CachingIterator[] = { SPL_ME(CachingIterator, offsetExists, arginfo_caching_it_offsetGet, ZEND_ACC_PUBLIC) SPL_ME(CachingIterator, getCache, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(CachingIterator, count, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* {{{ proto void RecursiveCachingIterator::__construct(RecursiveIterator it [, flags = CIT_CALL_TOSTRING]) @@ -2824,7 +2857,7 @@ SPL_METHOD(RecursiveCachingIterator, hasChildren) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); RETURN_BOOL(intern->u.caching.zchildren); } /* }}} */ @@ -2839,7 +2872,7 @@ SPL_METHOD(RecursiveCachingIterator, getChildren) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (intern->u.caching.zchildren) { RETURN_ZVAL(intern->u.caching.zchildren, 1, 0); @@ -2857,7 +2890,7 @@ static const zend_function_entry spl_funcs_RecursiveCachingIterator[] = { SPL_ME(RecursiveCachingIterator, __construct, arginfo_caching_rec_it___construct, ZEND_ACC_PUBLIC) SPL_ME(RecursiveCachingIterator, hasChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(RecursiveCachingIterator, getChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* {{{ proto void IteratorIterator::__construct(Traversable it) @@ -2879,7 +2912,7 @@ static const zend_function_entry spl_funcs_IteratorIterator[] = { SPL_ME(dual_it, current, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(dual_it, next, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(dual_it, getInnerIterator, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* {{{ proto void NoRewindIterator::__construct(Iterator it) @@ -2909,7 +2942,7 @@ SPL_METHOD(NoRewindIterator, valid) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); RETURN_BOOL(intern->inner.iterator->funcs->valid(intern->inner.iterator TSRMLS_CC) == SUCCESS); } /* }}} */ @@ -2923,7 +2956,7 @@ SPL_METHOD(NoRewindIterator, key) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (intern->inner.iterator->funcs->get_current_key) { char *str_key; @@ -2955,7 +2988,7 @@ SPL_METHOD(NoRewindIterator, current) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); intern->inner.iterator->funcs->get_current_data(intern->inner.iterator, &data TSRMLS_CC); if (data && *data) { RETURN_ZVAL(*data, 1, 0); @@ -2972,7 +3005,7 @@ SPL_METHOD(NoRewindIterator, next) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); intern->inner.iterator->funcs->move_forward(intern->inner.iterator TSRMLS_CC); } /* }}} */ @@ -2988,7 +3021,7 @@ static const zend_function_entry spl_funcs_NoRewindIterator[] = { SPL_ME(NoRewindIterator, current, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(NoRewindIterator, next, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(dual_it, getInnerIterator, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* {{{ proto void InfiniteIterator::__construct(Iterator it) @@ -3008,7 +3041,7 @@ SPL_METHOD(InfiniteIterator, next) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_dual_it_next(intern, 1 TSRMLS_CC); if (spl_dual_it_valid(intern TSRMLS_CC) == SUCCESS) { @@ -3024,7 +3057,7 @@ SPL_METHOD(InfiniteIterator, next) static const zend_function_entry spl_funcs_InfiniteIterator[] = { SPL_ME(InfiniteIterator, __construct, arginfo_norewind_it___construct, ZEND_ACC_PUBLIC) SPL_ME(InfiniteIterator, next, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; /* {{{ proto void EmptyIterator::rewind() @@ -3081,7 +3114,7 @@ static const zend_function_entry spl_funcs_EmptyIterator[] = { SPL_ME(EmptyIterator, key, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, current, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, next, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; int spl_append_it_next_iterator(spl_dual_it_object *intern TSRMLS_DC) /* {{{*/ @@ -3147,9 +3180,7 @@ SPL_METHOD(AppendIterator, append) spl_dual_it_object *intern; zval *it; - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - - APPENDIT_CHECK_CTOR(intern); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "O", &it, zend_ce_iterator) == FAILURE) { return; @@ -3177,7 +3208,7 @@ SPL_METHOD(AppendIterator, rewind) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); intern->u.append.iterator->funcs->rewind(intern->u.append.iterator TSRMLS_CC); if (spl_append_it_next_iterator(intern TSRMLS_CC) == SUCCESS) { @@ -3195,7 +3226,7 @@ SPL_METHOD(AppendIterator, valid) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); RETURN_BOOL(intern->current.data); } /* }}} */ @@ -3210,7 +3241,7 @@ SPL_METHOD(AppendIterator, next) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); spl_append_it_next(intern TSRMLS_CC); } /* }}} */ @@ -3225,7 +3256,7 @@ SPL_METHOD(AppendIterator, getIteratorIndex) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); APPENDIT_CHECK_CTOR(intern); spl_array_iterator_key(intern->u.append.zarrayit, return_value TSRMLS_CC); @@ -3241,9 +3272,8 @@ SPL_METHOD(AppendIterator, getArrayIterator) return; } - intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); - APPENDIT_CHECK_CTOR(intern); RETURN_ZVAL(intern->u.append.zarrayit, 1, 0); } /* }}} */ @@ -3262,7 +3292,7 @@ static const zend_function_entry spl_funcs_AppendIterator[] = { SPL_ME(dual_it, getInnerIterator, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(AppendIterator, getIteratorIndex, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(AppendIterator, getArrayIterator, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_FE_END }; PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser TSRMLS_DC) @@ -3276,6 +3306,7 @@ PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, v goto done; } + iter->index = 0; if (iter->funcs->rewind) { iter->funcs->rewind(iter TSRMLS_CC); if (EG(exception)) { @@ -3290,6 +3321,7 @@ PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, v if (apply_func(iter, puser TSRMLS_CC) == ZEND_HASH_APPLY_STOP || EG(exception)) { goto done; } + iter->index++; iter->funcs->move_forward(iter TSRMLS_CC); if (EG(exception)) { goto done; @@ -3452,12 +3484,12 @@ PHP_FUNCTION(iterator_apply) static const zend_function_entry spl_funcs_OuterIterator[] = { SPL_ABSTRACT_ME(OuterIterator, getInnerIterator, arginfo_recursive_it_void) - {NULL, NULL, NULL} + PHP_FE_END }; static const zend_function_entry spl_funcs_Countable[] = { SPL_ABSTRACT_ME(Countable, count, arginfo_recursive_it_void) - {NULL, NULL, NULL} + PHP_FE_END }; /* {{{ PHP_MINIT_FUNCTION(spl_iterators) diff --git a/ext/spl/tests/DirectoryIterator_getGroup_basic.phpt b/ext/spl/tests/DirectoryIterator_getGroup_basic.phpt index 58387ccce..9cc9fadbe 100644 --- a/ext/spl/tests/DirectoryIterator_getGroup_basic.phpt +++ b/ext/spl/tests/DirectoryIterator_getGroup_basic.phpt @@ -8,23 +8,19 @@ Daniel Londero <daniel.londero@gmail.com> Francesco Trucchia <ft@ideato.it> Jacopo Romei <jacopo@sviluppoagile.it> #Test Fest Cesena (Italy) on 2009-06-20
---SKIPIF--
-<?php
-if (substr(PHP_OS, 0, 3) == 'WIN') die("skip this test not for Windows platforms");
-?>
--FILE--
<?php
- -shell_exec('mkdir test_dir_ptfi'); -$dir = new DirectoryIterator('test_dir_ptfi'); -$result = shell_exec('ls -lnd test_dir_ptfi | cut -d" " -f 4'); - -var_dump($dir->getGroup() == $result); - +$dirname = 'DirectoryIterator_getGroup_basic'; +mkdir($dirname); +$dir = new DirectoryIterator($dirname); +$expected = filegroup($dirname); +$actual = $dir->getGroup(); +var_dump($expected == $actual); ?> --CLEAN-- <?php -rmdir('test_dir_ptfi'); +$dirname = 'DirectoryIterator_getGroup_basic'; +rmdir($dirname); ?>
--EXPECTF--
bool(true) diff --git a/ext/spl/tests/DirectoryIterator_getOwner_basic.phpt b/ext/spl/tests/DirectoryIterator_getOwner_basic.phpt index e342dcdb6..c5e9f7c2c 100644 --- a/ext/spl/tests/DirectoryIterator_getOwner_basic.phpt +++ b/ext/spl/tests/DirectoryIterator_getOwner_basic.phpt @@ -1,29 +1,26 @@ ---TEST--
-SPL: Spl Directory Iterator test getOwner
---CREDITS--
+--TEST-- +SPL: DirectoryIterator test getOwner +--CREDITS-- Cesare D'Amico <cesare.damico@gruppovolta.it> Andrea Giorgini <agiorg@gmail.com> Filippo De Santis <fd@ideato.it> Daniel Londero <daniel.londero@gmail.com> Francesco Trucchia <ft@ideato.it> Jacopo Romei <jacopo@sviluppoagile.it> -#Test Fest Cesena (Italy) on 2009-06-20
---SKIPIF--
-<?php
-if (substr(PHP_OS, 0, 3) == 'WIN') die("skip this test not for Windows platforms");
-?>
---FILE--
-<?php
- -shell_exec('mkdir test_dir_ptfi'); -$dir = new DirectoryIterator('test_dir_ptfi'); -$result = shell_exec('ls -lnd test_dir_ptfi | cut -d" " -f 3'); -var_dump($dir->getOwner() == $result); - +#Test Fest Cesena (Italy) on 2009-06-20 +--FILE-- +<?php +$dirname = 'DirectoryIterator_getOwner_basic'; +mkdir($dirname); +$dir = new DirectoryIterator($dirname); +$expected = fileowner($dirname); +$actual = $dir->getOwner(); +var_dump($expected == $actual); ?> --CLEAN-- <?php -rmdir('test_dir_ptfi'); -?>
---EXPECTF--
+$dirname = 'DirectoryIterator_getOwner_basic'; +rmdir($dirname); +?> +--EXPECTF-- bool(true) diff --git a/ext/spl/tests/SplFileInfo_getGroup_basic.phpt b/ext/spl/tests/SplFileInfo_getGroup_basic.phpt index 7b0528d7d..c5808c57d 100644 --- a/ext/spl/tests/SplFileInfo_getGroup_basic.phpt +++ b/ext/spl/tests/SplFileInfo_getGroup_basic.phpt @@ -1,30 +1,26 @@ ---TEST--
-SPL: Spl File Info test getGroup
---CREDITS--
+--TEST-- +SPL: SplFileInfo test getGroup +--CREDITS-- Cesare D'Amico <cesare.damico@gruppovolta.it> Andrea Giorgini <agiorg@gmail.com> Filippo De Santis <fd@ideato.it> Daniel Londero <daniel.londero@gmail.com> Francesco Trucchia <ft@ideato.it> Jacopo Romei <jacopo@sviluppoagile.it> -#Test Fest Cesena (Italy) on 2009-06-20
---SKIPIF--
-<?php
-if (substr(PHP_OS, 0, 3) == 'WIN') die("skip this test not for Windows platforms");
-?>
---FILE--
-<?php
- -//file -touch ('test_file_ptfi'); -$fileInfo = new SplFileInfo('test_file_ptfi'); -$result = shell_exec('ls -ln test_file_ptfi | cut -d" " -f 4'); -var_dump($fileInfo->getGroup() == $result); - +#Test Fest Cesena (Italy) on 2009-06-20 +--FILE-- +<?php +$filename = basename(__FILE__, 'phpt').'tmp'; +touch($filename); +$fileInfo = new SplFileInfo($filename); +$expected = filegroup($filename); +$actual = $fileInfo->getGroup(); +var_dump($expected == $actual); ?> --CLEAN-- <?php -unlink('test_file_ptfi'); -?>
---EXPECTF--
+$filename = basename(__FILE__, 'phpt').'tmp'; +unlink($filename); +?> +--EXPECTF-- bool(true) diff --git a/ext/spl/tests/SplFileInfo_getOwner_basic.phpt b/ext/spl/tests/SplFileInfo_getOwner_basic.phpt index 50f79430c..790dcc69b 100644 --- a/ext/spl/tests/SplFileInfo_getOwner_basic.phpt +++ b/ext/spl/tests/SplFileInfo_getOwner_basic.phpt @@ -1,30 +1,26 @@ ---TEST--
-SPL: Spl File Info test getOwner
---CREDITS--
+--TEST-- +SPL: SplFileInfo test getOwner +--CREDITS-- Cesare D'Amico <cesare.damico@gruppovolta.it> Andrea Giorgini <agiorg@gmail.com> Filippo De Santis <fd@ideato.it> Daniel Londero <daniel.londero@gmail.com> Francesco Trucchia <ft@ideato.it> Jacopo Romei <jacopo@sviluppoagile.it> -#Test Fest Cesena (Italy) on 2009-06-20
---SKIPIF--
-<?php
-if (substr(PHP_OS, 0, 3) == 'WIN') die("skip this test not for Windows platforms");
-?>
---FILE--
-<?php
- -//file -touch ('test_file_ptfi'); -$fileInfo = new SplFileInfo('test_file_ptfi'); -$result = shell_exec('ls -ln test_file_ptfi | cut -d" " -f 3'); -var_dump($fileInfo->getOwner() == $result); - +#Test Fest Cesena (Italy) on 2009-06-20 +--FILE-- +<?php +$filename = basename(__FILE__, 'phpt').'tmp'; +touch($filename); +$fileInfo = new SplFileInfo($filename); +$expected = fileowner($filename); +$actual = $fileInfo->getOwner(); +var_dump($expected == $actual); ?> --CLEAN-- <?php -unlink('test_file_ptfi'); -?>
---EXPECTF--
+$filename = basename(__FILE__, 'phpt').'tmp'; +unlink($filename); +?> +--EXPECTF-- bool(true) diff --git a/ext/spl/tests/bug54281.phpt b/ext/spl/tests/bug54281.phpt new file mode 100644 index 000000000..d42d9e585 --- /dev/null +++ b/ext/spl/tests/bug54281.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #54281 (Crash in spl_recursive_it_rewind_ex) +--FILE-- +<?php + +class RecursiveArrayIteratorIterator extends RecursiveIteratorIterator { + function __construct($it, $max_depth) { } +} +$it = new RecursiveArrayIteratorIterator(new RecursiveArrayIterator(array()), 2); + +foreach($it as $k=>$v) { } + +?> +--EXPECTF-- +Fatal error: RecursiveIteratorIterator::rewind(): The RecursiveArrayIteratorIterator instance wasn't initialized properly in %s on line %d diff --git a/ext/spl/tests/bug54291.phpt b/ext/spl/tests/bug54291.phpt new file mode 100644 index 000000000..b8f596e02 --- /dev/null +++ b/ext/spl/tests/bug54291.phpt @@ -0,0 +1,13 @@ +--TEST-- +Bug #54291 (Crash iterating DirectoryIterator for dir name starting with \0) +--FILE-- +<?php +$dir = new DirectoryIterator("\x00/abc"); +$dir->isFile(); +--EXPECTF-- +Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Failed to open directory ""' in %s:%d +Stack trace: +#0 %s(%d): DirectoryIterator->__construct('?/abc') +#1 {main} + thrown in %s on line %d + diff --git a/ext/spl/tests/bug54292.phpt b/ext/spl/tests/bug54292.phpt new file mode 100644 index 000000000..d9175f7e6 --- /dev/null +++ b/ext/spl/tests/bug54292.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #54292 (Wrong parameter causes crash in SplFileObject::__construct()) +--FILE-- +<?php + +try { + new SplFileObject('foo', array()); +} catch (Exception $e) { + var_dump($e->getMessage()); +} + +?> +--EXPECTF-- +string(74) "SplFileObject::__construct() expects parameter 2 to be string, array given" diff --git a/ext/spl/tests/bug54384.phpt b/ext/spl/tests/bug54384.phpt new file mode 100644 index 000000000..a1ce7edff --- /dev/null +++ b/ext/spl/tests/bug54384.phpt @@ -0,0 +1,171 @@ +--TEST-- +Bug #54384: Several SPL classes crash when the parent constructor is not called +--FILE-- +<?php + +function test($f) { + try { + $f(); + echo "ran normally (unexpected)\n\n"; + } catch (LogicException $e) { + echo "exception (expected)\n"; + } +} + +echo "IteratorIterator... "; +class IteratorIteratorTest extends IteratorIterator { + function __construct(){} +} +test( function() { + $o = new IteratorIteratorTest; + $o->rewind(); +} ); + +echo "FilterIterator... "; +class FilterIteratorTest extends FilterIterator { + function __construct(){} + function accept(){} +} +test( function() { + $o = new FilterIteratorTest; + $o->rewind(); +} ); + +echo "RecursiveFilterIterator... "; +class RecursiveFilterIteratorTest extends RecursiveFilterIterator { + function __construct(){} + function accept(){} +} +test( function() { +$o = new RecursiveFilterIteratorTest; +$o->hasChildren(); +} ); + +echo "ParentIterator... "; +class ParentIteratorTest extends ParentIterator { + function __construct(){} +} +test ( function() { +$o = new ParentIteratorTest; +$o->accept(); +} ); + +echo "LimitIterator... "; +class LimitIteratorTest extends LimitIterator { + function __construct(){} +} +test ( function() { +$o = new LimitIteratorTest; +$o->rewind(); +} ); + +echo "CachingIterator... "; +class CachingIteratorTest extends CachingIterator { + function __construct(){} +} +test ( function() { +$o = new CachingIteratorTest; +$o->rewind(); +} ); + +echo "RecursiveCachingIterator... "; +class RecursiveCachingIteratorTest extends RecursiveCachingIterator { + function __construct(){} +} +test ( function() { +$o = new RecursiveCachingIteratorTest; +$o->rewind(); +} ); + +echo "NoRewindIterator... "; +class NoRewindIteratorTest extends NoRewindIterator { + function __construct(){} +} +test ( function() { +$o = new NoRewindIteratorTest; +$o->valid(); +} ); + +echo "RegexIterator... "; +class RegexIteratorTest extends RegexIterator { + function __construct(){} +} +test ( function() { +$o = new RegexIteratorTest; +$o->rewind(); +} ); + +echo "RecursiveRegexIterator... "; +class RecursiveRegexIteratorTest extends RecursiveRegexIterator { + function __construct(){} +} +test ( function() { +$o = new RecursiveRegexIteratorTest; +$o->hasChildren(); +} ); + +echo "GlobIterator... "; +class GlobIteratorTest extends GlobIterator { + function __construct(){} +} +test ( function() { +$o = new GlobIteratorTest; +$o->count(); +} ); + +echo "SplFileObject... "; +class SplFileObjectTest extends SplFileObject { + function __construct(){} +} +test ( function() { +$o = new SplFileObjectTest; +$o->rewind(); +} ); + +echo "SplTempFileObject... "; +class SplTempFileObjectTest extends SplTempFileObject { + function __construct(){} +} +test ( function() { +$o = new SplTempFileObjectTest; +$o->rewind(); +} ); + +echo "AppendIterator... "; +class AppendIteratorTest extends AppendIterator { + function __construct(){} +} +test ( function() { +$o = new AppendIteratorTest; +foreach ($o as $a) { +echo $a,"\n"; +} +} ); + +echo "InfiniteIterator... "; +class InfiniteIteratorTest extends InfiniteIterator { + function __construct(){} +} +test ( function() { +$o = new InfiniteIteratorTest; +foreach ($o as $a) { +echo $a,"\n"; +} +} ); + +--EXPECT-- +IteratorIterator... exception (expected) +FilterIterator... exception (expected) +RecursiveFilterIterator... exception (expected) +ParentIterator... exception (expected) +LimitIterator... exception (expected) +CachingIterator... exception (expected) +RecursiveCachingIterator... exception (expected) +NoRewindIterator... exception (expected) +RegexIterator... exception (expected) +RecursiveRegexIterator... exception (expected) +GlobIterator... exception (expected) +SplFileObject... exception (expected) +SplTempFileObject... exception (expected) +AppendIterator... exception (expected) +InfiniteIterator... exception (expected) diff --git a/ext/spl/tests/bug54970.phpt b/ext/spl/tests/bug54970.phpt new file mode 100644 index 000000000..62b1eedb5 --- /dev/null +++ b/ext/spl/tests/bug54970.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #54970 (SplFixedArray::setSize() isn't resizing) +--FILE-- +<?php + +$fa = new SplFixedArray(2); +$fa[0] = 'Hello'; +$fa[1] = 'World'; +$fa->setSize(3); +$fa[2] = '!'; +var_dump($fa); +$fa->setSize(2); +var_dump($fa); +var_dump($fa->getSize()); + + +?> +--EXPECTF-- +object(SplFixedArray)#%d (3) { + [0]=> + string(5) "Hello" + [1]=> + string(5) "World" + [2]=> + string(1) "!" +} +object(SplFixedArray)#%d (2) { + [0]=> + string(5) "Hello" + [1]=> + string(5) "World" +} +int(2) diff --git a/ext/spl/tests/bug54971.phpt b/ext/spl/tests/bug54971.phpt new file mode 100644 index 000000000..166613b43 --- /dev/null +++ b/ext/spl/tests/bug54971.phpt @@ -0,0 +1,45 @@ +--TEST-- +Bug #54971 (Wrong result when using iterator_to_array with use_keys on true) +--FILE-- +<?php + +$source = <<<XML +<root> +<node>val1</node> +<node>val2</node> +</root> +XML; + + +$doc = new DOMDocument(); +$doc->loadXML($source); + +$xpath = new DOMXPath($doc); +$items = $xpath->query('//node'); + +print_r(iterator_to_array($items, false)); +print_r(iterator_to_array($items, true)); +?> +--EXPECT-- +Array +( + [0] => DOMElement Object + ( + ) + + [1] => DOMElement Object + ( + ) + +) +Array +( + [0] => DOMElement Object + ( + ) + + [1] => DOMElement Object + ( + ) + +) diff --git a/ext/spl/tests/iterator_031.phpt b/ext/spl/tests/iterator_031.phpt index 458f071b7..40342f4bb 100755 --- a/ext/spl/tests/iterator_031.phpt +++ b/ext/spl/tests/iterator_031.phpt @@ -56,7 +56,7 @@ try { $ap->append($it); } -catch(BadMethodCallException $e) +catch(LogicException $e) { echo $e->getMessage() . "\n"; } @@ -90,7 +90,7 @@ MyArrayIterator::rewind 1=>2 MyAppendIterator::__construct MyAppendIterator::append -Classes derived from AppendIterator must call AppendIterator::__construct() +The object is in an invalid state as the parent constructor was not called AppendIterator::getIterator() must be called exactly once per instance MyAppendIterator::append MyArrayIterator::rewind |
