Skip to content

gibaseinfo: Stop building GIBoxedInfo instances and use gi_registered_type_info_is_boxed() instead

Philip Withnall requested to merge pwithnall/glib:3245-boxed-info-typing into main

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:

  1. Plain old datatype (POD) structs
  2. POD unions
  3. Structs with a copy func and/or free func
  4. Unions with a copy func and/or free func
  5. Structs which are the ‘GType struct’ for an object or interface (i.e. the class or instance or interface struct)
  6. Structs with a copy func and free func and boxed GType
  7. Unions with a copy func and free func and boxed GType
  8. 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 GTypes, 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:

  1. GIStructInfo instance, GIRegisteredTypeInfo methods return no GType info
  2. GIUnionInfo instance similarly
  3. GIStructInfo instance, GIRegisteredTypeInfo methods return no GType info, gi_struct_info_get_{copy,free}_function_name() return non-NULL values
  4. GIUnionInfo instance similarly
  5. GIStructInfo instance, GIRegisteredTypeInfo methods return no GType info, gi_struct_info_is_gtype_struct() returns true
  6. GIStructInfo instance, GIRegisteredTypeInfo methods return valid GType information, gi_registered_type_info_is_boxed() returns true, gi_struct_info_get_{copy,free}_function_name() return NULL values (because the copy/free functions are hidden inside the boxed type registration at runtime)
  7. GIUnionInfo instance similarly
  8. Not representable, but could be represented in future by re-adding a GIBoxedInfo type which derives from GIRegisteredTypeInfo 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)

Merge request reports