helly Tue Feb 22 20:03:18 2005 EDT
Modified files:
/php-src/ext/spl spl_iterators.c
Log:
- Allow to convert traversable into Iterator
http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.62&r2=1.63&ty=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.62
php-src/ext/spl/spl_iterators.c:1.63
--- php-src/ext/spl/spl_iterators.c:1.62 Mon Jan 24 15:21:11 2005
+++ php-src/ext/spl/spl_iterators.c Tue Feb 22 20:03:16 2005
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_iterators.c,v 1.62 2005/01/24 20:21:11 helly Exp $ */
+/* $Id: spl_iterators.c,v 1.63 2005/02/23 01:03:16 helly Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -627,6 +627,7 @@
{
zval *zobject;
spl_dual_it_object *intern;
+ zend_class_entry *ce;
php_set_error_handling(EH_THROW, spl_ce_InvalidArgumentException
TSRMLS_CC);
@@ -664,14 +665,27 @@
break;
}
case DIT_IteratorIterator: {
- zend_class_entry *ce;
+ zend_class_entry **pce_cast;
+ char * class_name;
+ int class_name_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O", &zobject, ce_inner) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|s", &zobject, ce_inner, &class_name, &class_name_len) == FAILURE) {
php_set_error_handling(EH_NORMAL, NULL
TSRMLS_CC);
return NULL;
}
ce = Z_OBJCE_P(zobject);
if (!instanceof_function(ce, zend_ce_iterator
TSRMLS_CC)) {
+ if (ZEND_NUM_ARGS() > 1) {
+ if (zend_lookup_class(class_name,
class_name_len, &pce_cast TSRMLS_CC) == FAILURE
+ || !instanceof_function(ce, *pce_cast
TSRMLS_CC)
+ || !(*pce_cast)->get_iterator
+ ) {
+
zend_throw_exception(spl_ce_LogicException, "Class to downcast to not found or
not base class or does not implement Traversable", 0 TSRMLS_CC);
+
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+ return NULL;
+ }
+ ce = *pce_cast;
+ }
if (instanceof_function(ce, zend_ce_aggregate
TSRMLS_CC)) {
zval *retval;
zobject =
zend_call_method_with_0_params(&zobject, ce,
&ce->iterator_funcs.zf_new_iterator, "getiterator", &retval);
@@ -697,7 +711,7 @@
zobject->refcount++;
intern->inner.zobject = zobject;
- intern->inner.ce = Z_OBJCE_P(zobject);
+ intern->inner.ce = dit_type == DIT_IteratorIterator ? ce :
Z_OBJCE_P(zobject);
intern->inner.object = zend_object_store_get_object(zobject TSRMLS_CC);
intern->inner.iterator =
intern->inner.ce->get_iterator(intern->inner.ce, zobject TSRMLS_CC);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php