girepository: Port GIBaseInfo to GTypeInstance

This adds more type safety to libgirepository, and allows
differentiating the `GIBaseInfo` derived types using the type system.

Two new derived types had to be added (previously they were just a
collection of helper methods which worked directly on a `GIBaseInfo` and
didn’t check types): `GICallbackInfo` and `GIUnresolvedInfo`.

Further cleanups and refactoring might be needed on this, but the core
of libgirepository now uses `GTypeInstance` and appears to still work
(it’s difficult to be entirely sure because there are no unit tests
yet).

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3155
This commit is contained in:
Philip Withnall 2023-11-28 17:24:20 +00:00
parent cdb5ab0cd2
commit 52ac467426
25 changed files with 921 additions and 192 deletions

View File

@ -26,6 +26,7 @@
#include <glib.h> #include <glib.h>
#include "gibaseinfo-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "giarginfo.h" #include "giarginfo.h"
@ -333,3 +334,12 @@ gi_arg_info_load_type (GIArgInfo *info,
gi_type_info_init ((GIBaseInfo *) type, (GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type)); gi_type_info_init ((GIBaseInfo *) type, (GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type));
} }
void
gi_arg_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_ARG;
}

View File

@ -0,0 +1,58 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
* GObject introspection: Parsed GIR
*
* Copyright 2023 GNOME Foundation Inc.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#pragma once
#include <glib.h>
#include <glib-object.h>
#include "gitypes.h"
G_BEGIN_DECLS
/* Keep this in sync with the GIInfoType enumeration.
*
* We don't add an "n-types" value to avoid having to handle
* it in every single switch.
*/
#define GI_INFO_TYPE_N_TYPES (GI_INFO_TYPE_REGISTERED_TYPE + 1)
#define GI_IS_BASE_INFO_TYPE(info,type) \
(G_TYPE_INSTANCE_GET_CLASS ((info), GI_TYPE_BASE_INFO, GIBaseInfoClass)->info_type == (type))
struct _GIBaseInfoClass
{
GTypeClass parent_class;
GIInfoType info_type;
void (* finalize) (GIBaseInfo *info);
};
void gi_base_info_init_types (void);
GType gi_base_info_type_register_static (const char *type_name,
gsize instance_size,
GClassInitFunc class_init);
G_END_DECLS

View File

