mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-03-14 19:55:12 +01:00
Bug 584423 – Add short/ushort support
Add type tags for short and ushort, plus all of the requisite code needed to utilize them in libgirepository. Add support in the scanner's AST files. Add test functions to the everything library and the expected gir file. gtypelib.c constant validation fixed by Colin Walters <walters@verbum.org>
This commit is contained in:
parent
0a046b7aa0
commit
378350f3a9
8
gfield.c
8
gfield.c
@ -55,6 +55,8 @@ g_field_info_get_field (GIFieldInfo *field_info,
|
||||
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;
|
||||
@ -138,6 +140,8 @@ g_field_info_get_field (GIFieldInfo *field_info,
|
||||
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;
|
||||
@ -251,6 +255,8 @@ g_field_info_set_field (GIFieldInfo *field_info,
|
||||
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;
|
||||
@ -329,6 +335,8 @@ g_field_info_set_field (GIFieldInfo *field_info,
|
||||
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;
|
||||
|
6
ginfo.c
6
ginfo.c
@ -2091,6 +2091,12 @@ g_constant_info_get_value (GIConstantInfo *info,
|
||||
case GI_TYPE_TAG_TIME_T:
|
||||
value->v_long = *(long*)&base->typelib->data[blob->offset];
|
||||
break;
|
||||
case GI_TYPE_TAG_SHORT:
|
||||
value->v_short = *(gshort*)&base->typelib->data[blob->offset];
|
||||
break;
|
||||
case GI_TYPE_TAG_USHORT:
|
||||
value->v_ushort = *(gushort*)&base->typelib->data[blob->offset];
|
||||
break;
|
||||
case GI_TYPE_TAG_INT:
|
||||
value->v_int = *(gint*)&base->typelib->data[blob->offset];
|
||||
break;
|
||||
|
@ -1321,6 +1321,10 @@ g_type_tag_to_string (GITypeTag type)
|
||||
return "int64";
|
||||
case GI_TYPE_TAG_UINT64:
|
||||
return "uint64";
|
||||
case GI_TYPE_TAG_SHORT:
|
||||
return "short";
|
||||
case GI_TYPE_TAG_USHORT:
|
||||
return "ushort";
|
||||
case GI_TYPE_TAG_INT:
|
||||
return "int";
|
||||
case GI_TYPE_TAG_UINT:
|
||||
|
@ -240,6 +240,8 @@ typedef union
|
||||
guint64 v_uint64;
|
||||
gfloat v_float;
|
||||
gdouble v_double;
|
||||
gshort v_short;
|
||||
gushort v_ushort;
|
||||
gint v_int;
|
||||
guint v_uint;
|
||||
glong v_long;
|
||||
@ -329,25 +331,27 @@ typedef enum {
|
||||
GI_TYPE_TAG_UINT32 = 7,
|
||||
GI_TYPE_TAG_INT64 = 8,
|
||||
GI_TYPE_TAG_UINT64 = 9,
|
||||
GI_TYPE_TAG_INT = 10,
|
||||
GI_TYPE_TAG_UINT = 11,
|
||||
GI_TYPE_TAG_LONG = 12,
|
||||
GI_TYPE_TAG_ULONG = 13,
|
||||
GI_TYPE_TAG_SSIZE = 14,
|
||||
GI_TYPE_TAG_SIZE = 15,
|
||||
GI_TYPE_TAG_FLOAT = 16,
|
||||
GI_TYPE_TAG_DOUBLE = 17,
|
||||
GI_TYPE_TAG_TIME_T = 18,
|
||||
GI_TYPE_TAG_GTYPE = 19,
|
||||
GI_TYPE_TAG_UTF8 = 20,
|
||||
GI_TYPE_TAG_FILENAME = 21,
|
||||
GI_TYPE_TAG_SHORT = 10,
|
||||
GI_TYPE_TAG_USHORT = 11,
|
||||
GI_TYPE_TAG_INT = 12,
|
||||
GI_TYPE_TAG_UINT = 13,
|
||||
GI_TYPE_TAG_LONG = 14,
|
||||
GI_TYPE_TAG_ULONG = 15,
|
||||
GI_TYPE_TAG_SSIZE = 16,
|
||||
GI_TYPE_TAG_SIZE = 17,
|
||||
GI_TYPE_TAG_FLOAT = 18,
|
||||
GI_TYPE_TAG_DOUBLE = 19,
|
||||
GI_TYPE_TAG_TIME_T = 20,
|
||||
GI_TYPE_TAG_GTYPE = 21,
|
||||
GI_TYPE_TAG_UTF8 = 22,
|
||||
GI_TYPE_TAG_FILENAME = 23,
|
||||
/* Non-basic types */
|
||||
GI_TYPE_TAG_ARRAY = 22,
|
||||
GI_TYPE_TAG_INTERFACE = 23,
|
||||
GI_TYPE_TAG_GLIST = 24,
|
||||
GI_TYPE_TAG_GSLIST = 25,
|
||||
GI_TYPE_TAG_GHASH = 26,
|
||||
GI_TYPE_TAG_ERROR = 27
|
||||
GI_TYPE_TAG_ARRAY = 24,
|
||||
GI_TYPE_TAG_INTERFACE = 25,
|
||||
GI_TYPE_TAG_GLIST = 26,
|
||||
GI_TYPE_TAG_GSLIST = 27,
|
||||
GI_TYPE_TAG_GHASH = 28,
|
||||
GI_TYPE_TAG_ERROR = 29
|
||||
/* Note - there is only room currently for 32 tags.
|
||||
* See docs/typelib-format.txt SimpleTypeBlob definition */
|
||||
} GITypeTag;
|
||||
|
4
girffi.c
4
girffi.c
@ -51,6 +51,10 @@ g_ir_ffi_get_ffi_type (GITypeTag tag)
|
||||
return &ffi_type_sint64;
|
||||
case GI_TYPE_TAG_UINT64:
|
||||
return &ffi_type_uint64;
|
||||
case GI_TYPE_TAG_SHORT:
|
||||
return &ffi_type_sshort;
|
||||
case GI_TYPE_TAG_USHORT:
|
||||
return &ffi_type_ushort;
|
||||
case GI_TYPE_TAG_INT:
|
||||
return &ffi_type_sint;
|
||||
case GI_TYPE_TAG_UINT:
|
||||
|
@ -2254,6 +2254,14 @@ g_ir_node_build_typelib (GIrNode *node,
|
||||
blob->size = 8;
|
||||
*(guint64*)&data[blob->offset] = (guint64) parse_uint_value (constant->value);
|
||||
break;
|
||||
case GI_TYPE_TAG_SHORT:
|
||||
blob->size = sizeof (gshort);
|
||||
*(gshort*)&data[blob->offset] = (gshort) parse_int_value (constant->value);
|
||||
break;
|
||||
case GI_TYPE_TAG_USHORT:
|
||||
blob->size = sizeof (gushort);
|
||||
*(gushort*)&data[blob->offset] = (gushort) parse_uint_value (constant->value);
|
||||
break;
|
||||
case GI_TYPE_TAG_INT:
|
||||
blob->size = sizeof (gint);
|
||||
*(gint*)&data[blob->offset] = (gint) parse_int_value (constant->value);
|
||||
|
@ -364,6 +364,8 @@ static BasicTypeInfo basic_types[] = {
|
||||
{ "uint32", GI_TYPE_TAG_UINT32, 0 },
|
||||
{ "int64", GI_TYPE_TAG_INT64, 0 },
|
||||
{ "uint64", GI_TYPE_TAG_UINT64, 0 },
|
||||
{ "short", GI_TYPE_TAG_SHORT, 0 },
|
||||
{ "ushort", GI_TYPE_TAG_USHORT, 0 },
|
||||
{ "int", GI_TYPE_TAG_INT, 0 },
|
||||
{ "uint", GI_TYPE_TAG_UINT, 0 },
|
||||
{ "long", GI_TYPE_TAG_LONG, 0 },
|
||||
|
@ -904,6 +904,8 @@ validate_constant_blob (GTypelib *typelib,
|
||||
4, /* UINT32 */
|
||||
8, /* INT64 */
|
||||
8, /* UINT64 */
|
||||
sizeof (gshort),
|
||||
sizeof (gushort),
|
||||
sizeof (gint),
|
||||
sizeof (guint),
|
||||
sizeof (glong),
|
||||
|
Loading…
x
Reference in New Issue
Block a user