From: Marcus Boerger Date: Sat, 18 Oct 2003 18:43:31 +0000 (+0000) Subject: Fix class/iterator relationship & handling X-Git-Tag: RELEASE_1_3b3~28 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b0b82541e84e88a2e66b8a2239610c257ce6e475;p=php Fix class/iterator relationship & handling --- diff --git a/Zend/zend.h b/Zend/zend.h index 20c36fd8bb..4317f75373 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -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); diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 5fd3d3ea82..d7b9a44390 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -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); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 6df8fc3554..f0e73b3e07 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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; } diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h index bd62cc0c8d..4a05fdd942 100755 --- a/Zend/zend_iterators.h +++ b/Zend/zend_iterators.h @@ -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; diff --git a/ext/sqlite/sqlite.c b/ext/sqlite/sqlite.c index ce2b0dac21..0c94267e02 100644 --- a/ext/sqlite/sqlite.c +++ b/ext/sqlite/sqlite.c @@ -948,25 +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 *sqlite_ub_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_ub_query_iterator_funcs.funcs; - iterator->res = obj->u.res; - iterator->value = NULL; - return (zend_object_iterator*)iterator; -} +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_class_iterator_funcs sqlite_query_iterator_funcs; +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_query_get_iterator(zend_class_entry *ce, zval *object TSRMLS_DC) +zend_object_iterator *sqlite_get_iterator(zend_class_entry *ce, zval *object TSRMLS_DC) { sqlite_object_iterator *iterator = emalloc(sizeof(sqlite_object_iterator)); @@ -974,7 +974,7 @@ zend_object_iterator *sqlite_query_get_iterator(zend_class_entry *ce, zval *obje 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_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_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_get_iterator; + sqlite_ce_query->iterator_funcs.funcs = &sqlite_query_iterator_funcs; ZEND_INIT_MODULE_GLOBALS(sqlite, init_sqlite_globals, NULL);