helly           Sun Feb  5 23:31:47 2006 UTC

  Modified files:              
    /php-src/ext/spl    spl_iterators.c spl_directory.c spl_array.c 
    /php-src/ext/simplexml      simplexml.c 
    /pecl/pdo   php_pdo_int.h pdo_stmt.c 
    /php-src/ext/unicode        unicode_iterators.c 
  Log:
  - Iterator API was changed
  
  
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_iterators.c?r1=1.111&r2=1.112&diff_format=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.111 
php-src/ext/spl/spl_iterators.c:1.112
--- php-src/ext/spl/spl_iterators.c:1.111       Mon Jan 23 02:26:15 2006
+++ php-src/ext/spl/spl_iterators.c     Sun Feb  5 23:31:47 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_iterators.c,v 1.111 2006/01/23 02:26:15 helly Exp $ */
+/* $Id: spl_iterators.c,v 1.112 2006/02/05 23:31:47 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -278,7 +278,7 @@
                                        object->iterators[object->level].state 
= RS_NEXT;
                                }
                                object->iterators = erealloc(object->iterators, 
sizeof(spl_sub_iterator) * (++object->level+1));
-                               sub_iter = ce->get_iterator(ce, child 
TSRMLS_CC);
+                               sub_iter = ce->get_iterator(ce, child, 0 
TSRMLS_CC);
                                object->iterators[object->level].iterator = 
sub_iter;
                                object->iterators[object->level].zobject = 
child;
                                object->iterators[object->level].ce = ce;
@@ -340,10 +340,16 @@
        spl_recursive_it_rewind_ex((spl_recursive_it_object*)iter->data, 
((spl_recursive_it_iterator*)iter)->zobject TSRMLS_CC);
 }
 
-static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry 
*ce, zval *zobject TSRMLS_DC)
+static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry 
*ce, zval *zobject, int by_ref TSRMLS_DC)
 {
-       spl_recursive_it_iterator *iterator = 
emalloc(sizeof(spl_recursive_it_iterator));
-       spl_recursive_it_object   *object   = 
(spl_recursive_it_object*)zend_object_store_get_object(zobject TSRMLS_CC);
+       spl_recursive_it_iterator *iterator;
+       spl_recursive_it_object   *object;
+
+       if (by_ref) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+       iterator = emalloc(sizeof(spl_recursive_it_iterator));
+       object   = 
(spl_recursive_it_object*)zend_object_store_get_object(zobject TSRMLS_CC);
 
        zobject->refcount++;
        iterator->intern.data = (void*)object;
@@ -430,7 +436,7 @@
                intern->nextElement = NULL;
        }
        ce_iterator = Z_OBJCE_P(iterator); /* respect inheritance, don't use 
spl_ce_RecursiveIterator */
-       intern->iterators[0].iterator = ce_iterator->get_iterator(ce_iterator, 
iterator TSRMLS_CC);
+       intern->iterators[0].iterator = ce_iterator->get_iterator(ce_iterator, 
iterator, 0 TSRMLS_CC);
        if (inc_refcount) {
                iterator->refcount++;
        }
@@ -918,7 +924,7 @@
                case DIT_AppendIterator:
                        spl_instantiate(U_CLASS_ENTRY(spl_ce_ArrayIterator), 
&intern->u.append.zarrayit, 1 TSRMLS_CC);
                        
zend_call_method_with_0_params(&intern->u.append.zarrayit, 
U_CLASS_ENTRY(spl_ce_ArrayIterator), 
&U_CLASS_ENTRY(spl_ce_ArrayIterator)->constructor, "__construct", NULL);
-                       intern->u.append.iterator = 
U_CLASS_ENTRY(spl_ce_ArrayIterator)->get_iterator(U_CLASS_ENTRY(spl_ce_ArrayIterator),
 intern->u.append.zarrayit TSRMLS_CC);
+                       intern->u.append.iterator = 
U_CLASS_ENTRY(spl_ce_ArrayIterator)->get_iterator(U_CLASS_ENTRY(spl_ce_ArrayIterator),
 intern->u.append.zarrayit, 0 TSRMLS_CC);
                        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                        return intern;
 #if HAVE_PCRE || HAVE_BUNDLED_PCRE
