Skip to content
  • Philip Withnall's avatar
    gibaseinfo: Stop building GIBoxedInfo instances · 0fd99a9f
    Philip Withnall authored
    
    
    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
    `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:
     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: default avatarPhilip Withnall <pwithnall@gnome.org>
    
    Fixes: #3245
    0fd99a9f