@ -29,26 +29,284 @@
#include <glib.h> #include <glib.h>
#include <glib-object.h> #include <glib-object.h>
#include <gobject/gvaluecollector.h>
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gibaseinfo.h" #include "gibaseinfo.h"
#include "gibaseinfo-private.h"
#define INVALID_REFCOUNT 0x7FFFFFFF #define INVALID_REFCOUNT 0x7FFFFFFF
/* GBoxed registration of BaseInfo. */ /* Type registration of BaseInfo. */
#define GI_BASE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GI_TYPE_BASE_INFO, GIBaseInfoClass))
static void
value_base_info_init (GValue *value)
{
value->data[0].v_pointer = NULL;
}
static void
value_base_info_free_value (GValue *value)
{
if (value->data[0].v_pointer != NULL)
gi_base_info_unref (value->data[0].v_pointer);
}
static void
value_base_info_copy_value (const GValue *src,
GValue *dst)
{
if (src->data[0].v_pointer != NULL)
dst->data[0].v_pointer = gi_base_info_ref (src->data[0].v_pointer);
else
dst->data[0].v_pointer = NULL;
}
static gpointer
value_base_info_peek_pointer (const GValue *value)
{
return value->data[0].v_pointer;
}
static char *
value_base_info_collect_value (GValue *value,
guint n_collect_values,
GTypeCValue *collect_values,
guint collect_flags)
{
GIBaseInfo *info = collect_values[0].v_pointer;
if (info == NULL)
{
value->data[0].v_pointer = NULL;
return NULL;
}
if (info->parent_instance.g_class == NULL)
return g_strconcat ("invalid unclassed GIBaseInfo pointer for "
"value type '",
G_VALUE_TYPE_NAME (value),
"'",
NULL);
value->data[0].v_pointer = gi_base_info_ref (info);
return NULL;
}
static gchar *
value_base_info_lcopy_value (const GValue *value,
guint n_collect_values,
GTypeCValue *collect_values,
guint collect_flags)
{
GIBaseInfo **node_p = collect_values[0].v_pointer;
if (node_p == NULL)
return g_strconcat ("value location for '",
G_VALUE_TYPE_NAME (value),
"' passed as NULL",
NULL);
if (value->data[0].v_pointer == NULL)
*node_p = NULL;
else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
*node_p = value->data[0].v_pointer;
else
*node_p = gi_base_info_ref (value->data[0].v_pointer);
return NULL;
}
static void
gi_base_info_finalize (GIBaseInfo *self)
{
if (self->container && self->container->ref_count != INVALID_REFCOUNT)
gi_base_info_unref (self->container);
g_clear_object (&self->repository);
g_type_free_instance ((GTypeInstance *) self);
}
static void
gi_base_info_class_init (GIBaseInfoClass *klass)
{
klass->info_type = GI_INFO_TYPE_INVALID;
klass->finalize = gi_base_info_finalize;
}
static void
gi_base_info_init (GIBaseInfo *self)
{
g_atomic_ref_count_init (&self->ref_count);
}
GType GType
gi_base_info_gtype_get_type (void) gi_base_info_gtype_get_type (void)
{ {
static GType our_type = 0; static GType base_info_type = 0;
if (our_type == 0)
our_type =
g_boxed_type_register_static ("GIBaseInfo",
(GBoxedCopyFunc) gi_base_info_ref,
(GBoxedFreeFunc) gi_base_info_unref);
return our_type; if (g_once_init_enter_pointer (&base_info_type))
{
static const GTypeFundamentalInfo finfo = {
(G_TYPE_FLAG_CLASSED |
G_TYPE_FLAG_INSTANTIATABLE |
G_TYPE_FLAG_DERIVABLE |
G_TYPE_FLAG_DEEP_DERIVABLE),
};
static const GTypeValueTable value_table = {
value_base_info_init,
value_base_info_free_value,
value_base_info_copy_value,
value_base_info_peek_pointer,
"p",
value_base_info_collect_value,
"p",
value_base_info_lcopy_value,
};
const GTypeInfo type_info = {
/* Class */
sizeof (GIBaseInfoClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) gi_base_info_class_init,
(GClassFinalizeFunc) NULL,
NULL,
/* Instance */
sizeof (GIBaseInfo),
0,
(GInstanceInitFunc) gi_base_info_init,
/* GValue */
&value_table,
};
GType _base_info_type =
g_type_register_fundamental (g_type_fundamental_next (),
g_intern_static_string ("GIBaseInfo"),
&type_info, &finfo,
G_TYPE_FLAG_ABSTRACT);
g_once_init_leave_pointer (&base_info_type, _base_info_type);
}
return base_info_type;
}
/*< private >
* gi_base_info_type_register_static:
* @type_name: the name of the type
* @instance_size: size (in bytes) of the types instance struct
* @class_init: class init function for the type
*
* Registers a new [type@GIRepository.BaseInfo] type for the given @type_name
* using the type information provided.
*
* Returns: the newly registered [type@GObject.Type]
* Since: 2.80
*/
GType
gi_base_info_type_register_static (const char *type_name,
gsize instance_size,
GClassInitFunc class_init)
{
GTypeInfo info;
info.class_size = sizeof (GIBaseInfoClass);
info.base_init = NULL;
info.base_finalize = NULL;
info.class_init = class_init;
info.class_finalize = NULL;
info.instance_size = instance_size;
info.n_preallocs = 0;
info.instance_init = NULL;
info.value_table = NULL;
return g_type_register_static (GI_TYPE_BASE_INFO, type_name, &info, 0);
}
static GType gi_base_info_types[GI_INFO_TYPE_N_TYPES];
#define GI_DEFINE_BASE_INFO_TYPE(type_name, TYPE_ENUM_VALUE) \
GType \
type_name ## _get_type (void) \
{ \
gi_base_info_init_types (); \
g_assert (gi_base_info_types[TYPE_ENUM_VALUE] != G_TYPE_INVALID); \
return gi_base_info_types[TYPE_ENUM_VALUE]; \
}
GI_DEFINE_BASE_INFO_TYPE (gi_callable_info, GI_INFO_TYPE_CALLABLE)
GI_DEFINE_BASE_INFO_TYPE (gi_function_info, GI_INFO_TYPE_FUNCTION)
GI_DEFINE_BASE_INFO_TYPE (gi_callback_info, GI_INFO_TYPE_CALLBACK)
GI_DEFINE_BASE_INFO_TYPE (gi_registered_type_info, GI_INFO_TYPE_REGISTERED_TYPE)
GI_DEFINE_BASE_INFO_TYPE (gi_struct_info, GI_INFO_TYPE_STRUCT)
GI_DEFINE_BASE_INFO_TYPE (gi_union_info, GI_INFO_TYPE_UNION)
GI_DEFINE_BASE_INFO_TYPE (gi_enum_info, GI_INFO_TYPE_ENUM)
GI_DEFINE_BASE_INFO_TYPE (gi_object_info, GI_INFO_TYPE_OBJECT)
GI_DEFINE_BASE_INFO_TYPE (gi_interface_info, GI_INFO_TYPE_INTERFACE)
GI_DEFINE_BASE_INFO_TYPE (gi_constant_info, GI_INFO_TYPE_CONSTANT)
GI_DEFINE_BASE_INFO_TYPE (gi_value_info, GI_INFO_TYPE_VALUE)
GI_DEFINE_BASE_INFO_TYPE (gi_signal_info, GI_INFO_TYPE_SIGNAL)
GI_DEFINE_BASE_INFO_TYPE (gi_vfunc_info, GI_INFO_TYPE_VFUNC)
GI_DEFINE_BASE_INFO_TYPE (gi_property_info, GI_INFO_TYPE_PROPERTY)
GI_DEFINE_BASE_INFO_TYPE (gi_field_info, GI_INFO_TYPE_FIELD)
GI_DEFINE_BASE_INFO_TYPE (gi_arg_info, GI_INFO_TYPE_ARG)
GI_DEFINE_BASE_INFO_TYPE (gi_type_info, GI_INFO_TYPE_TYPE)
GI_DEFINE_BASE_INFO_TYPE (gi_unresolved_info, GI_INFO_TYPE_UNRESOLVED)
void
gi_base_info_init_types (void)
{
static gsize register_types_once = 0;
if (g_once_init_enter (&register_types_once))
{
const struct
{
GIInfoType info_type;
const char *type_name;
gsize instance_size;
GClassInitFunc class_init;
}
types[] =
{
{ GI_INFO_TYPE_CALLABLE, "GICallableInfo", sizeof (GICallableInfo), gi_callable_info_class_init },
{ GI_INFO_TYPE_FUNCTION, "GIFunctionInfo", sizeof (GIFunctionInfo), gi_function_info_class_init },
{ GI_INFO_TYPE_CALLBACK, "GICallbackInfo", sizeof (GICallbackInfo), gi_callback_info_class_init },
{ GI_INFO_TYPE_REGISTERED_TYPE, "GIRegisteredTypeInfo", sizeof (GIRegisteredTypeInfo), gi_registered_type_info_class_init },
{ GI_INFO_TYPE_STRUCT, "GIStructInfo", sizeof (GIStructInfo), gi_struct_info_class_init },
{ GI_INFO_TYPE_UNION, "GIUnionInfo", sizeof (GIUnionInfo), gi_union_info_class_init },
{ GI_INFO_TYPE_ENUM, "GIEnumInfo", sizeof (GIEnumInfo), gi_enum_info_class_init },
{ GI_INFO_TYPE_OBJECT, "GIObjectInfo", sizeof (GIObjectInfo), gi_object_info_class_init },
{ GI_INFO_TYPE_INTERFACE, "GIInterfaceInfo", sizeof (GIInterfaceInfo), gi_interface_info_class_init },
{ GI_INFO_TYPE_CONSTANT, "GIConstantInfo", sizeof (GIConstantInfo), gi_constant_info_class_init },
{ GI_INFO_TYPE_VALUE, "GIValueInfo", sizeof (GIValueInfo), gi_value_info_class_init },
{ GI_INFO_TYPE_SIGNAL, "GISignalInfo", sizeof (GISignalInfo), gi_signal_info_class_init },
{ GI_INFO_TYPE_VFUNC, "GIVFuncInfo", sizeof (GIVFuncInfo), gi_vfunc_info_class_init },
{ GI_INFO_TYPE_PROPERTY, "GIPropertyInfo", sizeof (GIPropertyInfo), gi_property_info_class_init },
{ GI_INFO_TYPE_FIELD, "GIFieldInfo", sizeof (GIFieldInfo), gi_field_info_class_init },
{ GI_INFO_TYPE_ARG, "GIArgInfo", sizeof (GIArgInfo), gi_arg_info_class_init },
{ GI_INFO_TYPE_TYPE, "GITypeInfo", sizeof (GITypeInfo), gi_type_info_class_init },
{ GI_INFO_TYPE_UNRESOLVED, "GIUnresolvedInfo", sizeof (GIUnresolvedInfo), gi_unresolved_info_class_init },
};
for (gsize i = 0; i < G_N_ELEMENTS (types); i++)
{
GType registered_type = gi_base_info_type_register_static (g_intern_static_string (types[i].type_name),
types[i].instance_size,
types[i].class_init);
gi_base_info_types[types[i].info_type] = registered_type;
}
g_once_init_leave (&register_types_once, 1);
}
} }
/* info creation */ /* info creation */
@ -62,16 +320,21 @@ gi_info_new_full (GIInfoType type,
GIRealInfo *info; GIRealInfo *info;
g_return_val_if_fail (container != NULL || repository != NULL, NULL); g_return_val_if_fail (container != NULL || repository != NULL, NULL);
g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL);
info = g_slice_new (GIRealInfo); gi_base_info_init_types ();
g_assert (gi_base_info_types[type] != G_TYPE_INVALID);
info = (GIRealInfo *) g_type_create_instance (gi_base_info_types[type]);
gi_info_init (info, type, repository, container, typelib, offset); info->typelib = typelib;
info->ref_count = 1; info->offset = offset;
if (container && ((GIRealInfo *) container)->ref_count != INVALID_REFCOUNT) if (container)
info->container = container;
if (container && container->ref_count != INVALID_REFCOUNT)
gi_base_info_ref (info->container); gi_base_info_ref (info->container);
g_object_ref (info->repository); info->repository = g_object_ref (repository);
return (GIBaseInfo*)info; return (GIBaseInfo*)info;
} }
@ -108,8 +371,6 @@ gi_info_init (GIRealInfo *info,
/* Invalid refcount used to flag stack-allocated infos */ /* Invalid refcount used to flag stack-allocated infos */
info->ref_count = INVALID_REFCOUNT; info->ref_count = INVALID_REFCOUNT;
info->type = type;
info->typelib = typelib; info->typelib = typelib;
info->offset = offset; info->offset = offset;
@ -140,12 +401,12 @@ gi_info_from_entry (GIRepository *repository,
{ {
GIUnresolvedInfo *unresolved; GIUnresolvedInfo *unresolved;
unresolved = g_slice_new0 (GIUnresolvedInfo); unresolved = (GIUnresolvedInfo *) gi_info_new_full (GI_INFO_TYPE_UNRESOLVED,
repository,
NULL,
typelib,
entry->offset);
unresolved->type = GI_INFO_TYPE_UNRESOLVED;
unresolved->ref_count = 1;
unresolved->repository = g_object_ref (repository);
unresolved->container = NULL;
unresolved->name = name; unresolved->name = name;
unresolved->namespace = namespace; unresolved->namespace = namespace;
@ -243,7 +504,7 @@ gi_base_info_ref (GIBaseInfo *info)
GIRealInfo *rinfo = (GIRealInfo*)info; GIRealInfo *rinfo = (GIRealInfo*)info;
g_assert (rinfo->ref_count != INVALID_REFCOUNT); g_assert (rinfo->ref_count != INVALID_REFCOUNT);
g_atomic_int_inc (&rinfo->ref_count); g_atomic_ref_count_inc (&rinfo->ref_count);
return info; return info;
} }
@ -262,19 +523,8 @@ gi_base_info_unref (GIBaseInfo *info)
g_assert (rinfo->ref_count > 0 && rinfo->ref_count != INVALID_REFCOUNT); g_assert (rinfo->ref_count > 0 && rinfo->ref_count != INVALID_REFCOUNT);
if (!g_atomic_int_dec_and_test (&rinfo->ref_count)) if (g_atomic_ref_count_dec (&rinfo->ref_count))
return; GI_BASE_INFO_GET_CLASS (info)->finalize (info);
if (rinfo->container && ((GIRealInfo *) rinfo->container)->ref_count != INVALID_REFCOUNT)
gi_base_info_unref (rinfo->container);
if (rinfo->repository)
g_object_unref (rinfo->repository);
if (rinfo->type == GI_INFO_TYPE_UNRESOLVED)
g_slice_free (GIUnresolvedInfo, (GIUnresolvedInfo *) rinfo);
else
g_slice_free (GIRealInfo, rinfo);
} }
/** /**
@ -288,8 +538,7 @@ gi_base_info_unref (GIBaseInfo *info)
GIInfoType GIInfoType
gi_base_info_get_info_type (GIBaseInfo *info) gi_base_info_get_info_type (GIBaseInfo *info)
{ {
return GI_BASE_INFO_GET_CLASS (info)->info_type;
return ((GIRealInfo*)info)->type;
} }
/** /**

View File

@ -29,6 +29,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "girffi.h" #include "girffi.h"
@ -791,3 +792,12 @@ gi_callable_info_invoke (GICallableInfo *info,
gi_base_info_unref ((GIBaseInfo *)rinfo); gi_base_info_unref ((GIBaseInfo *)rinfo);
return success; return success;
} }
void
gi_callable_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_CALLABLE;
}

View File

@ -0,0 +1,52 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
* GObject introspection: Callable implementation
*
* Copyright (C) 2005 Matthias Clasen
* Copyright 2023 GNOME Foundation, Inc.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <glib.h>
#include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h"
#include "gitypelib-internal.h"
#include "gicallbackinfo.h"
/**
* SECTION:gicallback
* @title: GICallbackInfo
* @short_description: Struct representing a callback
*
* GICallbackInfo represents a callback.
*/
void
gi_callback_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_CALLBACK;
}

