diff --git a/gifieldinfo.c b/gifieldinfo.c index d6f2da98e..878f411cc 100644 --- a/gifieldinfo.c +++ b/gifieldinfo.c @@ -43,9 +43,13 @@ GIFieldInfoFlags g_field_info_get_flags (GIFieldInfo *info) { GIFieldInfoFlags flags; - GIRealInfo *rinfo = (GIRealInfo *)info; - FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + FieldBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0); + + blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; flags = 0; @@ -58,32 +62,73 @@ g_field_info_get_flags (GIFieldInfo *info) return flags; } +/** + * g_field_info_get_size: + * @info: a #GIFieldInfo + * + * Obtain the size in bits of the field member, this is how + * much space you need to allocate to store the field. + * + * Returns: the field size + */ gint g_field_info_get_size (GIFieldInfo *info) { GIRealInfo *rinfo = (GIRealInfo *)info; - FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + FieldBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0); + + blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; return blob->bits; } +/** + * g_field_info_get_offset: + * @info: a #GIFieldInfo + * + * Obtain the offset in bits of the field member, this is relative + * to the beginning of the struct or union. + * + * Returns: the field offset + */ gint g_field_info_get_offset (GIFieldInfo *info) { GIRealInfo *rinfo = (GIRealInfo *)info; - FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + FieldBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0); + + blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; return blob->struct_offset; } +/** + * g_field_info_get_type: + * + * Obtain the type of a field as a #GITypeInfo. + * + * Returns: (transfer full): the #GITypeInfo. Free the struct by calling + * g_base_info_unref() when done. + */ GITypeInfo * g_field_info_get_type (GIFieldInfo *info) { GIRealInfo *rinfo = (GIRealInfo *)info; Header *header = (Header *)rinfo->typelib->data; - FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + FieldBlob *blob; GIRealInfo *type_info; + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_FIELD_INFO (info), NULL); + + blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + if (blob->has_embedded_type) { type_info = (GIRealInfo *) g_info_new (GI_INFO_TYPE_TYPE, @@ -115,195 +160,198 @@ g_field_info_get_field (GIFieldInfo *field_info, gpointer mem, GArgument *value) { - int offset; - GITypeInfo *type_info; - gboolean result = FALSE; + int offset; + GITypeInfo *type_info; + gboolean result = FALSE; - if ((g_field_info_get_flags (field_info) & GI_FIELD_IS_READABLE) == 0) - return FALSE; + g_return_val_if_fail (field_info != NULL, FALSE); + g_return_val_if_fail (GI_IS_FIELD_INFO (field_info), FALSE); - offset = g_field_info_get_offset (field_info); - type_info = g_field_info_get_type (field_info); + if ((g_field_info_get_flags (field_info) & GI_FIELD_IS_READABLE) == 0) + return FALSE; - if (g_type_info_is_pointer (type_info)) - { - value->v_pointer = G_STRUCT_MEMBER(gpointer, mem, offset); - result = TRUE; - } - else - { - switch (g_type_info_get_tag (type_info)) - { - case GI_TYPE_TAG_VOID: - g_warning("Field %s: should not be have void type", - g_base_info_get_name ((GIBaseInfo *)field_info)); - break; - case GI_TYPE_TAG_BOOLEAN: - value->v_boolean = G_STRUCT_MEMBER(gboolean, mem, offset) != FALSE; - result = TRUE; - break; - case GI_TYPE_TAG_INT8: - case GI_TYPE_TAG_UINT8: - value->v_uint8 = G_STRUCT_MEMBER(guint8, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_INT16: - case GI_TYPE_TAG_UINT16: - case GI_TYPE_TAG_SHORT: - case GI_TYPE_TAG_USHORT: - value->v_uint16 = G_STRUCT_MEMBER(guint16, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_INT32: - case GI_TYPE_TAG_UINT32: - case GI_TYPE_TAG_INT: - case GI_TYPE_TAG_UINT: - value->v_uint32 = G_STRUCT_MEMBER(guint32, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_INT64: - case GI_TYPE_TAG_UINT64: - value->v_uint64 = G_STRUCT_MEMBER(guint64, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_LONG: - case GI_TYPE_TAG_ULONG: - value->v_ulong = G_STRUCT_MEMBER(gulong, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_SSIZE: - case GI_TYPE_TAG_SIZE: - case GI_TYPE_TAG_GTYPE: - value->v_size = G_STRUCT_MEMBER(gsize, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_FLOAT: - value->v_float = G_STRUCT_MEMBER(gfloat, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_DOUBLE: - value->v_double = G_STRUCT_MEMBER(gdouble, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_TIME_T: + offset = g_field_info_get_offset (field_info); + type_info = g_field_info_get_type (field_info); + + if (g_type_info_is_pointer (type_info)) + { + value->v_pointer = G_STRUCT_MEMBER (gpointer, mem, offset); + result = TRUE; + } + else + { + switch (g_type_info_get_tag (type_info)) + { + case GI_TYPE_TAG_VOID: + g_warning("Field %s: should not be have void type", + g_base_info_get_name ((GIBaseInfo *)field_info)); + break; + case GI_TYPE_TAG_BOOLEAN: + value->v_boolean = G_STRUCT_MEMBER (gboolean, mem, offset) != FALSE; + result = TRUE; + break; + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + value->v_uint8 = G_STRUCT_MEMBER (guint8, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + case GI_TYPE_TAG_SHORT: + case GI_TYPE_TAG_USHORT: + value->v_uint16 = G_STRUCT_MEMBER (guint16, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_INT: + case GI_TYPE_TAG_UINT: + value->v_uint32 = G_STRUCT_MEMBER (guint32, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + value->v_uint64 = G_STRUCT_MEMBER (guint64, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_LONG: + case GI_TYPE_TAG_ULONG: + value->v_ulong = G_STRUCT_MEMBER (gulong, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_SSIZE: + case GI_TYPE_TAG_SIZE: + case GI_TYPE_TAG_GTYPE: + value->v_size = G_STRUCT_MEMBER (gsize, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_FLOAT: + value->v_float = G_STRUCT_MEMBER (gfloat, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_DOUBLE: + value->v_double = G_STRUCT_MEMBER (gdouble, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_TIME_T: #if SIZEOF_TIME_T == 4 - value->v_int32 = G_STRUCT_MEMBER(time_t, mem, offset); + value->v_int32 = G_STRUCT_MEMBER (time_t, mem, offset); #elif SIZEOF_TIME_T == 8 - value->v_int64 = G_STRUCT_MEMBER(time_t, mem, offset); + value->v_int64 = G_STRUCT_MEMBER (time_t, mem, offset); #else # error "Unexpected size for time_t: not 4 or 8" #endif - result = TRUE; - break; - case GI_TYPE_TAG_UTF8: - case GI_TYPE_TAG_FILENAME: - case GI_TYPE_TAG_ARRAY: - case GI_TYPE_TAG_GLIST: - case GI_TYPE_TAG_GSLIST: - case GI_TYPE_TAG_GHASH: - g_warning("Field %s: type %s should have is_pointer set", - g_base_info_get_name ((GIBaseInfo *)field_info), - g_type_tag_to_string (g_type_info_get_tag (type_info))); - break; - case GI_TYPE_TAG_ERROR: - /* Needs to be handled by the language binding directly */ - break; - case GI_TYPE_TAG_INTERFACE: - { - GIBaseInfo *interface = g_type_info_get_interface (type_info); - switch (g_base_info_get_type (interface)) + result = TRUE; + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + g_warning("Field %s: type %s should have is_pointer set", + g_base_info_get_name ((GIBaseInfo *)field_info), + g_type_tag_to_string (g_type_info_get_tag (type_info))); + break; + case GI_TYPE_TAG_ERROR: + /* Needs to be handled by the language binding directly */ + break; + case GI_TYPE_TAG_INTERFACE: + { + GIBaseInfo *interface = g_type_info_get_interface (type_info); + switch (g_base_info_get_type (interface)) + { + case GI_INFO_TYPE_STRUCT: + case GI_INFO_TYPE_UNION: + case GI_INFO_TYPE_BOXED: + /* Needs to be handled by the language binding directly */ + break; + case GI_INFO_TYPE_OBJECT: + break; + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: { - case GI_INFO_TYPE_STRUCT: - case GI_INFO_TYPE_UNION: - case GI_INFO_TYPE_BOXED: - /* Needs to be handled by the language binding directly */ - break; - case GI_INFO_TYPE_OBJECT: - break; - case GI_INFO_TYPE_ENUM: - case GI_INFO_TYPE_FLAGS: - { - /* FIXME: there's a mismatch here between the value->v_int we use - * here and the glong result returned from g_value_info_get_value(). - * But to switch this to glong, we'd have to make g_function_info_invoke() - * translate value->v_long to the proper ABI for an enum function - * call parameter, which will usually be int, and then fix up language - * bindings. - */ - GITypeTag storage_type = g_enum_info_get_storage_type ((GIEnumInfo *)interface); - switch (storage_type) - { - case GI_TYPE_TAG_INT8: - case GI_TYPE_TAG_UINT8: - value->v_int = (gint)G_STRUCT_MEMBER(guint8, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_INT16: - case GI_TYPE_TAG_UINT16: - case GI_TYPE_TAG_SHORT: - case GI_TYPE_TAG_USHORT: - value->v_int = (gint)G_STRUCT_MEMBER(guint16, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_INT32: - case GI_TYPE_TAG_UINT32: - case GI_TYPE_TAG_INT: - case GI_TYPE_TAG_UINT: - value->v_int = (gint)G_STRUCT_MEMBER(guint32, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_INT64: - case GI_TYPE_TAG_UINT64: - value->v_int = (gint)G_STRUCT_MEMBER(guint64, mem, offset); - result = TRUE; - break; - case GI_TYPE_TAG_LONG: - case GI_TYPE_TAG_ULONG: - value->v_int = (gint)G_STRUCT_MEMBER(gulong, mem, offset); - result = TRUE; - break; - default: - g_warning("Field %s: Unexpected enum storage type %s", - g_base_info_get_name ((GIBaseInfo *)field_info), - g_type_tag_to_string (storage_type)); - break; - } - break; - } - case GI_INFO_TYPE_VFUNC: - case GI_INFO_TYPE_CALLBACK: - g_warning("Field %s: Interface type %d should have is_pointer set", - g_base_info_get_name ((GIBaseInfo *)field_info), - g_base_info_get_type (interface)); - break; - case GI_INFO_TYPE_INVALID: - case GI_INFO_TYPE_INTERFACE: - case GI_INFO_TYPE_FUNCTION: - case GI_INFO_TYPE_CONSTANT: - case GI_INFO_TYPE_ERROR_DOMAIN: - case GI_INFO_TYPE_VALUE: - case GI_INFO_TYPE_SIGNAL: - case GI_INFO_TYPE_PROPERTY: - case GI_INFO_TYPE_FIELD: - case GI_INFO_TYPE_ARG: - case GI_INFO_TYPE_TYPE: - case GI_INFO_TYPE_UNRESOLVED: - g_warning("Field %s: Interface type %d not expected", - g_base_info_get_name ((GIBaseInfo *)field_info), - g_base_info_get_type (interface)); + /* FIXME: there's a mismatch here between the value->v_int we use + * here and the glong result returned from g_value_info_get_value(). + * But to switch this to glong, we'd have to make g_function_info_invoke() + * translate value->v_long to the proper ABI for an enum function + * call parameter, which will usually be int, and then fix up language + * bindings. + */ + GITypeTag storage_type = g_enum_info_get_storage_type ((GIEnumInfo *)interface); + switch (storage_type) + { + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + value->v_int = (gint)G_STRUCT_MEMBER (guint8, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + case GI_TYPE_TAG_SHORT: + case GI_TYPE_TAG_USHORT: + value->v_int = (gint)G_STRUCT_MEMBER (guint16, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_INT: + case GI_TYPE_TAG_UINT: + value->v_int = (gint)G_STRUCT_MEMBER (guint32, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + value->v_int = (gint)G_STRUCT_MEMBER (guint64, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_LONG: + case GI_TYPE_TAG_ULONG: + value->v_int = (gint)G_STRUCT_MEMBER (gulong, mem, offset); + result = TRUE; + break; + default: + g_warning("Field %s: Unexpected enum storage type %s", + g_base_info_get_name ((GIBaseInfo *)field_info), + g_type_tag_to_string (storage_type)); + break; + } break; } + case GI_INFO_TYPE_VFUNC: + case GI_INFO_TYPE_CALLBACK: + g_warning("Field %s: Interface type %d should have is_pointer set", + g_base_info_get_name ((GIBaseInfo *)field_info), + g_base_info_get_type (interface)); + break; + case GI_INFO_TYPE_INVALID: + case GI_INFO_TYPE_INTERFACE: + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CONSTANT: + case GI_INFO_TYPE_ERROR_DOMAIN: + case GI_INFO_TYPE_VALUE: + case GI_INFO_TYPE_SIGNAL: + case GI_INFO_TYPE_PROPERTY: + case GI_INFO_TYPE_FIELD: + case GI_INFO_TYPE_ARG: + case GI_INFO_TYPE_TYPE: + case GI_INFO_TYPE_UNRESOLVED: + g_warning("Field %s: Interface type %d not expected", + g_base_info_get_name ((GIBaseInfo *)field_info), + g_base_info_get_type (interface)); + break; + } - g_base_info_unref ((GIBaseInfo *)interface); - break; - } + g_base_info_unref ((GIBaseInfo *)interface); break; } - } + break; + } + } - g_base_info_unref ((GIBaseInfo *)type_info); + g_base_info_unref ((GIBaseInfo *)type_info); - return result; + return result; } /** @@ -326,184 +374,187 @@ g_field_info_set_field (GIFieldInfo *field_info, gpointer mem, const GArgument *value) { - int offset; - GITypeInfo *type_info; - gboolean result = FALSE; + int offset; + GITypeInfo *type_info; + gboolean result = FALSE; - if ((g_field_info_get_flags (field_info) & GI_FIELD_IS_WRITABLE) == 0) - return FALSE; + g_return_val_if_fail (field_info != NULL, FALSE); + g_return_val_if_fail (GI_IS_FIELD_INFO (field_info), FALSE); - offset = g_field_info_get_offset (field_info); - type_info = g_field_info_get_type (field_info); + if ((g_field_info_get_flags (field_info) & GI_FIELD_IS_WRITABLE) == 0) + return FALSE; - if (!g_type_info_is_pointer (type_info)) - { - switch (g_type_info_get_tag (type_info)) - { - case GI_TYPE_TAG_VOID: - g_warning("Field %s: should not be have void type", - g_base_info_get_name ((GIBaseInfo *)field_info)); - break; - case GI_TYPE_TAG_BOOLEAN: - G_STRUCT_MEMBER(gboolean, mem, offset) = value->v_boolean != FALSE; - result = TRUE; - break; - case GI_TYPE_TAG_INT8: - case GI_TYPE_TAG_UINT8: - G_STRUCT_MEMBER(guint8, mem, offset) = value->v_uint8; - result = TRUE; - break; - case GI_TYPE_TAG_INT16: - case GI_TYPE_TAG_UINT16: - case GI_TYPE_TAG_SHORT: - case GI_TYPE_TAG_USHORT: - G_STRUCT_MEMBER(guint16, mem, offset) = value->v_uint16; - result = TRUE; - break; - case GI_TYPE_TAG_INT32: - case GI_TYPE_TAG_UINT32: - case GI_TYPE_TAG_INT: - case GI_TYPE_TAG_UINT: - G_STRUCT_MEMBER(guint32, mem, offset) = value->v_uint32; - result = TRUE; - break; - case GI_TYPE_TAG_INT64: - case GI_TYPE_TAG_UINT64: - G_STRUCT_MEMBER(guint64, mem, offset) = value->v_uint64; - result = TRUE; - break; - case GI_TYPE_TAG_LONG: - case GI_TYPE_TAG_ULONG: - G_STRUCT_MEMBER(gulong, mem, offset)= value->v_ulong; - result = TRUE; - break; - case GI_TYPE_TAG_SSIZE: - case GI_TYPE_TAG_SIZE: - case GI_TYPE_TAG_GTYPE: - G_STRUCT_MEMBER(gsize, mem, offset) = value->v_size; - result = TRUE; - break; - case GI_TYPE_TAG_FLOAT: - G_STRUCT_MEMBER(gfloat, mem, offset) = value->v_float; - result = TRUE; - break; - case GI_TYPE_TAG_DOUBLE: - G_STRUCT_MEMBER(gdouble, mem, offset)= value->v_double; - result = TRUE; - break; - case GI_TYPE_TAG_TIME_T: + offset = g_field_info_get_offset (field_info); + type_info = g_field_info_get_type (field_info); + + if (!g_type_info_is_pointer (type_info)) + { + switch (g_type_info_get_tag (type_info)) + { + case GI_TYPE_TAG_VOID: + g_warning("Field %s: should not be have void type", + g_base_info_get_name ((GIBaseInfo *)field_info)); + break; + case GI_TYPE_TAG_BOOLEAN: + G_STRUCT_MEMBER (gboolean, mem, offset) = value->v_boolean != FALSE; + result = TRUE; + break; + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + G_STRUCT_MEMBER (guint8, mem, offset) = value->v_uint8; + result = TRUE; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + case GI_TYPE_TAG_SHORT: + case GI_TYPE_TAG_USHORT: + G_STRUCT_MEMBER (guint16, mem, offset) = value->v_uint16; + result = TRUE; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_INT: + case GI_TYPE_TAG_UINT: + G_STRUCT_MEMBER (guint32, mem, offset) = value->v_uint32; + result = TRUE; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + G_STRUCT_MEMBER (guint64, mem, offset) = value->v_uint64; + result = TRUE; + break; + case GI_TYPE_TAG_LONG: + case GI_TYPE_TAG_ULONG: + G_STRUCT_MEMBER (gulong, mem, offset)= value->v_ulong; + result = TRUE; + break; + case GI_TYPE_TAG_SSIZE: + case GI_TYPE_TAG_SIZE: + case GI_TYPE_TAG_GTYPE: + G_STRUCT_MEMBER (gsize, mem, offset) = value->v_size; + result = TRUE; + break; + case GI_TYPE_TAG_FLOAT: + G_STRUCT_MEMBER (gfloat, mem, offset) = value->v_float; + result = TRUE; + break; + case GI_TYPE_TAG_DOUBLE: + G_STRUCT_MEMBER (gdouble, mem, offset)= value->v_double; + result = TRUE; + break; + case GI_TYPE_TAG_TIME_T: #if SIZEOF_TIME_T == 4 - G_STRUCT_MEMBER(time_t, mem, offset) = value->v_int32; + G_STRUCT_MEMBER (time_t, mem, offset) = value->v_int32; #elif SIZEOF_TIME_T == 8 - G_STRUCT_MEMBER(time_t, mem, offset) = value->v_int64; + G_STRUCT_MEMBER (time_t, mem, offset) = value->v_int64; #else # error "Unexpected size for time_t: not 4 or 8" #endif - result = TRUE; - break; - case GI_TYPE_TAG_UTF8: - case GI_TYPE_TAG_FILENAME: - case GI_TYPE_TAG_ARRAY: - case GI_TYPE_TAG_GLIST: - case GI_TYPE_TAG_GSLIST: - case GI_TYPE_TAG_GHASH: - g_warning("Field %s: type %s should have is_pointer set", - g_base_info_get_name ((GIBaseInfo *)field_info), - g_type_tag_to_string (g_type_info_get_tag (type_info))); - break; - case GI_TYPE_TAG_ERROR: - /* Needs to be handled by the language binding directly */ - break; - case GI_TYPE_TAG_INTERFACE: - { - GIBaseInfo *interface = g_type_info_get_interface (type_info); - switch (g_base_info_get_type (interface)) + result = TRUE; + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + g_warning("Field %s: type %s should have is_pointer set", + g_base_info_get_name ((GIBaseInfo *)field_info), + g_type_tag_to_string (g_type_info_get_tag (type_info))); + break; + case GI_TYPE_TAG_ERROR: + /* Needs to be handled by the language binding directly */ + break; + case GI_TYPE_TAG_INTERFACE: + { + GIBaseInfo *interface = g_type_info_get_interface (type_info); + switch (g_base_info_get_type (interface)) + { + case GI_INFO_TYPE_STRUCT: + case GI_INFO_TYPE_UNION: + case GI_INFO_TYPE_BOXED: + /* Needs to be handled by the language binding directly */ + break; + case GI_INFO_TYPE_OBJECT: + break; + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: { - case GI_INFO_TYPE_STRUCT: - case GI_INFO_TYPE_UNION: - case GI_INFO_TYPE_BOXED: - /* Needs to be handled by the language binding directly */ - break; - case GI_INFO_TYPE_OBJECT: - break; - case GI_INFO_TYPE_ENUM: - case GI_INFO_TYPE_FLAGS: - { - /* See FIXME above - */ - GITypeTag storage_type = g_enum_info_get_storage_type ((GIEnumInfo *)interface); - switch (storage_type) - { - case GI_TYPE_TAG_INT8: - case GI_TYPE_TAG_UINT8: - G_STRUCT_MEMBER(guint8, mem, offset) = (guint8)value->v_int; - result = TRUE; - break; - case GI_TYPE_TAG_INT16: - case GI_TYPE_TAG_UINT16: - case GI_TYPE_TAG_SHORT: - case GI_TYPE_TAG_USHORT: - G_STRUCT_MEMBER(guint16, mem, offset) = (guint16)value->v_int; - result = TRUE; - break; - case GI_TYPE_TAG_INT32: - case GI_TYPE_TAG_UINT32: - case GI_TYPE_TAG_INT: - case GI_TYPE_TAG_UINT: - G_STRUCT_MEMBER(guint32, mem, offset) = (guint32)value->v_int; - result = TRUE; - break; - case GI_TYPE_TAG_INT64: - case GI_TYPE_TAG_UINT64: - G_STRUCT_MEMBER(guint64, mem, offset) = (guint64)value->v_int; - result = TRUE; - break; - case GI_TYPE_TAG_LONG: - case GI_TYPE_TAG_ULONG: - G_STRUCT_MEMBER(gulong, mem, offset) = (gulong)value->v_int; - result = TRUE; - break; - default: - g_warning("Field %s: Unexpected enum storage type %s", - g_base_info_get_name ((GIBaseInfo *)field_info), - g_type_tag_to_string (storage_type)); - break; - } - break; - } - break; - case GI_INFO_TYPE_VFUNC: - case GI_INFO_TYPE_CALLBACK: - g_warning("Field%s: Interface type %d should have is_pointer set", - g_base_info_get_name ((GIBaseInfo *)field_info), - g_base_info_get_type (interface)); - break; - case GI_INFO_TYPE_INVALID: - case GI_INFO_TYPE_INTERFACE: - case GI_INFO_TYPE_FUNCTION: - case GI_INFO_TYPE_CONSTANT: - case GI_INFO_TYPE_ERROR_DOMAIN: - case GI_INFO_TYPE_VALUE: - case GI_INFO_TYPE_SIGNAL: - case GI_INFO_TYPE_PROPERTY: - case GI_INFO_TYPE_FIELD: - case GI_INFO_TYPE_ARG: - case GI_INFO_TYPE_TYPE: - case GI_INFO_TYPE_UNRESOLVED: - g_warning("Field %s: Interface type %d not expected", - g_base_info_get_name ((GIBaseInfo *)field_info), - g_base_info_get_type (interface)); + /* See FIXME above + */ + GITypeTag storage_type = g_enum_info_get_storage_type ((GIEnumInfo *)interface); + switch (storage_type) + { + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + G_STRUCT_MEMBER (guint8, mem, offset) = (guint8)value->v_int; + result = TRUE; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + case GI_TYPE_TAG_SHORT: + case GI_TYPE_TAG_USHORT: + G_STRUCT_MEMBER (guint16, mem, offset) = (guint16)value->v_int; + result = TRUE; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_INT: + case GI_TYPE_TAG_UINT: + G_STRUCT_MEMBER (guint32, mem, offset) = (guint32)value->v_int; + result = TRUE; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + G_STRUCT_MEMBER (guint64, mem, offset) = (guint64)value->v_int; + result = TRUE; + break; + case GI_TYPE_TAG_LONG: + case GI_TYPE_TAG_ULONG: + G_STRUCT_MEMBER (gulong, mem, offset) = (gulong)value->v_int; + result = TRUE; + break; + default: + g_warning("Field %s: Unexpected enum storage type %s", + g_base_info_get_name ((GIBaseInfo *)field_info), + g_type_tag_to_string (storage_type)); + break; + } break; } + break; + case GI_INFO_TYPE_VFUNC: + case GI_INFO_TYPE_CALLBACK: + g_warning("Field%s: Interface type %d should have is_pointer set", + g_base_info_get_name ((GIBaseInfo *)field_info), + g_base_info_get_type (interface)); + break; + case GI_INFO_TYPE_INVALID: + case GI_INFO_TYPE_INTERFACE: + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CONSTANT: + case GI_INFO_TYPE_ERROR_DOMAIN: + case GI_INFO_TYPE_VALUE: + case GI_INFO_TYPE_SIGNAL: + case GI_INFO_TYPE_PROPERTY: + case GI_INFO_TYPE_FIELD: + case GI_INFO_TYPE_ARG: + case GI_INFO_TYPE_TYPE: + case GI_INFO_TYPE_UNRESOLVED: + g_warning("Field %s: Interface type %d not expected", + g_base_info_get_name ((GIBaseInfo *)field_info), + g_base_info_get_type (interface)); + break; + } - g_base_info_unref ((GIBaseInfo *)interface); - break; - } + g_base_info_unref ((GIBaseInfo *)interface); break; } - } + break; + } + } - g_base_info_unref ((GIBaseInfo *)type_info); + g_base_info_unref ((GIBaseInfo *)type_info); - return result; + return result; }