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

Reply via email to