mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-25 03:32:12 +01:00
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:
parent
a1d7beda01
commit
eb153575a4
@ -413,6 +413,63 @@ g_object_info_find_method (GIObjectInfo *info,
|
|||||||
return _g_base_info_find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
|
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:
|
* g_object_info_get_n_signals:
|
||||||
* @info: a #GIObjectInfo
|
* @info: a #GIObjectInfo
|
||||||
|
@ -91,6 +91,11 @@ GIFunctionInfo * g_object_info_get_method (GIObjectInfo *info,
|
|||||||
gint n);
|
gint n);
|
||||||
GIFunctionInfo * g_object_info_find_method (GIObjectInfo *info,
|
GIFunctionInfo * g_object_info_find_method (GIObjectInfo *info,
|
||||||
const gchar *name);
|
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);
|
gint g_object_info_get_n_signals (GIObjectInfo *info);
|
||||||
GISignalInfo * g_object_info_get_signal (GIObjectInfo *info,
|
GISignalInfo * g_object_info_get_signal (GIObjectInfo *info,
|
||||||
gint n);
|
gint n);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user