mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Fix class/iterator relationship & handling
This commit is contained in:
parent
15bfbc7619
commit
b0b82541e8
5 changed files with 32 additions and 35 deletions
|
@ -333,7 +333,7 @@ struct _zend_class_entry {
|
|||
union _zend_function *__set;
|
||||
union _zend_function *__call;
|
||||
|
||||
zend_class_iterator_funcs *iterator_funcs;
|
||||
zend_class_iterator_funcs iterator_funcs;
|
||||
|
||||
/* handlers */
|
||||
zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC);
|
||||
|
|
|
@ -126,7 +126,7 @@ typedef struct _zend_function_entry {
|
|||
class_container.__set = handle_propset; \
|
||||
class_container.num_interfaces = 0; \
|
||||
class_container.get_iterator = NULL; \
|
||||
class_container.iterator_funcs = NULL; \
|
||||
class_container.iterator_funcs.funcs = NULL; \
|
||||
}
|
||||
|
||||
int zend_next_free_module(void);
|
||||
|
|
|
@ -1608,6 +1608,12 @@ static void do_inherit_parent_constructor(zend_class_entry *ce)
|
|||
ce->create_object = ce->parent->create_object;
|
||||
|
||||
/* Inherit special functions if needed */
|
||||
if (!ce->get_iterator) {
|
||||
ce->get_iterator = ce->parent->get_iterator;
|
||||
}
|
||||
if (!ce->iterator_funcs.funcs) {
|
||||
ce->iterator_funcs.funcs = ce->parent->iterator_funcs.funcs;
|
||||
}
|
||||
if (!ce->__get) {
|
||||
ce->__get = ce->parent->__get;
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ struct _zend_object_iterator {
|
|||
typedef zval *(*zend_object_new_iterator_t)(zend_class_entry *ce, zval *object TSRMLS_DC);
|
||||
|
||||
typedef struct _zend_class_iterator_funcs {
|
||||
zend_object_iterator_funcs funcs;
|
||||
zend_object_iterator_funcs *funcs;
|
||||
zend_object_new_iterator_t new_iterator;
|
||||
union _zend_function *zf_new_iterator;
|
||||
union _zend_function *zf_has_more;
|
||||
|
|
|
@ -948,9 +948,25 @@ void sqlite_iterator_move_forward(zend_object_iterator *iter TSRMLS_DC)
|
|||
}
|
||||
}
|
||||
|
||||
zend_class_iterator_funcs sqlite_ub_query_iterator_funcs;
|
||||
zend_object_iterator_funcs sqlite_ub_query_iterator_funcs = {
|
||||
sqlite_iterator_dtor,
|
||||
sqlite_iterator_has_more,
|
||||
sqlite_iterator_get_current_data,
|
||||
sqlite_iterator_get_current_key,
|
||||
sqlite_iterator_move_forward,
|
||||
NULL
|
||||
};
|
||||
|
||||
zend_object_iterator *sqlite_ub_query_get_iterator(zend_class_entry *ce, zval *object TSRMLS_DC)
|
||||
zend_object_iterator_funcs sqlite_query_iterator_funcs = {
|
||||
sqlite_iterator_dtor,
|
||||
sqlite_iterator_has_more,
|
||||
sqlite_iterator_get_current_data,
|
||||
sqlite_iterator_get_current_key,
|
||||
sqlite_iterator_move_forward,
|
||||
sqlite_iterator_rewind
|
||||
};
|
||||
|
||||
zend_object_iterator *sqlite_get_iterator(zend_class_entry *ce, zval *object TSRMLS_DC)
|
||||
{
|
||||
sqlite_object_iterator *iterator = emalloc(sizeof(sqlite_object_iterator));
|
||||
|
||||
|
@ -958,23 +974,7 @@ zend_object_iterator *sqlite_ub_query_get_iterator(zend_class_entry *ce, zval *o
|
|||
|
||||
object->refcount++;
|
||||
iterator->it.data = (void*)object;
|
||||
iterator->it.funcs = &sqlite_ub_query_iterator_funcs.funcs;
|
||||
iterator->res = obj->u.res;
|
||||
iterator->value = NULL;
|
||||
return (zend_object_iterator*)iterator;
|
||||
}
|
||||
|
||||
zend_class_iterator_funcs sqlite_query_iterator_funcs;
|
||||
|
||||
zend_object_iterator *sqlite_query_get_iterator(zend_class_entry *ce, zval *object TSRMLS_DC)
|
||||
{
|
||||
sqlite_object_iterator *iterator = emalloc(sizeof(sqlite_object_iterator));
|
||||
|
||||
sqlite_object *obj = (sqlite_object*) zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
object->refcount++;
|
||||
iterator->it.data = (void*)object;
|
||||
iterator->it.funcs = &sqlite_query_iterator_funcs.funcs;
|
||||
iterator->it.funcs = ce->iterator_funcs.funcs;
|
||||
iterator->res = obj->u.res;
|
||||
iterator->value = NULL;
|
||||
return (zend_object_iterator*)iterator;
|
||||
|
@ -996,20 +996,11 @@ PHP_MINIT_FUNCTION(sqlite)
|
|||
sqlite_object_handlers_query.get_class_entry = sqlite_get_ce_query;
|
||||
sqlite_object_handlers_ub_query.get_class_entry = sqlite_get_ce_ub_query;
|
||||
|
||||
sqlite_ce_ub_query->get_iterator = sqlite_ub_query_get_iterator;
|
||||
sqlite_ce_ub_query->iterator_funcs = &sqlite_ub_query_iterator_funcs;
|
||||
memset(&sqlite_ub_query_iterator_funcs, 0, sizeof(zend_class_iterator_funcs));
|
||||
sqlite_ub_query_iterator_funcs.funcs.dtor = sqlite_iterator_dtor;
|
||||
sqlite_ub_query_iterator_funcs.funcs.rewind = NULL;
|
||||
sqlite_ub_query_iterator_funcs.funcs.has_more = sqlite_iterator_has_more;
|
||||
sqlite_ub_query_iterator_funcs.funcs.get_current_data = sqlite_iterator_get_current_data;
|
||||
sqlite_ub_query_iterator_funcs.funcs.get_current_key = sqlite_iterator_get_current_key;
|
||||
sqlite_ub_query_iterator_funcs.funcs.move_forward = sqlite_iterator_move_forward;
|
||||
sqlite_ce_ub_query->get_iterator = sqlite_get_iterator;
|
||||
sqlite_ce_ub_query->iterator_funcs.funcs = &sqlite_ub_query_iterator_funcs;
|
||||
|
||||
sqlite_ce_query->get_iterator = sqlite_query_get_iterator;
|
||||
sqlite_ce_query->iterator_funcs = &sqlite_query_iterator_funcs;
|
||||
memcpy(&sqlite_query_iterator_funcs, &sqlite_ub_query_iterator_funcs, sizeof(zend_class_iterator_funcs));
|
||||
sqlite_query_iterator_funcs.funcs.rewind = sqlite_iterator_rewind;
|
||||
sqlite_ce_query->get_iterator = sqlite_get_iterator;
|
||||
sqlite_ce_query->iterator_funcs.funcs = &sqlite_query_iterator_funcs;
|
||||
|
||||
ZEND_INIT_MODULE_GLOBALS(sqlite, init_sqlite_globals, NULL);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue