diff options
author | Tomeu Vizoso <tomeu@sugarlabs.org> | 2010-04-30 18:15:23 +0200 |
---|---|---|
committer | Tomeu Vizoso <tomeu@sugarlabs.org> | 2010-04-30 18:15:23 +0200 |
commit | 87291e08b0fd34b62e1ad9811c174108b38311a9 (patch) | |
tree | 1932336ef4767a30c57e0c8a4b6513d8f6888ccc /girepository | |
parent | 72f63c149132056655840e00c53119802f72a8bf (diff) | |
download | gobject-introspection-87291e08b0fd34b62e1ad9811c174108b38311a9.tar.gz |
Add support for GArrays: add g_type_info_get_array_type() and properly scan GArray args
Based on a previous patch by C. Scott Ananian <cscott@litl.com>
https://bugzilla.gnome.org/show_bug.cgi?id=581687
Diffstat (limited to 'girepository')
-rw-r--r-- | girepository/ginfo.c | 17 | ||||
-rw-r--r-- | girepository/girepository.h | 8 | ||||
-rw-r--r-- | girepository/girnode.c | 1 | ||||
-rw-r--r-- | girepository/girnode.h | 1 | ||||
-rw-r--r-- | girepository/girparser.c | 48 | ||||
-rw-r--r-- | girepository/gtypelib.h | 8 |
6 files changed, 67 insertions, 16 deletions
diff --git a/girepository/ginfo.c b/girepository/ginfo.c index 724109fe..1d56a22a 100644 --- a/girepository/ginfo.c +++ b/girepository/ginfo.c @@ -1093,6 +1093,23 @@ g_type_info_is_zero_terminated (GITypeInfo *info) return FALSE; } +GIArrayType +g_type_info_get_array_type (GITypeInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { + ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + g_return_val_if_fail (blob->tag == GI_TYPE_TAG_ARRAY, -1); + + return blob->array_type; + } + + return -1; +} + gint g_type_info_get_n_error_domains (GITypeInfo *info) { diff --git a/girepository/girepository.h b/girepository/girepository.h index cfa5b390..9e62ab15 100644 --- a/girepository/girepository.h +++ b/girepository/girepository.h @@ -383,6 +383,13 @@ typedef enum { * See docs/typelib-format.txt SimpleTypeBlob definition */ } GITypeTag; +typedef enum { + GI_ARRAY_TYPE_C, + GI_ARRAY_TYPE_ARRAY, + GI_ARRAY_TYPE_PTR_ARRAY, + GI_ARRAY_TYPE_BYTE_ARRAY +} GIArrayType; + #define G_TYPE_TAG_IS_BASIC(tag) (tag < GI_TYPE_TAG_ARRAY) const gchar* g_type_tag_to_string (GITypeTag type); @@ -395,6 +402,7 @@ GIBaseInfo * g_type_info_get_interface (GITypeInfo *info); gint g_type_info_get_array_length (GITypeInfo *info); gint g_type_info_get_array_fixed_size(GITypeInfo *info); gboolean g_type_info_is_zero_terminated (GITypeInfo *info); +GIArrayType g_type_info_get_array_type (GITypeInfo *info); gint g_type_info_get_n_error_domains (GITypeInfo *info); GIErrorDomainInfo *g_type_info_get_error_domain (GITypeInfo *info, diff --git a/girepository/girnode.c b/girepository/girnode.c index 1694406d..6f4a44af 100644 --- a/girepository/girnode.c +++ b/girepository/girnode.c @@ -1497,6 +1497,7 @@ g_ir_node_build_typelib (GIrNode *node, array->zero_terminated = type->zero_terminated; array->has_length = type->has_length; array->has_size = type->has_size; + array->array_type = type->array_type; array->reserved2 = 0; if (array->has_length) array->dimensions.length = type->length; diff --git a/girepository/girnode.h b/girepository/girnode.h index 7fe235b8..5e6cba03 100644 --- a/girepository/girnode.h +++ b/girepository/girnode.h @@ -138,6 +138,7 @@ struct _GIrNodeType gint length; gboolean has_size; gint size; + gint array_type; GIrNodeType *parameter_type1; GIrNodeType *parameter_type2; diff --git a/girepository/girparser.c b/girepository/girparser.c index 5b24604a..85f85e21 100644 --- a/girepository/girparser.c +++ b/girepository/girparser.c @@ -1717,22 +1717,40 @@ start_type (GMarkupParseContext *context, typenode->is_pointer = TRUE; typenode->is_array = TRUE; - zero = find_attribute ("zero-terminated", attribute_names, attribute_values); - len = find_attribute ("length", attribute_names, attribute_values); - size = find_attribute ("fixed-size", attribute_names, attribute_values); - - typenode->zero_terminated = !(zero && strcmp (zero, "1") != 0); - typenode->has_length = len != NULL; - typenode->length = typenode->has_length ? atoi (len) : -1; - - typenode->has_size = size != NULL; - typenode->size = typenode->has_size ? atoi (size) : -1; + ctype = find_attribute ("c:type", attribute_names, attribute_values); + if (g_str_has_prefix (ctype, "GArray")) { + typenode->array_type = GI_ARRAY_TYPE_ARRAY; + } else if (g_str_has_prefix (ctype, "GByteArray")) { + typenode->array_type = GI_ARRAY_TYPE_BYTE_ARRAY; + } else if (g_str_has_prefix (ctype, "GPtrArray")) { + typenode->array_type = GI_ARRAY_TYPE_PTR_ARRAY; + } else { + typenode->array_type = GI_ARRAY_TYPE_C; + } - if (zero) - typenode->zero_terminated = strcmp(zero, "1") == 0; - else - /* If neither zero-terminated nor length nor fixed-size is given, assume zero-terminated. */ - typenode->zero_terminated = !(typenode->has_length || typenode->has_size); + if (typenode->array_type == GI_ARRAY_TYPE_C) { + zero = find_attribute ("zero-terminated", attribute_names, attribute_values); + len = find_attribute ("length", attribute_names, attribute_values); + size = find_attribute ("fixed-size", attribute_names, attribute_values); + + typenode->has_length = len != NULL; + typenode->length = typenode->has_length ? atoi (len) : -1; + + typenode->has_size = size != NULL; + typenode->size = typenode->has_size ? atoi (size) : -1; + + if (zero) + typenode->zero_terminated = strcmp(zero, "1") == 0; + else + /* If neither zero-terminated nor length nor fixed-size is given, assume zero-terminated. */ + typenode->zero_terminated = !(typenode->has_length || typenode->has_size); + } else { + typenode->zero_terminated = FALSE; + typenode->has_length = FALSE; + typenode->length = -1; + typenode->has_size = FALSE; + typenode->size = -1; + } } else { diff --git a/girepository/gtypelib.h b/girepository/gtypelib.h index 14edc984..82080149 100644 --- a/girepository/gtypelib.h +++ b/girepository/gtypelib.h @@ -524,9 +524,14 @@ typedef struct { * of the array. If both has_length and zero_terminated are set, the * convention is to pass -1 for the length if the array is * zero-terminated. + * @has_size: Indicates that size is the fixed size of the array. + * @array_type: Indicates whether this is a C array, GArray, GPtrArray, or + * GByteArray. If something other than a C array, the length and element size + * are implicit in the structure. * @length: The index of the parameter which is used to pass the length of the * array. The parameter must be an integer type and have the same * direction as this one. + * @size: The fixed size of the array. * @type: The type of the array elements. * * Arrays are passed by reference, thus is_pointer is always 1. @@ -539,7 +544,8 @@ typedef struct { guint16 zero_terminated :1; guint16 has_length :1; guint16 has_size :1; - guint16 reserved2 :5; + guint16 array_type :2; + guint16 reserved2 :3; union { guint16 length; |