[PHP-CVS] cvs: php-src(PHP_5_2) /ext/spl spl_iterators.c spl_iterators.h
helly Fri May 11 00:15:25 2007 UTC Modified files: (Branch: PHP_5_2) /php-src/ext/splspl_iterators.c spl_iterators.h Log: - MFH Add invert option to RegexIterator http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_iterators.c?r1=1.73.2.30.2.27r2=1.73.2.30.2.28diff_format=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.73.2.30.2.27 php-src/ext/spl/spl_iterators.c:1.73.2.30.2.28 --- php-src/ext/spl/spl_iterators.c:1.73.2.30.2.27 Sun Mar 4 14:01:06 2007 +++ php-src/ext/spl/spl_iterators.c Fri May 11 00:15:25 2007 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: spl_iterators.c,v 1.73.2.30.2.27 2007/03/04 14:01:06 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.73.2.30.2.28 2007/05/11 00:15:25 helly Exp $ */ #ifdef HAVE_CONFIG_H # include config.h @@ -1426,6 +1426,10 @@ } } + if (intern-u.regex.flags REGIT_INVERTED) { + RETVAL_BOOL(Z_LVAL_P(return_value)); + } + if (use_copy) { efree(subject); } http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_iterators.h?r1=1.18.2.7.2.11r2=1.18.2.7.2.12diff_format=u Index: php-src/ext/spl/spl_iterators.h diff -u php-src/ext/spl/spl_iterators.h:1.18.2.7.2.11 php-src/ext/spl/spl_iterators.h:1.18.2.7.2.12 --- php-src/ext/spl/spl_iterators.h:1.18.2.7.2.11 Thu Feb 8 22:17:40 2007 +++ php-src/ext/spl/spl_iterators.h Fri May 11 00:15:25 2007 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: spl_iterators.h,v 1.18.2.7.2.11 2007/02/08 22:17:40 helly Exp $ */ +/* $Id: spl_iterators.h,v 1.18.2.7.2.12 2007/05/11 00:15:25 helly Exp $ */ #ifndef SPL_ITERATORS_H #define SPL_ITERATORS_H @@ -94,6 +94,7 @@ enum { /* public */ REGIT_USE_KEY= 0x0001, + REGIT_INVERTED = 0x0002, }; typedef enum { -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] cvs: php-src(PHP_5_2) /ext/spl spl_iterators.c spl_iterators.h /ext/spl/tests iterator_042.phpt iterator_043.phpt iterator_044.phpt iterator_045.phpt iterator_046.phpt iterator_047.phpt ite
helly Sun May 21 18:13:37 2006 UTC Added files: (Branch: PHP_5_2) /php-src/ext/spl/tests iterator_042.phpt iterator_043.phpt iterator_044.phpt iterator_045.phpt iterator_046.phpt iterator_047.phpt iterator_048.phpt Modified files: /php-src/ext/splspl_iterators.c spl_iterators.h Log: - MFH . Make code exception safe . Make RecursiveRegexIterator::getChildren pass regex to inner ctor . Fix CachingIterator::__toString() in TOSTRING_USE_KEY mode . Add CachingIterator::getCache() . Add tests http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_iterators.c?r1=1.73.2.30.2.8r2=1.73.2.30.2.9diff_format=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.73.2.30.2.8 php-src/ext/spl/spl_iterators.c:1.73.2.30.2.9 --- php-src/ext/spl/spl_iterators.c:1.73.2.30.2.8 Sat May 20 21:01:42 2006 +++ php-src/ext/spl/spl_iterators.c Sun May 21 18:13:37 2006 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: spl_iterators.c,v 1.73.2.30.2.8 2006/05/20 21:01:42 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.73.2.30.2.9 2006/05/21 18:13:37 helly Exp $ */ #ifdef HAVE_CONFIG_H # include config.h @@ -193,6 +193,13 @@ switch (object-iterators[object-level].state) { case RS_NEXT: iterator-funcs-move_forward(iterator TSRMLS_CC); + if (EG(exception)) { + if (!(object-flags RIT_CATCH_GET_CHILD)) { + return; + } else { + zend_clear_exception(TSRMLS_C); + } + } case RS_START: if (iterator-funcs-valid(iterator TSRMLS_CC) == FAILURE) { break; @@ -207,6 +214,14 @@ } else { zend_call_method_with_0_params(zobject, ce, NULL, haschildren, retval); } + if (EG(exception)) { + if (!(object-flags RIT_CATCH_GET_CHILD)) { + object-iterators[object-level].state = RS_NEXT; + return; + } else { + zend_clear_exception(TSRMLS_C); + } + } if (retval) { has_children = zend_is_true(retval); zval_ptr_dtor(retval); @@ -235,6 +250,13 @@ zend_call_method_with_0_params(zthis, object-ce, object-nextElement, nextelement, NULL); } object-iterators[object-level].state = RS_NEXT; + if (EG(exception)) { + if (!(object-flags RIT_CATCH_GET_CHILD)) { + return; + } else { + zend_clear_exception(TSRMLS_C); + } + } return /* self */; case RS_SELF: if (object-nextElement (object-mode == RIT_SELF_FIRST || object-mode == RIT_CHILD_FIRST)) { @@ -292,6 +314,13 @@ } if (object-beginChildren) { zend_call_method_with_0_params(zthis, object-ce, object-beginChildren, beginchildren, NULL); + if (EG(exception)) { + if (!(object-flags RIT_CATCH_GET_CHILD)) { + return; + } else { + zend_clear_exception(TSRMLS_C); + } + } } goto next_step; } @@ -299,6 +328,13 @@ if (object-level 0) { if (object-endChildren) { zend_call_method_with_0_params(zthis, object-ce, object-endChildren, endchildren, NULL); +
[PHP-CVS] cvs: php-src(PHP_5_2) /ext/spl spl_iterators.c spl_iterators.h /ext/spl/tests iterator_041.phpt iterator_041a.phpt iterator_041b.phpt
helly Sat May 20 21:01:42 2006 UTC Added files: (Branch: PHP_5_2) /php-src/ext/spl/tests iterator_041.phpt iterator_041a.phpt iterator_041b.phpt Modified files: /php-src/ext/splspl_iterators.c spl_iterators.h Log: - MFH Sync with head fixes part of an issue with iterator_(to_array|count) http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_iterators.c?r1=1.73.2.30.2.7r2=1.73.2.30.2.8diff_format=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.73.2.30.2.7 php-src/ext/spl/spl_iterators.c:1.73.2.30.2.8 --- php-src/ext/spl/spl_iterators.c:1.73.2.30.2.7 Thu May 18 21:48:33 2006 +++ php-src/ext/spl/spl_iterators.c Sat May 20 21:01:42 2006 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: spl_iterators.c,v 1.73.2.30.2.7 2006/05/18 21:48:33 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.73.2.30.2.8 2006/05/20 21:01:42 helly Exp $ */ #ifdef HAVE_CONFIG_H # include config.h @@ -2372,63 +2372,100 @@ {NULL, NULL, NULL} }; -/* {{{ proto array iterator_to_array(Traversable it) - Copy the iterator into an array */ -PHP_FUNCTION(iterator_to_array) +PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser TSRMLS_DC) { - zval *obj, **data; zend_object_iterator *iter; - char *str_key; - uintstr_key_len; - ulong int_key; - int key_type; + zend_class_entry *ce = Z_OBJCE_P(obj); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, O, obj, zend_ce_traversable) == FAILURE) { - RETURN_FALSE; + iter = ce-get_iterator(ce, obj, 0 TSRMLS_CC); + + if (EG(exception)) { + goto done; } - - array_init(return_value); - - iter = Z_OBJCE_P(obj)-get_iterator(Z_OBJCE_P(obj), obj, 0 TSRMLS_CC); if (iter-funcs-rewind) { iter-funcs-rewind(iter TSRMLS_CC); + if (EG(exception)) { + goto done; + } } - if (EG(exception)) { - return; - } + while (iter-funcs-valid(iter TSRMLS_CC) == SUCCESS) { - iter-funcs-get_current_data(iter, data TSRMLS_CC); if (EG(exception)) { - return; + goto done; } - (*data)-refcount++; - if (iter-funcs-get_current_key) { - key_type = iter-funcs-get_current_key(iter, str_key, str_key_len, int_key TSRMLS_CC); - if (EG(exception)) { - return; - } - switch(key_type) { - case HASH_KEY_IS_STRING: - add_assoc_zval_ex(return_value, str_key, str_key_len, *data); - efree(str_key); - break; - case HASH_KEY_IS_LONG: - add_index_zval(return_value, int_key, *data); - break; - } - } else { - add_next_index_zval(return_value, *data); + if (apply_func(iter, puser TSRMLS_CC) == ZEND_HASH_APPLY_STOP || EG(exception)) { + goto done; } iter-funcs-move_forward(iter TSRMLS_CC); if (EG(exception)) { - return; + goto done; } } + +done: iter-funcs-dtor(iter TSRMLS_CC); + return EG(exception) ? FAILURE : SUCCESS; +} +/* }}} */ + +static int spl_iterator_to_array_apply(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ */ +{ + zval**data, *return_value = (zval*)puser; + char*str_key; + uintstr_key_len; + ulong int_key; + int key_type; + + iter-funcs-get_current_data(iter, data TSRMLS_CC); if (EG(exception)) { - return; + return ZEND_HASH_APPLY_STOP; + } + if (iter-funcs-get_current_key) { + key_type = iter-funcs-get_current_key(iter, str_key, str_key_len, int_key TSRMLS_CC); + if (EG(exception)) { + return ZEND_HASH_APPLY_STOP; + } + (*data)-refcount++; + switch(key_type) { + case HASH_KEY_IS_STRING: + add_assoc_zval_ex(return_value, str_key, str_key_len, *data); + efree(str_key); +
[PHP-CVS] cvs: php-src(PHP_5_2) /ext/spl spl_iterators.c spl_iterators.h /ext/spl/tests iterator_036.phpt iterator_037.phpt
helly Thu May 18 21:42:58 2006 UTC Added files: (Branch: PHP_5_2) /php-src/ext/spl/tests iterator_036.phpt iterator_037.phpt Modified files: /php-src/ext/splspl_iterators.c spl_iterators.h Log: - MFH Fixed CachingIterator issues with string conversion/__toString() Partly by adding new mode TOSTRING_USE_INNER http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_iterators.c?r1=1.73.2.30.2.5r2=1.73.2.30.2.6diff_format=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.73.2.30.2.5 php-src/ext/spl/spl_iterators.c:1.73.2.30.2.6 --- php-src/ext/spl/spl_iterators.c:1.73.2.30.2.5 Tue May 16 08:21:07 2006 +++ php-src/ext/spl/spl_iterators.c Thu May 18 21:42:58 2006 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: spl_iterators.c,v 1.73.2.30.2.5 2006/05/16 08:21:07 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.73.2.30.2.6 2006/05/18 21:42:58 helly Exp $ */ #ifdef HAVE_CONFIG_H # include config.h @@ -835,6 +835,18 @@ static inline int spl_dual_it_fetch(spl_dual_it_object *intern, int check_more TSRMLS_DC); +static inline int spl_cit_check_flags(int flags) +{ + int cnt = 0; + + cnt += (flags CIT_CALL_TOSTRING) ? 1 : 0; + cnt += (flags CIT_TOSTRING_USE_KEY) ? 1 : 0; + cnt += (flags CIT_TOSTRING_USE_CURRENT) ? 1 : 0; + cnt += (flags CIT_TOSTRING_USE_INNER) ? 1 : 0; + + return cnt = 1 ? SUCCESS : FAILURE; +} + static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *ce_base, zend_class_entry *ce_inner, dual_it_type dit_type) { zval *zobject, *retval; @@ -879,10 +891,9 @@ php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); return NULL; } - if (((flags CIT_CALL_TOSTRING) (flags (CIT_TOSTRING_USE_KEY|CIT_TOSTRING_USE_CURRENT))) - || ((flags (CIT_TOSTRING_USE_KEY|CIT_TOSTRING_USE_CURRENT)) == (CIT_TOSTRING_USE_KEY|CIT_TOSTRING_USE_CURRENT))) { + if (spl_cit_check_flags(flags) != SUCCESS) { php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); - zend_throw_exception(spl_ce_InvalidArgumentException, Flags must contain only one of CATCH_GET_CHILD, CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, 0 TSRMLS_CC); + zend_throw_exception(spl_ce_InvalidArgumentException, Flags must contain only one of CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_CURRENT, 0 TSRMLS_CC); return NULL; } intern-u.caching.flags |= flags CIT_PUBLIC; @@ -1661,8 +1672,9 @@ } if (intern-u.caching.flags CIT_CATCH_GET_CHILD) { zend_clear_exception(TSRMLS_C); + } else { + return; } - return; } else { INIT_PZVAL(zflags); ZVAL_LONG(zflags, intern-u.caching.flags CIT_PUBLIC); @@ -1670,49 +1682,26 @@ zval_ptr_dtor(zchildren); } } - zval_ptr_dtor(retval); + zval_ptr_dtor(retval); } - if (intern-u.caching.flags CIT_CALL_TOSTRING) { - if (Z_TYPE_P(intern-current.data) == IS_OBJECT) { - zval expr_copy; - if (intern-current.data-value.obj.handlers-cast_object - intern-current.data-value.obj.handlers-cast_object(intern-current.data, expr_copy, IS_STRING TSRMLS_CC) == SUCCESS) - { - ALLOC_ZVAL(intern-u.caching.zstr); - *intern-u.caching.zstr = expr_copy; - INIT_PZVAL(intern-u.caching.zstr); - zval_copy_ctor(intern-u.caching.zstr); - zval_dtor(expr_copy); - } else { - zend_class_entry *ce_data = spl_get_class_entry(intern-current.data TSRMLS_CC); - if (ce_data zend_hash_exists(ce_data-function_table, __tostring, sizeof(__tostring))) { -
[PHP-CVS] cvs: php-src(PHP_5_2) /ext/spl spl_iterators.c spl_iterators.h /ext/spl/tests iterator_029.phpt
andrei Wed May 10 16:50:58 2006 UTC Modified files: (Branch: PHP_5_2) /php-src/ext/splspl_iterators.c spl_iterators.h /php-src/ext/spl/tests iterator_029.phpt Log: Rename RegExIterator - RegexIterator. Also rename recursive one. http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_iterators.c?r1=1.73.2.30.2.2r2=1.73.2.30.2.3diff_format=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.73.2.30.2.2 php-src/ext/spl/spl_iterators.c:1.73.2.30.2.3 --- php-src/ext/spl/spl_iterators.c:1.73.2.30.2.2 Wed May 10 00:29:42 2006 +++ php-src/ext/spl/spl_iterators.c Wed May 10 16:50:57 2006 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: spl_iterators.c,v 1.73.2.30.2.2 2006/05/10 00:29:42 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.73.2.30.2.3 2006/05/10 16:50:57 andrei Exp $ */ #ifdef HAVE_CONFIG_H # include config.h @@ -55,8 +55,8 @@ PHPAPI zend_class_entry *spl_ce_InfiniteIterator; PHPAPI zend_class_entry *spl_ce_EmptyIterator; PHPAPI zend_class_entry *spl_ce_AppendIterator; -PHPAPI zend_class_entry *spl_ce_RegExIterator; -PHPAPI zend_class_entry *spl_ce_RecursiveRegExIterator; +PHPAPI zend_class_entry *spl_ce_RegexIterator; +PHPAPI zend_class_entry *spl_ce_RecursiveRegexIterator; zend_function_entry spl_funcs_RecursiveIterator[] = { SPL_ABSTRACT_ME(RecursiveIterator, hasChildren, NULL) @@ -933,8 +933,8 @@ php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); return intern; #if HAVE_PCRE || HAVE_BUNDLED_PCRE - case DIT_RegExIterator: - case DIT_RecursiveRegExIterator: { + case DIT_RegexIterator: + case DIT_RecursiveRegexIterator: { char *regex; int len, poptions, coptions; pcre_extra *extra = NULL; @@ -1280,16 +1280,16 @@ } /* }}} */ #if HAVE_PCRE || HAVE_BUNDLED_PCRE -/* {{{ proto void RegExIterator::__construct(Iterator it, string $regex [, int $flags]) - Create an RegExIterator from another iterator and a regular expression */ -SPL_METHOD(RegExIterator, __construct) +/* {{{ proto void RegexIterator::__construct(Iterator it, string $regex [, int $flags]) + Create an RegexIterator from another iterator and a regular expression */ +SPL_METHOD(RegexIterator, __construct) { - spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, spl_ce_RegExIterator, zend_ce_iterator, DIT_RegExIterator); + spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, spl_ce_RegexIterator, zend_ce_iterator, DIT_RegexIterator); } /* }}} */ -/* {{{ proto bool RegExIterator::accept() +/* {{{ proto bool RegexIterator::accept() Match (string)current() against regular expression */ -SPL_METHOD(RegExIterator, accept) +SPL_METHOD(RegexIterator, accept) { spl_dual_it_object *intern; int count; @@ -1330,11 +1330,11 @@ RETURN_BOOL(count = 0); } /* }}} */ -/* {{{ proto void RecursiveRegExIterator::__construct(RecursiveIterator it, string $regex [, int $flags]) - Create an RecursiveRegExIterator from another recursive iterator and a regular expression */ -SPL_METHOD(RecursiveRegExIterator, __construct) +/* {{{ proto void RecursiveRegexIterator::__construct(RecursiveIterator it, string $regex [, int $flags]) + Create an RecursiveRegexIterator from another recursive iterator and a regular expression */ +SPL_METHOD(RecursiveRegexIterator, __construct) { - spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, spl_ce_RecursiveRegExIterator, spl_ce_RecursiveIterator, DIT_RecursiveRegExIterator); + spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, spl_ce_RecursiveRegexIterator, spl_ce_RecursiveIterator, DIT_RecursiveRegexIterator); } /* }}} */ #endif @@ -1368,7 +1368,7 @@ } #if HAVE_PCRE || HAVE_BUNDLED_PCRE - if (object-dit_type == DIT_RegExIterator || object-dit_type == DIT_RecursiveRegExIterator) { + if (object-dit_type == DIT_RegexIterator || object-dit_type == DIT_RecursiveRegexIterator) { if (object-u.regex.pce) { object-u.regex.pce-refcount--; } @@ -1448,9 +1448,9 @@ ZEND_ARG_INFO(0, flags) ZEND_END_ARG_INFO(); -static zend_function_entry spl_funcs_RegExIterator[] = { - SPL_ME(RegExIterator, __construct, arginfo_regex_it___construct, ZEND_ACC_PUBLIC) - SPL_ME(RegExIterator, accept, NULL, ZEND_ACC_PUBLIC) +static zend_function_entry spl_funcs_RegexIterator[] = { + SPL_ME(RegexIterator, __construct, arginfo_regex_it___construct, ZEND_ACC_PUBLIC) + SPL_ME(RegexIterator, accept, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; @@ -1461,8 +1461,8 @@ ZEND_ARG_INFO(0, flags) ZEND_END_ARG_INFO(); -static zend_function_entry