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:
Mark Lee 2009-06-19 16:53:03 -07:00 committed by Colin Walters
parent 0a046b7aa0
commit 378350f3a9
8 changed files with 56 additions and 18 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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:

View File

@ -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;

View File

@ -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:

View File

@ -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);

View File

@ -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 },

View File

@ -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),