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