Merge branch 'ebassi/gir-more' into 'main'

Port GIRepository to GTypeInstance and add introspection

See merge request GNOME/glib!3703
This commit is contained in:
Philip Withnall 2023-12-12 17:27:26 +00:00
commit d74a9bc73e
56 changed files with 1709 additions and 577 deletions

View File

@ -11,11 +11,11 @@ cache:
- _ccache/ - _ccache/
variables: variables:
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/glib/fedora:v24" FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/glib/fedora:v25"
COVERITY_IMAGE: "registry.gitlab.gnome.org/gnome/glib/coverity:v7" COVERITY_IMAGE: "registry.gitlab.gnome.org/gnome/glib/coverity:v7"
DEBIAN_IMAGE: "registry.gitlab.gnome.org/gnome/glib/debian-stable:v18" DEBIAN_IMAGE: "registry.gitlab.gnome.org/gnome/glib/debian-stable:v19"
ALPINE_IMAGE: "registry.gitlab.gnome.org/gnome/glib/alpine:v3" ALPINE_IMAGE: "registry.gitlab.gnome.org/gnome/glib/alpine:v3"
MINGW_IMAGE: "registry.gitlab.gnome.org/gnome/glib/mingw:v14" MINGW_IMAGE: "registry.gitlab.gnome.org/gnome/glib/mingw:v15"
MESON_TEST_TIMEOUT_MULTIPLIER: 4 MESON_TEST_TIMEOUT_MULTIPLIER: 4
G_MESSAGES_DEBUG: all G_MESSAGES_DEBUG: all
MESON_COMMON_OPTIONS: "--buildtype debug --wrap-mode=nodownload --fatal-meson-warnings" MESON_COMMON_OPTIONS: "--buildtype debug --wrap-mode=nodownload --fatal-meson-warnings"
@ -120,6 +120,7 @@ fedora-x86_64:
-Ddtrace=true -Ddtrace=true
-Dinstalled_tests=true -Dinstalled_tests=true
-Ddocumentation=true -Ddocumentation=true
-Dintrospection=enabled
_build _build
- meson compile -C _build - meson compile -C _build
- mkdir -p _coverage - mkdir -p _coverage
@ -294,6 +295,7 @@ G_DISABLE_ASSERT:
-Ddtrace=true -Ddtrace=true
-Dinstalled_tests=true -Dinstalled_tests=true
-Dglib_assert=false -Dglib_assert=false
-Dintrospection=enabled
_build _build
- meson compile -C _build - meson compile -C _build
- bash -x ./.gitlab-ci/run-tests.sh - bash -x ./.gitlab-ci/run-tests.sh
@ -325,6 +327,7 @@ valgrind:
-Dsystemtap=true -Dsystemtap=true
-Ddtrace=true -Ddtrace=true
-Dinstalled_tests=true -Dinstalled_tests=true
-Dintrospection=enabled
_build _build
- meson compile -C _build - meson compile -C _build
# Valgrind doesnt work when the soft FD limit is set too high # Valgrind doesnt work when the soft FD limit is set too high
@ -547,7 +550,10 @@ freebsd-12-x86_64:
- "_build/meson-logs" - "_build/meson-logs"
freebsd-13-x86_64: freebsd-13-x86_64:
extends: .only-origin # FIXME: Temporarily only run the FreeBSD 13 CI on a schedule, rather than on
# every commit to origin, because its broken:
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3740#note_1935427
extends: .only-schedules
stage: build stage: build
tags: tags:
- freebsd-13 - freebsd-13
@ -672,6 +678,7 @@ scan-build:
-Dsystemtap=true -Dsystemtap=true
-Ddtrace=true -Ddtrace=true
-Dinstalled_tests=true -Dinstalled_tests=true
-Dintrospection=enabled
_scan_build _scan_build
- ninja -C _scan_build scan-build - ninja -C _scan_build scan-build
artifacts: artifacts:
@ -701,6 +708,7 @@ scan-build:
-Dsystemtap=true -Dsystemtap=true
-Ddtrace=true -Ddtrace=true
-Dinstalled_tests=true -Dinstalled_tests=true
-Dintrospection=enabled
_coverity_build _coverity_build
- $HOME/cov-analysis-linux64-*/bin/cov-build --dir cov-int meson compile -C _coverity_build - $HOME/cov-analysis-linux64-*/bin/cov-build --dir cov-int meson compile -C _coverity_build
- tar cfz cov-int.tar.gz cov-int - tar cfz cov-int.tar.gz cov-int

View File

@ -19,6 +19,7 @@ RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \
gi-docgen \ gi-docgen \
git \ git \
libc6-dev \ libc6-dev \
gobject-introspection \
gtk-doc-tools \ gtk-doc-tools \
itstool \ itstool \
lcov \ lcov \
@ -26,6 +27,7 @@ RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \
libdbus-1-dev \ libdbus-1-dev \
libelf-dev \ libelf-dev \
libffi-dev \ libffi-dev \
libgirepository1.0-dev \
libmount-dev \ libmount-dev \
libpcre2-dev \ libpcre2-dev \
libselinux1-dev \ libselinux1-dev \

View File

@ -35,6 +35,8 @@ RUN dnf -y update \
glibc-langpack-th \ glibc-langpack-th \
glibc-langpack-tr \ glibc-langpack-tr \
"gnome-desktop-testing >= 2018.1" \ "gnome-desktop-testing >= 2018.1" \
gobject-introspection \
gobject-introspection-devel \
gtk-doc \ gtk-doc \
itstool \ itstool \
lcov \ lcov \

View File

@ -1,4 +1,4 @@
FROM registry.gitlab.gnome.org/gnome/glib/fedora:v24 FROM registry.gitlab.gnome.org/gnome/glib/fedora:v25
USER root USER root

View File

@ -0,0 +1,50 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
# Copyright 2023 Matthias Clasen
# Copyright 2023 Philip Withnall
[library]
name = "Girepository"
version = "@VERSION@"
browse_url = "https://gitlab.gnome.org/GNOME/glib/"
repository_url = "https://gitlab.gnome.org/GNOME/glib.git"
website_url = "https://www.gtk.org"
docs_urls = "https://docs.gtk.org/girepository/"
authors = "GLib Development Team"
license = "LGPL-2.1-or-later"
description = "GIRepository is a library providing access to typelibs and introspection data which describes C APIs"
dependencies = [ "GLib-2.0", "GModule-2.0", "GObject-2.0", "Gio-2.0" ]
devhelp = true
search_index = true
[dependencies."GLib-2.0"]
name = "GLib"
description = "The base utility library"
docs_url = "https://docs.gtk.org/glib/"
[dependencies."GModule-2.0"]
name = "GModule"
description = "Portable API for dynamically loading modules"
docs_url = "https://docs.gtk.org/gmodule/"
[dependencies."GObject-2.0"]
name = "GObject"
description = "The base type system library"
docs_url = "https://docs.gtk.org/gobject/"
[dependencies."Gio-2.0"]
name = "Gio"
description = "Useful classes for general purpose I/O, networking, IPC, settings, etc."
docs_url = "https://docs.gtk.org/gio/"
[theme]
name = "basic"
show_index_summary = true
show_class_hierarchy = true
[extra]
urlmap_file = "urlmap.js"
# The same order will be used when generating the index
content_files = [
]
content_images = [
]

View File

@ -0,0 +1,23 @@
girepository_toml = configure_file(
input: 'girepository.toml.in',
output: 'girepository.toml',
configuration: toml_conf,
)
custom_target('girepository-docs',
input: [ girepository_toml, girepository_gir[0] ],
output: 'girepository',
command: [
gidocgen,
'generate',
gidocgen_common_args,
'--config=@INPUT0@',
'--output-dir=@OUTPUT@',
'--content-dir=@0@'.format(meson.current_source_dir()),
'--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gobject'),
'--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gmodule'),
'--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gio'),
'@INPUT1@',
],
build_by_default: true,
)

View File

@ -0,0 +1,10 @@
// SPDX-License-Identifier: LGPL-2.1-or-later
// SPDX-FileCopyrightText: 2023 Matthias Clasen
var baseURLs = [
[ 'GdkPixbuf', 'https://docs.gtk.org/gdk-pixbuf/' ],
[ 'GLib', 'https://docs.gtk.org/glib/' ],
[ 'GModule', 'https://docs.gtk.org/gmodule/' ],
[ 'GObject', 'https://docs.gtk.org/gobject/' ],
[ 'Gio', 'https://docs.gtk.org/gio/' ],
[ 'Gtk', 'https://docs.gtk.org/gtk4/' ],
];

View File