View File

@ -0,0 +1,43 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
* GObject introspection: Callable
*
* Copyright 2023 GNOME Foundation, Inc.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#pragma once
#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION)
#error "Only <girepository.h> can be included directly."
#endif
#include <girepository/gitypes.h>
G_BEGIN_DECLS
/**
* GI_IS_CALLBACK_INFO
* @info: an info structure
*
* Checks if @info is a #GICallbackInfo or derived from it.
*/
#define GI_IS_CALLBACK_INFO(info) \
(gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_CALLBACK)
G_END_DECLS

View File

@ -28,6 +28,7 @@
#include <string.h> // memcpy #include <string.h> // memcpy
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "giconstantinfo.h" #include "giconstantinfo.h"
@ -176,3 +177,11 @@ gi_constant_info_get_value (GIConstantInfo *info,
return blob->size; return blob->size;
} }
void
gi_constant_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_CONSTANT;
}

View File

@ -27,6 +27,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "gienuminfo.h" #include "gienuminfo.h"
@ -207,6 +208,15 @@ gi_enum_info_get_storage_type (GIEnumInfo *info)
return blob->storage_type; return blob->storage_type;
} }
void
gi_enum_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_ENUM;
}
/** /**
* gi_value_info_get_value: * gi_value_info_get_value:
* @info: a #GIValueInfo * @info: a #GIValueInfo
@ -233,3 +243,12 @@ gi_value_info_get_value (GIValueInfo *info)
else else
return (gint64)blob->value; return (gint64)blob->value;
} }
void
gi_value_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_VALUE;
}

View File

@ -27,6 +27,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "config.h" #include "config.h"
@ -554,3 +555,12 @@ gi_field_info_set_field (GIFieldInfo *field_info,
return result; return result;
} }
void
gi_field_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_FIELD;
}

View File

@ -29,6 +29,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "gifunctioninfo.h" #include "gifunctioninfo.h"
@ -294,3 +295,12 @@ gi_function_info_invoke (GIFunctionInfo *info,
throws, throws,
error); error);
} }
void
gi_function_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_FUNCTION;
}

View File

@ -27,6 +27,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "giinterfaceinfo.h" #include "giinterfaceinfo.h"
@ -501,3 +502,11 @@ gi_interface_info_get_iface_struct (GIInterfaceInfo *info)
return NULL; return NULL;
} }
void
gi_interface_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_INTERFACE;
}

View File

@ -27,6 +27,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "giobjectinfo.h" #include "giobjectinfo.h"
@ -1097,3 +1098,12 @@ gi_object_info_get_get_value_function_pointer (GIObjectInfo *info)
return (GIObjectInfoGetValueFunction)_get_func(info, (SymbolGetter)gi_object_info_get_get_value_function); return (GIObjectInfoGetValueFunction)_get_func(info, (SymbolGetter)gi_object_info_get_get_value_function);
} }
void
gi_object_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_OBJECT;
}

View File

@ -27,6 +27,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "gipropertyinfo.h" #include "gipropertyinfo.h"
@ -207,3 +208,12 @@ gi_property_info_get_getter (GIPropertyInfo *info)
else else
return NULL; return NULL;
} }
void
gi_property_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_PROPERTY;
}

View File

@ -29,6 +29,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "giregisteredtypeinfo.h" #include "giregisteredtypeinfo.h"
@ -144,3 +145,11 @@ gi_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
return (* get_type_func) (); return (* get_type_func) ();
} }
void
gi_registered_type_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_REGISTERED_TYPE;
}

View File

@ -32,7 +32,9 @@
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include <girepository/gitypelib.h> #include <girepository/gitypelib.h>
typedef struct _GIRealInfo GIRealInfo; /* FIXME: For now, GIRealInfo is a compatibility define. This will eventually
* be removed. */
typedef struct _GIBaseInfo GIRealInfo;
/* We changed a gint32 -> gint in the structure below, which should be /* We changed a gint32 -> gint in the structure below, which should be
* valid everywhere we care about. * valid everywhere we care about.
@ -45,39 +47,169 @@ G_STATIC_ASSERT (sizeof (int) == sizeof (gint32));
* from the typelib, and not having computed data in * from the typelib, and not having computed data in
* per-type structures. * per-type structures.
*/ */
struct _GIRealInfo struct _GIBaseInfo
{ {
/* Keep this part in sync with GIUnresolvedInfo below */ /*< private >*/
gint32 type; GTypeInstance parent_instance;
volatile gint ref_count; gatomicrefcount ref_count;
GIRepository *repository; GIRepository *repository;
GIBaseInfo *container; GIBaseInfo *container;
/* Resolved specific */
GITypelib *typelib; GITypelib *typelib;
guint32 offset; guint32 offset;
guint32 type_is_embedded : 1; /* Used by GITypeInfo */ guint32 type_is_embedded : 1; /* Used by GITypeInfo */
guint32 reserved : 31;
gpointer reserved2[4];
}; };
/* Subtypes */
struct _GICallableInfo
{
GIBaseInfo parent;
};
void gi_callable_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIFunctionInfo
{
GIBaseInfo parent;
};
void gi_function_info_class_init (gpointer g_class,
gpointer class_data);
struct _GICallbackInfo
{
GIBaseInfo parent;
};
void gi_callback_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIRegisteredTypeInfo
{
GIBaseInfo parent;
};
void gi_registered_type_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIStructInfo
{
GIBaseInfo parent;
};
void gi_struct_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIUnionInfo
{
GIBaseInfo parent;
};
void gi_union_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIEnumInfo
{
GIBaseInfo parent;
};
void gi_enum_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIObjectInfo
{
GIBaseInfo parent;
};
void gi_object_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIInterfaceInfo
{
GIBaseInfo parent;
};
void gi_interface_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIConstantInfo
{
GIBaseInfo parent;
};
void gi_constant_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIValueInfo
{
GIBaseInfo parent;
};
void gi_value_info_class_init (gpointer g_class,
gpointer class_data);
struct _GISignalInfo
{
GIBaseInfo parent;
};
void gi_signal_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIVFuncInfo
{
GIBaseInfo parent;
};
void gi_vfunc_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIPropertyInfo
{
GIBaseInfo parent;
};
void gi_property_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIFieldInfo
{
GIBaseInfo parent;
};
void gi_field_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIArgInfo
{
GIBaseInfo parent;
};
void gi_arg_info_class_init (gpointer g_class,
gpointer class_data);
struct _GITypeInfo
{
GIBaseInfo parent;
};
void gi_type_info_class_init (gpointer g_class,
gpointer class_data);
struct _GIUnresolvedInfo struct _GIUnresolvedInfo
{ {
/* Keep this part in sync with GIBaseInfo above */ GIBaseInfo parent;
gint32 type;
volatile gint ref_count;
GIRepository *repository;
GIBaseInfo *container;
/* Unresolved specific */
const gchar *name; const gchar *name;
const gchar *namespace; const gchar *namespace;
}; };
void gi_unresolved_info_class_init (gpointer g_class,
gpointer class_data);
void gi_info_init (GIRealInfo *info, void gi_info_init (GIRealInfo *info,
GIInfoType type, GIInfoType type,
GIRepository *repository, GIRepository *repository,

View File

@ -34,6 +34,7 @@
#include <girepository/giarginfo.h> #include <girepository/giarginfo.h>
#include <girepository/gibaseinfo.h> #include <girepository/gibaseinfo.h>
#include <girepository/gicallableinfo.h> #include <girepository/gicallableinfo.h>
#include <girepository/gicallbackinfo.h>
#include <girepository/giconstantinfo.h> #include <girepository/giconstantinfo.h>
#include <girepository/gienuminfo.h> #include <girepository/gienuminfo.h>
#include <girepository/gifieldinfo.h> #include <girepository/gifieldinfo.h>
@ -48,6 +49,7 @@
#include <girepository/gitypelib.h> #include <girepository/gitypelib.h>
#include <girepository/gitypes.h> #include <girepository/gitypes.h>
#include <girepository/giunioninfo.h> #include <girepository/giunioninfo.h>
#include <girepository/giunresolvedinfo.h>
#include <girepository/givfuncinfo.h> #include <girepository/givfuncinfo.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@ -27,6 +27,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "gisignalinfo.h" #include "gisignalinfo.h"
@ -141,3 +142,11 @@ gi_signal_info_true_stops_emit (GISignalInfo *info)
return blob->true_stops_emit; return blob->true_stops_emit;
} }
void
gi_signal_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_SIGNAL;
}

