com gtk/php-gtk: Add rudimentary support for exceptions thrown inside callbacks. We just quit the current main loop and let PHP take it from there: ext/gtk+/gtk.overrides ext/gtk+/gtktreeview.overrides main/php_gtk.h main/phpg_closure.c main/phpg_supp ort.c

[email protected] (David Soria Parra) Mon, 27 Mar 2006 04:25:50 +0000
Newsgroups php.gtk.cvs
Message-ID <[email protected]>
Commit:    7315af0db75afeeb44b1d705ef85a4a06074333a
Author:    Andrei Zmievski <[email protected]>         Mon, 27 Mar 2006 04:25:50 +0000
Parents:   e7901e6ef071c6fe20c33a651ded6d39b4c56e94
Branches:  master

Link:       http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=7315af0db75afeeb44b1d705ef85a4a06074333a

Log:
Add rudimentary support for exceptions thrown inside callbacks. We just
quit the current main loop and let PHP take it from there

Changed paths:
  M  ext/gtk+/gtk.overrides
  M  ext/gtk+/gtktreeview.overrides
  M  main/php_gtk.h
  M  main/phpg_closure.c
  M  main/phpg_support.c


Diff:
7315af0db75afeeb44b1d705ef85a4a06074333a
diff --git a/ext/gtk+/gtk.overrides b/ext/gtk+/gtk.overrides
index 94a7658..dd48c89 100644
--- a/ext/gtk+/gtk.overrides
+++ b/ext/gtk+/gtk.overrides
@@ -461,6 +461,7 @@ static gboolean phpg_iowatch_marshal(GIOChannel *source, GIOCondition condition,
     if (args)
         efree(args);
 
+    phpg_handle_marshaller_exception(TSRMLS_C);
     return result;
 }
 
@@ -2018,6 +2019,7 @@ static void php_gtk_menu_position(GtkMenu *menu, int *x, int *y, int *push_in, g
 
     efree(callback_name);
     phpg_cb_data_destroy(data);
+    phpg_handle_marshaller_exception(TSRMLS_C);
 }
 
 PHP_METHOD
diff --git a/ext/gtk+/gtktreeview.overrides b/ext/gtk+/gtktreeview.overrides
index 7de6e05..8f92644 100644
--- a/ext/gtk+/gtktreeview.overrides
+++ b/ext/gtk+/gtktreeview.overrides
@@ -1110,6 +1110,8 @@ gboolean phpg_tree_model_foreach_marshal(GtkTreeModel *model,
     efree(callback_name);
     efree(args);
 
+    phpg_handle_marshaller_exception(TSRMLS_C);
+
     return ret;
 }
 
@@ -1255,6 +1257,8 @@ static void phpg_cell_data_func_marshal(GtkCellLayout *cell_layout, GtkCellRende
         zval_ptr_dtor(&retval);
     }
 
+    phpg_handle_marshaller_exception(TSRMLS_C);
+
     efree(callback_name);
     efree(args);
 }
diff --git a/main/php_gtk.h b/main/php_gtk.h
index 55a386f..49548f5 100644
--- a/main/php_gtk.h
+++ b/main/php_gtk.h
@@ -326,6 +326,7 @@ static inline zend_class_entry* phpg_class_from_gtype(GType gtype)
 }
 
 PHP_GTK_API zend_bool phpg_handle_gerror(GError **error TSRMLS_DC);
+PHP_GTK_API void phpg_handle_marshaller_exception(TSRMLS_D);
 
 static inline gchar* phpg_to_utf8(const gchar *str, zend_uint str_len, gsize *utf8_len, zend_bool *free_orig TSRMLS_DC)
 {
diff --git a/main/phpg_closure.c b/main/phpg_closure.c
index 8e387c5..3cd517d 100644
--- a/main/phpg_closure.c
+++ b/main/phpg_closure.c
@@ -142,6 +142,8 @@ err_marshal:
         efree(params[i]);
     }
     efree(params);
+
+    phpg_handle_marshaller_exception(TSRMLS_C);
 }
 
 PHP_GTK_API GClosure* phpg_closure_new(zval *callback, zval *user_args, int connect_type, zval *replace_object TSRMLS_DC)
diff --git a/main/phpg_support.c b/main/phpg_support.c
index 76ad10b..6d2f542 100644
--- a/main/phpg_support.c
+++ b/main/phpg_support.c
@@ -198,6 +198,19 @@ PHP_GTK_API zend_bool phpg_handle_gerror(GError **error TSRMLS_DC)
 }
 /* }}} */
 
+
+PHP_GTK_API void phpg_handle_marshaller_exception(TSRMLS_D)
+{
+    /*
+     * Quit current main loop on exception. This will not help with GtkDialog::run()
+     * though, since it has its own main loop.
+     */
+    if (EG(exception)) {
+        gtk_main_quit();
+    }
+}
+
+
 /* {{{ phpg_get_properties_helper */
 PHP_GTK_API void phpg_get_properties_helper(zval *object, HashTable *ht TSRMLS_DC, ...)
 {
@@ -546,6 +559,8 @@ gboolean phpg_handler_marshal(gpointer user_data)
     if (handler_args)
         efree(handler_args);
 
+    phpg_handle_marshaller_exception(TSRMLS_C);
+
     return result;
 }
 /* }}} */