@ -18,4 +18,5 @@ if get_option('documentation') and enable_gir
subdir('gmodule') subdir('gmodule')
subdir('gobject') subdir('gobject')
subdir('gio') subdir('gio')
subdir('girepository')
endif endif

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"
@ -175,7 +176,7 @@ gi_arg_info_may_be_null (GIArgInfo *info)
* Obtain if an argument is only useful in C. * Obtain if an argument is only useful in C.
* *
* Returns: %TRUE if argument is only useful in C. * Returns: %TRUE if argument is only useful in C.
* Since: 1.30 * Since: 2.80
*/ */
gboolean gboolean
gi_arg_info_is_skip (GIArgInfo *info) gi_arg_info_is_skip (GIArgInfo *info)
@ -291,7 +292,7 @@ gi_arg_info_get_destroy (GIArgInfo *info)
} }
/** /**
* gi_arg_info_get_type: * gi_arg_info_get_type_info:
* @info: a #GIArgInfo * @info: a #GIArgInfo
* *
* Obtain the type information for @info. * Obtain the type information for @info.
@ -301,7 +302,7 @@ gi_arg_info_get_destroy (GIArgInfo *info)
* when done. * when done.
*/ */
GITypeInfo * GITypeInfo *
gi_arg_info_get_type (GIArgInfo *info) gi_arg_info_get_type_info (GIArgInfo *info)
{ {
GIRealInfo *rinfo = (GIRealInfo *)info; GIRealInfo *rinfo = (GIRealInfo *)info;
@ -317,7 +318,7 @@ gi_arg_info_get_type (GIArgInfo *info)
* @type: (out caller-allocates): Initialized with information about type of @info * @type: (out caller-allocates): Initialized with information about type of @info
* *
* Obtain information about a the type of given argument @info; this * Obtain information about a the type of given argument @info; this
* function is a variant of gi_arg_info_get_type() designed for stack * function is a variant of gi_arg_info_get_type_info() designed for stack
* allocation. * allocation.
* *
* The initialized @type must not be referenced after @info is deallocated. * The initialized @type must not be referenced after @info is deallocated.
@ -331,5 +332,14 @@ gi_arg_info_load_type (GIArgInfo *info,
g_return_if_fail (info != NULL); g_return_if_fail (info != NULL);
g_return_if_fail (GI_IS_ARG_INFO (info)); g_return_if_fail (GI_IS_ARG_INFO (info));
gi_type_info_init (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

@ -39,7 +39,7 @@ G_BEGIN_DECLS
* Checks if @info is a GIArgInfo. * Checks if @info is a GIArgInfo.
*/ */
#define GI_IS_ARG_INFO(info) \ #define GI_IS_ARG_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_ARG) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_ARG)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
@ -73,7 +73,7 @@ GI_AVAILABLE_IN_ALL
gint gi_arg_info_get_destroy (GIArgInfo *info); gint gi_arg_info_get_destroy (GIArgInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GITypeInfo * gi_arg_info_get_type (GIArgInfo *info); GITypeInfo * gi_arg_info_get_type_info (GIArgInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
void gi_arg_info_load_type (GIArgInfo *info, void gi_arg_info_load_type (GIArgInfo *info,

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. */
GType #define GI_BASE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GI_TYPE_BASE_INFO, GIBaseInfoClass))
gi_base_info_gtype_get_type (void)
{
static GType our_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; 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
gi_base_info_get_type (void)
{
static GType base_info_type = 0;
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;
} }
@ -85,7 +348,7 @@ gi_info_new_full (GIInfoType type,
* *
* TODO * TODO
* *
* Returns: TODO * Returns: (transfer full): TODO
*/ */
GIBaseInfo * GIBaseInfo *
gi_info_new (GIInfoType type, gi_info_new (GIInfoType type,
@ -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,23 +523,12 @@ 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);
} }
/** /**
* gi_base_info_get_type: * gi_base_info_get_info_type:
* @info: a #GIBaseInfo * @info: a #GIBaseInfo
* *
* Obtain the info type of the GIBaseInfo. * Obtain the info type of the GIBaseInfo.
@ -286,10 +536,9 @@ gi_base_info_unref (GIBaseInfo *info)
* Returns: the info type of @info * Returns: the info type of @info
*/ */
GIInfoType GIInfoType
gi_base_info_get_type (GIBaseInfo *info) gi_base_info_get_info_type (GIBaseInfo *info)
{ {
return GI_BASE_INFO_GET_CLASS (info)->info_type;
return ((GIRealInfo*)info)->type;
} }
/** /**
@ -307,7 +556,7 @@ gi_base_info_get_name (GIBaseInfo *info)
{ {
GIRealInfo *rinfo = (GIRealInfo*)info; GIRealInfo *rinfo = (GIRealInfo*)info;
g_assert (rinfo->ref_count > 0); g_assert (rinfo->ref_count > 0);
switch (rinfo->type) switch (gi_base_info_get_info_type ((GIBaseInfo *) info))
{ {
case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_FUNCTION:
case GI_INFO_TYPE_CALLBACK: case GI_INFO_TYPE_CALLBACK:
@ -407,7 +656,7 @@ gi_base_info_get_namespace (GIBaseInfo *info)
g_assert (rinfo->ref_count > 0); g_assert (rinfo->ref_count > 0);
if (rinfo->type == GI_INFO_TYPE_UNRESOLVED) if (gi_base_info_get_info_type (info) == GI_INFO_TYPE_UNRESOLVED)
{ {
GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info; GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
@ -430,7 +679,7 @@ gboolean
gi_base_info_is_deprecated (GIBaseInfo *info) gi_base_info_is_deprecated (GIBaseInfo *info)
{ {
GIRealInfo *rinfo = (GIRealInfo*) info; GIRealInfo *rinfo = (GIRealInfo*) info;
switch (rinfo->type) switch (gi_base_info_get_info_type ((GIBaseInfo *) info))
{ {
case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_FUNCTION:
case GI_INFO_TYPE_CALLBACK: case GI_INFO_TYPE_CALLBACK:

View File

@ -48,11 +48,11 @@ typedef struct {
gpointer data4; gpointer data4;
} GIAttributeIter; } GIAttributeIter;
#define GI_TYPE_BASE_INFO (gi_base_info_gtype_get_type ()) #define GI_TYPE_BASE_INFO (gi_base_info_get_type ())
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GType gi_base_info_gtype_get_type (void) G_GNUC_CONST; GType gi_base_info_get_type (void) G_GNUC_CONST;
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GIBaseInfo * gi_base_info_ref (GIBaseInfo *info); GIBaseInfo * gi_base_info_ref (GIBaseInfo *info);
@ -61,7 +61,7 @@ GI_AVAILABLE_IN_ALL
void gi_base_info_unref (GIBaseInfo *info); void gi_base_info_unref (GIBaseInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GIInfoType gi_base_info_get_type (GIBaseInfo *info); GIInfoType gi_base_info_get_info_type (GIBaseInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
const gchar * gi_base_info_get_name (GIBaseInfo *info); const gchar * gi_base_info_get_name (GIBaseInfo *info);

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"
@ -59,7 +60,7 @@ signature_offset (GICallableInfo *info)
GIRealInfo *rinfo = (GIRealInfo*)info; GIRealInfo *rinfo = (GIRealInfo*)info;
int sigoff = -1; int sigoff = -1;
switch (rinfo->type) switch (gi_base_info_get_info_type ((GIBaseInfo *) info))
{ {
case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_FUNCTION:
sigoff = G_STRUCT_OFFSET (FunctionBlob, signature); sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
@ -87,7 +88,7 @@ signature_offset (GICallableInfo *info)
* *
* TODO * TODO
* *
* Since: 1.34 * Since: 2.80
* Returns: %TRUE if this #GICallableInfo can throw a #GError * Returns: %TRUE if this #GICallableInfo can throw a #GError
*/ */
gboolean gboolean
@ -105,7 +106,7 @@ gi_callable_info_can_throw_gerror (GICallableInfo *info)
* to support the other callables. For Functions and VFuncs, * to support the other callables. For Functions and VFuncs,
* also check their legacy flag for compatibility. * also check their legacy flag for compatibility.
*/ */
switch (rinfo->type) { switch (gi_base_info_get_info_type ((GIBaseInfo *) info)) {
case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_FUNCTION:
{ {
FunctionBlob *blob; FunctionBlob *blob;
@ -141,13 +142,13 @@ gi_callable_info_can_throw_gerror (GICallableInfo *info)
* or "this" object. * or "this" object.
* *
* Returns: %TRUE if @info is a method, %FALSE otherwise * Returns: %TRUE if @info is a method, %FALSE otherwise
* Since: 1.34 * Since: 2.80
*/ */
gboolean gboolean
gi_callable_info_is_method (GICallableInfo *info) gi_callable_info_is_method (GICallableInfo *info)
{ {
GIRealInfo *rinfo = (GIRealInfo*)info; GIRealInfo *rinfo = (GIRealInfo*)info;
switch (rinfo->type) { switch (gi_base_info_get_info_type ((GIBaseInfo *) info)) {
case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_FUNCTION:
{ {
FunctionBlob *blob; FunctionBlob *blob;
@ -211,7 +212,7 @@ gi_callable_info_load_return_type (GICallableInfo *info,
offset = signature_offset (info); offset = signature_offset (info);
gi_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, offset); gi_type_info_init ((GIBaseInfo *) type, (GIBaseInfo*)info, rinfo->typelib, offset);
} }
/** /**
@ -293,7 +294,7 @@ gi_callable_info_get_caller_owns (GICallableInfo *info)
* Obtains the ownership transfer for the instance argument. * Obtains the ownership transfer for the instance argument.
* #GITransfer contains a list of possible transfer values. * #GITransfer contains a list of possible transfer values.
* *
* Since: 1.42 * Since: 2.80
* Returns: the transfer mode of the instance argument * Returns: the transfer mode of the instance argument
*/ */
GITransfer GITransfer
@ -458,7 +459,7 @@ gi_callable_info_iterate_return_attributes (GICallableInfo *info,
if (iterator->data != NULL) if (iterator->data != NULL)
next = (AttributeBlob *) iterator->data; next = (AttributeBlob *) iterator->data;
else else
next = _attribute_blob_find_first (info, blob_offset); next = _attribute_blob_find_first ((GIBaseInfo *) info, blob_offset);
if (next == NULL || next->offset != blob_offset || next >= after) if (next == NULL || next->offset != blob_offset || next >= after)
return FALSE; return FALSE;
@ -489,7 +490,7 @@ gi_callable_info_iterate_return_attributes (GICallableInfo *info,
* The @interface_type argument only applies if @return_tag is * The @interface_type argument only applies if @return_tag is
* %GI_TYPE_TAG_INTERFACE. Otherwise it is ignored. * %GI_TYPE_TAG_INTERFACE. Otherwise it is ignored.
* *
* Since: 1.72 * Since: 2.80
*/ */
void void
gi_type_tag_extract_ffi_return_value (GITypeTag return_tag, gi_type_tag_extract_ffi_return_value (GITypeTag return_tag,
@ -573,7 +574,7 @@ gi_type_info_extract_ffi_return_value (GITypeInfo *return_info,
if (return_tag == GI_TYPE_TAG_INTERFACE) if (return_tag == GI_TYPE_TAG_INTERFACE)
{ {
GIBaseInfo *interface_info = gi_type_info_get_interface (return_info); GIBaseInfo *interface_info = gi_type_info_get_interface (return_info);
interface_type = gi_base_info_get_type (interface_info); interface_type = gi_base_info_get_info_type (interface_info);
gi_base_info_unref (interface_info); gi_base_info_unref (interface_info);
} }
@ -597,7 +598,7 @@ gi_type_info_extract_ffi_return_value (GITypeInfo *return_info,
* TODO * TODO
*/ */
gboolean gboolean
gi_callable_info_invoke (GIFunctionInfo *info, gi_callable_info_invoke (GICallableInfo *info,
gpointer function, gpointer function,
const GIArgument *in_args, const GIArgument *in_args,
int n_in_args, int n_in_args,
@ -666,7 +667,7 @@ gi_callable_info_invoke (GIFunctionInfo *info,
switch (gi_arg_info_get_direction (ainfo)) switch (gi_arg_info_get_direction (ainfo))
{ {
case GI_DIRECTION_IN: case GI_DIRECTION_IN:
tinfo = gi_arg_info_get_type (ainfo); tinfo = gi_arg_info_get_type_info (ainfo);
atypes[i+offset] = gi_type_info_get_ffi_type (tinfo); atypes[i+offset] = gi_type_info_get_ffi_type (tinfo);
gi_base_info_unref ((GIBaseInfo *)ainfo); gi_base_info_unref ((GIBaseInfo *)ainfo);
gi_base_info_unref ((GIBaseInfo *)tinfo); gi_base_info_unref ((GIBaseInfo *)tinfo);
@ -791,3 +792,12 @@ gi_callable_info_invoke (GIFunctionInfo *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

@ -39,10 +39,10 @@ G_BEGIN_DECLS
* Checks if @info is a #GICallableInfo or derived from it. * Checks if @info is a #GICallableInfo or derived from it.
*/ */
#define GI_IS_CALLABLE_INFO(info) \ #define GI_IS_CALLABLE_INFO(info) \
((gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_FUNCTION) || \ ((gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_FUNCTION) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_CALLBACK) || \ (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_CALLBACK) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_SIGNAL) || \ (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_SIGNAL) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_VFUNC)) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_VFUNC))
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL

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"
@ -40,13 +41,13 @@
* GIConstantInfo represents a constant. * GIConstantInfo represents a constant.
* *
* A constant has a type associated which can be obtained by calling * A constant has a type associated which can be obtained by calling
* gi_constant_info_get_type() and a value, which can be obtained by * gi_constant_info_get_type_info() and a value, which can be obtained by
* calling gi_constant_info_get_value(). * calling gi_constant_info_get_value().
*/ */
/** /**
* gi_constant_info_get_type: * gi_constant_info_get_type_info:
* @info: a #GIConstantInfo * @info: a #GIConstantInfo
* *
* Obtain the type of the constant as a #GITypeInfo. * Obtain the type of the constant as a #GITypeInfo.
@ -55,7 +56,7 @@
* gi_base_info_unref() when done. * gi_base_info_unref() when done.
*/ */
GITypeInfo * GITypeInfo *
gi_constant_info_get_type (GIConstantInfo *info) gi_constant_info_get_type_info (GIConstantInfo *info)
{ {
GIRealInfo *rinfo = (GIRealInfo *)info; GIRealInfo *rinfo = (GIRealInfo *)info;
@ -75,7 +76,7 @@ gi_constant_info_get_type (GIConstantInfo *info)
* *
* Free the value returned from gi_constant_info_get_value(). * Free the value returned from gi_constant_info_get_value().
* *
* Since: 1.32 * Since: 2.80
*/ */
void void
gi_constant_info_free_value (GIConstantInfo *info, gi_constant_info_free_value (GIConstantInfo *info,
@ -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

@ -39,11 +39,11 @@ G_BEGIN_DECLS
* Checks if @info is a #GIConstantInfo. * Checks if @info is a #GIConstantInfo.
*/ */
#define GI_IS_CONSTANT_INFO(info) \ #define GI_IS_CONSTANT_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_CONSTANT) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_CONSTANT)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GITypeInfo * gi_constant_info_get_type (GIConstantInfo *info); GITypeInfo * gi_constant_info_get_type_info (GIConstantInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
void gi_constant_info_free_value (GIConstantInfo *info, void gi_constant_info_free_value (GIConstantInfo *info,

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"
@ -76,7 +77,7 @@ gi_enum_info_get_n_values (GIEnumInfo *info)
* *
* Returns: (transfer none): the string form of the error domain associated * Returns: (transfer none): the string form of the error domain associated
* with this enum, or %NULL. * with this enum, or %NULL.
* Since: 1.30 * Since: 2.80
*/ */
const gchar * const gchar *
gi_enum_info_get_error_domain (GIEnumInfo *info) gi_enum_info_get_error_domain (GIEnumInfo *info)
@ -130,7 +131,7 @@ gi_enum_info_get_value (GIEnumInfo *info,
* Obtain the number of methods that this enum type has. * Obtain the number of methods that this enum type has.
* *
* Returns: number of methods * Returns: number of methods
* Since: 1.30 * Since: 2.80
*/ */
gint gint
gi_enum_info_get_n_methods (GIEnumInfo *info) gi_enum_info_get_n_methods (GIEnumInfo *info)
@ -155,7 +156,7 @@ gi_enum_info_get_n_methods (GIEnumInfo *info)
* *
* Returns: (transfer full): the #GIFunctionInfo. Free the struct by calling * Returns: (transfer full): the #GIFunctionInfo. Free the struct by calling
* gi_base_info_unref() when done. * gi_base_info_unref() when done.
* Since: 1.30 * Since: 2.80
*/ */
GIFunctionInfo * GIFunctionInfo *
gi_enum_info_get_method (GIEnumInfo *info, gi_enum_info_get_method (GIEnumInfo *info,
@ -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

@ -39,8 +39,8 @@ G_BEGIN_DECLS
* Checks if @info is a #GIEnumInfo. * Checks if @info is a #GIEnumInfo.
*/ */
#define GI_IS_ENUM_INFO(info) \ #define GI_IS_ENUM_INFO(info) \
((gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_ENUM) || \ ((gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_ENUM) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_FLAGS)) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_FLAGS))
/** /**
* GI_IS_VALUE_INFO * GI_IS_VALUE_INFO
@ -49,7 +49,7 @@ G_BEGIN_DECLS
* Checks if @info is a #GIValueInfo. * Checks if @info is a #GIValueInfo.
*/ */
#define GI_IS_VALUE_INFO(info) \ #define GI_IS_VALUE_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_VALUE) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_VALUE)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL

View File

@ -27,35 +27,40 @@
#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"
#include "gifieldinfo.h" #include "gifieldinfo.h"
/** /**
* SECTION:gifieldinfo * GIFieldInfo:
* @title: GIFieldInfo
* @short_description: Struct representing a struct or union field
* *
* A GIFieldInfo struct represents a field of a struct, union, or object. * A `GIFieldInfo` struct represents a field of a struct, union, or object.
* *
* The GIFieldInfo is fetched by calling gi_struct_info_get_field(), * The `GIFieldInfo` is fetched by calling
* gi_union_info_get_field() or gi_object_info_get_field(). * [method@GIRepository.StructInfo.get_field],
* [method@GIRepository.UnionInfo.get_field] or
* [method@GIRepository.ObjectInfo.get_field].
* *
* A field has a size, type and a struct offset asssociated and a set of flags, * A field has a size, type and a struct offset associated and a set of flags,
* which are currently #GI_FIELD_IS_READABLE or #GI_FIELD_IS_WRITABLE. * which are currently `GI_FIELD_IS_READABLE` or `GI_FIELD_IS_WRITABLE`.
* *
* See also: #GIStructInfo, #GIUnionInfo, #GIObjectInfo * See also: [type@GIRepository.StructInfo], [type@GIRepository.UnionInfo],
* [type@GIRepository.ObjectInfo]
*
* Since: 2.80
*/ */
/** /**
* gi_field_info_get_flags: * gi_field_info_get_flags:
* @info: a #GIFieldInfo * @info: a #GIFieldInfo
* *
* Obtain the flags for this #GIFieldInfo. See #GIFieldInfoFlags for possible * Obtain the flags for this `GIFieldInfo`. See
* flag values. * [flags@GIRepository.FieldInfoFlags] for possible flag values.
* *
* Returns: the flags * Returns: the flags
* Since: 2.80
*/ */
GIFieldInfoFlags GIFieldInfoFlags
gi_field_info_get_flags (GIFieldInfo *info) gi_field_info_get_flags (GIFieldInfo *info)
@ -84,10 +89,11 @@ gi_field_info_get_flags (GIFieldInfo *info)
* gi_field_info_get_size: * gi_field_info_get_size:
* @info: a #GIFieldInfo * @info: a #GIFieldInfo
* *
* Obtain the size in bits of the field member, this is how * Obtain the size of the field member, in bits. This is how
* much space you need to allocate to store the field. * much space you need to allocate to store the field.
* *
* Returns: the field size * Returns: the field size, in bits
* Since: 2.80
*/ */
gint gint
gi_field_info_get_size (GIFieldInfo *info) gi_field_info_get_size (GIFieldInfo *info)
@ -107,10 +113,11 @@ gi_field_info_get_size (GIFieldInfo *info)
* gi_field_info_get_offset: * gi_field_info_get_offset:
* @info: a #GIFieldInfo * @info: a #GIFieldInfo
* *
* Obtain the offset in bytes of the field member, this is relative * Obtain the offset of the field member, in bytes. This is relative
* to the beginning of the struct or union. * to the beginning of the struct or union.
* *
* Returns: the field offset * Returns: the field offset, in bytes
* Since: 2.80
*/ */
gint gint
gi_field_info_get_offset (GIFieldInfo *info) gi_field_info_get_offset (GIFieldInfo *info)
@ -127,16 +134,16 @@ gi_field_info_get_offset (GIFieldInfo *info)
} }
/** /**
* gi_field_info_get_type: * gi_field_info_get_type_info:
* @info: a #GIFieldInfo * @info: a #GIFieldInfo
* *
* Obtain the type of a field as a #GITypeInfo. * Obtain the type of a field as a [type@GIRepository.TypeInfo].
* *
* Returns: (transfer full): the #GITypeInfo. Free the struct by calling * Returns: (transfer full): the [type@GIRepository.TypeInfo]. Free the struct
* gi_base_info_unref() when done. * by calling [method@GIRepository.BaseInfo.unref] when done.
*/ */
GITypeInfo * GITypeInfo *
gi_field_info_get_type (GIFieldInfo *info) gi_field_info_get_type_info (GIFieldInfo *info)
{ {
GIRealInfo *rinfo = (GIRealInfo *)info; GIRealInfo *rinfo = (GIRealInfo *)info;
Header *header = (Header *)rinfo->typelib->data; Header *header = (Header *)rinfo->typelib->data;
@ -158,21 +165,24 @@ gi_field_info_get_type (GIFieldInfo *info)
else else
return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (FieldBlob, type)); return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (FieldBlob, type));
return (GIBaseInfo*)type_info; return (GITypeInfo *) type_info;
} }
/** /**
* gi_field_info_get_field: (skip) * gi_field_info_get_field: (skip)
* @field_info: a #GIFieldInfo * @field_info: a #GIFieldInfo
* @mem: pointer to a block of memory representing a C structure or union * @mem: pointer to a block of memory representing a C structure or union
* @value: a #GIArgument into which to store the value retrieved * @value: a [type@GIRepository.Argument] into which to store the value retrieved
* *
* Reads a field identified by a #GIFieldInfo from a C structure or * Reads a field identified by a `GIFieldInfo` from a C structure or
* union. This only handles fields of simple C types. It will fail * union.
* for a field of a composite type like a nested structure or union
* even if that is actually readable.
* *
* Returns: %TRUE if reading the field succeeded, otherwise %FALSE * This only handles fields of simple C types. It will fail for a field of a
* composite type like a nested structure or union even if that is actually
* readable.
*
* Returns: true if reading the field succeeded, false otherwise
* Since: 2.80
*/ */
gboolean gboolean
gi_field_info_get_field (GIFieldInfo *field_info, gi_field_info_get_field (GIFieldInfo *field_info,
@ -190,7 +200,7 @@ gi_field_info_get_field (GIFieldInfo *field_info,
return FALSE; return FALSE;
offset = gi_field_info_get_offset (field_info); offset = gi_field_info_get_offset (field_info);
type_info = gi_field_info_get_type (field_info); type_info = gi_field_info_get_type_info (field_info);
if (gi_type_info_is_pointer (type_info)) if (gi_type_info_is_pointer (type_info))
{ {
@ -263,7 +273,7 @@ gi_field_info_get_field (GIFieldInfo *field_info,
case GI_TYPE_TAG_INTERFACE: case GI_TYPE_TAG_INTERFACE:
{ {
GIBaseInfo *interface = gi_type_info_get_interface (type_info); GIBaseInfo *interface = gi_type_info_get_interface (type_info);
switch (gi_base_info_get_type (interface)) switch (gi_base_info_get_info_type (interface))
{ {
case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_STRUCT:
case GI_INFO_TYPE_UNION: case GI_INFO_TYPE_UNION:
@ -317,7 +327,7 @@ gi_field_info_get_field (GIFieldInfo *field_info,
case GI_INFO_TYPE_CALLBACK: case GI_INFO_TYPE_CALLBACK:
g_warning("Field %s: Interface type %d should have is_pointer set", g_warning("Field %s: Interface type %d should have is_pointer set",
gi_base_info_get_name ((GIBaseInfo *)field_info), gi_base_info_get_name ((GIBaseInfo *)field_info),
gi_base_info_get_type (interface)); gi_base_info_get_info_type (interface));
break; break;
case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_INVALID:
case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_INTERFACE:
@ -333,7 +343,7 @@ gi_field_info_get_field (GIFieldInfo *field_info,
case GI_INFO_TYPE_UNRESOLVED: case GI_INFO_TYPE_UNRESOLVED:
g_warning("Field %s: Interface type %d not expected", g_warning("Field %s: Interface type %d not expected",
gi_base_info_get_name ((GIBaseInfo *)field_info), gi_base_info_get_name ((GIBaseInfo *)field_info),
gi_base_info_get_type (interface)); gi_base_info_get_info_type (interface));
break; break;
default: default:
break; break;
@ -357,16 +367,19 @@ gi_field_info_get_field (GIFieldInfo *field_info,
* gi_field_info_set_field: (skip) * gi_field_info_set_field: (skip)
* @field_info: a #GIFieldInfo * @field_info: a #GIFieldInfo
* @mem: pointer to a block of memory representing a C structure or union * @mem: pointer to a block of memory representing a C structure or union
* @value: a #GIArgument holding the value to store * @value: a [type@GIRepository.Argument] holding the value to store
* *
* Writes a field identified by a #GIFieldInfo to a C structure or * Writes a field identified by a `GIFieldInfo` to a C structure or
* union. This only handles fields of simple C types. It will fail * union.
* for a field of a composite type like a nested structure or union
* even if that is actually writable. Note also that that it will refuse
* to write fields where memory management would by required. A field
* with a type such as 'char *' must be set with a setter function.
* *
* Returns: %TRUE if writing the field succeeded, otherwise %FALSE * This only handles fields of simple C types. It will fail for a field of a
* composite type like a nested structure or union even if that is actually
* writable. Note also that that it will refuse to write fields where memory
* management would by required. A field with a type such as `char *` must be
* set with a setter function.
*
* Returns: true if writing the field succeeded, false otherwise
* Since: 2.80
*/ */
gboolean gboolean
gi_field_info_set_field (GIFieldInfo *field_info, gi_field_info_set_field (GIFieldInfo *field_info,
@ -384,7 +397,7 @@ gi_field_info_set_field (GIFieldInfo *field_info,
return FALSE; return FALSE;
offset = gi_field_info_get_offset (field_info); offset = gi_field_info_get_offset (field_info);
type_info = gi_field_info_get_type (field_info); type_info = gi_field_info_get_type_info (field_info);
if (!gi_type_info_is_pointer (type_info)) if (!gi_type_info_is_pointer (type_info))
{ {
@ -447,7 +460,7 @@ gi_field_info_set_field (GIFieldInfo *field_info,
case GI_TYPE_TAG_INTERFACE: case GI_TYPE_TAG_INTERFACE:
{ {
GIBaseInfo *interface = gi_type_info_get_interface (type_info); GIBaseInfo *interface = gi_type_info_get_interface (type_info);
switch (gi_base_info_get_type (interface)) switch (gi_base_info_get_info_type (interface))
{ {
case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_STRUCT:
case GI_INFO_TYPE_UNION: case GI_INFO_TYPE_UNION:
@ -497,7 +510,7 @@ gi_field_info_set_field (GIFieldInfo *field_info,
case GI_INFO_TYPE_CALLBACK: case GI_INFO_TYPE_CALLBACK:
g_warning("Field%s: Interface type %d should have is_pointer set", g_warning("Field%s: Interface type %d should have is_pointer set",
gi_base_info_get_name ((GIBaseInfo *)field_info), gi_base_info_get_name ((GIBaseInfo *)field_info),
gi_base_info_get_type (interface)); gi_base_info_get_info_type (interface));
break; break;
case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_INVALID:
case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_INTERFACE:
@ -513,7 +526,7 @@ gi_field_info_set_field (GIFieldInfo *field_info,
case GI_INFO_TYPE_UNRESOLVED: case GI_INFO_TYPE_UNRESOLVED:
g_warning("Field %s: Interface type %d not expected", g_warning("Field %s: Interface type %d not expected",
gi_base_info_get_name ((GIBaseInfo *)field_info), gi_base_info_get_name ((GIBaseInfo *)field_info),
gi_base_info_get_type (interface)); gi_base_info_get_info_type (interface));
break; break;
default: default:
break; break;
@ -532,7 +545,7 @@ gi_field_info_set_field (GIFieldInfo *field_info,
case GI_TYPE_TAG_INTERFACE: case GI_TYPE_TAG_INTERFACE:
{ {
GIBaseInfo *interface = gi_type_info_get_interface (type_info); GIBaseInfo *interface = gi_type_info_get_interface (type_info);
switch (gi_base_info_get_type (interface)) switch (gi_base_info_get_info_type (interface))
{ {
case GI_INFO_TYPE_OBJECT: case GI_INFO_TYPE_OBJECT:
case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_INTERFACE:
@ -554,3 +567,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

@ -33,14 +33,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/** /**
* GI_IS_FIELD_INFO * GI_IS_FIELD_INFO:
* @info: an info structure * @info: an info structure
* *
* Checks if @info is a #GIFieldInfo. * Checks if @info is a [class@GIRepository.FieldInfo].
* *
* Since: 2.80
*/ */
#define GI_IS_FIELD_INFO(info) \ #define GI_IS_FIELD_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_FIELD) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_FIELD)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
@ -53,7 +54,7 @@ GI_AVAILABLE_IN_ALL
gint gi_field_info_get_offset (GIFieldInfo *info); gint gi_field_info_get_offset (GIFieldInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GITypeInfo * gi_field_info_get_type (GIFieldInfo *info); GITypeInfo * gi_field_info_get_type_info (GIFieldInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
gboolean gi_field_info_get_field (GIFieldInfo *field_info, gboolean gi_field_info_get_field (GIFieldInfo *field_info,

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"
@ -158,7 +159,7 @@ gi_function_info_get_flags (GIFunctionInfo *info)
GIPropertyInfo * GIPropertyInfo *
gi_function_info_get_property (GIFunctionInfo *info) gi_function_info_get_property (GIFunctionInfo *info)
{ {
GIRealInfo *rinfo, *container_rinfo; GIRealInfo *rinfo;
FunctionBlob *blob; FunctionBlob *blob;
g_return_val_if_fail (info != NULL, NULL); g_return_val_if_fail (info != NULL, NULL);
@ -166,15 +167,14 @@ gi_function_info_get_property (GIFunctionInfo *info)
rinfo = (GIRealInfo *)info; rinfo = (GIRealInfo *)info;
blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
container_rinfo = (GIRealInfo *)rinfo->container;
if (container_rinfo->type == GI_INFO_TYPE_INTERFACE) if (gi_base_info_get_info_type ((GIBaseInfo *) rinfo->container) == GI_INFO_TYPE_INTERFACE)
{ {
GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container; GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container;
return gi_interface_info_get_property (container, blob->index); return gi_interface_info_get_property (container, blob->index);
} }
else if (container_rinfo->type == GI_INFO_TYPE_OBJECT) else if (gi_base_info_get_info_type ((GIBaseInfo *) rinfo->container) == GI_INFO_TYPE_OBJECT)
{ {
GIObjectInfo *container = (GIObjectInfo *)rinfo->container; GIObjectInfo *container = (GIObjectInfo *)rinfo->container;
@ -295,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

@ -39,7 +39,7 @@ G_BEGIN_DECLS
* Checks if @info is a #GIFunctionInfo. * Checks if @info is a #GIFunctionInfo.
*/ */
#define GI_IS_FUNCTION_INFO(info) \ #define GI_IS_FUNCTION_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_FUNCTION) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_FUNCTION)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL

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"
@ -297,7 +298,7 @@ gi_interface_info_get_signal (GIInterfaceInfo *info,
* *
* Returns: (transfer full): Info for the signal with name @name in @info, or * Returns: (transfer full): Info for the signal with name @name in @info, or
* %NULL on failure. * %NULL on failure.
* Since: 1.34 * Since: 2.80
*/ */
GISignalInfo * GISignalInfo *
gi_interface_info_find_signal (GIInterfaceInfo *info, gi_interface_info_find_signal (GIInterfaceInfo *info,
@ -311,7 +312,7 @@ gi_interface_info_find_signal (GIInterfaceInfo *info,
{ {
GISignalInfo *siginfo = gi_interface_info_get_signal (info, i); GISignalInfo *siginfo = gi_interface_info_get_signal (info, i);
if (g_strcmp0 (gi_base_info_get_name (siginfo), name) != 0) if (g_strcmp0 (gi_base_info_get_name ((GIBaseInfo *) siginfo), name) != 0)
{ {
gi_base_info_unref ((GIBaseInfo*)siginfo); gi_base_info_unref ((GIBaseInfo*)siginfo);
continue; continue;
@ -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

@ -39,7 +39,7 @@ G_BEGIN_DECLS
* Checks if @info is a #GIInterfaceInfo. * Checks if @info is a #GIInterfaceInfo.
*/ */
#define GI_IS_INTERFACE_INFO(info) \ #define GI_IS_INTERFACE_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_INTERFACE) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_INTERFACE)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL

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"
@ -141,7 +142,7 @@ gi_object_info_get_abstract (GIObjectInfo *info)
* *
* Returns: %TRUE if the object type is final * Returns: %TRUE if the object type is final
* *
* Since: 1.70 * Since: 2.80
*/ */
gboolean gboolean
gi_object_info_get_final (GIObjectInfo *info) gi_object_info_get_final (GIObjectInfo *info)
@ -496,7 +497,7 @@ gi_object_info_find_method_using_interfaces (GIObjectInfo *info,
result = gi_object_info_find_method (info, name); result = gi_object_info_find_method (info, name);
if (result) if (result)
implementor_result = gi_base_info_ref ((GIBaseInfo*) info); implementor_result = (GIObjectInfo *) gi_base_info_ref ((GIBaseInfo*) info);
if (result == NULL) if (result == NULL)
{ {
@ -514,7 +515,7 @@ gi_object_info_find_method_using_interfaces (GIObjectInfo *info,
if (result != NULL) if (result != NULL)
{ {
implementor_result = iface_info; implementor_result = (GIObjectInfo *) iface_info;
break; break;
} }
gi_base_info_unref ((GIBaseInfo*) iface_info); gi_base_info_unref ((GIBaseInfo*) iface_info);
@ -607,7 +608,7 @@ gi_object_info_find_signal (GIObjectInfo *info,
{ {
GISignalInfo *siginfo = gi_object_info_get_signal (info, i); GISignalInfo *siginfo = gi_object_info_get_signal (info, i);
if (g_strcmp0 (gi_base_info_get_name (siginfo), name) != 0) if (g_strcmp0 (gi_base_info_get_name ((GIBaseInfo *) siginfo), name) != 0)
{ {
gi_base_info_unref ((GIBaseInfo*)siginfo); gi_base_info_unref ((GIBaseInfo*)siginfo);
continue; continue;
@ -750,7 +751,7 @@ gi_object_info_find_vfunc_using_interfaces (GIObjectInfo *info,
result = gi_object_info_find_vfunc (info, name); result = gi_object_info_find_vfunc (info, name);
if (result) if (result)
implementor_result = gi_base_info_ref ((GIBaseInfo*) info); implementor_result = (GIObjectInfo *) gi_base_info_ref ((GIBaseInfo*) info);
if (result == NULL) if (result == NULL)
{ {
@ -768,7 +769,7 @@ gi_object_info_find_vfunc_using_interfaces (GIObjectInfo *info,
if (result != NULL) if (result != NULL)
{ {
implementor_result = iface_info; implementor_result = (GIObjectInfo *) iface_info;
break; break;
} }
gi_base_info_unref ((GIBaseInfo*) iface_info); gi_base_info_unref ((GIBaseInfo*) iface_info);
@ -881,7 +882,7 @@ _get_func(GIObjectInfo *info,
GIObjectInfo *parent_info; GIObjectInfo *parent_info;
gpointer func = NULL; gpointer func = NULL;
parent_info = gi_base_info_ref (info); parent_info = (GIObjectInfo *) gi_base_info_ref ((GIBaseInfo *) info);
while (parent_info != NULL) while (parent_info != NULL)
{ {
parents = g_slist_prepend (parents, parent_info); parents = g_slist_prepend (parents, parent_info);
@ -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

@ -76,7 +76,7 @@ typedef void * (*GIObjectInfoGetValueFunction) (const GValue *value);
* Checks if @info is a #GIObjectInfo. * Checks if @info is a #GIObjectInfo.
*/ */
#define GI_IS_OBJECT_INFO(info) \ #define GI_IS_OBJECT_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_OBJECT) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_OBJECT)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL

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"
@ -80,7 +81,7 @@ gi_property_info_get_flags (GIPropertyInfo *info)
} }
/** /**
* gi_property_info_get_type: * gi_property_info_get_type_info:
* @info: a #GIPropertyInfo * @info: a #GIPropertyInfo
* *
* Obtain the type information for the property @info. * Obtain the type information for the property @info.
@ -89,7 +90,7 @@ gi_property_info_get_flags (GIPropertyInfo *info)
* gi_base_info_unref() when done. * gi_base_info_unref() when done.
*/ */
GITypeInfo * GITypeInfo *
gi_property_info_get_type (GIPropertyInfo *info) gi_property_info_get_type_info (GIPropertyInfo *info)
{ {
GIRealInfo *rinfo = (GIRealInfo *)info; GIRealInfo *rinfo = (GIRealInfo *)info;
@ -160,7 +161,7 @@ gi_property_info_get_setter (GIPropertyInfo *info)
return NULL; return NULL;
container = rinfo->container; container = rinfo->container;
parent_type = gi_base_info_get_type (container); parent_type = gi_base_info_get_info_type (container);
if (parent_type == GI_INFO_TYPE_OBJECT) if (parent_type == GI_INFO_TYPE_OBJECT)
return gi_object_info_get_method ((GIObjectInfo *) container, blob->setter); return gi_object_info_get_method ((GIObjectInfo *) container, blob->setter);
else if (parent_type == GI_INFO_TYPE_INTERFACE) else if (parent_type == GI_INFO_TYPE_INTERFACE)
@ -199,7 +200,7 @@ gi_property_info_get_getter (GIPropertyInfo *info)
return NULL; return NULL;
container = rinfo->container; container = rinfo->container;
parent_type = gi_base_info_get_type (container); parent_type = gi_base_info_get_info_type (container);
if (parent_type == GI_INFO_TYPE_OBJECT) if (parent_type == GI_INFO_TYPE_OBJECT)
return gi_object_info_get_method ((GIObjectInfo *) container, blob->getter); return gi_object_info_get_method ((GIObjectInfo *) container, blob->getter);
else if (parent_type == GI_INFO_TYPE_INTERFACE) else if (parent_type == GI_INFO_TYPE_INTERFACE)
@ -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

@ -39,14 +39,14 @@ G_BEGIN_DECLS
* Checks if @info is a #GIPropertyInfo. * Checks if @info is a #GIPropertyInfo.
*/ */
#define GI_IS_PROPERTY_INFO(info) \ #define GI_IS_PROPERTY_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_PROPERTY) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_PROPERTY)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GParamFlags gi_property_info_get_flags (GIPropertyInfo *info); GParamFlags gi_property_info_get_flags (GIPropertyInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GITypeInfo * gi_property_info_get_type (GIPropertyInfo *info); GITypeInfo *gi_property_info_get_type_info (GIPropertyInfo *info);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GITransfer gi_property_info_get_ownership_transfer (GIPropertyInfo *info); GITransfer gi_property_info_get_ownership_transfer (GIPropertyInfo *info);

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

@ -40,14 +40,14 @@ G_BEGIN_DECLS
* Checks if @info is a #GIRegisteredTypeInfo or derived from it. * Checks if @info is a #GIRegisteredTypeInfo or derived from it.
*/ */
#define GI_IS_REGISTERED_TYPE_INFO(info) \ #define GI_IS_REGISTERED_TYPE_INFO(info) \
((gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_BOXED) || \ ((gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_BOXED) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_ENUM) || \ (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_ENUM) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_FLAGS) || \ (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_FLAGS) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_INTERFACE) || \ (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_INTERFACE) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_OBJECT) || \ (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_OBJECT) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_STRUCT) || \ (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_STRUCT) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_UNION) || \ (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_UNION) || \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_BOXED)) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_BOXED))
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
const gchar * gi_registered_type_info_get_type_name (GIRegisteredTypeInfo *info); const gchar * gi_registered_type_info_get_type_name (GIRegisteredTypeInfo *info);

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

@ -129,7 +129,7 @@ gi_repository_init (GIRepository *repository)
repository->priv = gi_repository_get_instance_private (repository); repository->priv = gi_repository_get_instance_private (repository);
repository->priv->typelibs repository->priv->typelibs
= g_hash_table_new_full (g_str_hash, g_str_equal, = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify) NULL, (GDestroyNotify) g_free,
(GDestroyNotify) gi_typelib_free); (GDestroyNotify) gi_typelib_free);
repository->priv->lazy_typelibs repository->priv->lazy_typelibs
= g_hash_table_new_full (g_str_hash, g_str_equal, = g_hash_table_new_full (g_str_hash, g_str_equal,
@ -184,7 +184,7 @@ init_globals (void)
return; return;
if (default_repository == NULL) if (default_repository == NULL)
default_repository = g_object_new (GI_TYPE_REPOSITORY, NULL); default_repository = gi_repository_new ();
if (typelib_search_path == NULL) if (typelib_search_path == NULL)
{ {
@ -441,7 +441,9 @@ register_internal (GIRepository *repository,
else else
key = build_typelib_key (namespace, source); key = build_typelib_key (namespace, source);
g_hash_table_insert (repository->priv->typelibs, key, (void *)typelib); g_hash_table_insert (repository->priv->typelibs,
g_steal_pointer (&key),
(void *)typelib);
} }
/* These types might be resolved now, clear the cache */ /* These types might be resolved now, clear the cache */
@ -468,7 +470,7 @@ register_internal (GIRepository *repository,
* Returns: (transfer full): Zero-terminated string array of immediate versioned * Returns: (transfer full): Zero-terminated string array of immediate versioned
* dependencies * dependencies
* *
* Since: 1.44 * Since: 2.80
*/ */
char ** char **
gi_repository_get_immediate_dependencies (GIRepository *repository, gi_repository_get_immediate_dependencies (GIRepository *repository,
@ -688,6 +690,23 @@ gi_repository_get_default (void)
return get_repository (NULL); return get_repository (NULL);
} }
/**
* gi_repository_new:
*
* Create a new (non-singleton) #GIRepository.
*
* Most callers should use gi_repository_get_default() instead, as a singleton
* repository is more useful in most situations.
*
* Returns: (transfer full): a new #GIRepository
* Since: 2.80
*/
GIRepository *
gi_repository_new (void)
{
return g_object_new (GI_TYPE_REPOSITORY, NULL);
}
/** /**
* gi_repository_get_n_infos: * gi_repository_get_n_infos:
* @repository: (allow-none): A #GIRepository or %NULL for the singleton * @repository: (allow-none): A #GIRepository or %NULL for the singleton
@ -943,7 +962,7 @@ find_by_error_domain_foreach (gpointer key,
* *
* Returns: (transfer full): #GIEnumInfo representing metadata about @domain's * Returns: (transfer full): #GIEnumInfo representing metadata about @domain's
* enum type, or %NULL * enum type, or %NULL
* Since: 1.30 * Since: 2.80
*/ */
GIEnumInfo * GIEnumInfo *
gi_repository_find_by_error_domain (GIRepository *repository, gi_repository_find_by_error_domain (GIRepository *repository,
@ -958,7 +977,7 @@ gi_repository_find_by_error_domain (GIRepository *repository,
GUINT_TO_POINTER (domain)); GUINT_TO_POINTER (domain));
if (cached != NULL) if (cached != NULL)
return gi_base_info_ref ((GIBaseInfo *)cached); return (GIEnumInfo *) gi_base_info_ref ((GIBaseInfo *)cached);
data.repository = repository; data.repository = repository;
data.domain = domain; data.domain = domain;
@ -971,13 +990,13 @@ gi_repository_find_by_error_domain (GIRepository *repository,
if (data.result != NULL) if (data.result != NULL)
{ {
cached = gi_info_new_full (data.result->blob_type, cached = (GIEnumInfo *) gi_info_new_full (data.result->blob_type,
repository, repository,
NULL, data.result_typelib, data.result->offset); NULL, data.result_typelib, data.result->offset);
g_hash_table_insert (repository->priv->info_by_error_domain, g_hash_table_insert (repository->priv->info_by_error_domain,
GUINT_TO_POINTER (domain), GUINT_TO_POINTER (domain),
gi_base_info_ref (cached)); gi_base_info_ref ((GIBaseInfo *) cached));
return cached; return cached;
} }
return NULL; return NULL;
@ -1002,7 +1021,7 @@ gi_repository_find_by_error_domain (GIRepository *repository,
* returning a concrete class of #GLocalFile, which is a #GType we * returning a concrete class of #GLocalFile, which is a #GType we
* see at runtime, but not statically. * see at runtime, but not statically.
* *
* Since: 1.62 * Since: 2.80
*/ */
void void
gi_repository_get_object_gtype_interfaces (GIRepository *repository, gi_repository_get_object_gtype_interfaces (GIRepository *repository,
@ -1034,7 +1053,7 @@ gi_repository_get_object_gtype_interfaces (GIRepository *repository,
if (base_info == NULL) if (base_info == NULL)
continue; continue;
if (gi_base_info_get_type (base_info) != GI_INFO_TYPE_INTERFACE) if (gi_base_info_get_info_type (base_info) != GI_INFO_TYPE_INTERFACE)
{ {
/* FIXME - could this really happen? */ /* FIXME - could this really happen? */
gi_base_info_unref (base_info); gi_base_info_unref (base_info);

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
@ -101,6 +103,9 @@ GType gi_repository_get_type (void) G_GNUC_CONST;
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GIRepository *gi_repository_get_default (void); GIRepository *gi_repository_get_default (void);
GI_AVAILABLE_IN_ALL
GIRepository *gi_repository_new (void);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
void gi_repository_prepend_search_path (const char *directory); void gi_repository_prepend_search_path (const char *directory);

View File

@ -146,7 +146,7 @@ gi_type_info_get_ffi_type (GITypeInfo *info)
if (gi_type_info_get_tag (info) == GI_TYPE_TAG_INTERFACE) if (gi_type_info_get_tag (info) == GI_TYPE_TAG_INTERFACE)
{ {
iinfo = gi_type_info_get_interface (info); iinfo = gi_type_info_get_interface (info);
switch (gi_base_info_get_type (iinfo)) switch (gi_base_info_get_info_type (iinfo))
{ {
case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_ENUM:
case GI_INFO_TYPE_FLAGS: case GI_INFO_TYPE_FLAGS:
@ -293,7 +293,7 @@ gi_function_info_prep_invoker (GIFunctionInfo *info,
return FALSE; return FALSE;
} }
return gi_function_invoker_new_for_address (addr, info, invoker, error); return gi_function_invoker_new_for_address (addr, (GICallableInfo *) info, invoker, error);
} }
/** /**

View File

@ -165,7 +165,7 @@ xml_free (Xml *xml)
static void static void
check_unresolved (GIBaseInfo *info) check_unresolved (GIBaseInfo *info)
{ {
if (gi_base_info_get_type (info) != GI_INFO_TYPE_UNRESOLVED) if (gi_base_info_get_info_type (info) != GI_INFO_TYPE_UNRESOLVED)
return; return;
g_critical ("Found unresolved type '%s' '%s'\n", g_critical ("Found unresolved type '%s' '%s'\n",
@ -423,13 +423,13 @@ write_field_info (const gchar *ns,
write_attributes (file, (GIBaseInfo*) info); write_attributes (file, (GIBaseInfo*) info);
type = gi_field_info_get_type (info); type = gi_field_info_get_type_info (info);
if (branch) if (branch)
{ {
xml_printf (file, " branch=\""); xml_printf (file, " branch=\"");
gi_base_info_unref ((GIBaseInfo *)type); gi_base_info_unref ((GIBaseInfo *)type);
type = gi_constant_info_get_type (branch); type = gi_constant_info_get_type_info (branch);
gi_constant_info_get_value (branch, &value); gi_constant_info_get_value (branch, &value);
write_constant_value (ns, type, &value, file); write_constant_value (ns, type, &value, file);
xml_printf (file, "\""); xml_printf (file, "\"");
@ -442,7 +442,7 @@ write_field_info (const gchar *ns,
} }
interface = gi_type_info_get_interface (type); interface = gi_type_info_get_interface (type);
if (interface && gi_base_info_get_type(interface) == GI_INFO_TYPE_CALLBACK) if (interface && gi_base_info_get_info_type (interface) == GI_INFO_TYPE_CALLBACK)
write_callback_info (ns, (GICallbackInfo *)interface, file); write_callback_info (ns, (GICallbackInfo *)interface, file);
else else
write_type_info (ns, type, file); write_type_info (ns, type, file);
@ -555,7 +555,7 @@ write_callable_info (const gchar *ns,
write_attributes (file, (GIBaseInfo*) arg); write_attributes (file, (GIBaseInfo*) arg);
type = gi_arg_info_get_type (arg); type = gi_arg_info_get_type_info (arg);
write_type_info (ns, type, file); write_type_info (ns, type, file);
xml_end_element (file, "parameter"); xml_end_element (file, "parameter");
@ -607,7 +607,7 @@ write_function_info (const gchar *ns,
else if (flags & GI_FUNCTION_IS_GETTER) else if (flags & GI_FUNCTION_IS_GETTER)
xml_printf (file, " glib:get-property=\"%s\"", property_name); xml_printf (file, " glib:get-property=\"%s\"", property_name);
gi_base_info_unref (property); gi_base_info_unref ((GIBaseInfo *) property);
} }
} }
@ -661,7 +661,7 @@ write_struct_info (const gchar *ns,
type_name = gi_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); type_name = gi_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info);
type_init = gi_registered_type_info_get_type_init ((GIRegisteredTypeInfo*)info); type_init = gi_registered_type_info_get_type_init ((GIRegisteredTypeInfo*)info);
if (gi_base_info_get_type ((GIBaseInfo *)info) == GI_INFO_TYPE_BOXED) if (gi_base_info_get_info_type ((GIBaseInfo *) info) == GI_INFO_TYPE_BOXED)
{ {
xml_start_element (file, "glib:boxed"); xml_start_element (file, "glib:boxed");
xml_printf (file, " glib:name=\"%s\"", name); xml_printf (file, " glib:name=\"%s\"", name);
@ -813,7 +813,7 @@ write_constant_info (const gchar *ns,
xml_start_element (file, "constant"); xml_start_element (file, "constant");
xml_printf (file, " name=\"%s\"", name); xml_printf (file, " name=\"%s\"", name);
type = gi_constant_info_get_type (info); type = gi_constant_info_get_type_info (info);
xml_printf (file, " value=\""); xml_printf (file, " value=\"");
gi_constant_info_get_value (info, &value); gi_constant_info_get_value (info, &value);
@ -849,7 +849,7 @@ write_enum_info (const gchar *ns,
type_init = gi_registered_type_info_get_type_init ((GIRegisteredTypeInfo*)info); type_init = gi_registered_type_info_get_type_init ((GIRegisteredTypeInfo*)info);
error_domain = gi_enum_info_get_error_domain (info); error_domain = gi_enum_info_get_error_domain (info);
if (gi_base_info_get_type ((GIBaseInfo *)info) == GI_INFO_TYPE_ENUM) if (gi_base_info_get_info_type ((GIBaseInfo *) info) == GI_INFO_TYPE_ENUM)
xml_start_element (file, "enumeration"); xml_start_element (file, "enumeration");
else else
xml_start_element (file, "bitfield"); xml_start_element (file, "bitfield");
@ -1020,7 +1020,7 @@ write_property_info (const gchar *ns,
write_attributes (file, (GIBaseInfo*) info); write_attributes (file, (GIBaseInfo*) info);
type = gi_property_info_get_type (info); type = gi_property_info_get_type_info (info);
write_type_info (ns, type, file); write_type_info (ns, type, file);
@ -1414,7 +1414,7 @@ gi_ir_writer_write (const char *filename,
for (j = 0; j < n_infos; j++) for (j = 0; j < n_infos; j++)
{ {
GIBaseInfo *info = gi_repository_get_info (repository, cur_ns, j); GIBaseInfo *info = gi_repository_get_info (repository, cur_ns, j);
switch (gi_base_info_get_type (info)) switch (gi_base_info_get_info_type (info))
{ {
case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_FUNCTION:
write_function_info (ns, (GIFunctionInfo *)info, xml); write_function_info (ns, (GIFunctionInfo *)info, xml);
@ -1451,7 +1451,7 @@ gi_ir_writer_write (const char *filename,
break; break;
default: default:
g_error ("unknown info type %d\n", gi_base_info_get_type (info)); g_error ("unknown info type %d\n", gi_base_info_get_info_type (info));
} }
gi_base_info_unref (info); gi_base_info_unref (info);

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

@ -40,7 +40,7 @@ G_BEGIN_DECLS
* Checks if @info is a #GISignalInfo. * Checks if @info is a #GISignalInfo.
*/ */
#define GI_IS_SIGNAL_INFO(info) \ #define GI_IS_SIGNAL_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_SIGNAL) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_SIGNAL)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL

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"
@ -117,7 +118,7 @@ gi_struct_info_get_field (GIStructInfo *info,
* *
* Obtain the type information for field named @name. * Obtain the type information for field named @name.
* *
* Since: 1.46 * Since: 2.80
* Returns: (transfer full): the #GIFieldInfo or %NULL if not found, * Returns: (transfer full): the #GIFieldInfo or %NULL if not found,
* free it with gi_base_info_unref() when done. * free it with gi_base_info_unref() when done.
*/ */
@ -293,7 +294,7 @@ gi_struct_info_is_gtype_struct (GIStructInfo *info)
* *
* Returns: (transfer none) (nullable): the name of the copy function * Returns: (transfer none) (nullable): the name of the copy function
* *
* Since: 1.76 * Since: 2.80
*/ */
const char * const char *
gi_struct_info_get_copy_function (GIStructInfo *info) gi_struct_info_get_copy_function (GIStructInfo *info)
@ -320,7 +321,7 @@ gi_struct_info_get_copy_function (GIStructInfo *info)
* *
* Returns: (transfer none) (nullable): the name of the free function * Returns: (transfer none) (nullable): the name of the free function
* *
* Since: 1.76 * Since: 2.80
*/ */
const char * const char *
gi_struct_info_get_free_function (GIStructInfo *info) gi_struct_info_get_free_function (GIStructInfo *info)
@ -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

@ -39,7 +39,7 @@ G_BEGIN_DECLS
* Checks if @info is a #GIStructInfo. * Checks if @info is a #GIStructInfo.
*/ */
#define GI_IS_STRUCT_INFO(info) \ #define GI_IS_STRUCT_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_STRUCT) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_STRUCT)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL

View File

@ -27,26 +27,31 @@
#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"
/** /**
* SECTION:gitypeinfo * GITypeInfo:
* @title: GITypeInfo
* @short_description: Struct representing a type
* *
* GITypeInfo represents a type. * `GITypeInfo` represents a type, including information about direction and
* transfer.
* *
* You can retrieve a type info from an argument (see #GIArgInfo), a * You can retrieve a type info from an argument (see
* functions return value (see #GIFunctionInfo), a field (see * [class@GIRepository.ArgInfo]), a functions return value (see
* #GIFieldInfo), a property (see #GIPropertyInfo), a constant * [class@GIRepository.FunctionInfo]), a field (see
* (see #GIConstantInfo) or for a union discriminator (see #GIUnionInfo). * [class@GIRepository.FieldInfo]), a property (see
* [class@GIRepository.PropertyInfo]), a constant (see
* [class@GIRepository.ConstantInfo]) or for a union discriminator (see
* [class@GIRepository.UnionInfo]).
* *
* A type can either be a of a basic type which is a standard C primitive * A type can either be a of a basic type which is a standard C primitive
* type or an interface type. For interface types you need to call * type or an interface type. For interface types you need to call
* gi_type_info_get_interface() to get a reference to the base info for that * [method@GIRepository.TypeInfo.get_interface] to get a reference to the base
* interface. * info for that interface.
*
* Since: 2.80
*/ */
/** /**
@ -55,12 +60,13 @@
* *
* Obtain if the type is passed as a reference. * Obtain if the type is passed as a reference.
* *
* Note that the types of %GI_DIRECTION_OUT and %GI_DIRECTION_INOUT parameters * Note that the types of `GI_DIRECTION_OUT` and `GI_DIRECTION_INOUT` parameters
* will only be pointers if the underlying type being transferred is a pointer * will only be pointers if the underlying type being transferred is a pointer
* (i.e. only if the type of the C functions formal parameter is a pointer to a * (i.e. only if the type of the C functions formal parameter is a pointer to a
* pointer). * pointer).
* *
* Returns: %TRUE if it is a pointer * Returns: true if it is a pointer
* Since: 2.80
*/ */
gboolean gboolean
gi_type_info_is_pointer (GITypeInfo *info) gi_type_info_is_pointer (GITypeInfo *info)
@ -87,10 +93,12 @@ gi_type_info_is_pointer (GITypeInfo *info)
* gi_type_info_get_tag: * gi_type_info_get_tag:
* @info: a #GITypeInfo * @info: a #GITypeInfo
* *
* Obtain the type tag for the type. See #GITypeTag for a list * Obtain the type tag for the type.
* of type tags. *
* See [type@GIRepository.TypeTag] for a list of type tags.
* *
* Returns: the type tag * Returns: the type tag
* Since: 2.80
*/ */
GITypeTag GITypeTag
gi_type_info_get_tag (GITypeInfo *info) gi_type_info_get_tag (GITypeInfo *info)
@ -120,9 +128,10 @@ gi_type_info_get_tag (GITypeInfo *info)
* @info: a #GITypeInfo * @info: a #GITypeInfo
* @n: index of the parameter * @n: index of the parameter
* *
* Obtain the parameter type @n. * Obtain the parameter type @n, or `-1` if the type is not an array.
* *
* Returns: (transfer full): the param type info * Returns: (transfer full) (nullable): the param type info
* Since: 2.80
*/ */
GITypeInfo * GITypeInfo *
gi_type_info_get_param_type (GITypeInfo *info, gi_type_info_get_param_type (GITypeInfo *info,
@ -162,13 +171,15 @@ gi_type_info_get_param_type (GITypeInfo *info,
* gi_type_info_get_interface: * gi_type_info_get_interface:
* @info: a #GITypeInfo * @info: a #GITypeInfo
* *
* For types which have #GI_TYPE_TAG_INTERFACE such as GObjects and boxed values, * For types which have `GI_TYPE_TAG_INTERFACE` such as [class@GObject.Object]s
* this function returns full information about the referenced type. You can then * and boxed values, this function returns full information about the referenced
* inspect the type of the returned #GIBaseInfo to further query whether it is * type. You can then inspect the type of the returned
* a concrete GObject, a GInterface, a structure, etc. using gi_base_info_get_type(). * [class@GIRepository.BaseInfo] to further query whether it is a concrete
* [class@GObject.Object], an interface, a structure, etc., using
* [method@GIRepository.BaseInfo.get_info_type].
* *
* Returns: (transfer full): the #GIBaseInfo, or %NULL. Free it with * Returns: (transfer full) (nullable): the [class@GIRepository.BaseInfo], or
* gi_base_info_unref() when done. * `NULL`. Free it with gi_base_info_unref() when done.
*/ */
GIBaseInfo * GIBaseInfo *
gi_type_info_get_interface (GITypeInfo *info) gi_type_info_get_interface (GITypeInfo *info)
@ -219,9 +230,10 @@ gi_type_info_get_interface (GITypeInfo *info)
* @info: a #GITypeInfo * @info: a #GITypeInfo
* *
* Obtain the position of the argument which gives the array length of the type. * Obtain the position of the argument which gives the array length of the type.
* The type tag must be a #GI_TYPE_TAG_ARRAY or -1 will be returned. * The type tag must be a `GI_TYPE_TAG_ARRAY` or `-1` will be returned.
* *
* Returns: the array length, or -1 if the type is not an array * Returns: the array length, or `-1` if the type is not an array
* Since: 2.80
*/ */
gint gint
gi_type_info_get_array_length (GITypeInfo *info) gi_type_info_get_array_length (GITypeInfo *info)
@ -253,9 +265,10 @@ gi_type_info_get_array_length (GITypeInfo *info)
* @info: a #GITypeInfo * @info: a #GITypeInfo
* *
* Obtain the fixed array size of the type. The type tag must be a * Obtain the fixed array size of the type. The type tag must be a
* #GI_TYPE_TAG_ARRAY or -1 will be returned. * `GI_TYPE_TAG_ARRAY` or `-1` will be returned.
* *
* Returns: the size or -1 if it's not an array * Returns: the size or `-1` if the type is not an array
* Since: 2.80
*/ */
gint gint
gi_type_info_get_array_fixed_size (GITypeInfo *info) gi_type_info_get_array_fixed_size (GITypeInfo *info)
@ -286,10 +299,11 @@ gi_type_info_get_array_fixed_size (GITypeInfo *info)
* gi_type_info_is_zero_terminated: * gi_type_info_is_zero_terminated:
* @info: a #GITypeInfo * @info: a #GITypeInfo
* *
* Obtain if the last element of the array is %NULL. The type tag must be a * Obtain if the last element of the array is `NULL`. The type tag must be a
* #GI_TYPE_TAG_ARRAY or %FALSE will be returned. * `GI_TYPE_TAG_ARRAY` or false will be returned.
* *
* Returns: %TRUE if zero terminated * Returns: true if zero terminated
* Since: 2.80
*/ */
gboolean gboolean
gi_type_info_is_zero_terminated (GITypeInfo *info) gi_type_info_is_zero_terminated (GITypeInfo *info)
@ -317,11 +331,13 @@ gi_type_info_is_zero_terminated (GITypeInfo *info)
* gi_type_info_get_array_type: * gi_type_info_get_array_type:
* @info: a #GITypeInfo * @info: a #GITypeInfo
* *
* Obtain the array type for this type. See #GIArrayType for a list of * Obtain the array type for this type.
* possible values. If the type tag of this type is not array, -1 will be
* returned.
* *
* Returns: the array type or -1 * See [enum@GIRepository.ArrayType] for a list of possible values. If the type
* tag of this type is not array, `-1` will be returned.
*
* Returns: the array type or `-1`
* Since: 2.80
*/ */
GIArrayType GIArrayType
gi_type_info_get_array_type (GITypeInfo *info) gi_type_info_get_array_type (GITypeInfo *info)
@ -351,11 +367,11 @@ gi_type_info_get_array_type (GITypeInfo *info)
* *
* Obtain the type tag corresponding to the underlying storage type in C for * Obtain the type tag corresponding to the underlying storage type in C for
* the type. * the type.
* See #GITypeTag for a list of type tags. *
* See [type@GIRepository.TypeTag] for a list of type tags.
* *
* Returns: the type tag * Returns: the type tag
* * Since: 2.80
* Since: 1.66
*/ */
GITypeTag GITypeTag
gi_type_info_get_storage_type (GITypeInfo *info) gi_type_info_get_storage_type (GITypeInfo *info)
@ -365,9 +381,9 @@ gi_type_info_get_storage_type (GITypeInfo *info)
if (type_tag == GI_TYPE_TAG_INTERFACE) if (type_tag == GI_TYPE_TAG_INTERFACE)
{ {
GIBaseInfo *interface = gi_type_info_get_interface (info); GIBaseInfo *interface = gi_type_info_get_interface (info);
GIInfoType info_type = gi_base_info_get_type (interface); GIInfoType info_type = gi_base_info_get_info_type (interface);
if (info_type == GI_INFO_TYPE_ENUM || info_type == GI_INFO_TYPE_FLAGS) if (info_type == GI_INFO_TYPE_ENUM || info_type == GI_INFO_TYPE_FLAGS)
type_tag = gi_enum_info_get_storage_type (interface); type_tag = gi_enum_info_get_storage_type ((GIEnumInfo *) interface);
gi_base_info_unref (interface); gi_base_info_unref (interface);
} }
@ -376,23 +392,25 @@ gi_type_info_get_storage_type (GITypeInfo *info)
/** /**
* gi_type_tag_argument_from_hash_pointer: * gi_type_tag_argument_from_hash_pointer:
* @storage_type: a #GITypeTag obtained from gi_type_info_get_storage_type() * @storage_type: a [type@GIRepository.TypeTag] obtained from
* @hash_pointer: A pointer, such as a #GHashTable data pointer * [method@GIRepository.TypeInfo.get_storage_type]
* @arg: A #GIArgument to fill in * @hash_pointer: a pointer, such as a [struct@GLib.HashTable] data pointer
* @arg: a [type@GIRepository.Argument] to fill in
*
* GLib data structures, such as [type@GLib.List], [type@GLib.SList], and
* [type@GLib.HashTable], all store data pointers.
* *
* GLib data structures, such as #GList, #GSList, and #GHashTable, all store
* data pointers.
* In the case where the list or hash table is storing single types rather than * In the case where the list or hash table is storing single types rather than
* structs, these data pointers may have values stuffed into them via macros * structs, these data pointers may have values stuffed into them via macros
* such as %GPOINTER_TO_INT. * such as `GPOINTER_TO_INT`.
* *
* Use this function to ensure that all values are correctly extracted from * Use this function to ensure that all values are correctly extracted from
* stuffed pointers, regardless of the machine's architecture or endianness. * stuffed pointers, regardless of the machines architecture or endianness.
* *
* This function fills in the appropriate field of @arg with the value extracted * This function fills in the appropriate field of @arg with the value extracted
* from @hash_pointer, depending on @storage_type. * from @hash_pointer, depending on @storage_type.
* *
* Since: 1.72 * Since: 2.80
*/ */
void void
gi_type_tag_argument_from_hash_pointer (GITypeTag storage_type, gi_type_tag_argument_from_hash_pointer (GITypeTag storage_type,
@ -450,22 +468,23 @@ gi_type_tag_argument_from_hash_pointer (GITypeTag storage_type,
/** /**
* gi_type_info_argument_from_hash_pointer: * gi_type_info_argument_from_hash_pointer:
* @info: a #GITypeInfo * @info: a #GITypeInfo
* @hash_pointer: A pointer, such as a #GHashTable data pointer * @hash_pointer: a pointer, such as a [struct@GLib.HashTable] data pointer
* @arg: A #GIArgument to fill in * @arg: a [type@GIRepository.Argument] to fill in
*
* GLib data structures, such as [type@GLib.List], [type@GLib.SList], and
* [type@GLib.HashTable], all store data pointers.
* *
* GLib data structures, such as #GList, #GSList, and #GHashTable, all store
* data pointers.
* In the case where the list or hash table is storing single types rather than * In the case where the list or hash table is storing single types rather than
* structs, these data pointers may have values stuffed into them via macros * structs, these data pointers may have values stuffed into them via macros
* such as %GPOINTER_TO_INT. * such as `GPOINTER_TO_INT`.
* *
* Use this function to ensure that all values are correctly extracted from * Use this function to ensure that all values are correctly extracted from
* stuffed pointers, regardless of the machine's architecture or endianness. * stuffed pointers, regardless of the machines architecture or endianness.
* *
* This function fills in the appropriate field of @arg with the value extracted * This function fills in the appropriate field of @arg with the value extracted
* from @hash_pointer, depending on the storage type of @info. * from @hash_pointer, depending on the storage type of @info.
* *
* Since: 1.66 * Since: 2.80
*/ */
void void
gi_type_info_argument_from_hash_pointer (GITypeInfo *info, gi_type_info_argument_from_hash_pointer (GITypeInfo *info,
@ -479,24 +498,26 @@ gi_type_info_argument_from_hash_pointer (GITypeInfo *info,
/** /**
* gi_type_tag_hash_pointer_from_argument: * gi_type_tag_hash_pointer_from_argument:
* @storage_type: a #GITypeTag obtained from gi_get_storage_type() * @storage_type: a [type@GIRepository.TypeTag] obtained from
* @arg: A #GIArgument with the value to stuff into a pointer * [method@GIRepository.TypeInfo.get_storage_type]
* @arg: A [type@GIRepository.Argument] with the value to stuff into a pointer
*
* GLib data structures, such as [type@GLib.List], [type@GLib.SList], and
* [type@GLib.HashTable], all store data pointers.
* *
* GLib data structures, such as #GList, #GSList, and #GHashTable, all store
* data pointers.
* In the case where the list or hash table is storing single types rather than * In the case where the list or hash table is storing single types rather than
* structs, these data pointers may have values stuffed into them via macros * structs, these data pointers may have values stuffed into them via macros
* such as %GPOINTER_TO_INT. * such as `GPOINTER_TO_INT`.
* *
* Use this function to ensure that all values are correctly stuffed into * Use this function to ensure that all values are correctly stuffed into
* pointers, regardless of the machine's architecture or endianness. * pointers, regardless of the machines architecture or endianness.
* *
* This function returns a pointer stuffed with the appropriate field of @arg, * This function returns a pointer stuffed with the appropriate field of @arg,
* depending on @storage_type. * depending on @storage_type.
* *
* Returns: A stuffed pointer, that can be stored in a #GHashTable, for example * Returns: A stuffed pointer, that can be stored in a [struct@GLib.HashTable],
* * for example
* Since: 1.72 * Since: 2.80
*/ */
gpointer gpointer
gi_type_tag_hash_pointer_from_argument (GITypeTag storage_type, gi_type_tag_hash_pointer_from_argument (GITypeTag storage_type,
@ -544,23 +565,24 @@ gi_type_tag_hash_pointer_from_argument (GITypeTag storage_type,
/** /**
* gi_type_info_hash_pointer_from_argument: * gi_type_info_hash_pointer_from_argument:
* @info: a #GITypeInfo * @info: a #GITypeInfo
* @arg: A #GIArgument with the value to stuff into a pointer * @arg: A [struct@GIRepository.Argument] with the value to stuff into a pointer
*
* GLib data structures, such as [type@GLib.List], [type@GLib.SList], and
* [type@GLib.HashTable], all store data pointers.
* *
* GLib data structures, such as #GList, #GSList, and #GHashTable, all store
* data pointers.
* In the case where the list or hash table is storing single types rather than * In the case where the list or hash table is storing single types rather than
* structs, these data pointers may have values stuffed into them via macros * structs, these data pointers may have values stuffed into them via macros
* such as %GPOINTER_TO_INT. * such as `GPOINTER_TO_INT`.
* *
* Use this function to ensure that all values are correctly stuffed into * Use this function to ensure that all values are correctly stuffed into
* pointers, regardless of the machine's architecture or endianness. * pointers, regardless of the machines architecture or endianness.
* *
* This function returns a pointer stuffed with the appropriate field of @arg, * This function returns a pointer stuffed with the appropriate field of @arg,
* depending on the storage type of @info. * depending on the storage type of @info.
* *
* Returns: A stuffed pointer, that can be stored in a #GHashTable, for example * Returns: A stuffed pointer, that can be stored in a [struct@GLib.HashTable],
* * for example
* Since: 1.66 * Since: 2.80
*/ */
gpointer gpointer
gi_type_info_hash_pointer_from_argument (GITypeInfo *info, gi_type_info_hash_pointer_from_argument (GITypeInfo *info,
@ -569,3 +591,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

@ -33,21 +33,23 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/** /**
* GI_IS_TYPE_INFO * GI_IS_TYPE_INFO:
* @info: an info structure * @info: an info structure
* *
* Checks if @info is a #GITypeInfo. * Checks if @info is a [alias@GIRepository.TypeInfo].
*
* Since: 2.80
*/ */
#define GI_IS_TYPE_INFO(info) \ #define GI_IS_TYPE_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_TYPE) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_TYPE)
/** /**
* GI_TYPE_TAG_IS_BASIC * GI_TYPE_TAG_IS_BASIC:
* @tag: a type tag * @tag: a type tag
* *
* Checks if @tag is a basic type. * Checks if @tag is a basic type.
* *
* Since: 1.72 * Since: 2.80
*/ */
#define GI_TYPE_TAG_IS_BASIC(tag) ((tag) < GI_TYPE_TAG_ARRAY || (tag) == GI_TYPE_TAG_UNICHAR) #define GI_TYPE_TAG_IS_BASIC(tag) ((tag) < GI_TYPE_TAG_ARRAY || (tag) == GI_TYPE_TAG_UNICHAR)
@ -57,27 +59,7 @@ G_BEGIN_DECLS
* *
* Checks if @tag is a numeric type. That is, integer or floating point. * Checks if @tag is a numeric type. That is, integer or floating point.
* *
* Since: 1.72 * Since: 2.80
*/
#define GI_TYPE_TAG_IS_NUMERIC(tag) ((tag) >= GI_TYPE_TAG_INT8 && (tag) <= GI_TYPE_TAG_DOUBLE)
/**
* GI_TYPE_TAG_IS_NUMERIC:
* @tag: a type tag
*
* Checks if @tag is a numeric type. That is, integer or floating point.
*
* Since: 1.72
*/
#define GI_TYPE_TAG_IS_NUMERIC(tag) ((tag) >= GI_TYPE_TAG_INT8 && (tag) <= GI_TYPE_TAG_DOUBLE)
/**
* GI_TYPE_TAG_IS_NUMERIC:
* @tag: a type tag
*
* Checks if @tag is a numeric type. That is, integer or floating point.
*
* Since: 1.72
*/ */
#define GI_TYPE_TAG_IS_NUMERIC(tag) ((tag) >= GI_TYPE_TAG_INT8 && (tag) <= GI_TYPE_TAG_DOUBLE) #define GI_TYPE_TAG_IS_NUMERIC(tag) ((tag) >= GI_TYPE_TAG_INT8 && (tag) <= GI_TYPE_TAG_DOUBLE)
@ -86,9 +68,9 @@ G_BEGIN_DECLS
* @tag: a type tag * @tag: a type tag
* *
* Checks if @tag is a container type. That is, a type which may have a nonnull * Checks if @tag is a container type. That is, a type which may have a nonnull
* return from gi_type_info_get_param_type(). * return from [method@GIRepository.TypeInfo.get_param_type].
* *
* Since: 1.72 * Since: 2.80
*/ */
#define GI_TYPE_TAG_IS_CONTAINER(tag) ((tag) == GI_TYPE_TAG_ARRAY || \ #define GI_TYPE_TAG_IS_CONTAINER(tag) ((tag) == GI_TYPE_TAG_ARRAY || \
((tag) >= GI_TYPE_TAG_GLIST && (tag) <= GI_TYPE_TAG_GHASH)) ((tag) >= GI_TYPE_TAG_GLIST && (tag) <= GI_TYPE_TAG_GHASH))

View File

@ -32,6 +32,15 @@
#include "gitypelib-internal.h" #include "gitypelib-internal.h"
#include "gitypelib.h" #include "gitypelib.h"
/**
* GITypelib:
*
* `GITypelib` represents a loaded `.typelib` file, which contains a description
* of a single modules API.
*
* Since: 2.80
*/
typedef struct { typedef struct {
GITypelib *typelib; GITypelib *typelib;
GSList *context_stack; GSList *context_stack;
@ -2242,7 +2251,7 @@ static GSList *library_paths;
* path (ie. LD_LIBRARY_PATH and DT_RPATH in ELF systems). * path (ie. LD_LIBRARY_PATH and DT_RPATH in ELF systems).
* See the documentation of your dynamic linker for full details. * See the documentation of your dynamic linker for full details.
* *
* Since: 1.36 * Since: 2.80
*/ */
void void
gi_repository_prepend_library_path (const char *directory) gi_repository_prepend_library_path (const char *directory)
@ -2369,15 +2378,17 @@ gi_typelib_ensure_open (GITypelib *typelib)
/** /**
* gi_typelib_new_from_memory: (skip) * gi_typelib_new_from_memory: (skip)
* @memory: address of memory chunk containing the typelib * @memory: (array length=len): address of memory chunk containing the typelib
* @len: length of memory chunk containing the typelib * @len: length of memory chunk containing the typelib
* @error: a #GError * @error: a #GError
* *
* Creates a new #GITypelib from a memory location. The memory block * Creates a new `GITypelib` from a memory location.
* pointed to by @typelib will be automatically g_free()d when the *
* The memory block pointed to by @typelib will be automatically freed when the
* repository is destroyed. * repository is destroyed.
* *
* Returns: the new #GITypelib * Returns: (transfer full): the new #GITypelib
* Since: 2.80
*/ */
GITypelib * GITypelib *
gi_typelib_new_from_memory (guint8 *memory, gi_typelib_new_from_memory (guint8 *memory,
@ -2400,13 +2411,14 @@ gi_typelib_new_from_memory (guint8 *memory,
/** /**
* gi_typelib_new_from_const_memory: (skip) * gi_typelib_new_from_const_memory: (skip)
* @memory: address of memory chunk containing the typelib * @memory: (array length=len): address of memory chunk containing the typelib
* @len: length of memory chunk containing the typelib * @len: length of memory chunk containing the typelib
* @error: A #GError * @error: a #GError
* *
* Creates a new #GITypelib from a memory location. * Creates a new `GITypelib` from a memory location.
* *
* Returns: the new #GITypelib * Returns: (transfer full): the new #GITypelib
* Since: 2.80
*/ */
GITypelib * GITypelib *
gi_typelib_new_from_const_memory (const guchar *memory, gi_typelib_new_from_const_memory (const guchar *memory,
@ -2429,12 +2441,14 @@ gi_typelib_new_from_const_memory (const guchar *memory,
/** /**
* gi_typelib_new_from_mapped_file: (skip) * gi_typelib_new_from_mapped_file: (skip)
* @mfile: a #GMappedFile, that will be free'd when the repository is destroyed * @mfile: (transfer full): a [type@GLib.MappedFile], that will be freed when
* the repository is destroyed
* @error: a #GError * @error: a #GError
* *
* Creates a new #GITypelib from a #GMappedFile. * Creates a new `GITypelib` from a [type@GLib.MappedFile].
* *
* Returns: the new #GITypelib * Returns: (transfer full): the new #GITypelib
* Since: 2.80
*/ */
GITypelib * GITypelib *
gi_typelib_new_from_mapped_file (GMappedFile *mfile, gi_typelib_new_from_mapped_file (GMappedFile *mfile,
@ -2458,9 +2472,11 @@ gi_typelib_new_from_mapped_file (GMappedFile *mfile,
/** /**
* gi_typelib_free: * gi_typelib_free:
* @typelib: a #GITypelib * @typelib: (transfer full): a #GITypelib
* *
* Free a #GITypelib. * Free a `GITypelib`.
*
* Since: 2.80
*/ */
void void
gi_typelib_free (GITypelib *typelib) gi_typelib_free (GITypelib *typelib)
@ -2480,11 +2496,12 @@ gi_typelib_free (GITypelib *typelib)
/** /**
* gi_typelib_get_namespace: * gi_typelib_get_namespace:
* @typelib: TODO * @typelib: a #GITypelib
* *
* TODO * Get the name of the namespace represented by @typelib.
* *
* Returns: TODO * Returns: name of the namespace represented by @typelib
* Since: 2.80
*/ */
const gchar * const gchar *
gi_typelib_get_namespace (GITypelib *typelib) gi_typelib_get_namespace (GITypelib *typelib)
@ -2496,11 +2513,13 @@ gi_typelib_get_namespace (GITypelib *typelib)
* gi_typelib_symbol: * gi_typelib_symbol:
* @typelib: the typelib * @typelib: the typelib
* @symbol_name: name of symbol to be loaded * @symbol_name: name of symbol to be loaded
* @symbol: returns a pointer to the symbol value * @symbol: (out) (nullable): returns a pointer to the symbol value, or `NULL`
* on failure
* *
* Loads a symbol from #GITypelib. * Loads a symbol from a `GITypelib`.
* *
* Returns: #TRUE on success * Returns: true on success
* Since: 2.80
*/ */
gboolean gboolean
gi_typelib_symbol (GITypelib *typelib, const char *symbol_name, gpointer *symbol) gi_typelib_symbol (GITypelib *typelib, const char *symbol_name, gpointer *symbol)

View File

@ -34,19 +34,6 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/**
* SECTION:gitypelib
* @title: GITypelib
* @short_description: TODO
*
* TODO
*/
/**
* GITypelib:
*
* TODO
*/
typedef struct _GITypelib GITypelib; typedef struct _GITypelib GITypelib;
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL

View File

@ -28,162 +28,88 @@
#error "Only <girepository.h> can be included directly." #error "Only <girepository.h> can be included directly."
#endif #endif
#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;
/** /* Documented in giunioninfo.c */
* GIStructInfo: typedef struct _GIUnionInfo GIUnionInfo;
* GI_AVAILABLE_IN_ALL GType gi_union_info_get_type (void);
* Represents a struct.
*/
typedef GIBaseInfo GIStructInfo;
/** /* Documented in gienuminfo.c */
* GIUnionInfo: typedef struct _GIEnumInfo GIEnumInfo;
* GI_AVAILABLE_IN_ALL GType gi_enum_info_get_type (void);
* Represents a union.
*/
typedef GIBaseInfo GIUnionInfo;
/** /* Documented in giobjectinfo.c */
* GIEnumInfo: typedef struct _GIObjectInfo GIObjectInfo;
* GI_AVAILABLE_IN_ALL GType gi_object_info_get_type (void);
* Represents an enum or a flag.
*/
typedef GIBaseInfo GIEnumInfo;
/** /* Documented in giinterfaceinfo.c */
* GIObjectInfo: typedef struct _GIInterfaceInfo GIInterfaceInfo;
* GI_AVAILABLE_IN_ALL GType gi_interface_info_get_type (void);
* Represents an object.
*/
typedef GIBaseInfo GIObjectInfo;
/** /* Documented in giconstantinfo.c */
* GIInterfaceInfo: typedef struct _GIConstantInfo GIConstantInfo;
* GI_AVAILABLE_IN_ALL GType gi_constant_info_get_type (void);
* Represents an interface.
*/
typedef GIBaseInfo GIInterfaceInfo;
/** /* Documented in givalueinfo.c */
* GIConstantInfo: typedef struct _GIValueInfo GIValueInfo;
* GI_AVAILABLE_IN_ALL GType gi_value_info_get_type (void);
* Represents a constant.
*/
typedef GIBaseInfo GIConstantInfo;
/** /* Documented in gisignalinfo.c */
* SECTION:givalueinfo typedef struct _GISignalInfo GISignalInfo;
* @title: GIValueInfo GI_AVAILABLE_IN_ALL GType gi_signal_info_get_type (void);
* @short_description: Struct representing a value
*
* GIValueInfo represents a value.
*/
/** /* Documented in givfuncinfo.c */
* GIValueInfo: typedef struct _GIVFuncInfo GIVFuncInfo;
* GI_AVAILABLE_IN_ALL GType gi_vfunc_info_get_type (void);
* Represents a enum value of a #GIEnumInfo.
*/
typedef GIBaseInfo GIValueInfo;
/** /* Documented in gipropertyinfo.c */
* GISignalInfo: typedef struct _GIPropertyInfo GIPropertyInfo;
* GI_AVAILABLE_IN_ALL GType gi_property_info_get_type (void);
* Represents a signal.
*/
typedef GIBaseInfo GISignalInfo;
/** /* Documented in gifieldinfo.c */
* GIVFuncInfo: typedef struct _GIFieldInfo GIFieldInfo;
* GI_AVAILABLE_IN_ALL GType gi_field_info_get_type (void);
* Represents a virtual function.
*/
typedef GIBaseInfo GIVFuncInfo;
/** /* Documented in giarginfo.c */
* GIPropertyInfo: typedef struct _GIArgInfo GIArgInfo;
* GI_AVAILABLE_IN_ALL GType gi_arg_info_get_type (void);
* Represents a property of a #GIObjectInfo or a #GIInterfaceInfo.
*/
typedef GIBaseInfo GIPropertyInfo;
/** /* Documented in gitypeinfo.c */
* GIFieldInfo: typedef struct _GITypeInfo GITypeInfo;
* GI_AVAILABLE_IN_ALL GType gi_type_info_get_type (void);
* Represents a field of a #GIStructInfo or a #GIUnionInfo.
*/
typedef GIBaseInfo GIFieldInfo;
/** /* Documented in giunresolvedinfo.c */
* GIArgInfo:
*
* Represents an argument.
*/
typedef GIBaseInfo GIArgInfo;
/**
* GITypeInfo:
*
* Represents type information, direction, transfer etc.
*/
typedef GIBaseInfo GITypeInfo;
/**
* 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
{ {
@ -261,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.
*/ */
@ -285,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;
/** /**
@ -423,16 +356,6 @@ typedef enum {
*/ */
#define GI_TYPE_TAG_N_TYPES (GI_TYPE_TAG_UNICHAR+1) #define GI_TYPE_TAG_N_TYPES (GI_TYPE_TAG_UNICHAR+1)
#ifndef __GTK_DOC_IGNORE__
/* These were removed and no longer appear in the typelib;
* instead, the machine-specific versions like INT32 are
* always used.
*/
#define GI_TYPE_TAG_SHORT GI_TYPE_TAG_SHORT_WAS_REMOVED
#define GI_TYPE_TAG_INT GI_TYPE_TAG_INT_WAS_REMOVED
#define GI_TYPE_TAG_LONG GI_TYPE_TAG_LONG_WAS_REMOVED
#endif
/** /**
* GIArrayType: * GIArrayType:
* @GI_ARRAY_TYPE_C: a C array, char[] for instance * @GI_ARRAY_TYPE_C: a C array, char[] for instance

View File

@ -27,20 +27,21 @@
#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"
/** /**
* SECTION:giunioninfo * GIUnionInfo:
* @title: GIUnionInfo
* @short_description: Struct representing a union.
* *
* GIUnionInfo represents a union type. * `GIUnionInfo` represents a union type.
* *
* A union has methods and fields. Unions can optionally have a * A union has methods and fields. Unions can optionally have a
* discriminator, which is a field deciding what type of real union * discriminator, which is a field deciding what type of real union
* fields is valid for specified instance. * fields is valid for specified instance.
*
* Since: 2.80
*/ */
/** /**
@ -50,6 +51,7 @@
* Obtain the number of fields this union has. * Obtain the number of fields this union has.
* *
* Returns: number of fields * Returns: number of fields
* Since: 2.80
*/ */
gint gint
gi_union_info_get_n_fields (GIUnionInfo *info) gi_union_info_get_n_fields (GIUnionInfo *info)
@ -65,10 +67,11 @@ gi_union_info_get_n_fields (GIUnionInfo *info)
* @info: a #GIUnionInfo * @info: a #GIUnionInfo
* @n: a field index * @n: a field index
* *
* Obtain the type information for field with specified index. * Obtain the type information for the field with the specified index.
* *
* Returns: (transfer full): the #GIFieldInfo, free it with gi_base_info_unref() * Returns: (transfer full): the [type@GIRepository.FieldInfo], free it with
* when done. * [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80
*/ */
GIFieldInfo * GIFieldInfo *
gi_union_info_get_field (GIUnionInfo *info, gi_union_info_get_field (GIUnionInfo *info,
@ -89,6 +92,7 @@ gi_union_info_get_field (GIUnionInfo *info,
* Obtain the number of methods this union has. * Obtain the number of methods this union has.
* *
* Returns: number of methods * Returns: number of methods
* Since: 2.80
*/ */
gint gint
gi_union_info_get_n_methods (GIUnionInfo *info) gi_union_info_get_n_methods (GIUnionInfo *info)
@ -104,10 +108,11 @@ gi_union_info_get_n_methods (GIUnionInfo *info)
* @info: a #GIUnionInfo * @info: a #GIUnionInfo
* @n: a method index * @n: a method index
* *
* Obtain the type information for method with specified index. * Obtain the type information for the method with the specified index.
* *
* Returns: (transfer full): the #GIFunctionInfo, free it with gi_base_info_unref() * Returns: (transfer full): the [type@GIRepository.FunctionInfo], free it
* when done. * with [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80
*/ */
GIFunctionInfo * GIFunctionInfo *
gi_union_info_get_method (GIUnionInfo *info, gi_union_info_get_method (GIUnionInfo *info,
@ -129,9 +134,10 @@ gi_union_info_get_method (GIUnionInfo *info,
* gi_union_info_is_discriminated: * gi_union_info_is_discriminated:
* @info: a #GIUnionInfo * @info: a #GIUnionInfo
* *
* Return true if this union contains discriminator field. * Return true if this union contains a discriminator field.
* *
* Returns: %TRUE if this is a discriminated union, %FALSE otherwise * Returns: true if this is a discriminated union, false otherwise
* Since: 2.80
*/ */
gboolean gboolean
gi_union_info_is_discriminated (GIUnionInfo *info) gi_union_info_is_discriminated (GIUnionInfo *info)
@ -146,9 +152,10 @@ gi_union_info_is_discriminated (GIUnionInfo *info)
* gi_union_info_get_discriminator_offset: * gi_union_info_get_discriminator_offset:
* @info: a #GIUnionInfo * @info: a #GIUnionInfo
* *
* Returns offset of the discriminator field in the structure. * Returns the offset of the discriminator field in the structure.
* *
* Returns: offset in bytes of the discriminator * Returns: offset, in bytes, of the discriminator
* Since: 2.80
*/ */
gint gint
gi_union_info_get_discriminator_offset (GIUnionInfo *info) gi_union_info_get_discriminator_offset (GIUnionInfo *info)
@ -165,8 +172,9 @@ 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 #GITypeInfo, free it with gi_base_info_unref() * Returns: (transfer full): the [type@GIRepository.TypeInfo], free it with
* when done. * [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80
*/ */
GITypeInfo * GITypeInfo *
gi_union_info_get_discriminator_type (GIUnionInfo *info) gi_union_info_get_discriminator_type (GIUnionInfo *info)
@ -181,12 +189,15 @@ gi_union_info_get_discriminator_type (GIUnionInfo *info)
* @info: a #GIUnionInfo * @info: a #GIUnionInfo
* @n: a union field index * @n: a union field index
* *
* Obtain discriminator value assigned for n-th union field, i.e. n-th * Obtain the discriminator value assigned for n-th union field, i.e. the n-th
* union field is the active one if discriminator contains this * union field is the active one if the discriminator contains this
* constant. * constant.
* *
* Returns: (transfer full): the #GIConstantInfo, free it with gi_base_info_unref() * If the union is not discriminated, `NULL` is returned.
* when done. *
* Returns: (transfer full) (nullable): the [type@GIRepository.ConstantInfo],
* free it with [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80
*/ */
GIConstantInfo * GIConstantInfo *
gi_union_info_get_discriminator (GIUnionInfo *info, gi_union_info_get_discriminator (GIUnionInfo *info,
@ -217,10 +228,11 @@ gi_union_info_get_discriminator (GIUnionInfo *info,
* @info: a #GIUnionInfo * @info: a #GIUnionInfo
* @name: a method name * @name: a method name
* *
* Obtain the type information for method named @name. * Obtain the type information for the method named @name.
* *
* Returns: (transfer full): the #GIFunctionInfo, free it with gi_base_info_unref() * Returns: (transfer full): the [type@GIRepository.FunctionInfo], free it
* when done. * with [method@GIRepository.BaseInfo.unref] when done.
* Since: 2.80
*/ */
GIFunctionInfo * GIFunctionInfo *
gi_union_info_find_method (GIUnionInfo *info, gi_union_info_find_method (GIUnionInfo *info,
@ -243,7 +255,8 @@ gi_union_info_find_method (GIUnionInfo *info,
* *
* Obtain the total size of the union. * Obtain the total size of the union.
* *
* Returns: size of the union in bytes * Returns: size of the union, in bytes
* Since: 2.80
*/ */
gsize gsize
gi_union_info_get_size (GIUnionInfo *info) gi_union_info_get_size (GIUnionInfo *info)
@ -260,7 +273,8 @@ gi_union_info_get_size (GIUnionInfo *info)
* *
* Obtain the required alignment of the union. * Obtain the required alignment of the union.
* *
* Returns: required alignment in bytes * Returns: required alignment, in bytes
* Since: 2.80
*/ */
gsize gsize
gi_union_info_get_alignment (GIUnionInfo *info) gi_union_info_get_alignment (GIUnionInfo *info)
@ -277,9 +291,9 @@ gi_union_info_get_alignment (GIUnionInfo *info)
* *
* Retrieves the name of the copy function for @info, if any is set. * Retrieves the name of the copy function for @info, if any is set.
* *
* Returns: (transfer none) (nullable): the name of the copy function * Returns: (transfer none) (nullable): the name of the copy function, or `NULL`
* * if none is set
* Since: 1.76 * Since: 2.80
*/ */
const char * const char *
gi_union_info_get_copy_function (GIUnionInfo *info) gi_union_info_get_copy_function (GIUnionInfo *info)
@ -304,9 +318,9 @@ gi_union_info_get_copy_function (GIUnionInfo *info)
* *
* Retrieves the name of the free function for @info, if any is set. * Retrieves the name of the free function for @info, if any is set.
* *
* Returns: (transfer none) (nullable): the name of the free function * Returns: (transfer none) (nullable): the name of the free function, or `NULL`
* * if none is set
* Since: 1.76 * Since: 2.80
*/ */
const char * const char *
gi_union_info_get_free_function (GIUnionInfo *info) gi_union_info_get_free_function (GIUnionInfo *info)
@ -324,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

@ -33,13 +33,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/** /**
* GI_IS_UNION_INFO * GI_IS_UNION_INFO:
* @info: an info structure * @info: an info structure
* *
* Checks if @info is a #GIUnionInfo. * Checks if @info is a [struct@GIRepository.UnionInfo].
*
* Since: 2.80
*/ */
#define GI_IS_UNION_INFO(info) \ #define GI_IS_UNION_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_UNION) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_UNION)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
gint gi_union_info_get_n_fields (GIUnionInfo *info); gint gi_union_info_get_n_fields (GIUnionInfo *info);

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,19 +29,20 @@
#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"
/** /**
* SECTION:givfuncinfo * GIVFuncInfo:
* @title: GIVFuncInfo
* @short_description: Struct representing a virtual function
* *
* 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
* #GIObjectInfo or a #GIInterfaceInfo. * [type@GIRepository.ObjectInfo] or a [type@GIRepository.InterfaceInfo].
*
* Since: 2.80
*/ */
GIVFuncInfo * GIVFuncInfo *
@ -73,10 +74,13 @@ gi_base_info_find_vfunc (GIRealInfo *rinfo,
* gi_vfunc_info_get_flags: * gi_vfunc_info_get_flags:
* @info: a #GIVFuncInfo * @info: a #GIVFuncInfo
* *
* Obtain the flags for this virtual function info. See #GIVFuncInfoFlags for * Obtain the flags for this virtual function info.
* more information about possible flag values. *
* See [flags@GIRepository.VFuncInfoFlags] for more information about possible
* flag values.
* *
* Returns: the flags * Returns: the flags
* Since: 2.80
*/ */
GIVFuncInfoFlags GIVFuncInfoFlags
gi_vfunc_info_get_flags (GIVFuncInfo *info) gi_vfunc_info_get_flags (GIVFuncInfo *info)
@ -112,9 +116,10 @@ gi_vfunc_info_get_flags (GIVFuncInfo *info)
* @info: a #GIVFuncInfo * @info: a #GIVFuncInfo
* *
* Obtain the offset of the function pointer in the class struct. The value * Obtain the offset of the function pointer in the class struct. The value
* 0xFFFF indicates that the struct offset is unknown. * `0xFFFF` indicates that the struct offset is unknown.
* *
* Returns: the struct offset or 0xFFFF if it's unknown * Returns: the struct offset or `0xFFFF` if its unknown
* Since: 2.80
*/ */
gint gint
gi_vfunc_info_get_offset (GIVFuncInfo *info) gi_vfunc_info_get_offset (GIVFuncInfo *info)
@ -135,10 +140,12 @@ gi_vfunc_info_get_offset (GIVFuncInfo *info)
* @info: a #GIVFuncInfo * @info: a #GIVFuncInfo
* *
* Obtain the signal for the virtual function if one is set. * Obtain the signal for the virtual function if one is set.
*
* The signal comes from the object or interface to which * The signal comes from the object or interface to which
* this virtual function belongs. * this virtual function belongs.
* *
* Returns: (transfer full): the signal or %NULL if none set * Returns: (transfer full) (nullable): the signal or `NULL` if none set
* Since: 2.80
*/ */
GISignalInfo * GISignalInfo *
gi_vfunc_info_get_signal (GIVFuncInfo *info) gi_vfunc_info_get_signal (GIVFuncInfo *info)
@ -166,8 +173,9 @@ gi_vfunc_info_get_signal (GIVFuncInfo *info)
* *
* Not all virtuals will have invokers. * Not all virtuals will have invokers.
* *
* Returns: (transfer full): the #GIVFuncInfo or %NULL. Free it with * Returns: (transfer full) (nullable): the [type@GIRepository.FunctionInfo] or
* gi_base_info_unref() when done. * `NULL`. Free it with gi_base_info_unref() when done.
* Since: 2.80
*/ */
GIFunctionInfo * GIFunctionInfo *
gi_vfunc_info_get_invoker (GIVFuncInfo *info) gi_vfunc_info_get_invoker (GIVFuncInfo *info)
@ -187,7 +195,7 @@ gi_vfunc_info_get_invoker (GIVFuncInfo *info)
return NULL; return NULL;
container = rinfo->container; container = rinfo->container;
parent_type = gi_base_info_get_type (container); parent_type = gi_base_info_get_info_type (container);
if (parent_type == GI_INFO_TYPE_OBJECT) if (parent_type == GI_INFO_TYPE_OBJECT)
return gi_object_info_get_method ((GIObjectInfo*)container, blob->invoker); return gi_object_info_get_method ((GIObjectInfo*)container, blob->invoker);
else if (parent_type == GI_INFO_TYPE_INTERFACE) else if (parent_type == GI_INFO_TYPE_INTERFACE)
@ -202,10 +210,11 @@ gi_vfunc_info_get_invoker (GIVFuncInfo *info)
* @implementor_gtype: #GType implementing this virtual function * @implementor_gtype: #GType implementing this virtual function
* @error: return location for a #GError * @error: return location for a #GError
* *
* This method will look up where inside the type struct of @implementor_gtype * Looks up where inside the type struct of @implementor_gtype is the
* is the implementation for @info. * implementation for @info.
* *
* Returns: address to a function or %NULL if an error happened * Returns: address to a function or `NULL` if an error happened
* Since: 2.80
*/ */
gpointer gpointer
gi_vfunc_info_get_address (GIVFuncInfo *vfunc_info, gi_vfunc_info_get_address (GIVFuncInfo *vfunc_info,
@ -221,8 +230,12 @@ gi_vfunc_info_get_address (GIVFuncInfo *vfunc_info,
gpointer implementor_class, implementor_vtable; gpointer implementor_class, implementor_vtable;
gpointer func = NULL; gpointer func = NULL;
container_info = gi_base_info_get_container (vfunc_info); g_return_val_if_fail (vfunc_info != NULL, NULL);
if (gi_base_info_get_type (container_info) == GI_INFO_TYPE_OBJECT) g_return_val_if_fail (GI_IS_VFUNC_INFO (vfunc_info), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
container_info = gi_base_info_get_container ((GIBaseInfo *) vfunc_info);
if (gi_base_info_get_info_type (container_info) == GI_INFO_TYPE_OBJECT)
{ {
object_info = (GIObjectInfo*) container_info; object_info = (GIObjectInfo*) container_info;
interface_info = NULL; interface_info = NULL;
@ -242,7 +255,7 @@ gi_vfunc_info_get_address (GIVFuncInfo *vfunc_info,
if (strcmp (gi_base_info_get_name ( (GIBaseInfo*) field_info), if (strcmp (gi_base_info_get_name ( (GIBaseInfo*) field_info),
gi_base_info_get_name ( (GIBaseInfo*) vfunc_info)) != 0) { gi_base_info_get_name ( (GIBaseInfo*) vfunc_info)) != 0) {
gi_base_info_unref (field_info); gi_base_info_unref ((GIBaseInfo *) field_info);
field_info = NULL; field_info = NULL;
continue; continue;
} }
@ -276,7 +289,7 @@ gi_vfunc_info_get_address (GIVFuncInfo *vfunc_info,
offset = gi_field_info_get_offset (field_info); offset = gi_field_info_get_offset (field_info);
func = *(gpointer*) G_STRUCT_MEMBER_P (implementor_vtable, offset); func = *(gpointer*) G_STRUCT_MEMBER_P (implementor_vtable, offset);
g_type_class_unref (implementor_class); g_type_class_unref (implementor_class);
gi_base_info_unref (field_info); gi_base_info_unref ((GIBaseInfo *) field_info);
if (func == NULL) if (func == NULL)
{ {
@ -299,25 +312,26 @@ gi_vfunc_info_get_address (GIVFuncInfo *vfunc_info,
* gi_vfunc_info_invoke: (skip) * gi_vfunc_info_invoke: (skip)
* @info: a #GIVFuncInfo describing the virtual function to invoke * @info: a #GIVFuncInfo describing the virtual function to invoke
* @implementor: #GType of the type that implements this virtual function * @implementor: #GType of the type that implements this virtual function
* @in_args: (array length=n_in_args): an array of #GIArgument<!-- -->s, one for each in * @in_args: (array length=n_in_args) (nullable): an array of
* parameter of @info. If there are no in parameter, @in_args * [struct@GIRepository.Argument]s, one for each in parameter of @info. If
* can be %NULL * there are no in parameter, @in_args can be `NULL`
* @n_in_args: the length of the @in_args array * @n_in_args: the length of the @in_args array
* @out_args: (array length=n_out_args): an array of #GIArgument<!-- -->s, one for each out * @out_args: (array length=n_out_args) (nullable): an array of
* parameter of @info. If there are no out parameters, @out_args * [struct@GIRepository.Argument]s, one for each out parameter of @info. If
* may be %NULL * there are no out parameters, @out_args may be `NULL`
* @n_out_args: the length of the @out_args array * @n_out_args: the length of the @out_args array
* @return_value: return location for the return value of the * @return_value: (nullable): return location for the return value of the
* function. If the function returns void, @return_value may be * function. If the function returns void, @return_value may be
* %NULL * `NULL`
* @error: return location for detailed error information, or %NULL * @error: return location for detailed error information, or `NULL`
* *
* Invokes the function described in @info with the given * Invokes the function described in @info with the given
* arguments. Note that inout parameters must appear in both * arguments. Note that inout parameters must appear in both
* argument lists. * argument lists.
* *
* Returns: %TRUE if the function has been invoked, %FALSE if an * Returns: true if the function has been invoked, false if an
* error occurred. * error occurred.
* Since: 2.80
*/ */
gboolean gboolean
gi_vfunc_info_invoke (GIVFuncInfo *info, gi_vfunc_info_invoke (GIVFuncInfo *info,
@ -330,10 +344,20 @@ gi_vfunc_info_invoke (GIVFuncInfo *info,
GError **error) GError **error)
{ {
gpointer func; gpointer func;
GError *local_error = NULL;
func = gi_vfunc_info_get_address (info, implementor, error); g_return_val_if_fail (info != NULL, FALSE);
if (*error != NULL) g_return_val_if_fail (GI_IS_VFUNC_INFO (info), FALSE);
return FALSE; g_return_val_if_fail (in_args != NULL || n_in_args == 0, FALSE);
g_return_val_if_fail (out_args != NULL || n_out_args == 0, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
func = gi_vfunc_info_get_address (info, implementor, &local_error);
if (local_error != NULL)
{
g_propagate_error (error, g_steal_pointer (&local_error));
return FALSE;
}
return gi_callable_info_invoke ((GICallableInfo*) info, return gi_callable_info_invoke ((GICallableInfo*) info,
func, func,
@ -346,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

@ -33,13 +33,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/** /**
* GI_IS_VFUNC_INFO * GI_IS_VFUNC_INFO:
* @info: an info structure * @info: an info structure
* *
* Checks if @info is a #GIVfuncInfo. * Checks if @info is a [struct@GIRepository.VFuncInfo].
*
* Since: 2.80
*/ */
#define GI_IS_VFUNC_INFO(info) \ #define GI_IS_VFUNC_INFO(info) \
(gi_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_VFUNC) (gi_base_info_get_info_type ((GIBaseInfo*) info) == GI_INFO_TYPE_VFUNC)
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GIVFuncInfoFlags gi_vfunc_info_get_flags (GIVFuncInfo *info); GIVFuncInfoFlags gi_vfunc_info_get_flags (GIVFuncInfo *info);

View File

@ -23,10 +23,10 @@ subdir('cmph')
gir_dir_prefix = get_option('gir_dir_prefix') gir_dir_prefix = get_option('gir_dir_prefix')
if gir_dir_prefix == '' or gir_dir_prefix == get_option('datadir') if gir_dir_prefix == '' or gir_dir_prefix == get_option('datadir')
gir_dir_prefix = get_option('datadir') gir_dir_prefix = get_option('datadir')
gir_dir_pc_prefix = '${datadir}' gir_dir_pc_prefix = '${datadir}'
else else
gir_dir_pc_prefix = join_paths('${prefix}', gir_dir_prefix) gir_dir_pc_prefix = join_paths('${prefix}', gir_dir_prefix)
endif endif
glib_girdir = get_option('prefix') / gir_dir_prefix / 'gir-1.0' glib_girdir = get_option('prefix') / gir_dir_prefix / 'gir-1.0'
@ -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',
@ -54,17 +55,25 @@ girepo_headers = files(
'gipropertyinfo.h', 'gipropertyinfo.h',
'giregisteredtypeinfo.h', 'giregisteredtypeinfo.h',
'girepository.h', 'girepository.h',
'girffi.h',
'gisignalinfo.h', 'gisignalinfo.h',
'gistructinfo.h', 'gistructinfo.h',
'gitypeinfo.h', 'gitypeinfo.h',
'gitypelib.h', 'gitypelib.h',
'gitypes.h', 'gitypes.h',
'giunioninfo.h', 'giunioninfo.h',
'giunresolvedinfo.h',
'givfuncinfo.h', 'givfuncinfo.h',
) )
install_headers(girepo_headers, install_dir: gir_includedir) girepo_ffi_headers = [
'girffi.h',
]
girepo_ffi_sources = files(
'girffi.c',
)
install_headers(girepo_headers + girepo_ffi_headers, install_dir: gir_includedir)
gir_c_args = [ gir_c_args = [
'-DGI_COMPILATION', '-DGI_COMPILATION',
@ -110,7 +119,7 @@ if cc.get_id() != 'msvc'
]) ])
endif endif
libgirepo_internals = static_library('girepository-internals', libgirepository_internals = static_library('girepository-internals',
sources: [ sources: [
'girmodule.c', 'girmodule.c',
'girnode.c', 'girnode.c',
@ -124,8 +133,8 @@ libgirepo_internals = static_library('girepository-internals',
dependencies: [girepo_gthash_dep, libffi_dep], dependencies: [girepo_gthash_dep, libffi_dep],
) )
libgirepo_internals_dep = declare_dependency( libgirepository_internals_dep = declare_dependency(
link_with: libgirepo_internals, link_with: libgirepository_internals,
dependencies: libffi_dep, dependencies: libffi_dep,
include_directories: [girepoinc], include_directories: [girepoinc],
) )
@ -135,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',
@ -151,6 +161,7 @@ girepo_sources = files(
'gitypeinfo.c', 'gitypeinfo.c',
'gitypelib.c', 'gitypelib.c',
'giunioninfo.c', 'giunioninfo.c',
'giunresolvedinfo.c',
'givfuncinfo.c', 'givfuncinfo.c',
) )
@ -164,8 +175,8 @@ if cc.get_id() != 'msvc'
]) ])
endif endif
libgirepo = shared_library('girepository-2.0', libgirepository = shared_library('girepository-2.0',
sources: girepo_sources + [gi_visibility_h], sources: girepo_sources + girepo_ffi_sources + [gi_visibility_h],
include_directories: [configinc, girepoinc], include_directories: [configinc, girepoinc],
c_args: gir_c_args, c_args: gir_c_args,
version: library_version, version: library_version,
@ -178,13 +189,13 @@ libgirepo = shared_library('girepository-2.0',
libgobject_dep, libgobject_dep,
libgmodule_dep, libgmodule_dep,
libgio_dep, libgio_dep,
libgirepo_internals_dep, libgirepository_internals_dep,
], ],
install: true, install: true,
) )
libgirepo_dep = declare_dependency( libgirepository_dep = declare_dependency(
link_with: libgirepo, link_with: libgirepository,
dependencies: [libglib_dep, libgobject_dep, libgio_dep, libgmodule_dep], dependencies: [libglib_dep, libgobject_dep, libgio_dep, libgmodule_dep],
include_directories: [girepoinc], include_directories: [girepoinc],
) )
@ -192,7 +203,7 @@ libgirepo_dep = declare_dependency(
executable('gi-dump-types', executable('gi-dump-types',
sources: 'gi-dump-types.c', sources: 'gi-dump-types.c',
dependencies: [ dependencies: [
libgirepo_dep, libgirepository_dep,
libgiounix_dep, libgiounix_dep,
libgiowin32_dep libgiowin32_dep
], ],
@ -204,7 +215,7 @@ pkgconfig_variables = [
'typelibdir=${libdir}/girepository-1.0', 'typelibdir=${libdir}/girepository-1.0',
] ]
pkg.generate(libgirepo, pkg.generate(libgirepository,
name: 'girepository', name: 'girepository',
version: glib_version, version: glib_version,
filebase: 'girepository-2.0', filebase: 'girepository-2.0',
@ -214,3 +225,34 @@ pkg.generate(libgirepo,
libraries: [libglib_dep, libgobject_dep], libraries: [libglib_dep, libgobject_dep],
) )
if enable_gir
libgirepository_gir_sources = [
gi_visibility_h,
girepo_headers,
girepo_sources,
]
libgirepository_gir_packages = [ 'girepository-2.0' ]
libgirepository_gir_args = [
'-DGI_COMPILATION',
'--symbol-prefix=gi',
'--identifier-prefix=GI',
]
girepository_gir = gnome.generate_gir(libgirepository,
sources: libgirepository_gir_sources,
namespace: 'GIRepository',
nsversion: '2.0',
identifier_prefix: 'GI',
symbol_prefix: 'gi',
export_packages: libgirepository_gir_packages,
header: 'girepository/girepository.h',
includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0], gio_gir[0] ],
install: true,
dependencies: [ libglib_dep, libgobject_dep, libgmodule_dep, libgio_dep ],
extra_args: gir_args + libgirepository_gir_args,
)
endif
if build_tests
subdir('tests')
endif

View File

@ -0,0 +1,85 @@
girepository_tests = {}
# Some GIR files are needed to test against
if enable_gir
girepository_tests += {
'repository' : {
'depends': [glib_gir, gobject_gir],
},
}
endif
test_env = environment()
test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
test_deps = [libm, thread_dep, libgirepository_dep]
test_cargs = ['-DG_LOG_DOMAIN="GIRepository"', '-UG_DISABLE_ASSERT']
test_cpp_args = test_cargs
foreach test_name, extra_args : girepository_tests
source = extra_args.get('source', test_name + '.c')
install = installed_tests_enabled and extra_args.get('install', true)
installed_tests_env = extra_args.get('installed_tests_env', {})
if install
test_conf = configuration_data()
test_conf.set('installed_tests_dir', installed_tests_execdir)
test_conf.set('program', test_name)
test_env_override = ''
if installed_tests_env != {}
envs = []
foreach var, value : installed_tests_env
envs += '@0@=@1@'.format(var, value)
endforeach
test_env_override = '@0@ @1@ '.format(env_program.full_path(), ' '.join(envs))
endif
test_conf.set('env', test_env_override)
configure_file(
input: installed_tests_template_tap,
output: test_name + '.test',
install_dir: installed_tests_metadir,
install_tag: 'tests',
configuration: test_conf
)
endif
exe = executable(test_name, source,
c_args: test_cargs + extra_args.get('c_args', []),
cpp_args: test_cpp_args + extra_args.get('cpp_args', []),
link_args: extra_args.get('link_args', []),
override_options: extra_args.get('override_options', []),
dependencies: test_deps + extra_args.get('dependencies', []),
link_with: extra_args.get('link_with', []),
install_dir: installed_tests_execdir,
install_tag: 'tests',
install: install,
)
depends = [extra_args.get('depends', [])]
suite = ['girepository', 'core'] + extra_args.get('suite', [])
timeout = suite.contains('slow') ? test_timeout_slow : test_timeout
if extra_args.get('can_fail', false)
suite += 'failing'
endif
foreach program : extra_args.get('extra_programs', [])
depends += test_extra_programs_targets[program]
endforeach
local_test_env = test_env
foreach var, value : extra_args.get('env', {})
local_test_env.append(var, value)
endforeach
test(test_name, exe,
args: extra_args.get('args', []),
protocol: extra_args.get('protocol', test_protocol),
depends: depends,
env: local_test_env,
timeout: timeout,
suite: suite,
should_fail: extra_args.get('should_fail', false),
)
endforeach

View File

@ -0,0 +1,117 @@
/*
* 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.1 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, see <http://www.gnu.org/licenses/>.
*
* Author: Philip Withnall <pwithnall@gnome.org>
*/
#include "glib.h"
#include "girepository.h"
static void
test_repository_basic (void)
{
GIRepository *repository;
char *gobject_typelib_dir = NULL;
GSList *search_path;
GITypelib *typelib = NULL;
char **namespaces = NULL;
const char *expected_namespaces[] = { "GLib", NULL };
GError *local_error = NULL;
g_test_summary ("Test basic opening of a repository and requiring a typelib");
gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "..", "gobject", NULL);
g_test_message ("Using GI_TYPELIB_DIR = %s", gobject_typelib_dir);
gi_repository_prepend_search_path (gobject_typelib_dir);
repository = gi_repository_new ();
g_assert_nonnull (repository);
search_path = gi_repository_get_search_path ();
g_assert_nonnull (search_path);
g_assert_cmpstr (search_path->data, ==, gobject_typelib_dir);
typelib = gi_repository_require (repository, "GLib", "2.0", 0, &local_error);
g_assert_no_error (local_error);
g_assert_nonnull (typelib);
namespaces = gi_repository_get_loaded_namespaces (repository);
g_assert_cmpstrv (namespaces, expected_namespaces);
g_strfreev (namespaces);
g_free (gobject_typelib_dir);
g_clear_object (&repository);
}
static void
test_repository_info (void)
{
GIRepository *repository;
char *gobject_typelib_dir = NULL;
GITypelib *typelib = NULL;
GIObjectInfo *object_info = NULL;
GISignalInfo *signal_info = NULL;
GError *local_error = NULL;
g_test_summary ("Test retrieving some basic info blobs from a typelib");
gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "..", "gobject", NULL);
g_test_message ("Using GI_TYPELIB_DIR = %s", gobject_typelib_dir);
gi_repository_prepend_search_path (gobject_typelib_dir);
g_free (gobject_typelib_dir);
repository = gi_repository_new ();
g_assert_nonnull (repository);
typelib = gi_repository_require (repository, "GObject", "2.0", 0, &local_error);
g_assert_no_error (local_error);
g_assert_nonnull (typelib);
object_info = (GIObjectInfo *) gi_repository_find_by_name (repository, "GObject", "Object");
g_assert_nonnull (object_info);
g_assert_cmpint (gi_base_info_get_info_type ((GIBaseInfo *) object_info), ==, GI_INFO_TYPE_OBJECT);
g_assert_cmpstr (gi_base_info_get_name ((GIBaseInfo *) object_info), ==, "Object");
g_assert_cmpstr (gi_base_info_get_namespace ((GIBaseInfo *) object_info), ==, "GObject");
signal_info = gi_object_info_find_signal (object_info, "notify");
g_assert_nonnull (signal_info);
g_assert_cmpint (gi_signal_info_get_flags (signal_info), ==,
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION);
gi_base_info_unref ((GIBaseInfo *) signal_info);
gi_base_info_unref ((GIBaseInfo *) object_info);
g_clear_object (&repository);
}
int
main (int argc,
char *argv[])
{
/* Isolate from the system typelibs and GIRs. */
g_setenv ("GI_TYPELIB_PATH", "/dev/null", TRUE);
g_setenv ("GI_GIR_PATH", "/dev/null", TRUE);
g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
g_test_add_func ("/repository/basic", test_repository_basic);
g_test_add_func ("/repository/info", test_repository_info);
return g_test_run ();
}