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; } /* }}} */