diff options
author | Havoc Pennington <hp@pobox.com> | 2008-04-23 01:24:57 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2008-04-23 01:24:57 +0000 |
commit | d5e956f29e88455fd2ac1f0a413813cf266ce681 (patch) | |
tree | dc0758b467bc7bd36a7a22a6a7eee0ece33e733e /girepository/ginvoke.c | |
parent | f2fab34feacdd69c9c0c6384f1752c3534849f34 (diff) | |
download | gobject-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.c | 36 |
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); |