static VALUE rg_get_vfunc(VALUE self, VALUE rb_n_or_name) { GIInterfaceInfo *info; GIVFuncInfo *vfunc_info; info = SELF(self); if (RB_TYPE_P(rb_n_or_name, T_FIXNUM)) { gint n; n = NUM2INT(rb_n_or_name); vfunc_info = g_interface_info_get_vfunc(info, n); } else { const gchar *name; name = RVAL2CSTR(rb_n_or_name); vfunc_info = g_interface_info_find_vfunc(info, name); } return GI_BASE_INFO2RVAL_WITH_UNREF(vfunc_info); }
/** * g_object_info_find_vfunc_using_interfaces: * @info: a #GIObjectInfo * @name: name of method to obtain * @implementor: (out) (transfer full): The implementor of the interface * * Locate a virtual function slot with name @name, searching both the object * @info and any interfaces it implements. Note that the namespace for * virtuals is distinct from that of methods; there may or may not be a * concrete method associated for a virtual. If there is one, it may be * retrieved using g_vfunc_info_get_invoker(), otherwise %NULL will be * returned. * * 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. */ GIVFuncInfo * g_object_info_find_vfunc_using_interfaces (GIObjectInfo *info, const gchar *name, GIObjectInfo **implementor) { GIVFuncInfo *result = NULL; GIObjectInfo *implementor_result = NULL; result = g_object_info_find_vfunc (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_vfunc (iface_info, name); if (result != NULL) { implementor_result = iface_info; break; } g_base_info_unref ((GIBaseInfo*) iface_info); } } if (implementor) *implementor = implementor_result; else if (implementor_result != NULL) g_base_info_unref ((GIBaseInfo*) implementor_result); return result; }