From: Mark D. <the...@us...> - 2005-11-02 05:23:08
|
Update of /cvsroot/gaim/gaim/plugins/mono/loader In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30982/plugins/mono/loader Modified Files: mono-helper.c mono-helper.h mono.c signal-glue.c Log Message: Another patch attached to sf #1285501, from Eoin Coffey "the loader will now attempt to catch exceptions, so hopefully this will resolve some of the issues we were having." This looked fairly innocuous. Index: mono-helper.c =================================================================== RCS file: /cvsroot/gaim/gaim/plugins/mono/loader/mono-helper.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -p -r1.3 -r1.4 --- mono-helper.c 24 Oct 2005 03:31:44 -0000 1.3 +++ mono-helper.c 2 Nov 2005 05:23:00 -0000 1.4 @@ -15,6 +15,31 @@ #include "mono-helper.h" #include "mono-glue.h" #include "value.h" +#include "debug.h" + +MonoObject* mono_loader_delegate_invoke(MonoObject *method, void **params) +{ + MonoObject *ret, *exception; + + ret = mono_runtime_delegate_invoke(method, params, &exception); + if (exception) { + gaim_debug(GAIM_DEBUG_ERROR, "mono", "caught exception: %s\n", mono_class_get_name(mono_object_get_class(exception))); + } + + return ret; +} + +MonoObject* mono_loader_invoke(MonoMethod *method, void *obj, void **params) +{ + MonoObject *ret, *exception; + + ret = mono_runtime_invoke(method, obj, params, &exception); + if (exception) { + gaim_debug(GAIM_DEBUG_ERROR, "mono", "caught exception: %s\n", mono_class_get_name(mono_object_get_class(exception))); + } + + return ret; +} MonoClass* mono_loader_find_plugin_class(MonoImage *image) { Index: mono-helper.h =================================================================== RCS file: /cvsroot/gaim/gaim/plugins/mono/loader/mono-helper.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- mono-helper.h 14 Oct 2005 05:00:16 -0000 1.1 +++ mono-helper.h 2 Nov 2005 05:23:00 -0000 1.2 @@ -22,6 +22,10 @@ typedef struct { MonoMethod *destroy; } GaimMonoPlugin; +MonoObject* mono_loader_invoke(MonoMethod *method, void *obj, void **params); + +MonoObject* mono_loader_delegate_invoke(MonoObject *method, void **params); + MonoClass* mono_loader_find_plugin_class(MonoImage *image); gchar* mono_loader_get_prop_string(MonoObject *obj, char *field); Index: mono.c =================================================================== RCS file: /cvsroot/gaim/gaim/plugins/mono/loader/mono.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -p -r1.3 -r1.4 --- mono.c 24 Oct 2005 03:31:44 -0000 1.3 +++ mono.c 2 Nov 2005 05:23:00 -0000 1.4 @@ -18,9 +18,6 @@ #define MONO_PLUGIN_ID "core-mono" -/* This is where our code executes */ -static MonoDomain *domain = NULL; - /****************************************************************************** * Loader Stuff *****************************************************************************/ @@ -39,7 +36,7 @@ static gboolean probe_mono_plugin(GaimPl char *file = plugin->path; - assm = mono_domain_assembly_open(domain, file); + assm = mono_domain_assembly_open(mono_loader_get_domain(), file); if (!assm) { return FALSE; @@ -63,7 +60,7 @@ static gboolean probe_mono_plugin(GaimPl return FALSE; } - mplug->obj = mono_object_new(domain, mplug->klass); + mplug->obj = mono_object_new(mono_loader_get_domain(), mplug->klass); if (!mplug->obj) { gaim_debug(GAIM_DEBUG_ERROR, "mono", "obj not valid\n"); return FALSE; @@ -92,7 +89,7 @@ static gboolean probe_mono_plugin(GaimPl return FALSE; } - plugin_info = mono_runtime_invoke(info_method, mplug->obj, NULL, NULL); + plugin_info = mono_loader_invoke(info_method, mplug->obj, NULL); /* now that the methods are filled out we can populate the info struct with all the needed info */ @@ -130,7 +127,7 @@ static gboolean load_mono_plugin(GaimPlu mplug = (GaimMonoPlugin*)plugin->info->extra_info; - mono_runtime_invoke(mplug->load, mplug->obj, NULL, NULL); + mono_loader_invoke(mplug->load, mplug->obj, NULL); return TRUE; } @@ -146,13 +143,11 @@ static gboolean unload_mono_plugin(GaimP gaim_signals_disconnect_by_handle((gpointer)mplug->klass); - mono_runtime_invoke(mplug->unload, mplug->obj, NULL, NULL); + mono_loader_invoke(mplug->unload, mplug->obj, NULL); return TRUE; } -/* Destroys a Mono Plugin by calling 'destroy' in the class, - and cleaning up all the malloced memory */ static void destroy_mono_plugin(GaimPlugin *plugin) { GaimMonoPlugin *mplug; @@ -161,7 +156,7 @@ static void destroy_mono_plugin(GaimPlug mplug = (GaimMonoPlugin*)plugin->info->extra_info; - mono_runtime_invoke(mplug->destroy, mplug->obj, NULL, NULL); + mono_loader_invoke(mplug->destroy, mplug->obj, NULL); if (plugin->info) { g_free(plugin->info->name); @@ -187,7 +182,7 @@ static void destroy_mono_plugin(GaimPlug *****************************************************************************/ static void plugin_destroy(GaimPlugin *plugin) { - mono_jit_cleanup(domain); + mono_jit_cleanup(mono_loader_get_domain()); } static GaimPluginLoaderInfo loader_info = @@ -225,13 +220,9 @@ static GaimPluginInfo info = NULL }; -/* Creates the domain to execute in, and setups our CS Gaim API (note: - in the future the 'mono_add_internal_call' will be spread through out - the source to whatever module is exposing the API; this function will - simply call helper functions to do so) */ static void init_plugin(GaimPlugin *plugin) { - domain = mono_jit_init("gaim"); + MonoDomain *domain = mono_jit_init("gaim"); mono_loader_set_domain(domain); Index: signal-glue.c =================================================================== RCS file: /cvsroot/gaim/gaim/plugins/mono/loader/signal-glue.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- signal-glue.c 14 Oct 2005 05:00:17 -0000 1.1 +++ signal-glue.c 2 Nov 2005 05:23:00 -0000 1.2 @@ -45,7 +45,7 @@ static gpointer dispatch_callback(Signal meth_args[0] = array; - return mono_runtime_delegate_invoke(sig_data->func, meth_args, NULL); + return mono_loader_delegate_invoke(sig_data->func, meth_args); } static void cb_void__pointer(void *arg1, void *data) |