summaryrefslogtreecommitdiff
path: root/girepository/ginvoke.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@pobox.com>2008-04-23 01:24:57 +0000
committerHavoc Pennington <hp@src.gnome.org>2008-04-23 01:24:57 +0000
commitd5e956f29e88455fd2ac1f0a413813cf266ce681 (patch)
treedc0758b467bc7bd36a7a22a6a7eee0ece33e733e /girepository/ginvoke.c
parentf2fab34feacdd69c9c0c6384f1752c3534849f34 (diff)
downloadgobject-introspection-d5e956f29e88455fd2ac1f0a413813cf266ce681.tar.gz
If a symbol is not in metadata->module, look for it in the global module,
2008-04-22 Havoc Pennington <hp@pobox.com> * girepository/ginvoke.c (g_function_info_invoke): If a symbol is not in metadata->module, look for it in the global module, in case some other object or the app itself provides the symbol. svn path=/trunk/; revision=221
Diffstat (limited to 'girepository/ginvoke.c')
-rw-r--r--girepository/ginvoke.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/girepository/ginvoke.c b/girepository/ginvoke.c
index 986ca785..26f3c580 100644
--- a/girepository/ginvoke.c
+++ b/girepository/ginvoke.c
@@ -166,12 +166,36 @@ g_function_info_invoke (GIFunctionInfo *info,
if (!g_module_symbol (g_base_info_get_metadata((GIBaseInfo *) info)->module,
symbol, &func))
{
- g_set_error (error,
- G_INVOKE_ERROR,
- G_INVOKE_ERROR_SYMBOL_NOT_FOUND,
- "Could not locate %s: %s", symbol, g_module_error ());
-
- return FALSE;
+ GModule *entire_app;
+
+ /*
+ * We want to be able to add symbols to an app or an auxiliary
+ * library to fill in gaps in an introspected library. However,
+ * normally we would only look for symbols in the main library
+ * (metadata->module).
+ *
+ * A more elaborate solution is probably possible, but as a
+ * simple approach for now, if we fail to find a symbol we look
+ * for it in the global module.
+ *
+ * This would not be very efficient if it happened often, since
+ * we always do the failed lookup above first, but very few
+ * symbols should be outside of metadata->module so it doesn't
+ * matter.
+ */
+ entire_app = g_module_open (NULL, 0);
+ if (!g_module_symbol (entire_app, symbol, &func))
+ {
+ g_set_error (error,
+ G_INVOKE_ERROR,
+ G_INVOKE_ERROR_SYMBOL_NOT_FOUND,
+ "Could not locate %s: %s", symbol, g_module_error ());
+
+ g_module_close (entire_app);
+
+ return FALSE;
+ }
+ g_module_close (entire_app);
}
tinfo = g_callable_info_get_return_type ((GICallableInfo *)info);