gibaseinfo: Stop building GIBoxedInfo instances and use gi_registered_type_info_is_boxed() instead
Instead, add a method on GIRegisteredTypeInfo
which indicates whether
the registered type is a boxed type. This will return true for
GIStructInfo
and GIUnionInfo
instances which are boxed (not all
structs and unions are).
This makes GIBoxedInfo
redundant, and it’ll be dropped in a following
commit.
There are several different things which typelibs need to be able to represent:
- Plain old datatype (POD) structs
- POD unions
- Structs with a copy func and/or free func
- Unions with a copy func and/or free func
- Structs which are the ‘GType struct’ for an object or interface (i.e. the class or instance or interface struct)
- Structs with a copy func and free func and boxed GType
- Unions with a copy func and free func and boxed GType
- Boxed GTypes which represent something other than a struct or union
So there’s a lot going on here. In commit e28078c70cbf4a57c7dbd39626f43f9bd2674145, a lot of this was reworked, and support was added for boxed unions and boxed ‘others’ (the last item on the list above).
Since then, support for boxed types other than structs seems to have atrophied a bit, and the whole lot has got a bit confusing.
It was perhaps less confusing when all the GIBaseInfo
subclasses were
actually aliases of each other, but now they have subtype relationships,
the position of GIBoxedInfo
in that type hierarchy has become unclear.
How is it related to GIStructInfo
, GIUnionInfo
and
GIRegisteredTypeInfo
?
Since a boxed type is necessarily a GIRegisteredTypeInfo
, and the
methods of GIRegisteredTypeInfo
are all written to allow a GType
to
be optional, so that GIStructInfo
and GIUnionInfo
can safely derive
from it and still be used to represent plain old datatypes without
GType
s, it makes sense to add a method to GIRegisteredTypeInfo
to
indicate that the registered type is derived from G_TYPE_BOXED
.
Accordingly, the things above are now represented in libgirepository’s type system as:
-
GIStructInfo
instance,GIRegisteredTypeInfo
methods return noGType
info -
GIUnionInfo
instance similarly -
GIStructInfo
instance,GIRegisteredTypeInfo
methods return noGType
info,gi_struct_info_get_{copy,free}_function_name()
return non-NULL
values -
GIUnionInfo
instance similarly -
GIStructInfo
instance,GIRegisteredTypeInfo
methods return noGType
info,gi_struct_info_is_gtype_struct()
returns true -
GIStructInfo
instance,GIRegisteredTypeInfo
methods return validGType
information,gi_registered_type_info_is_boxed()
returns true,gi_struct_info_get_{copy,free}_function_name()
returnNULL
values (because the copy/free functions are hidden inside the boxed type registration at runtime) -
GIUnionInfo
instance similarly - Not representable, but could be represented in future by re-adding a
GIBoxedInfo
type which derives fromGIRegisteredTypeInfo
and is used solely for boxed ‘other’ types, not boxed structs or unions
Signed-off-by: Philip Withnall pwithnall@gnome.org
Fixes: #3245 (closed)
Closes #3245 (closed)