summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Lee <marklee@src.gnome.org>2009-06-19 16:53:03 -0700
committerColin Walters <walters@verbum.org>2009-06-22 14:01:56 -0400
commit7048d711b2787af81767bb472f5dbaf0f97d6db9 (patch)
tree1f5635988ec08dd7020c947e02f58cb32def5c90
parent94bae77228d816a308c054357125713b746b687c (diff)
downloadgobject-introspection-7048d711b2787af81767bb472f5dbaf0f97d6db9.tar.gz
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>
-rw-r--r--gir/Everything-1.0-expected.gir20
-rw-r--r--gir/everything.c10
-rw-r--r--gir/everything.h2
-rw-r--r--girepository/gfield.c8
-rw-r--r--girepository/ginfo.c6
-rw-r--r--girepository/girepository.c4
-rw-r--r--girepository/girepository.h40
-rw-r--r--girepository/girffi.c4
-rw-r--r--girepository/girnode.c8
-rw-r--r--girepository/girparser.c2
-rw-r--r--girepository/gtypelib.c2
-rw-r--r--giscanner/ast.py22
-rw-r--r--giscanner/glibast.py12
13 files changed, 107 insertions, 33 deletions
diff --git a/gir/Everything-1.0-expected.gir b/gir/Everything-1.0-expected.gir
index e3b352d2..1dacddef 100644
--- a/gir/Everything-1.0-expected.gir
+++ b/gir/Everything-1.0-expected.gir
@@ -1093,6 +1093,16 @@ call and can be released on return.">
</parameter>
</parameters>
</function>
+ <function name="test_short" c:identifier="test_short">
+ <return-value transfer-ownership="none">
+ <type name="short" c:type="gshort"/>
+ </return-value>
+ <parameters>
+ <parameter name="in" transfer-ownership="none">
+ <type name="short" c:type="gshort"/>
+ </parameter>
+ </parameters>
+ </function>
<function name="test_simple_boxed_a_const_return"
c:identifier="test_simple_boxed_a_const_return">
<return-value transfer-ownership="none">
@@ -1252,6 +1262,16 @@ call and can be released on return.">
</parameter>
</parameters>
</function>
+ <function name="test_ushort" c:identifier="test_ushort">
+ <return-value transfer-ownership="none">
+ <type name="ushort" c:type="gushort"/>
+ </return-value>
+ <parameters>
+ <parameter name="in" transfer-ownership="none">
+ <type name="ushort" c:type="gushort"/>
+ </parameter>
+ </parameters>
+ </function>
<function name="test_utf8_const_in" c:identifier="test_utf8_const_in">
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
diff --git a/gir/everything.c b/gir/everything.c
index 8b0d0fb0..5e5bed80 100644
--- a/gir/everything.c
+++ b/gir/everything.c
@@ -47,6 +47,16 @@ guint64 test_uint64 (guint64 in)
return in;
}
+gshort test_short (gshort in)
+{
+ return in;
+}
+
+gushort test_ushort (gushort in)
+{
+ return in;
+}
+
gint test_int (gint in)
{
return in;
diff --git a/gir/everything.h b/gir/everything.h
index 2bbcf9e9..88f91f26 100644
--- a/gir/everything.h
+++ b/gir/everything.h
@@ -14,6 +14,8 @@ gint32 test_int32 (gint32 in);
guint32 test_uint32 (guint32 in);
gint64 test_int64 (gint64 in);
guint64 test_uint64 (guint64 in);
+gshort test_short (gshort in);
+gushort test_ushort (gushort in);
gint test_int (gint in);
guint test_uint (guint in);
glong test_long (glong in);
diff --git a/girepository/gfield.c b/girepository/gfield.c
index 4515bcf5..2fa98227 100644
--- a/girepository/gfield.c
+++ b/girepository/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;
diff --git a/girepository/ginfo.c b/girepository/ginfo.c
index d522a565..6fbd464f 100644
--- a/girepository/ginfo.c
+++ b/girepository/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;
diff --git a/girepository/girepository.c b/girepository/girepository.c
index a2a8504d..3e0d08d8 100644
--- a/girepository/girepository.c
+++ b/girepository/girepository.c
@@ -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:
diff --git a/girepository/girepository.h b/girepository/girepository.h
index a01c3ec3..559be1ee 100644
--- a/girepository/girepository.h
+++ b/girepository/girepository.h
@@ -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;
diff --git a/girepository/girffi.c b/girepository/girffi.c
index 4611a630..a001b7d7 100644
--- a/girepository/girffi.c
+++ b/girepository/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:
diff --git a/girepository/girnode.c b/girepository/girnode.c
index 01e83ace..e4f889a7 100644
--- a/girepository/girnode.c
+++ b/girepository/girnode.c
@@ -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);
diff --git a/girepository/girparser.c b/girepository/girparser.c
index e5f5e75a..9387d252 100644
--- a/girepository/girparser.c
+++ b/girepository/girparser.c
@@ -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 },
diff --git a/girepository/gtypelib.c b/girepository/gtypelib.c
index 64138aa0..4e26f1e4 100644
--- a/girepository/gtypelib.c
+++ b/girepository/gtypelib.c
@@ -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),
diff --git a/giscanner/ast.py b/giscanner/ast.py
index 0d1b9f3b..911cc2bc 100644
--- a/giscanner/ast.py
+++ b/giscanner/ast.py
@@ -36,6 +36,8 @@ TYPE_ANY = 'any'
TYPE_BOOLEAN = 'boolean'
TYPE_INT8 = 'int8'
TYPE_UINT8 = 'uint8'
+TYPE_SHORT = 'short'
+TYPE_USHORT = 'ushort'
TYPE_INT16 = 'int16'
TYPE_UINT16 = 'uint16'
TYPE_INT = 'int'
@@ -57,9 +59,10 @@ TYPE_FILENAME = 'filename'
BASIC_GIR_TYPES = [TYPE_BOOLEAN, TYPE_INT8, TYPE_UINT8, TYPE_INT16,
TYPE_UINT16, TYPE_INT32, TYPE_UINT32, TYPE_INT64,
- TYPE_UINT64, TYPE_INT, TYPE_UINT, TYPE_LONG,
- TYPE_ULONG, TYPE_SSIZET, TYPE_SIZET, TYPE_FLOAT,
- TYPE_DOUBLE, TYPE_TIMET, TYPE_GTYPE]
+ TYPE_UINT64, TYPE_SHORT, TYPE_USHORT, TYPE_INT,
+ TYPE_UINT, TYPE_LONG, TYPE_ULONG, TYPE_SSIZET,
+ TYPE_SIZET, TYPE_FLOAT, TYPE_DOUBLE, TYPE_TIMET,
+ TYPE_GTYPE]
GIR_TYPES = [TYPE_NONE, TYPE_ANY]
GIR_TYPES.extend(BASIC_GIR_TYPES)
GIR_TYPES.extend([TYPE_STRING, TYPE_FILENAME])
@@ -91,9 +94,9 @@ for name in GIR_TYPES:
type_names['char'] = TYPE_INT8
type_names['signed char'] = TYPE_INT8
type_names['unsigned char'] = TYPE_UINT8
-type_names['short'] = TYPE_INT16
-type_names['signed short'] = TYPE_INT16
-type_names['unsigned short'] = TYPE_UINT16
+type_names['short'] = TYPE_SHORT
+type_names['signed short'] = TYPE_SHORT
+type_names['unsigned short'] = TYPE_USHORT
type_names['int'] = TYPE_INT
type_names['signed int'] = TYPE_INT
type_names['signed'] = TYPE_INT
@@ -120,7 +123,7 @@ type_names['id'] = TYPE_ANY
# Suppress some GLib names
type_names['uchar'] = TYPE_UINT8
-type_names['ushort'] = TYPE_UINT16
+type_names['ushort'] = TYPE_USHORT
type_names['size'] = TYPE_SIZET
type_names['ssize'] = TYPE_SSIZET
type_names['pointer'] = TYPE_ANY
@@ -135,8 +138,9 @@ default_array_types['uint8*'] = TYPE_UINT8
default_array_types['utf8*'] = TYPE_STRING
# These types, when seen by reference, are interpreted as out parameters
-default_out_types = (TYPE_INT, TYPE_UINT, TYPE_LONG, TYPE_ULONG,
- TYPE_FLOAT, TYPE_DOUBLE, TYPE_SIZET, TYPE_SSIZET)
+default_out_types = (TYPE_SHORT, TYPE_USHORT, TYPE_INT, TYPE_UINT,
+ TYPE_LONG, TYPE_ULONG, TYPE_FLOAT, TYPE_DOUBLE,
+ TYPE_SIZET, TYPE_SSIZET)
def type_name_from_ctype(ctype):
diff --git a/giscanner/glibast.py b/giscanner/glibast.py
index e2a9d5b2..fb1ef208 100644
--- a/giscanner/glibast.py
+++ b/giscanner/glibast.py
@@ -22,10 +22,10 @@ from .ast import (Bitfield, Class, Enum, Interface, Member, Node,
Property, Struct, Union, Record)
from .ast import (
type_names, default_array_types,
- TYPE_STRING, TYPE_INT8, TYPE_UINT8, TYPE_INT16, TYPE_UINT16,
- TYPE_INT, TYPE_UINT, TYPE_UINT32, TYPE_INT32, TYPE_LONG,
- TYPE_ULONG, TYPE_INT64, TYPE_UINT64, TYPE_FLOAT,
- TYPE_DOUBLE, TYPE_BOOLEAN, TYPE_ANY, TYPE_SSIZET,
+ TYPE_STRING, TYPE_INT8, TYPE_UINT8, TYPE_SHORT, TYPE_USHORT,
+ TYPE_INT16, TYPE_UINT16, TYPE_INT, TYPE_UINT, TYPE_UINT32,
+ TYPE_INT32, TYPE_LONG, TYPE_ULONG, TYPE_INT64, TYPE_UINT64,
+ TYPE_FLOAT, TYPE_DOUBLE, TYPE_BOOLEAN, TYPE_ANY, TYPE_SSIZET,
TYPE_SIZET)
@@ -53,8 +53,8 @@ type_names['gsize'] = TYPE_SIZET
type_names['gssize'] = TYPE_SSIZET
type_names['gchar'] = TYPE_INT8
type_names['guchar'] = TYPE_UINT8
-type_names['gshort'] = TYPE_INT16
-type_names['gushort'] = TYPE_UINT16
+type_names['gshort'] = TYPE_SHORT
+type_names['gushort'] = TYPE_USHORT
# It's not very nice to duplicate the array types from ast.py,
# but a clean fix is hard without essentially hardcoding