diff options
Diffstat (limited to 'girepository')
-rw-r--r-- | girepository/cmph/meson.build | 2 | ||||
-rw-r--r-- | girepository/giobjectinfo.c | 2 | ||||
-rw-r--r-- | girepository/girepository.c | 2 | ||||
-rw-r--r-- | girepository/gitypeinfo.c | 170 | ||||
-rw-r--r-- | girepository/gitypeinfo.h | 12 | ||||
-rw-r--r-- | girepository/giversionmacros.h | 6 | ||||
-rw-r--r-- | girepository/meson.build | 3 |
7 files changed, 194 insertions, 3 deletions
diff --git a/girepository/cmph/meson.build b/girepository/cmph/meson.build index 5bc41a33..2a0cef7e 100644 --- a/girepository/cmph/meson.build +++ b/girepository/cmph/meson.build @@ -26,6 +26,7 @@ cmph_sources = [ cmph_deps = [ glib_dep, + gobject_dep, cc.find_library('m', required: false), ] @@ -67,6 +68,7 @@ cmph_test = executable('cmph-bdz-test', '../cmph-bdz-test.c', dependencies: [ cmph_dep, glib_dep, + gobject_dep, ], c_args: custom_c_args, ) diff --git a/girepository/giobjectinfo.c b/girepository/giobjectinfo.c index efb9ad76..3f3423cc 100644 --- a/girepository/giobjectinfo.c +++ b/girepository/giobjectinfo.c @@ -89,7 +89,7 @@ g_object_info_get_field_offset (GIObjectInfo *info, * * Obtain the parent of the object type. * - * Returns: (transfer full): the #GIObjectInfo. Free the struct by calling + * Returns: (transfer full) (nullable): the #GIObjectInfo. Free the struct by calling * g_base_info_unref() when done. */ GIObjectInfo * diff --git a/girepository/girepository.c b/girepository/girepository.c index b7948d61..7d034859 100644 --- a/girepository/girepository.c +++ b/girepository/girepository.c @@ -1144,7 +1144,7 @@ g_irepository_get_version (GIRepository *repository, * Note: The namespace must have already been loaded using a function * such as g_irepository_require() before calling this function. * - * Returns: Comma-separated list of paths to shared libraries, + * Returns: (nullable): Comma-separated list of paths to shared libraries, * or %NULL if none are associated */ const gchar * diff --git a/girepository/gitypeinfo.c b/girepository/gitypeinfo.c index 1434b2f3..e90f9463 100644 --- a/girepository/gitypeinfo.c +++ b/girepository/gitypeinfo.c @@ -347,3 +347,173 @@ g_type_info_get_array_type (GITypeInfo *info) return -1; } + +/** + * g_type_info_get_storage_type: + * @info: a #GITypeInfo + * + * Obtain the type tag corresponding to the underlying storage type in C for + * the type. + * See #GITypeTag for a list of type tags. + * + * Returns: the type tag + * + * Since: 1.66 + */ +GITypeTag +g_type_info_get_storage_type (GITypeInfo *info) +{ + GITypeTag type_tag = g_type_info_get_tag (info); + + if (type_tag == GI_TYPE_TAG_INTERFACE) + { + GIBaseInfo *interface = g_type_info_get_interface (info); + GIInfoType info_type = g_base_info_get_type (interface); + if (info_type == GI_INFO_TYPE_ENUM || info_type == GI_INFO_TYPE_FLAGS) + type_tag = g_enum_info_get_storage_type (interface); + g_base_info_unref (interface); + } + + return type_tag; +} + +/** + * g_type_info_argument_from_hash_pointer: + * @info: a #GITypeInfo + * @hash_pointer: A pointer, such as a #GHashTable data pointer + * @arg: A #GIArgument to fill in + * + * 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 + * structs, these data pointers may have values stuffed into them via macros + * such as %GPOINTER_TO_INT. + * + * Use this function to ensure that all values are correctly extracted from + * stuffed pointers, regardless of the machine's architecture or endianness. + * + * This function fills in the appropriate field of @arg with the value extracted + * from @hash_pointer, depending on the storage type of @info. + * + * Since: 1.66 + */ +void +g_type_info_argument_from_hash_pointer (GITypeInfo *info, + gpointer hash_pointer, + GIArgument *arg) +{ + GITypeTag type_tag = g_type_info_get_storage_type (info); + + switch (type_tag) + { + case GI_TYPE_TAG_BOOLEAN: + arg->v_boolean = !!GPOINTER_TO_INT (hash_pointer); + break; + case GI_TYPE_TAG_INT8: + arg->v_int8 = (gint8)GPOINTER_TO_INT (hash_pointer); + break; + case GI_TYPE_TAG_UINT8: + arg->v_uint8 = (guint8)GPOINTER_TO_UINT (hash_pointer); + break; + case GI_TYPE_TAG_INT16: + arg->v_int16 = (gint16)GPOINTER_TO_INT (hash_pointer); + break; + case GI_TYPE_TAG_UINT16: + arg->v_uint16 = (guint16)GPOINTER_TO_UINT (hash_pointer); + break; + case GI_TYPE_TAG_INT32: + arg->v_int32 = (gint32)GPOINTER_TO_INT (hash_pointer); + break; + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_UNICHAR: + arg->v_uint32 = (guint32)GPOINTER_TO_UINT (hash_pointer); + break; + case GI_TYPE_TAG_GTYPE: + arg->v_size = GPOINTER_TO_SIZE (hash_pointer); + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_INTERFACE: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + case GI_TYPE_TAG_ERROR: + arg->v_pointer = hash_pointer; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + case GI_TYPE_TAG_FLOAT: + case GI_TYPE_TAG_DOUBLE: + default: + g_critical ("Unsupported type for pointer-stuffing: %s", + g_type_tag_to_string (type_tag)); + arg->v_pointer = hash_pointer; + } +} + +/** + * g_type_info_hash_pointer_from_argument: + * @info: a #GITypeInfo + * @arg: A #GIArgument with the value to stuff into a pointer + * + * 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 + * structs, these data pointers may have values stuffed into them via macros + * such as %GPOINTER_TO_INT. + * + * Use this function to ensure that all values are correctly stuffed into + * pointers, regardless of the machine's architecture or endianness. + * + * This function returns a pointer stuffed with the appropriate field of @arg, + * depending on the storage type of @info. + * + * Returns: A stuffed pointer, that can be stored in a #GHashTable, for example + * + * Since: 1.66 + */ +gpointer +g_type_info_hash_pointer_from_argument (GITypeInfo *info, + GIArgument *arg) +{ + GITypeTag type_tag = g_type_info_get_storage_type (info); + + switch (type_tag) + { + case GI_TYPE_TAG_BOOLEAN: + return GINT_TO_POINTER (arg->v_boolean); + case GI_TYPE_TAG_INT8: + return GINT_TO_POINTER (arg->v_int8); + case GI_TYPE_TAG_UINT8: + return GUINT_TO_POINTER (arg->v_uint8); + case GI_TYPE_TAG_INT16: + return GINT_TO_POINTER (arg->v_int16); + case GI_TYPE_TAG_UINT16: + return GUINT_TO_POINTER (arg->v_uint16); + case GI_TYPE_TAG_INT32: + return GINT_TO_POINTER (arg->v_int32); + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_UNICHAR: + return GUINT_TO_POINTER (arg->v_uint32); + case GI_TYPE_TAG_GTYPE: + return GSIZE_TO_POINTER (arg->v_size); + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_INTERFACE: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + case GI_TYPE_TAG_ERROR: + return arg->v_pointer; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + case GI_TYPE_TAG_FLOAT: + case GI_TYPE_TAG_DOUBLE: + default: + g_critical ("Unsupported type for pointer-stuffing: %s", + g_type_tag_to_string (type_tag)); + return arg->v_pointer; + } +} diff --git a/girepository/gitypeinfo.h b/girepository/gitypeinfo.h index 4d5679c9..fd7d5be6 100644 --- a/girepository/gitypeinfo.h +++ b/girepository/gitypeinfo.h @@ -80,6 +80,18 @@ gboolean g_type_info_is_zero_terminated (GITypeInfo *info); GI_AVAILABLE_IN_ALL GIArrayType g_type_info_get_array_type (GITypeInfo *info); +GI_AVAILABLE_IN_1_66 +GITypeTag g_type_info_get_storage_type (GITypeInfo *info); + +GI_AVAILABLE_IN_1_66 +void g_type_info_argument_from_hash_pointer (GITypeInfo *info, + gpointer hash_pointer, + GIArgument *arg); + +GI_AVAILABLE_IN_1_66 +gpointer g_type_info_hash_pointer_from_argument (GITypeInfo *info, + GIArgument *arg); + G_END_DECLS diff --git a/girepository/giversionmacros.h b/girepository/giversionmacros.h index c32e5bb8..a941ee2d 100644 --- a/girepository/giversionmacros.h +++ b/girepository/giversionmacros.h @@ -159,4 +159,10 @@ # define GI_AVAILABLE_IN_1_60 _GI_EXTERN #endif +#if defined(GLIB_VERSION_2_66) && GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_66 +# define GI_AVAILABLE_IN_1_66 GLIB_UNAVAILABLE(2, 66) +#else +# define GI_AVAILABLE_IN_1_66 _GI_EXTERN +#endif + #endif /* __GIVERSIONMACROS_H__ */ diff --git a/girepository/meson.build b/girepository/meson.build index 204659fe..6cd8fd30 100644 --- a/girepository/meson.build +++ b/girepository/meson.build @@ -17,12 +17,13 @@ girepo_gthash_lib = static_library('girepository-gthash', cmph_dep, glib_dep, gmodule_dep, + gobject_dep, ], ) girepo_gthash_dep = declare_dependency( link_with: girepo_gthash_lib, - dependencies: [glib_dep, gmodule_dep], + dependencies: [glib_dep, gmodule_dep, gobject_dep], include_directories: include_directories('.'), ) |