]> granicus.if.org Git - php/commitdiff
Fix class/iterator relationship & handling
authorMarcus Boerger <helly@php.net>
Sat, 18 Oct 2003 18:43:31 +0000 (18:43 +0000)
committerMarcus Boerger <helly@php.net>
Sat, 18 Oct 2003 18:43:31 +0000 (18:43 +0000)
Zend/zend.h
Zend/zend_API.h
Zend/zend_compile.c
Zend/zend_iterators.h
ext/sqlite/sqlite.c

index 20c36fd8bb4277e8d7bff8a8b06279c4389be4c4..4317f7537309fd347aa491ef79c8fe0a86ed88d7 100644 (file)
@@ -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);
index 5fd3d3ea82444ff7f7fc9a8f20530ef6159a9c14..d7b9a443901a775bd57e81b1e0442ca897a83ad6 100644 (file)
@@ -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);
index 6df8fc35544aeffbd3b2dce77718c17798fdf967..f0e73b3e07a690a14f0460296366a4d96e0bc736 100644 (file)
@@ -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;
        }
index bd62cc0c8dce3ac226d0251709110a231d7153be..4a05fdd942763a7c073813110fc3712009bf03fa 100755 (executable)
@@ -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;
index ce2b0dac21e5c005ec04ccde92cec7da6fd48e72..0c94267e0252658b26b7675feb8c3f7cf78f119c 100644 (file)
@@ -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);