@@ -954,7 +960,7 @@
        intern->inner.zobject = 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);
+       intern->inner.iterator = 
intern->inner.ce->get_iterator(intern->inner.ce, zobject, 0 TSRMLS_CC);
 
        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
        return intern;
@@ -2209,7 +2215,7 @@
                intern->inner.zobject = *it;
                intern->inner.ce = Z_OBJCE_PP(it);
                intern->inner.object = zend_object_store_get_object(*it 
TSRMLS_CC);
-               intern->inner.iterator = 
intern->inner.ce->get_iterator(intern->inner.ce, *it TSRMLS_CC);
+               intern->inner.iterator = 
intern->inner.ce->get_iterator(intern->inner.ce, *it, 0 TSRMLS_CC);
                spl_dual_it_rewind(intern TSRMLS_CC);
                return SUCCESS;
        } else {
@@ -2362,7 +2368,7 @@
        
        array_init(return_value);
        
-       iter = Z_OBJCE_P(obj)->get_iterator(Z_OBJCE_P(obj), obj TSRMLS_CC);
+       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);
@@ -2406,7 +2412,7 @@
                RETURN_FALSE;
        }
        
-       iter = Z_OBJCE_P(obj)->get_iterator(Z_OBJCE_P(obj), obj TSRMLS_CC);
+       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);
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_directory.c?r1=1.72&r2=1.73&diff_format=u
Index: php-src/ext/spl/spl_directory.c
diff -u php-src/ext/spl/spl_directory.c:1.72 
php-src/ext/spl/spl_directory.c:1.73
--- php-src/ext/spl/spl_directory.c:1.72        Sun Feb  5 19:22:13 2006
+++ php-src/ext/spl/spl_directory.c     Sun Feb  5 23:31:47 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.c,v 1.72 2006/02/05 19:22:13 tony2001 Exp $ */
+/* $Id: spl_directory.c,v 1.73 2006/02/05 23:31:47 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -963,10 +963,16 @@
 };
 
 /* {{{ spl_ce_dir_get_iterator */
-zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, 
zval *object TSRMLS_DC)
+zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, 
zval *object, int by_ref TSRMLS_DC)
 {
-       spl_filesystem_dir_it *iterator   = 
emalloc(sizeof(spl_filesystem_dir_it));
-       spl_filesystem_object *dir_object = 
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
+       spl_filesystem_dir_it *iterator;
+       spl_filesystem_object *dir_object;
+
+       if (by_ref) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+       iterator   = emalloc(sizeof(spl_filesystem_dir_it));
+       dir_object = 
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
 
        object->refcount += 2;;
        iterator->intern.data = (void*)object;
@@ -1168,10 +1174,16 @@
 };
 
 /* {{{ spl_ce_dir_get_iterator */
-zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, 
zval *object TSRMLS_DC)
+zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, 
zval *object, int by_ref TSRMLS_DC)
 {
-       spl_filesystem_dir_it *iterator   = 
emalloc(sizeof(spl_filesystem_dir_it));
-       spl_filesystem_object *dir_object = 
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
+       spl_filesystem_dir_it *iterator;
+       spl_filesystem_object *dir_object;
+
+       if (by_ref) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+       iterator   = emalloc(sizeof(spl_filesystem_dir_it));
+       dir_object = 
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
 
        object->refcount++;
        iterator->intern.data = (void*)object;
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_array.c?r1=1.90&r2=1.91&diff_format=u
Index: php-src/ext/spl/spl_array.c
diff -u php-src/ext/spl/spl_array.c:1.90 php-src/ext/spl/spl_array.c:1.91
--- php-src/ext/spl/spl_array.c:1.90    Thu Feb  2 22:11:49 2006
+++ php-src/ext/spl/spl_array.c Sun Feb  5 23:31:47 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_array.c,v 1.90 2006/02/02 22:11:49 helly Exp $ */
+/* $Id: spl_array.c,v 1.91 2006/02/05 23:31:47 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -757,10 +757,27 @@
        spl_array_it_rewind
 };
 
-zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval 
*object TSRMLS_DC) /* {{{ */
+zend_object_iterator *spl_array_obj_get_iterator(zend_class_entry *ce, zval 
*object, int by_ref TSRMLS_DC) /* {{{ */
 {
-       spl_array_it       *iterator     = emalloc(sizeof(spl_array_it));
-       spl_array_object   *array_object = 
(spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
+       /* disable by_ref check */
+       /* We enable by ref if the returned thing does. If it is an 
ArrayIterator */
+       /* or derived then it does if it's current() method is not overloaded. 
*/
+       return zend_user_it_get_new_iterator(ce, object, 0 TSRMLS_CC);
+}
+/* }}} */
+
+zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval 
*object, int by_ref TSRMLS_DC) /* {{{ */
+{
+       spl_array_it       *iterator;
+       spl_array_object   *array_object;
+
+#if MBO_0
+       if (by_ref && /* check current() is overloaded, else it works */) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+#endif
+       iterator     = emalloc(sizeof(spl_array_it));
+       array_object = (spl_array_object*)zend_object_store_get_object(object 
TSRMLS_CC);
 
        object->refcount++;
        iterator->intern.data = (void*)object;
@@ -1392,6 +1409,8 @@
        REGISTER_SPL_IMPLEMENTS(ArrayObject, Aggregate);
        REGISTER_SPL_IMPLEMENTS(ArrayObject, ArrayAccess);
        memcpy(&spl_handler_ArrayObject, zend_get_std_object_handlers(), 
sizeof(zend_object_handlers));
+       spl_ce_ArrayObject->get_iterator = spl_array_obj_get_iterator;
+
        spl_handler_ArrayObject.clone_obj = spl_array_object_clone;
        spl_handler_ArrayObject.read_dimension = spl_array_read_dimension;
        spl_handler_ArrayObject.write_dimension = spl_array_write_dimension;
http://cvs.php.net/viewcvs.cgi/php-src/ext/simplexml/simplexml.c?r1=1.183&r2=1.184&diff_format=u
Index: php-src/ext/simplexml/simplexml.c
diff -u php-src/ext/simplexml/simplexml.c:1.183 
php-src/ext/simplexml/simplexml.c:1.184
--- php-src/ext/simplexml/simplexml.c:1.183     Tue Jan 17 12:18:52 2006
+++ php-src/ext/simplexml/simplexml.c   Sun Feb  5 23:31:47 2006
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: simplexml.c,v 1.183 2006/01/17 12:18:52 dmitry Exp $ */
+/* $Id: simplexml.c,v 1.184 2006/02/05 23:31:47 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -1769,9 +1769,14 @@
        return NULL;
 }
 
-zend_object_iterator *php_sxe_get_iterator(zend_class_entry *ce, zval *object 
TSRMLS_DC)
+zend_object_iterator *php_sxe_get_iterator(zend_class_entry *ce, zval *object, 
int by_ref TSRMLS_DC)
 {
-       php_sxe_iterator *iterator = emalloc(sizeof(php_sxe_iterator));
+       php_sxe_iterator *iterator;
+
+       if (by_ref) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+       iterator = emalloc(sizeof(php_sxe_iterator));
 
        object->refcount++;
        iterator->intern.data = (void*)object;
@@ -2027,7 +2032,7 @@
 {
        php_info_print_table_start();
        php_info_print_table_header(2, "Simplexml support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.183 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.184 $");
        php_info_print_table_row(2, "Schema support",
 #ifdef LIBXML_SCHEMAS_ENABLED
                "enabled");
http://cvs.php.net/viewcvs.cgi/pecl/pdo/php_pdo_int.h?r1=1.23&r2=1.24&diff_format=u
Index: pecl/pdo/php_pdo_int.h
diff -u pecl/pdo/php_pdo_int.h:1.23 pecl/pdo/php_pdo_int.h:1.24
--- pecl/pdo/php_pdo_int.h:1.23 Sun Jan  1 13:09:52 2006
+++ pecl/pdo/php_pdo_int.h      Sun Feb  5 23:31:47 2006
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: php_pdo_int.h,v 1.23 2006/01/01 13:09:52 sniper Exp $ */
+/* $Id: php_pdo_int.h,v 1.24 2006/02/05 23:31:47 helly Exp $ */
 
 #include "php_pdo_phpvers_compat.h"
 
@@ -42,7 +42,7 @@
 extern zend_function_entry pdo_dbstmt_functions[];
 extern zend_class_entry *pdo_dbstmt_ce;
 void pdo_dbstmt_free_storage(pdo_stmt_t *stmt TSRMLS_DC);
-zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object 
TSRMLS_DC);
+zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object, 
int by_ref TSRMLS_DC);
 extern zend_object_handlers pdo_dbstmt_object_handlers;
 int pdo_stmt_describe_columns(pdo_stmt_t *stmt TSRMLS_DC);
 int pdo_stmt_setup_fetch_mode(INTERNAL_FUNCTION_PARAMETERS, pdo_stmt_t *stmt, 
int skip_first_arg);
http://cvs.php.net/viewcvs.cgi/pecl/pdo/pdo_stmt.c?r1=1.142&r2=1.143&diff_format=u
Index: pecl/pdo/pdo_stmt.c
diff -u pecl/pdo/pdo_stmt.c:1.142 pecl/pdo/pdo_stmt.c:1.143
--- pecl/pdo/pdo_stmt.c:1.142   Sun Jan 22 23:53:53 2006
+++ pecl/pdo/pdo_stmt.c Sun Feb  5 23:31:47 2006
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: pdo_stmt.c,v 1.142 2006/01/22 23:53:53 helly Exp $ */
+/* $Id: pdo_stmt.c,v 1.143 2006/02/05 23:31:47 helly Exp $ */
 
 /* The PDO Statement Handle Class */
 
