[gobject-introspection] Bug 584423 – Add short/ushort support



commit 7048d711b2787af81767bb472f5dbaf0f97d6db9
Author: Mark Lee <marklee src gnome org>
Date:   Fri Jun 19 16:53:03 2009 -0700

    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>

 gir/Everything-1.0-expected.gir |   20 +++++++++++++++++++
 gir/everything.c                |   10 +++++++++
 gir/everything.h                |    2 +
 girepository/gfield.c           |    8 +++++++
 girepository/ginfo.c            |    6 +++++
 girepository/girepository.c     |    4 +++
 girepository/girepository.h     |   40 +++++++++++++++++++++-----------------
 girepository/girffi.c           |    4 +++
 girepository/girnode.c          |    8 +++++++
 girepository/girparser.c        |    2 +
 girepository/gtypelib.c         |    2 +
 giscanner/ast.py                |   22 ++++++++++++--------
 giscanner/glibast.py            |   12 +++++-----
 13 files changed, 107 insertions(+), 33 deletions(-)
---
diff --git a/gir/Everything-1.0-expected.gir b/gir/Everything-1.0-expected.gir
index e3b352d..1dacdde 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 8b0d0fb..5e5bed8 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 2bbcf9e..88f91f2 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 4515bcf..2fa9822 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 d522a56..6fbd464 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 a2a8504..3e0d08d 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 a01c3ec..559be1e 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 4611a63..a001b7d 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 01e83ac..e4f889a 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 e5f5e75..9387d25 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 64138aa..4e26f1e 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 0d1b9f3..911cc2b 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 e2a9d5b..fb1ef20 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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]