View File

@ -29,6 +29,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "gistructinfo.h" #include "gistructinfo.h"
@ -338,3 +339,12 @@ gi_struct_info_get_free_function (GIStructInfo *info)
return NULL; return NULL;
} }
void
gi_struct_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_STRUCT;
}

View File

@ -27,6 +27,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "gitypeinfo.h" #include "gitypeinfo.h"
@ -569,3 +570,12 @@ gi_type_info_hash_pointer_from_argument (GITypeInfo *info,
GITypeTag storage_type = gi_type_info_get_storage_type (info); GITypeTag storage_type = gi_type_info_get_storage_type (info);
return gi_type_tag_hash_pointer_from_argument (storage_type, arg); return gi_type_tag_hash_pointer_from_argument (storage_type, arg);
} }
void
gi_type_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_TYPE;
}

View File

@ -29,155 +29,87 @@
#endif #endif
#include <glib.h> #include <glib.h>
#include <glib-object.h>
#include "gi-visibility.h"
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GIBaseInfoStub { /* Documented in gibaseinfo.c */
/*< private >*/ typedef struct _GIBaseInfo GIBaseInfo;
gint32 dummy1; typedef struct _GIBaseInfoClass GIBaseInfoClass;
gint32 dummy2;
gpointer dummy3;
gpointer dummy4;
gpointer dummy5;
guint32 dummy6;
guint32 dummy7;
gpointer padding[4];
} GIBaseInfo;
/** /* Documented in gicallableinfo.c */
* GICallableInfo: typedef struct _GICallableInfo GICallableInfo;
* GI_AVAILABLE_IN_ALL GType gi_callable_info_get_type (void);
* Represents a callable, either #GIFunctionInfo, #GICallbackInfo or
* #GIVFuncInfo.
*/
typedef GIBaseInfo GICallableInfo;
/** /* Documented in gifunctioninfo.c */
* GIFunctionInfo: typedef struct _GIFunctionInfo GIFunctionInfo;
* GI_AVAILABLE_IN_ALL GType gi_function_info_get_type (void);
* Represents a function, eg arguments and return value.
*/
typedef GIBaseInfo GIFunctionInfo;
/** /* Documented in gicallbackinfo.c */
* SECTION:gicallbackinfo typedef struct _GICallbackInfo GICallbackInfo;
* @title: GICallbackInfo GI_AVAILABLE_IN_ALL GType gi_callback_info_get_type (void);
* @short_description: Struct representing a callback
*
* GICallbackInfo represents a callback.
*/
/** /* Documented in giregisteredtypeinfo.c */
* GICallbackInfo: typedef struct _GIRegisteredTypeInfo GIRegisteredTypeInfo;
* GI_AVAILABLE_IN_ALL GType gi_registered_type_info_get_type (void);
* Represents a callback, eg arguments and return value.
*/
typedef GIBaseInfo GICallbackInfo;
/** /* Documented in gistructinfo.c */
* GIRegisteredTypeInfo: typedef struct _GIStructInfo GIStructInfo;
* GI_AVAILABLE_IN_ALL GType gi_struct_info_get_type (void);
* Represent a registered type.
*/
typedef GIBaseInfo GIRegisteredTypeInfo;
/**
* GIStructInfo:
*
* Represents a struct.
*/
typedef GIBaseInfo GIStructInfo;
/* Documented in giunioninfo.c */ /* Documented in giunioninfo.c */
typedef GIBaseInfo GIUnionInfo; typedef struct _GIUnionInfo GIUnionInfo;
GI_AVAILABLE_IN_ALL GType gi_union_info_get_type (void);
/** /* Documented in gienuminfo.c */
* GIEnumInfo: typedef struct _GIEnumInfo GIEnumInfo;
* GI_AVAILABLE_IN_ALL GType gi_enum_info_get_type (void);
* Represents an enum or a flag.
*/
typedef GIBaseInfo GIEnumInfo;
/** /* Documented in giobjectinfo.c */
* GIObjectInfo: typedef struct _GIObjectInfo GIObjectInfo;
* GI_AVAILABLE_IN_ALL GType gi_object_info_get_type (void);
* Represents an object.
*/
typedef GIBaseInfo GIObjectInfo;
/** /* Documented in giinterfaceinfo.c */
* GIInterfaceInfo: typedef struct _GIInterfaceInfo GIInterfaceInfo;
* GI_AVAILABLE_IN_ALL GType gi_interface_info_get_type (void);
* Represents an interface.
*/
typedef GIBaseInfo GIInterfaceInfo;
/** /* Documented in giconstantinfo.c */
* GIConstantInfo: typedef struct _GIConstantInfo GIConstantInfo;
* GI_AVAILABLE_IN_ALL GType gi_constant_info_get_type (void);
* Represents a constant.
*/
typedef GIBaseInfo GIConstantInfo;
/** /* Documented in givalueinfo.c */
* SECTION:givalueinfo typedef struct _GIValueInfo GIValueInfo;
* @title: GIValueInfo GI_AVAILABLE_IN_ALL GType gi_value_info_get_type (void);
* @short_description: Struct representing a value
*
* GIValueInfo represents a value.
*/
/** /* Documented in gisignalinfo.c */
* GIValueInfo: typedef struct _GISignalInfo GISignalInfo;
* GI_AVAILABLE_IN_ALL GType gi_signal_info_get_type (void);
* Represents a enum value of a #GIEnumInfo.
*/
typedef GIBaseInfo GIValueInfo;
/**
* GISignalInfo:
*
* Represents a signal.
*/
typedef GIBaseInfo GISignalInfo;
/* Documented in givfuncinfo.c */ /* Documented in givfuncinfo.c */
typedef GIBaseInfo GIVFuncInfo; typedef struct _GIVFuncInfo GIVFuncInfo;
GI_AVAILABLE_IN_ALL GType gi_vfunc_info_get_type (void);
/** /* Documented in gipropertyinfo.c */
* GIPropertyInfo: typedef struct _GIPropertyInfo GIPropertyInfo;
* GI_AVAILABLE_IN_ALL GType gi_property_info_get_type (void);
* Represents a property of a #GIObjectInfo or a #GIInterfaceInfo.
*/
typedef GIBaseInfo GIPropertyInfo;
/** /* Documented in gifieldinfo.c */
* GIFieldInfo: typedef struct _GIFieldInfo GIFieldInfo;
* GI_AVAILABLE_IN_ALL GType gi_field_info_get_type (void);
* Represents a field of a #GIStructInfo or a #GIUnionInfo.
*/
typedef GIBaseInfo GIFieldInfo;
/** /* Documented in giarginfo.c */
* GIArgInfo: typedef struct _GIArgInfo GIArgInfo;
* GI_AVAILABLE_IN_ALL GType gi_arg_info_get_type (void);
* Represents an argument.
*/
typedef GIBaseInfo GIArgInfo;
/** /* Documented in gitypeinfo.c */
* GITypeInfo: typedef struct _GITypeInfo GITypeInfo;
* GI_AVAILABLE_IN_ALL GType gi_type_info_get_type (void);
* Represents type information, direction, transfer etc.
*/
typedef GIBaseInfo GITypeInfo;
/** /* Documented in giunresolvedinfo.c */
* GIUnresolvedInfo:
*
* Represents a unresolved type in a typelib.
*/
typedef struct _GIUnresolvedInfo GIUnresolvedInfo; typedef struct _GIUnresolvedInfo GIUnresolvedInfo;
GI_AVAILABLE_IN_ALL GType gi_unresolved_info_get_type (void);
union _GIArgument union _GIArgument
{ {
@ -255,6 +187,10 @@ typedef union _GIArgument GIArgument;
* @GI_INFO_TYPE_TYPE: type information, see #GITypeInfo * @GI_INFO_TYPE_TYPE: type information, see #GITypeInfo
* @GI_INFO_TYPE_UNRESOLVED: unresolved type, a type which is not present in * @GI_INFO_TYPE_UNRESOLVED: unresolved type, a type which is not present in
* the typelib, or any of its dependencies. * the typelib, or any of its dependencies.
* @GI_INFO_TYPE_CALLABLE: an abstract type representing any callable (function,
* callback, vfunc) (Since: 2.80)
* @GI_INFO_TYPE_REGISTERED_TYPE: an abstract type representing any registered
* type (enum, interface, object, struct, union) (Since: 2.80)
* *
* The type of a GIBaseInfo struct. * The type of a GIBaseInfo struct.
*/ */
@ -279,7 +215,10 @@ typedef enum
GI_INFO_TYPE_FIELD, GI_INFO_TYPE_FIELD,
GI_INFO_TYPE_ARG, GI_INFO_TYPE_ARG,
GI_INFO_TYPE_TYPE, GI_INFO_TYPE_TYPE,
GI_INFO_TYPE_UNRESOLVED GI_INFO_TYPE_UNRESOLVED,
GI_INFO_TYPE_CALLABLE, /* 20 */
GI_INFO_TYPE_REGISTERED_TYPE,
/* keep GI_INFO_TYPE_N_TYPES in sync with this */
} GIInfoType; } GIInfoType;
/** /**

View File

@ -27,6 +27,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "giunioninfo.h" #include "giunioninfo.h"
@ -68,8 +69,8 @@ gi_union_info_get_n_fields (GIUnionInfo *info)
* *
* Obtain the type information for the field with the specified index. * Obtain the type information for the field with the specified index.
* *
* Returns: (transfer full): the [alias@GIRepository.FieldInfo], free it with * Returns: (transfer full): the [type@GIRepository.FieldInfo], free it with
* gi_base_info_unref() when done. * [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80 * Since: 2.80
*/ */
GIFieldInfo * GIFieldInfo *
@ -109,8 +110,8 @@ gi_union_info_get_n_methods (GIUnionInfo *info)
* *
* Obtain the type information for the method with the specified index. * Obtain the type information for the method with the specified index.
* *
* Returns: (transfer full): the [alias@GIRepository.FunctionInfo], free it * Returns: (transfer full): the [type@GIRepository.FunctionInfo], free it
* with gi_base_info_unref() when done. * with [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80 * Since: 2.80
*/ */
GIFunctionInfo * GIFunctionInfo *
@ -171,8 +172,8 @@ gi_union_info_get_discriminator_offset (GIUnionInfo *info)
* *
* Obtain the type information of the union discriminator. * Obtain the type information of the union discriminator.
* *
* Returns: (transfer full): the [alias@GIRepository.TypeInfo], free it with * Returns: (transfer full): the [type@GIRepository.TypeInfo], free it with
* gi_base_info_unref() when done. * [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80 * Since: 2.80
*/ */
GITypeInfo * GITypeInfo *
@ -194,8 +195,8 @@ gi_union_info_get_discriminator_type (GIUnionInfo *info)
* *
* If the union is not discriminated, `NULL` is returned. * If the union is not discriminated, `NULL` is returned.
* *
* Returns: (transfer full) (nullable): the [alias@GIRepository.ConstantInfo], * Returns: (transfer full) (nullable): the [type@GIRepository.ConstantInfo],
* free it with gi_base_info_unref() when done. * free it with [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80 * Since: 2.80
*/ */
GIConstantInfo * GIConstantInfo *
@ -229,8 +230,8 @@ gi_union_info_get_discriminator (GIUnionInfo *info,
* *
* Obtain the type information for the method named @name. * Obtain the type information for the method named @name.
* *
* Returns: (transfer full): the [alias@GIRepository.FunctionInfo], free it * Returns: (transfer full): the [type@GIRepository.FunctionInfo], free it
* with gi_base_info_unref() when done. * with [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80 * Since: 2.80
*/ */
GIFunctionInfo * GIFunctionInfo *
@ -337,3 +338,12 @@ gi_union_info_get_free_function (GIUnionInfo *info)
return NULL; return NULL;
} }
void
gi_union_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_UNION;
}

View File

@ -0,0 +1,52 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
* GObject introspection: Callable implementation
*
* Copyright (C) 2005 Matthias Clasen
* Copyright 2023 GNOME Foundation, Inc.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <glib.h>
#include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h"
#include "gitypelib-internal.h"
#include "giunresolvedinfo.h"
/**
* SECTION:giunresolved
* @title: GIUnresolvedInfo
* @short_description: Struct representing an unresolved symbol
*
* GIUnresolvedInfo represents an unresolved symbol.
*/
void
gi_unresolved_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_UNRESOLVED;
}

View File

@ -0,0 +1,43 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
* GObject introspection: Callable
*
* Copyright 2023 GNOME Foundation, Inc.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#pragma once
#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION)
#error "Only <girepository.h> can be included directly."
#endif
#include <girepository/gitypes.h>
G_BEGIN_DECLS
/**
* GI_IS_UNRESOLVED_INFO
* @info: an info structure
*
* Checks if @info is a #GIUnresolvedInfo or derived from it.
*/
#define GI_IS_UNRESOLVED_INFO(info) \
(gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_UNRESOLVED)
G_END_DECLS

View File

@ -29,6 +29,7 @@
#include <glib.h> #include <glib.h>
#include <girepository/girepository.h> #include <girepository/girepository.h>
#include "gibaseinfo-private.h"
#include "girepository-private.h" #include "girepository-private.h"
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "givfuncinfo.h" #include "givfuncinfo.h"
@ -39,7 +40,7 @@
* `GIVfuncInfo` represents a virtual function. * `GIVfuncInfo` represents a virtual function.
* *
* A virtual function is a callable object that belongs to either a * A virtual function is a callable object that belongs to either a
* [alias@GIRepository.ObjectInfo] or a [alias@GIRepository.InterfaceInfo]. * [type@GIRepository.ObjectInfo] or a [type@GIRepository.InterfaceInfo].
* *
* Since: 2.80 * Since: 2.80
*/ */
@ -172,7 +173,7 @@ gi_vfunc_info_get_signal (GIVFuncInfo *info)
* *
* Not all virtuals will have invokers. * Not all virtuals will have invokers.
* *
* Returns: (transfer full) (nullable): the [alias@GIRepository.FunctionInfo] or * Returns: (transfer full) (nullable): the [type@GIRepository.FunctionInfo] or
* `NULL`. Free it with gi_base_info_unref() when done. * `NULL`. Free it with gi_base_info_unref() when done.
* Since: 2.80 * Since: 2.80
*/ */
@ -369,3 +370,12 @@ gi_vfunc_info_invoke (GIVFuncInfo *info,
FALSE, FALSE,
error); error);
} }
void
gi_vfunc_info_class_init (gpointer g_class,
gpointer class_data)
{
GIBaseInfoClass *info_class = g_class;
info_class->info_type = GI_INFO_TYPE_VFUNC;
}