@@ -2177,10 +2177,14 @@
        return I->fetch_ahead ? SUCCESS : FAILURE;
 }
 
-static void pdo_stmt_iter_get_data(zend_object_iterator *iter, zval ***data 
TSRMLS_DC)
+static void pdo_stmt_iter_get_data(zend_object_iterator *iter, zval ***data, 
int by_ref TSRMLS_DC)
 {
        struct php_pdo_iterator *I = (struct php_pdo_iterator*)iter->data;
 
+       if (by_ref) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+
        /* sanity */
        if (!I->fetch_ahead) {
                *data = NULL;
@@ -2237,11 +2241,15 @@
        NULL
 };
 
-zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object 
TSRMLS_DC)
+zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object, 
int by_ref TSRMLS_DC)
 {
        pdo_stmt_t *stmt = (pdo_stmt_t*)zend_object_store_get_object(object 
TSRMLS_CC);
        struct php_pdo_iterator *I;
 
+       if (by_ref) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+
        I = ecalloc(1, sizeof(*I));
        I->iter.funcs = &pdo_stmt_iter_funcs;
        I->iter.data = I;
http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/unicode_iterators.c?r1=1.10&r2=1.11&diff_format=u
Index: php-src/ext/unicode/unicode_iterators.c
diff -u php-src/ext/unicode/unicode_iterators.c:1.10 
php-src/ext/unicode/unicode_iterators.c:1.11
--- php-src/ext/unicode/unicode_iterators.c:1.10        Sat Feb  4 00:41:42 2006
+++ php-src/ext/unicode/unicode_iterators.c     Sun Feb  5 23:31:47 2006
@@ -14,7 +14,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: unicode_iterators.c,v 1.10 2006/02/04 00:41:42 andrei Exp $ */
+/* $Id: unicode_iterators.c,v 1.11 2006/02/05 23:31:47 helly Exp $ */
 
 /*
  * TODO
@@ -239,10 +239,16 @@
        text_iter_rewind,
 };
 
-static zend_object_iterator* text_iter_get_iterator(zend_class_entry *ce, zval 
*object TSRMLS_DC)
+static zend_object_iterator* text_iter_get_iterator(zend_class_entry *ce, zval 
*object, int by_ref TSRMLS_DC)
 {
-       text_iter_it*   iterator        = emalloc(sizeof(text_iter_it));
-       text_iter_obj*  iter_object = (text_iter_obj *) 
zend_object_store_get_object(object TSRMLS_CC);
+       text_iter_it*   iterator;
+       text_iter_obj*  iter_object;
+
+       if (by_ref) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+       iterator        = emalloc(sizeof(text_iter_it));
+       iter_object = (text_iter_obj *) zend_object_store_get_object(object 
TSRMLS_CC);
 
        ZVAL_ADDREF(object);
        iterator->intern.data  = (void *) object;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to