helly Wed Jul 16 05:48:36 2003 EDT
Removed files:
/spl/tests array_access_ex.phpt
Modified files:
/spl php_spl.c php_spl.h spl.php spl_array.c spl_array.h
spl_engine.c spl_engine.h spl_foreach.c
Log:
Update and remove parts no longer possible
Index: spl/php_spl.c
diff -u spl/php_spl.c:1.9 spl/php_spl.c:1.10
--- spl/php_spl.c:1.9 Tue Jun 17 16:18:10 2003
+++ spl/php_spl.c Wed Jul 16 05:48:36 2003
@@ -56,7 +56,7 @@
PHP_RINIT(spl),
PHP_RSHUTDOWN(spl),
PHP_MINFO(spl),
- "0.1",
+ "0.2",
STANDARD_MODULE_PROPERTIES
};
/* }}} */
@@ -69,11 +69,6 @@
zend_class_entry *spl_ce_sequence_assoc;
zend_class_entry *spl_ce_array_read;
zend_class_entry *spl_ce_array_access;
-zend_class_entry *spl_ce_array_access_ex;
-zend_class_entry *spl_ce_array_writer;
-#ifdef SPL_ARRAY_WRITE
-zend_class_entry *spl_ce_array_writer_default;
-#endif /* SPL_ARRAY_WRITE */
/* {{{ spl_functions_none
*/
@@ -82,17 +77,6 @@
};
/* }}} */
-static unsigned char first_of_two_force_ref[] = { 2, BYREF_FORCE, BYREF_NONE };
-
-/* {{{ spl_array_writer_funcs
- */
-function_entry spl_array_writer_funcs[] = {
- SPL_CLASS_FE(array_writer_default, __construct, first_of_two_force_ref)
- SPL_CLASS_FE(array_writer_default, set, NULL)
- {NULL, NULL, NULL}
-};
-/* }}} */
-
/* {{{ spl_init_globals
*/
static void spl_init_globals(zend_spl_globals *spl_globals)
@@ -110,7 +94,7 @@
#endif
#ifdef SPL_ARRAY_WRITE
- ZEND_EXECUTE_HOOK(ZEND_ASSIGN);
+ ZEND_EXECUTE_HOOK(ZEND_ASSIGN_DIM);
#endif /* SPL_ARRAY_WRITE */
}
/* }}} */
@@ -152,18 +136,6 @@
REGISTER_SPL_IMPLEMENT(array_access, array_read);
REGISTER_SPL_INTF_FUNC(array_access, set);
- REGISTER_SPL_INTERFACE(array_access_ex);
- REGISTER_SPL_IMPLEMENT(array_access_ex, array_access);
- REGISTER_SPL_INTF_FUNC(array_access_ex, new_writer);
-
- REGISTER_SPL_INTERFACE(array_writer);
- REGISTER_SPL_INTF_FUNC(array_writer, set);
-
-#ifdef SPL_ARRAY_WRITE
- REGISTER_SPL_STD_CLASS(array_writer_default, spl_array_writer_default_create);
- REGISTER_SPL_FUNCTIONS(array_writer_default, spl_array_writer_funcs);
-#endif
-
return SUCCESS;
}
/* }}} */
@@ -203,7 +175,7 @@
#endif
#ifdef SPL_ARRAY_WRITE
- ZEND_EXECUTE_HOOK_RESTORE(ZEND_ASSIGN);
+ ZEND_EXECUTE_HOOK_RESTORE(ZEND_ASSIGN_DIM);
#endif /* SPL_ARRAY_WRITE */
return SUCCESS;
@@ -240,8 +212,6 @@
php_info_print_table_row(2, "sequence_assoc", foreach);
php_info_print_table_row(2, "array_read", array_read);
php_info_print_table_row(2, "array_access", array_write);
- php_info_print_table_row(2, "array_access_ex", array_write);
- php_info_print_table_row(2, "array_writer", array_write);
php_info_print_table_end();
}
/* }}} */
@@ -295,12 +265,6 @@
SPL_ADD_CLASS(sequence_assoc);
SPL_ADD_CLASS(array_read);
SPL_ADD_CLASS(array_access);
- SPL_ADD_CLASS(array_access_ex);
- SPL_ADD_CLASS(array_writer);
-
-#ifdef SPL_ARRAY_WRITE
- SPL_ADD_CLASS(array_writer_default);
-#endif
}
/* }}} */
Index: spl/php_spl.h
diff -u spl/php_spl.h:1.6 spl/php_spl.h:1.7
--- spl/php_spl.h:1.6 Tue Jun 17 16:18:10 2003
+++ spl/php_spl.h Wed Jul 16 05:48:36 2003
@@ -70,7 +70,7 @@
ZEND_EXECUTE_HOOK_PTR(ZEND_FETCH_DIM_RW);
#endif
#ifdef SPL_ARRAY_WRITE
- ZEND_EXECUTE_HOOK_PTR(ZEND_ASSIGN);
+ ZEND_EXECUTE_HOOK_PTR(ZEND_ASSIGN_DIM);
#endif
ZEND_END_MODULE_GLOBALS(spl)
@@ -90,11 +90,6 @@
extern zend_class_entry *spl_ce_sequence_assoc;
extern zend_class_entry *spl_ce_array_read;
extern zend_class_entry *spl_ce_array_access;
-extern zend_class_entry *spl_ce_array_access_ex;
-extern zend_class_entry *spl_ce_array_writer;
-#ifdef SPL_ARRAY_WRITE
-extern zend_class_entry *spl_ce_array_writer_default;
-#endif /* SPL_ARRAY_WRITE */
PHP_FUNCTION(spl_classes);
PHP_FUNCTION(class_parents);
Index: spl/spl.php
diff -u spl/spl.php:1.4 spl/spl.php:1.5
--- spl/spl.php:1.4 Thu Jun 19 14:22:17 2003
+++ spl/spl.php Wed Jul 16 05:48:36 2003
@@ -226,79 +226,11 @@
}
\endcode
*/
-interface spl_array_access extends spl_array_read {
+interface spl_array_access implements spl_array_read {
/*! Set the value identified by $index to $value.
*/
function set($value, $index);
-}
-
-/*! \brief array read/write access with customized array_writer
- *
- * The internal structure requires that write access via interfaces
- * is divided into two parts. First the index is used to create an
- * array_writer which will later receive the new value and calls the
- * containers set() method with appropriate parameters.
- *
- * Sometimes it is helpfull to overwrite this behavior and have your
- * own implementation for the array_writer.
- *
- * The following example shows how to use a customized array_writer:
- * \code
- class array_emulation_ex extends array_emulation implemets spl_array_access_ex
{
- private $last_index = NULL;
- function new_writer($index) {
- $last_index = $index;
- return new array_write(&$this, $index);
- }
- }
- \endcode
- */
-interface spl_array_access_ex extends spl_array_access {
-
- /*! Create an array_writer interface for the specified index.
- *
- * If your container uses array_access instead of array_access_ex
- * the following code would be equal to the internal new_writer()
- * method:
- \code
- function new_writer($index) {
- return new array_write(&$this, $index);
- }
- \endcode
- */
- function new_writer($index);
-}
-
-/*! \brief array writer interface
- *
- * for every write access to an array_access instance an array_writer
- * is created which receives the originating object and the index as
- * parameters for the constructor call.
- *
- * The following shows the equivalent php code for the default
- * implementation array_write.
- * \code
- class array_write implements array_writer {
- private $obj;
- private $idx;
- function __construct(&$obj, $index = null) {
- $this->obj = $obj;
- $this->idx = $index;
- }
- function set($value) {
- return $this->obj->set($this->idx, $value);
- }
- }
- \endcode
- *
- * See array_access for more.
- */
-interface spl_array_writer {
-
- /*! Set the corresponding value to $value.
- */
- function set($value);
}
?>
Index: spl/spl_array.c
diff -u spl/spl_array.c:1.6 spl/spl_array.c:1.7
--- spl/spl_array.c:1.6 Sun Jun 22 10:55:44 2003
+++ spl/spl_array.c Wed Jul 16 05:48:36 2003
@@ -46,139 +46,32 @@
#define AI_PTR_2_PTR_PTR(ai) \
(ai).ptr_ptr = &((ai).ptr)
-/* {{{ spl_array_writer_default stuff */
-typedef struct {
- zval *obj;
- zval *idx;
- int locked;
-} spl_array_writer_object;
-
-static zend_class_entry *spl_array_writer_default_get_class(zval *object TSRMLS_DC)
-{
-#ifdef SPL_ARRAY_WRITE
- return spl_ce_array_writer_default;
-#else
- return (zend_class_entry *)1; /* force an error here: this ensures not equal */
-#endif
-}
-
-static zend_object_handlers spl_array_writer_default_handlers = {
- ZEND_OBJECTS_STORE_HANDLERS,
-
- NULL, /* read_property */
- NULL, /* write_property */
- NULL, /* get_property_ptr */
- NULL, /* get_property_zval_ptr */
- NULL, /* get */
- NULL, /* set */
- NULL, /* has_property */
- NULL, /* unset_property */
- NULL, /* get_properties */
- NULL, /* get_method */
- NULL, /* call_method */
- NULL, /* get_constructor */
- spl_array_writer_default_get_class, /* get_class_entry */
- NULL, /* get_class_name */
- NULL /* compare_objects */
-};
-/* }}} */
-
-/* {{{ spl_array_writer_dtor */
-void spl_array_writer_default_dtor(void *object, zend_object_handle handle TSRMLS_DC)
-{
- spl_array_writer_object *writer = (spl_array_writer_object*) object;
-
- if (writer->obj)
- {
- writer->obj->refcount--;
-/* DELETE_ZVAL(writer->obj); */
- }
- if (writer->idx)
- {
- if (writer->locked) {
- PZVAL_UNLOCK(writer->idx);
- } else {
- writer->idx->refcount--;
- DELETE_ZVAL(writer->idx);
- }
- }
- efree(writer);
-}
-/* }}} */
-
-/* {{{ spl_array_writer_default_create */
-zend_object_value spl_array_writer_default_create(zend_class_entry *class_type
TSRMLS_DC)
-{
- zend_object_value retval;
- spl_array_writer_object *intern;
-
- intern = ecalloc(sizeof(spl_array_writer_object), 1);
-
- retval.handle = zend_objects_store_put(intern, spl_array_writer_default_dtor,
NULL TSRMLS_CC);
- retval.handlers = &spl_array_writer_default_handlers;
-
- return retval;
-}
-/* }}} */
-
-/* {{{ spl_array_writer_default_set */
-void spl_array_writer_default_set(zval *object, zval *newval, zval **retval TSRMLS_DC)
-{
- spl_array_writer_object *writer;
-
- writer = (spl_array_writer_object *) zend_object_store_get_object(object
TSRMLS_CC);
- spl_begin_method_call_arg_ex2(&writer->obj, NULL, NULL, "set",
sizeof("set")-1, retval, writer->idx, newval TSRMLS_CC);
-}
-/* }}} */
-
-/* {{{ SPL_CLASS_FUNCTION(array_writer_default, __construct) */
-SPL_CLASS_FUNCTION(array_writer_default, __construct)
+/* {{{ spl_fetch_dimension_address */
+int spl_fetch_dimension_address(znode *result, znode *op1, znode *op2, temp_variable
*Ts, int type TSRMLS_DC)
{
- zval *object = getThis();
- zval *obj, *idx;
- spl_array_writer_object *writer;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &obj, &idx) ==
FAILURE) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Failed to parse
parameters");
- return;
- }
- writer = (spl_array_writer_object *) zend_object_store_get_object(object
TSRMLS_CC);
- writer->obj = obj; obj->refcount++;
- writer->idx = idx; idx->refcount++;
-}
-/* }}} */
+ zval **obj;
+ zend_class_entry *obj_ce;
+ spl_is_a is_a;
-/* {{{ SPL_CLASS_FUNCTION(array_writer_default, set) */
-SPL_CLASS_FUNCTION(array_writer_default, set)
-{
- zval *object = getThis();
- zval *newval;
+ obj = spl_get_zval_ptr_ptr(op1, Ts TSRMLS_CC);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &newval) == FAILURE)
{
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Failed to parse
parameters");
- return;
+ if (!obj || (obj_ce = spl_get_class_entry(*obj TSRMLS_CC)) == NULL) {
+ return 1;
}
- spl_array_writer_default_set(object, newval, &return_value TSRMLS_CC);
-}
-/* }}} */
-/* {{{ spl_fetch_dimension_address */
-int spl_fetch_dimension_address(znode *result, znode *op1, znode *op2, temp_variable
*Ts, int type TSRMLS_DC)
-{
- zval **container_ptr = spl_get_zval_ptr_ptr(op1, Ts TSRMLS_CC);
+ is_a = spl_implements(obj_ce);
- if (spl_is_instance_of(container_ptr, spl_ce_array_read TSRMLS_CC)) {
+ if (is_a & SPL_IS_A_ARRAY_READ) {
zval **retval = &(T(result->u.var).var.ptr);
zval *dim = spl_get_zval_ptr(op2, Ts, &EG(free_op2) TSRMLS_CC);
zval *exists;
- /*ALLOC_ZVAL(exists); not needed */
- spl_begin_method_call_arg_ex1(container_ptr, NULL, NULL, "exists",
sizeof("exists")-1, &exists, dim TSRMLS_CC);
+ spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "exists",
sizeof("exists")-1, &exists, dim TSRMLS_CC);
if (!i_zend_is_true(exists)) {
if (type == BP_VAR_R || type == BP_VAR_RW) {
SEPARATE_ZVAL(&dim);
convert_to_string_ex(&dim);
- zend_error(E_NOTICE,"Undefined index: %s",
Z_STRVAL_P(dim));
+ zend_error(E_NOTICE, "Undefined index: %s",
Z_STRVAL_P(dim));
DELETE_ZVAL(dim);
}
if (type == BP_VAR_R || type == BP_VAR_IS) {
@@ -192,37 +85,8 @@
}
DELETE_RET_ZVAL(exists);
if (type == BP_VAR_R || type == BP_VAR_IS) {
- spl_begin_method_call_arg_ex1(container_ptr, NULL, NULL,
"get", sizeof("get")-1, retval, dim TSRMLS_CC);
- (*retval)->refcount--;
- } else
-#ifdef SPL_ARRAY_WRITE
- if (spl_is_instance_of(container_ptr, spl_ce_array_access_ex
TSRMLS_CC)) {
- /* array_access_ex instaces have their own way of creating an
access_writer */
- spl_begin_method_call_arg_ex1(container_ptr, NULL, NULL,
"new_writer", sizeof("new_writer")-1, retval, dim TSRMLS_CC);
- T(result->u.var).var.ptr = *retval;
- AI_PTR_2_PTR_PTR(T(result->u.var).var);
- SELECTIVE_PZVAL_LOCK(*retval, result);
- } else if (spl_is_instance_of(container_ptr, spl_ce_array_access
TSRMLS_CC)) {
- /* array_access instances create the default array_writer:
array_write */
- spl_array_writer_object *writer;
- spl_instanciate(spl_ce_array_writer_default, retval TSRMLS_CC);
- T(result->u.var).var.ptr = *retval;
- AI_PTR_2_PTR_PTR(T(result->u.var).var);
- writer = (spl_array_writer_object *)
zend_object_store_get_object(*retval TSRMLS_CC);
- writer->obj = *container_ptr;
- writer->obj->refcount++;
- writer->idx = dim;
- PZVAL_LOCK(writer->idx);
- writer->locked = 1;
- SELECTIVE_PZVAL_LOCK(*retval, result);
- } else {
- zend_error(E_ERROR, "Object must implement spl_array_access
for write access");
- retval = &EG(error_zval_ptr);
+ spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "get",
sizeof("get")-1, retval, dim TSRMLS_CC);
}
- SELECTIVE_PZVAL_LOCK(*retval, result);
-#else
- zend_error(E_ERROR, "SPL compiled without array write hook");
-#endif
FREE_OP(Ts, op2, EG(free_op2));
return 0;
}
@@ -279,66 +143,90 @@
#endif
/* }}} */
-/* {{{ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN) */
-#ifdef SPL_ARRAY_WRITE
-ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN)
+static inline zval **spl_get_obj_zval_ptr_ptr(znode *op, temp_variable *Ts, int type
TSRMLS_DC)
{
- zval **writer = spl_get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC);
- zval *newval, *retval, *target;
- znode *result;
-
- if (writer && *writer && Z_TYPE_PP(writer) == IS_OBJECT) {
- /* optimization: do pre checks and only test for handlers in case of
- * spl_array_writer_default, for spl_array_writer we must use the
- * long way of calling spl_instance
- * if (spl_is_instance_of(writer, spl_ce_array_writer_default
TSRMLS_CC))
- */
- if ((*writer)->value.obj.handlers ==
&spl_array_writer_default_handlers) {
- newval = spl_get_zval_ptr(&EX(opline)->op2, EX(Ts),
&EG(free_op2) TSRMLS_CC);
- spl_array_writer_default_set(*writer, newval, &retval
TSRMLS_CC);
- } else if (spl_is_instance_of(writer, spl_ce_array_writer TSRMLS_CC)) {
- newval = spl_get_zval_ptr(&EX(opline)->op2, EX(Ts),
&EG(free_op2) TSRMLS_CC);
- spl_begin_method_call_arg_ex1(writer, NULL, NULL, "set",
sizeof("set")-1, &retval, newval TSRMLS_CC);
+ if (op->op_type == IS_UNUSED) {
+ if (EG(This)) {
+ /* this should actually never be modified, _ptr_ptr is
modified only when
+ the object is empty */
+ return &EG(This);
} else {
- ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_ASSIGN);
+ zend_error(E_ERROR, "Using $this when not in object context");
}
- } else {
- ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_ASSIGN);
}
- spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC);
+ return spl_get_zval_ptr_ptr(op, Ts TSRMLS_CC);
+}
- result = &EX(opline)->result;
- if (result) {
- if (retval->refcount<2) {
- if ((*writer)->value.obj.handlers ==
&spl_array_writer_default_handlers) {
- spl_array_writer_object *object =
(spl_array_writer_object *) zend_object_store_get_object(*writer TSRMLS_CC);
- target = object->obj;
- } else {
- target = *writer;
- }
- zend_error(E_WARNING, "Method %s::set() did not return a
value, using NULL", Z_OBJCE_P(target)->name);
- DELETE_ZVAL(retval);
- DELETE_ZVAL(newval);
- /* Unfortunately it doesn't work when trying to return newval.
- * But anyhow it wouldn't make sense...and confuse reference
counting and such.
- */
- retval = &EG(uninitialized_zval);
- } else {
- retval->refcount--;
- }
- EX_T(EX(opline)->result.u.var).var.ptr = retval;
- AI_PTR_2_PTR_PTR(EX_T(EX(opline)->result.u.var).var);
- SELECTIVE_PZVAL_LOCK(retval, result);
- } else {
- retval->refcount = 1;
- DELETE_ZVAL(retval);
+/* {{{ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN_DIM) */
+#ifdef SPL_ARRAY_WRITE
+ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN_DIM)
+{
+ zval **obj;
+ zend_class_entry *obj_ce;
+ spl_is_a is_a;
+
+ obj = spl_get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), 0 TSRMLS_CC);
+
+ if (!obj || (obj_ce = spl_get_class_entry(*obj TSRMLS_CC)) == NULL) {
+ ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_ASSIGN_DIM);
}
- (*writer)->refcount = 1;
- DELETE_ZVAL(*writer);
- FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2));
+ is_a = spl_implements(obj_ce);
+
+ if (is_a & SPL_IS_A_ARRAY_ACCESS) {
+ znode *op2 = &EX(opline)->op2;
+ zval *index = spl_get_zval_ptr(op2, EX(Ts), &EG(free_op2), BP_VAR_R);
+ zval *free_value;
+ zend_op *value_op = EX(opline)+1;
+ zval *value = spl_get_zval_ptr(&value_op->op1, EX(Ts), &free_value,
BP_VAR_R);
+ zval tmp;
+ zval *retval;
+
+ spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC);
+
+ /* here we are sure we are dealing with an object */
+ switch (op2->op_type) {
+ case IS_CONST:
+ /* already a constant string */
+ break;
+ case IS_VAR:
+ tmp = *index;
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ index = &tmp;
+ break;
+ case IS_TMP_VAR:
+ convert_to_string(index);
+ break;
+ }
+
+ /* separate our value if necessary */
+ if (value_op->op1.op_type == IS_TMP_VAR) {
+ zval *orig_value = value;
+
+ ALLOC_ZVAL(value);
+ *value = *orig_value;
+ value->is_ref = 0;
+ value->refcount = 0;
+ }
- NEXT_OPCODE();
+ spl_begin_method_call_arg_ex2(obj, obj_ce, NULL, "set",
sizeof("set")-1, &retval, index, value TSRMLS_CC);
+
+ if (index == &tmp) {
+ zval_dtor(index);
+ }
+
+ FREE_OP(Ts, op2, EG(free_op2));
+ if (&EX(opline)->result) {
+ EX_T(EX(opline)->result.u.var).var.ptr = retval;
+ EX_T(EX(opline)->result.u.var).var.ptr_ptr =
NULL;/*&EX_T(EX(opline)->result.u.var).var.ptr;*/
+ SELECTIVE_PZVAL_LOCK(retval, &EX(opline)->result);
+ }
+
+ EX(opline)++;
+ NEXT_OPCODE();
+ }
+ ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_ASSIGN_DIM);
}
#endif
/* }}} */
Index: spl/spl_array.h
diff -u spl/spl_array.h:1.2 spl/spl_array.h:1.3
--- spl/spl_array.h:1.2 Thu Jun 12 15:30:54 2003
+++ spl/spl_array.h Wed Jul 16 05:48:36 2003
@@ -29,13 +29,8 @@
#endif
#ifdef SPL_ARRAY_WRITE
-ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN);
+ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN_DIM);
#endif
-
-SPL_CLASS_FUNCTION(array_writer_default, __construct);
-SPL_CLASS_FUNCTION(array_writer_default, set);
-
-zend_object_value spl_array_writer_default_create(zend_class_entry *class_type
TSRMLS_DC);
#endif /* SPL_ARRAY_H */
Index: spl/spl_engine.c
diff -u spl/spl_engine.c:1.9 spl/spl_engine.c:1.10
--- spl/spl_engine.c:1.9 Tue Jun 17 16:18:10 2003
+++ spl/spl_engine.c Wed Jul 16 05:48:36 2003
@@ -158,10 +158,12 @@
register zend_class_entry **pce = ce->interfaces;
while (i--) {
- if (*pce == spl_ce_iterator) is_a |= SPL_IS_A_ITERATOR;
- else if (*pce == spl_ce_forward) is_a |= SPL_IS_A_FORWARD;
- else if (*pce == spl_ce_assoc) is_a |= SPL_IS_A_ASSOC;
- else if (*pce == spl_ce_sequence) is_a |= SPL_IS_A_SEQUENCE;
+ if (*pce == spl_ce_iterator) is_a |= SPL_IS_A_ITERATOR;
+ else if (*pce == spl_ce_forward) is_a |= SPL_IS_A_FORWARD;
+ else if (*pce == spl_ce_assoc) is_a |= SPL_IS_A_ASSOC;
+ else if (*pce == spl_ce_sequence) is_a |= SPL_IS_A_SEQUENCE;
+ else if (*pce == spl_ce_array_read) is_a |= SPL_IS_A_ARRAY_READ;
+ else if (*pce == spl_ce_array_access) is_a |= SPL_IS_A_ARRAY_ACCESS;
pce++;
}
return is_a;
Index: spl/spl_engine.h
diff -u spl/spl_engine.h:1.7 spl/spl_engine.h:1.8
--- spl/spl_engine.h:1.7 Tue Jun 17 16:18:10 2003
+++ spl/spl_engine.h Wed Jul 16 05:48:36 2003
@@ -50,10 +50,10 @@
/* }}} */
/* {{{ spl_begin_method_call_arg */
-static inline int spl_begin_method_call_arg(zval **ce, zend_class_entry *obj_ce,
zend_function **fn_proxy, char *function_name, int fname_len, zval *retval, zval *arg1
TSRMLS_DC)
+static inline int spl_begin_method_call_arg(zval **obj, zend_class_entry *obj_ce,
zend_function **fn_proxy, char *function_name, int fname_len, zval *retval, zval *arg1
TSRMLS_DC)
{
zval *local_retval;
- int ret = spl_call_method(ce, obj_ce, fn_proxy, function_name, fname_len,
&local_retval, NULL TSRMLS_CC, 1, arg1);
+ int ret = spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len,
&local_retval, NULL TSRMLS_CC, 1, arg1);
if (local_retval) {
COPY_PZVAL_TO_ZVAL(*retval, local_retval);
} else {
@@ -64,10 +64,10 @@
/* }}} */
/* {{{ spl_begin_method_call_no_retval */
-static inline int spl_begin_method_call_no_retval(zval **ce, zend_class_entry
*obj_ce, zend_function **fn_proxy, char *function_name, int fname_len TSRMLS_DC)
+static inline int spl_begin_method_call_no_retval(zval **obj, zend_class_entry
*obj_ce, zend_function **fn_proxy, char *function_name, int fname_len TSRMLS_DC)
{
zval *retval;
- int ret = spl_call_method(ce, obj_ce, fn_proxy, function_name, fname_len,
&retval, NULL TSRMLS_CC, 0);
+ int ret = spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len,
&retval, NULL TSRMLS_CC, 0);
if (retval) {
zval_dtor(retval);
FREE_ZVAL(retval);
@@ -76,14 +76,14 @@
}
/* }}} */
-#define spl_begin_method_call_ex(ce, obj_ce, fn_proxy, function_name, fname_len,
retval) \
- spl_call_method(ce, obj_ce, fn_proxy, function_name, fname_len, retval, NULL
TSRMLS_CC, 0)
+#define spl_begin_method_call_ex(obj, obj_ce, fn_proxy, function_name, fname_len,
retval) \
+ spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, NULL
TSRMLS_CC, 0)
-#define spl_begin_method_call_arg_ex1(ce, obj_ce, fn_proxy, function_name, fname_len,
retval, arg1) \
- spl_call_method(ce, obj_ce, fn_proxy, function_name, fname_len, retval, NULL
TSRMLS_CC, 1, arg1)
+#define spl_begin_method_call_arg_ex1(obj, obj_ce, fn_proxy, function_name,
fname_len, retval, arg1) \
+ spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, NULL
TSRMLS_CC, 1, arg1)
-#define spl_begin_method_call_arg_ex2(ce, obj_ce, fn_proxy, function_name, fname_len,
retval, arg1, arg2) \
- spl_call_method(ce, obj_ce, fn_proxy, function_name, fname_len, retval, NULL
TSRMLS_CC, 2, arg1, arg2)
+#define spl_begin_method_call_arg_ex2(obj, obj_ce, fn_proxy, function_name,
fname_len, retval, arg1, arg2) \
+ spl_call_method(obj, obj_ce, fn_proxy, function_name, fname_len, retval, NULL
TSRMLS_CC, 2, arg1, arg2)
void spl_instanciate(zend_class_entry *pce, zval **object TSRMLS_DC);
int spl_instanciate_arg_ex2(zend_class_entry *pce, zval **retval, zval *arg1, zval
*arg2, HashTable *symbol_table TSRMLS_DC);
@@ -95,10 +95,12 @@
int spl_is_instance_of(zval **obj, zend_class_entry *ce TSRMLS_DC);
typedef enum {
- SPL_IS_A_ITERATOR = 1,
- SPL_IS_A_FORWARD = 2,
- SPL_IS_A_ASSOC = 4,
- SPL_IS_A_SEQUENCE = 8
+ SPL_IS_A_ITERATOR = 0x01,
+ SPL_IS_A_FORWARD = 0x02,
+ SPL_IS_A_ASSOC = 0x04,
+ SPL_IS_A_SEQUENCE = 0x08,
+ SPL_IS_A_ARRAY_READ = 0x10,
+ SPL_IS_A_ARRAY_ACCESS = 0x20
} spl_is_a;
spl_is_a spl_implements(zend_class_entry *ce);
Index: spl/spl_foreach.c
diff -u spl/spl_foreach.c:1.16 spl/spl_foreach.c:1.17
--- spl/spl_foreach.c:1.16 Tue Jul 8 22:48:25 2003
+++ spl/spl_foreach.c Wed Jul 16 05:48:36 2003
@@ -69,8 +69,8 @@
if (is_a & SPL_IS_A_ITERATOR) {
spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC);
- spl_begin_method_call_ex(obj, NULL, NULL, "new_iterator",
sizeof("new_iterator")-1, &retval);
obj_ce = instance_ce;
+ spl_begin_method_call_ex(obj, obj_ce, NULL, "new_iterator",
sizeof("new_iterator")-1, &retval);
instance_ce = spl_get_class_entry(retval TSRMLS_CC);
is_a = spl_implements(instance_ce);
if (!(is_a & SPL_IS_A_FORWARD)) {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php