g_object_info_find_method_using_interfaces: New function

Pull this down into introspection from gjs; this will allow us
to cache this better in the future (for example, by caching the
infos for interfaces in the info for the object).

https://bugzilla.gnome.org/show_bug.cgi?id=632924
This commit is contained in:
Colin Walters 2010-10-22 14:22:19 -04:00
parent a1d7beda01
commit eb153575a4
2 changed files with 62 additions and 0 deletions

View File

@ -413,6 +413,63 @@ g_object_info_find_method (GIObjectInfo *info,
return _g_base_info_find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
}
/**
* g_object_info_find_method_using_interfaces:
* @info: a #GIObjectInfo
* @name: name of method to obtain
* @implementor: (out) (transfer full): The implementor of the interface
*
* Obtain a method of the object given a @name, searching both the
* object @info and any interfaces it implements. %NULL will be
* returned if there's no method available with that name.
*
* Note that this function does *not* search parent classes; you will have
* to chain up if that's desired.
*
* Returns: (transfer full): the #GIFunctionInfo. Free the struct by calling
* g_base_info_unref() when done.
*/
GIFunctionInfo *
g_object_info_find_method_using_interfaces (GIObjectInfo *info,
const gchar *name,
GIObjectInfo **implementor)
{
GIFunctionInfo *result = NULL;
GIObjectInfo *implementor_result = NULL;
result = g_object_info_find_method (info, name);
if (result)
implementor_result = g_base_info_ref ((GIBaseInfo*) info);
if (result == NULL)
{
int n_interfaces;
int i;
n_interfaces = g_object_info_get_n_interfaces (info);
for (i = 0; i < n_interfaces; ++i)
{
GIInterfaceInfo *iface_info;
iface_info = g_object_info_get_interface (info, i);
result = g_interface_info_find_method (iface_info, name);
if (result != NULL)
{
implementor_result = iface_info;
break;
}
g_base_info_unref ((GIBaseInfo*) iface_info);
}
}
if (implementor)
*implementor = implementor_result;
else
g_base_info_unref ((GIBaseInfo*) implementor_result);
return result;
}
/**
* g_object_info_get_n_signals:
* @info: a #GIObjectInfo

View File

@ -91,6 +91,11 @@ GIFunctionInfo * g_object_info_get_method (GIObjectInfo *info,
gint n);
GIFunctionInfo * g_object_info_find_method (GIObjectInfo *info,
const gchar *name);
GIFunctionInfo * g_object_info_find_method_using_interfaces (GIObjectInfo *info,
const gchar *name,
GIObjectInfo **implementor);
gint g_object_info_get_n_signals (GIObjectInfo *info);
GISignalInfo * g_object_info_get_signal (GIObjectInfo *info,
gint n);