View File

@ -45,6 +45,7 @@ girepo_headers = files(
'giarginfo.h', 'giarginfo.h',
'gibaseinfo.h', 'gibaseinfo.h',
'gicallableinfo.h', 'gicallableinfo.h',
'gicallbackinfo.h',
'giconstantinfo.h', 'giconstantinfo.h',
'gienuminfo.h', 'gienuminfo.h',
'gifieldinfo.h', 'gifieldinfo.h',
@ -60,6 +61,7 @@ girepo_headers = files(
'gitypelib.h', 'gitypelib.h',
'gitypes.h', 'gitypes.h',
'giunioninfo.h', 'giunioninfo.h',
'giunresolvedinfo.h',
'givfuncinfo.h', 'givfuncinfo.h',
) )
@ -142,6 +144,7 @@ girepo_sources = files(
'giarginfo.c', 'giarginfo.c',
'gibaseinfo.c', 'gibaseinfo.c',
'gicallableinfo.c', 'gicallableinfo.c',
'gicallbackinfo.c',
'giconstantinfo.c', 'giconstantinfo.c',
'gienuminfo.c', 'gienuminfo.c',
'gifieldinfo.c', 'gifieldinfo.c',
@ -158,6 +161,7 @@ girepo_sources = files(
'gitypeinfo.c', 'gitypeinfo.c',
'gitypelib.c', 'gitypelib.c',
'giunioninfo.c', 'giunioninfo.c',
'giunresolvedinfo.c',
'givfuncinfo.c', 'givfuncinfo.c',
) )