[prev in list] [next in list] [prev in thread] [next in thread]
List: php-gtk-cvs
Subject: [php-gtk-cvs] com gtk/php-gtk: Implement better abstraction of property handlers, thus allowing for
From: David Soria Parra <dsp () php ! net>
Date: 2001-02-26 21:21:20
Message-ID: php-mail-68afb23486b0ec4a2bc3a118850dd5c81782595785 () git ! php ! net
[Download RAW message or body]
Commit: ca984494741ff56b71434dd4f2a88041c6ac21bf
Author: Andrei Zmievski <andrei@php.net> Mon, 26 Feb 2001 21:21:20 +0000
Parents: e23795ca671a75189ebe7b7723fbec2f095eb3f5
Branches: GTK2 PHP_GTK_1 ZE2_PORT devel master
Link: http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=ca984494741ff56b71434dd4f2a88041c6ac21bf
Log:
Implement better abstraction of property handlers, thus allowing
for object field access in the near future.
Changed paths:
M main/php_gtk.c
M main/php_gtk.h
M main/php_gtk_object.c
M main/php_gtk_types.c
["diff_ca984494741ff56b71434dd4f2a88041c6ac21bf.txt" (text/plain)]
ca984494741ff56b71434dd4f2a88041c6ac21bf
diff --git a/main/php_gtk.c b/main/php_gtk.c
index 06a6dff..fdbc92d 100644
--- a/main/php_gtk.c
+++ b/main/php_gtk.c
@@ -160,6 +160,8 @@ PHP_MINIT_FUNCTION(gtk)
le_gtk = zend_register_list_destructors_ex(release_gtk_object_rsrc, NULL, \
"GtkObject", module_number);
php_gtk_class_hash = g_hash_table_new(g_str_hash, g_str_equal);
+ zend_hash_init_ex(&php_gtk_prop_getters, 20, NULL, NULL, 1, 0);
+ zend_hash_init_ex(&php_gtk_prop_setters, 20, NULL, NULL, 1, 0);
php_gtk_register_classes();
php_gtk_register_types(module_number);
php_gtk_register_constants(module_number ELS_CC);
@@ -181,6 +183,8 @@ PHP_MSHUTDOWN_FUNCTION(gtk)
/* Remove comments if you have entries in php.ini
UNREGISTER_INI_ENTRIES();
*/
+ zend_hash_destroy(&php_gtk_prop_getters);
+ zend_hash_destroy(&php_gtk_prop_setters);
gtk_exit(0);
return SUCCESS;
}
diff --git a/main/php_gtk.h b/main/php_gtk.h
index ea1a00a..c5a26a0 100644
--- a/main/php_gtk.h
+++ b/main/php_gtk.h
@@ -62,6 +62,9 @@ extern zend_class_entry *gtk_ctree_node_ce;
extern zend_class_entry *gtk_accel_group_ce;
extern zend_class_entry *gtk_style_ce;
+typedef void (*prop_getter_t)(zval *result, zval *object, zend_llist_element \
**element); +typedef int (*prop_setter_t)(zval *object, zend_llist_element **element, \
zval *value); +
/* Useful macros. */
#define PHP_GTK_GET(w) ((GtkObject *)php_gtk_get_object(w, le_gtk))
#define PHP_GDK_EVENT_GET(w) ((GdkEvent *)php_gtk_get_object(w, le_gdk_event))
@@ -81,6 +84,8 @@ extern zend_class_entry *gtk_style_ce;
/* True globals. */
extern GHashTable *php_gtk_class_hash;
+extern HashTable php_gtk_prop_getters;
+extern HashTable php_gtk_prop_setters;
/* Function declarations. */
@@ -96,6 +101,10 @@ void php_gtk_ret_from_value(GtkArg *ret, zval *value);
zval *php_gtk_args_as_hash(int nargs, GtkArg *args);
zval *php_gtk_arg_as_value(GtkArg *arg);
int php_gtk_get_flag_value(GtkType flag_type, zval *flag_val, int *result);
+zval php_gtk_get_property(zend_property_reference *property_reference);
+int php_gtk_set_property(zend_property_reference *property_reference, zval *value);
+void php_gtk_register_prop_getter(zend_class_entry *ce, prop_getter_t getter);
+void php_gtk_register_prop_setter(zend_class_entry *ce, prop_setter_t setter);
/* Constructors and initializers. */
void php_gtk_object_init(GtkObject *obj, zval *wrapper);
diff --git a/main/php_gtk_object.c b/main/php_gtk_object.c
index f5f249b..c53b103 100644
--- a/main/php_gtk_object.c
+++ b/main/php_gtk_object.c
@@ -25,6 +25,8 @@
#if HAVE_PHP_GTK
int le_gtk;
+HashTable php_gtk_prop_getters;
+HashTable php_gtk_prop_setters;
static const char *php_gtk_wrapper_key = "php_gtk::wrapper";
@@ -168,7 +170,7 @@ void php_gtk_callback_marshal(GtkObject *o, gpointer data, guint \
nargs, GtkArg * array_init(params);
zend_hash_next_index_insert(Z_ARRVAL_P(params), &wrapper, sizeof(zval *), NULL);
php_array_merge(Z_ARRVAL_P(params), Z_ARRVAL_P(gtk_args), 0);
- zval_del_ref(>k_args);
+ zval_ptr_dtor(>k_args);
} else
params = gtk_args;
@@ -184,13 +186,13 @@ void php_gtk_callback_marshal(GtkObject *o, gpointer data, \
guint nargs, GtkArg * if (retval)
zval_ptr_dtor(&retval);
efree(signal_args);
- zval_del_ref(¶ms);
+ zval_ptr_dtor(¶ms);
}
void php_gtk_destroy_notify(gpointer user_data)
{
zval *value = (zval *)user_data;
- zval_del_ref(&value);
+ zval_ptr_dtor(&value);
}
zval *php_gtk_new(GtkObject *obj)
@@ -495,4 +497,95 @@ void php_gtk_ret_from_value(GtkArg *ret, zval *value)
}
}
+inline void php_gtk_register_prop_getter(zend_class_entry *ce, prop_getter_t getter)
+{
+ zend_hash_index_update(&php_gtk_prop_getters, (long)ce, (void*)&getter,
+ sizeof(prop_getter_t), NULL);
+}
+
+inline void php_gtk_register_prop_setter(zend_class_entry *ce, prop_setter_t setter)
+{
+ zend_hash_index_update(&php_gtk_prop_setters, (long)ce, (void*)&setter,
+ sizeof(prop_setter_t), NULL);
+}
+
+/* Generic get/set property handlers. */
+zval php_gtk_get_property(zend_property_reference *property_reference)
+{
+ zval result;
+ zend_overloaded_element *overloaded_property;
+ zend_llist_element *element;
+ zval *object = property_reference->object;
+ prop_getter_t *getter;
+
+ for (element=property_reference->elements_list->head; element; \
element=element->next) { + overloaded_property = (zend_overloaded_element *) \
element->data; + if ((Z_TYPE_P(overloaded_property) != OE_IS_OBJECT ||
+ Z_TYPE(overloaded_property->element) != IS_STRING) ||
+ Z_TYPE_P(object) != IS_OBJECT) {
+ convert_to_null(&result);
+ return result;
+ }
+
+ if (zend_hash_index_find(&php_gtk_prop_getters, (long)object->value.obj.ce, (void \
**)&getter) == SUCCESS) { + (*getter)(&result, object, &element);
+ } else {
+ convert_to_null(&result);
+ return result;
+ }
+ object = &result;
+
+ zval_dtor(&overloaded_property->element);
+ }
+
+ return result;
+}
+
+int php_gtk_set_property(zend_property_reference *property_reference, zval *value)
+{
+ zval result;
+ zend_overloaded_element *overloaded_property;
+ zend_llist_element *element;
+ zend_llist_element *stop_element;
+ zval *object = property_reference->object;
+ prop_getter_t *getter;
+ prop_setter_t *setter;
+ int retval;
+
+ /*
+ * We want to stop at the last overloaded object reference - the rest can
+ * contain array references, that's fine.
+ */
+ for (stop_element=property_reference->elements_list->tail;
+ stop_element && Z_TYPE_P((zend_overloaded_element *)stop_element->data) == \
OE_IS_ARRAY; + stop_element=stop_element->prev);
+
+ for (element=property_reference->elements_list->head; element && \
element!=stop_element; element=element->next) { + overloaded_property = \
(zend_overloaded_element *) element->data; + if (Z_TYPE_P(overloaded_property) != \
OE_IS_OBJECT || + Z_TYPE(overloaded_property->element) != IS_STRING ||
+ Z_TYPE_P(object) != IS_OBJECT) {
+ return FAILURE;
+ }
+
+ if (zend_hash_index_find(&php_gtk_prop_getters, (long)object->value.obj.ce, (void \
**)&getter) == SUCCESS) { + (*getter)(&result, object, &element);
+ } else {
+ return FAILURE;
+ }
+ object = &result;
+
+ zval_dtor(&overloaded_property->element);
+ }
+
+ retval = FAILURE;
+ overloaded_property = (zend_overloaded_element *) element->data;
+ if (zend_hash_index_find(&php_gtk_prop_setters, (long)object->value.obj.ce, (void \
**)&setter) == SUCCESS) { + retval = (*setter)(object, &element, value);
+ }
+
+ zval_dtor(&overloaded_property->element);
+ return retval;
+}
+
#endif /* HAVE_PHP_GTK */
diff --git a/main/php_gtk_types.c b/main/php_gtk_types.c
index fca40ff..143a17d 100644
--- a/main/php_gtk_types.c
+++ b/main/php_gtk_types.c
@@ -1467,7 +1467,7 @@ static void gtk_ctree_node_get_property(zval *result, zval \
*object, zend_llist_e while (temp) {
php_node = php_gtk_ctree_node_new(temp);
add_next_index_zval(result, php_node);
- zval_del_ref(&php_node);
+ zval_ptr_dtor(&php_node);
temp = GTK_CTREE_ROW(temp)->sibling;
}
} else if (!strcmp(prop_name, "level")) {
@@ -1904,127 +1904,6 @@ static int gtk_style_set_property(zval *object, \
zend_llist_element **element, zv }
-
-/* Generic get/set property handlers. */
-static zval php_gtk_get_property(zend_property_reference *property_reference)
-{
- zval result;
- zend_overloaded_element *overloaded_property;
- zend_llist_element *element;
- zval *object = property_reference->object;
-
- for (element=property_reference->elements_list->head; element; \
element=element->next) {
- overloaded_property = (zend_overloaded_element *) element->data;
- if ((Z_TYPE_P(overloaded_property) != OE_IS_OBJECT ||
- Z_TYPE(overloaded_property->element) != IS_STRING) ||
- Z_TYPE_P(object) != IS_OBJECT) {
- convert_to_null(&result);
- return result;
- }
-
- if (php_gtk_check_class(object, gdk_window_ce) ||
- php_gtk_check_class(object, gdk_pixmap_ce) ||
- php_gtk_check_class(object, gdk_bitmap_ce)) {
- gdk_window_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_color_ce)) {
- gdk_color_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_colormap_ce)) {
- gdk_colormap_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_cursor_ce)) {
- gdk_cursor_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_visual_ce)) {
- gdk_visual_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_font_ce)) {
- gdk_font_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_gc_ce)) {
- gdk_gc_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_drag_context_ce)) {
- gdk_drag_context_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gtk_selection_data_ce)) {
- gtk_selection_data_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gtk_ctree_node_ce)) {
- gtk_ctree_node_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gtk_style_ce)) {
- gtk_style_get_property(&result, object, &element);
- } else {
- convert_to_null(&result);
- return result;
- }
- object = &result;
-
- zval_dtor(&overloaded_property->element);
- }
-
- return result;
-}
-
-static int php_gtk_set_property(zend_property_reference *property_reference, zval \
*value)
-{
- zval result;
- zend_overloaded_element *overloaded_property;
- zend_llist_element *element;
- zend_llist_element *stop_element;
- zval *object = property_reference->object;
- int retval;
-
- for (stop_element=property_reference->elements_list->tail;
- stop_element && Z_TYPE_P((zend_overloaded_element *)stop_element->data) == \
OE_IS_ARRAY;
- stop_element=stop_element->prev);
-
- for (element=property_reference->elements_list->head; element && \
element!=stop_element; element=element->next) {
- overloaded_property = (zend_overloaded_element *) element->data;
- if (Z_TYPE_P(overloaded_property) != OE_IS_OBJECT ||
- Z_TYPE(overloaded_property->element) != IS_STRING ||
- Z_TYPE_P(object) != IS_OBJECT) {
- return FAILURE;
- }
-
- if (php_gtk_check_class(object, gdk_window_ce) ||
- php_gtk_check_class(object, gdk_pixmap_ce) ||
- php_gtk_check_class(object, gdk_bitmap_ce)) {
- gdk_window_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_color_ce)) {
- gdk_color_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_colormap_ce)) {
- gdk_colormap_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_cursor_ce)) {
- gdk_cursor_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_visual_ce)) {
- gdk_visual_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_font_ce)) {
- gdk_font_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_gc_ce)) {
- gdk_gc_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gdk_drag_context_ce)) {
- gdk_drag_context_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gtk_selection_data_ce)) {
- gtk_selection_data_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gtk_ctree_node_ce)) {
- gtk_ctree_node_get_property(&result, object, &element);
- } else if (php_gtk_check_class(object, gtk_style_ce)) {
- gtk_style_get_property(&result, object, &element);
- } else {
- return FAILURE;
- }
- object = &result;
-
- zval_dtor(&overloaded_property->element);
- }
-
- retval = FAILURE;
- overloaded_property = (zend_overloaded_element *) element->data;
- if (php_gtk_check_class(object, gdk_color_ce))
- retval = gdk_color_set_property(object, &element, value);
- else if (php_gtk_check_class(object, gdk_gc_ce))
- retval = gdk_gc_set_property(object, &element, value);
- else if (php_gtk_check_class(object, gtk_style_ce))
- retval = gtk_style_set_property(object, &element, value);
-
- zval_dtor(&overloaded_property->element);
- return retval;
-}
-
-
void php_gtk_register_types(int module_number)
{
zend_class_entry ce;
@@ -2053,42 +1932,58 @@ void php_gtk_register_types(int module_number)
gdk_pixmap_ce = zend_register_internal_class_ex(&ce, NULL, NULL);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gdkbitmap", php_gdk_window_functions, NULL, \
php_gtk_get_property, NULL); gdk_bitmap_ce = zend_register_internal_class_ex(&ce, \
NULL, NULL); + php_gtk_register_prop_getter(gdk_window_ce, gdk_window_get_property);
+ php_gtk_register_prop_getter(gdk_pixmap_ce, gdk_window_get_property);
+ php_gtk_register_prop_getter(gdk_bitmap_ce, gdk_window_get_property);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gdkcolor", php_gdk_color_functions, NULL, \
php_gtk_get_property, php_gtk_set_property); gdk_color_ce = \
zend_register_internal_class_ex(&ce, NULL, NULL); \
+ php_gtk_register_prop_getter(gdk_color_ce, gdk_color_get_property); \
+ php_gtk_register_prop_setter(gdk_color_ce, gdk_color_set_property);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gdkcolormap", php_gdk_colormap_functions, NULL, \
php_gtk_get_property, php_gtk_set_property); gdk_colormap_ce = \
zend_register_internal_class_ex(&ce, NULL, NULL); \
+ php_gtk_register_prop_getter(gdk_colormap_ce, gdk_colormap_get_property);
INIT_CLASS_ENTRY(ce, "gdkatom", php_gdk_atom_functions);
gdk_atom_ce = zend_register_internal_class_ex(&ce, NULL, NULL);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gdkcursor", php_gdk_cursor_functions, NULL, \
php_gtk_get_property, NULL); gdk_cursor_ce = zend_register_internal_class_ex(&ce, \
NULL, NULL); + php_gtk_register_prop_getter(gdk_cursor_ce, gdk_cursor_get_property);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gdkvisual", php_gdk_visual_functions, NULL, \
php_gtk_get_property, NULL); gdk_visual_ce = zend_register_internal_class_ex(&ce, \
NULL, NULL); + php_gtk_register_prop_getter(gdk_visual_ce, gdk_visual_get_property);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gdkfont", php_gdk_font_functions, NULL, \
php_gtk_get_property, NULL); gdk_font_ce = zend_register_internal_class_ex(&ce, \
NULL, NULL); + php_gtk_register_prop_getter(gdk_font_ce, gdk_font_get_property);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gdkgc", php_gdk_gc_functions, NULL, \
php_gtk_get_property, php_gtk_set_property); gdk_gc_ce = \
zend_register_internal_class_ex(&ce, NULL, NULL); \
+ php_gtk_register_prop_getter(gdk_gc_ce, gdk_gc_get_property); \
+ php_gtk_register_prop_setter(gdk_gc_ce, gdk_gc_set_property);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gdkdragcontext", php_gdk_drag_context_functions, \
NULL, php_gtk_get_property, NULL); gdk_drag_context_ce = \
zend_register_internal_class_ex(&ce, NULL, NULL); \
+ php_gtk_register_prop_getter(gdk_drag_context_ce, gdk_drag_context_get_property);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gtkselectiondata", \
php_gtk_selection_data_functions, NULL, php_gtk_get_property, NULL); \
gtk_selection_data_ce = zend_register_internal_class_ex(&ce, NULL, NULL); \
+ php_gtk_register_prop_getter(gtk_selection_data_ce, \
gtk_selection_data_get_property);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gtkctreenode", php_gtk_ctree_node_functions, NULL, \
php_gtk_get_property, NULL); gtk_ctree_node_ce = \
zend_register_internal_class_ex(&ce, NULL, NULL); \
+ php_gtk_register_prop_getter(gtk_ctree_node_ce, gtk_ctree_node_get_property);
INIT_CLASS_ENTRY(ce, "gtkaccelgroup", php_gtk_accel_group_functions);
gtk_accel_group_ce = zend_register_internal_class_ex(&ce, NULL, NULL);
INIT_OVERLOADED_CLASS_ENTRY(ce, "gtkstyle", php_gtk_style_functions, NULL, \
php_gtk_get_property, php_gtk_set_property); gtk_style_ce = \
zend_register_internal_class_ex(&ce, NULL, NULL); \
+ php_gtk_register_prop_getter(gtk_style_ce, gtk_style_get_property); \
+ php_gtk_register_prop_setter(gtk_style_ce, gtk_style_set_property); }
#endif
--
PHP-GTK CVS Mailing List (http://gtk.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic