summaryrefslogtreecommitdiff
path: root/girepository
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@sugarlabs.org>2010-04-30 18:15:23 +0200
committerTomeu Vizoso <tomeu@sugarlabs.org>2010-04-30 18:15:23 +0200
commit87291e08b0fd34b62e1ad9811c174108b38311a9 (patch)
tree1932336ef4767a30c57e0c8a4b6513d8f6888ccc /girepository
parent72f63c149132056655840e00c53119802f72a8bf (diff)
downloadgobject-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.c17
-rw-r--r--girepository/girepository.h8
-rw-r--r--girepository/girnode.c1
-rw-r--r--girepository/girnode.h1
-rw-r--r--girepository/girparser.c48
-rw-r--r--girepository/gtypelib.h8
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;