[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(&gtk_args);
+		zval_ptr_dtor(&gtk_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(&params);
+	zval_ptr_dtor(&params);
 }
 
 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