diff options
author | Simon van der Linden <svdlinden@src.gnome.org> | 2009-11-28 00:22:21 +0100 |
---|---|---|
committer | Tomeu Vizoso <tomeu@sugarlabs.org> | 2009-11-30 11:43:23 +0000 |
commit | cfa7d005487e17e8f7c1ceb14282d3a5baadb736 (patch) | |
tree | a3cd0bb5b0682087e5e584e7a9a2cfca2965a5dd /gi/pygi-info.c | |
parent | d1ae73f3cf7cebdb74c9ec56b08928a2a53b9de6 (diff) | |
download | pygi-cfa7d005487e17e8f7c1ceb14282d3a5baadb736.tar.gz pygi-cfa7d005487e17e8f7c1ceb14282d3a5baadb736.tar.xz pygi-cfa7d005487e17e8f7c1ceb14282d3a5baadb736.zip |
Remove global checks for pointers and move them in type cases that need them
Diffstat (limited to 'gi/pygi-info.c')
-rw-r--r-- | gi/pygi-info.c | 333 |
1 files changed, 172 insertions, 161 deletions
diff --git a/gi/pygi-info.c b/gi/pygi-info.c index 56aee16..11751a9 100644 --- a/gi/pygi-info.c +++ b/gi/pygi-info.c @@ -379,101 +379,108 @@ gsize _pygi_g_type_info_size (GITypeInfo *type_info) { gsize size = 0; - gboolean is_pointer; - is_pointer = g_type_info_is_pointer(type_info); + GITypeTag type_tag; - if (is_pointer) { - size = sizeof(gpointer); - } else { - GITypeTag type_tag; - - type_tag = g_type_info_get_tag(type_info); - switch(type_tag) { - case GI_TYPE_TAG_BOOLEAN: - case GI_TYPE_TAG_INT8: - case GI_TYPE_TAG_UINT8: - case GI_TYPE_TAG_INT16: - case GI_TYPE_TAG_UINT16: - case GI_TYPE_TAG_INT32: - case GI_TYPE_TAG_UINT32: - case GI_TYPE_TAG_INT64: - case GI_TYPE_TAG_UINT64: - case GI_TYPE_TAG_SHORT: - case GI_TYPE_TAG_USHORT: - case GI_TYPE_TAG_INT: - case GI_TYPE_TAG_UINT: - case GI_TYPE_TAG_LONG: - case GI_TYPE_TAG_ULONG: - case GI_TYPE_TAG_SIZE: - case GI_TYPE_TAG_SSIZE: - case GI_TYPE_TAG_FLOAT: - case GI_TYPE_TAG_DOUBLE: - case GI_TYPE_TAG_TIME_T: - case GI_TYPE_TAG_GTYPE: + type_tag = g_type_info_get_tag(type_info); + switch(type_tag) { + case GI_TYPE_TAG_BOOLEAN: + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + case GI_TYPE_TAG_SHORT: + case GI_TYPE_TAG_USHORT: + case GI_TYPE_TAG_INT: + case GI_TYPE_TAG_UINT: + case GI_TYPE_TAG_LONG: + case GI_TYPE_TAG_ULONG: + case GI_TYPE_TAG_SIZE: + case GI_TYPE_TAG_SSIZE: + case GI_TYPE_TAG_FLOAT: + case GI_TYPE_TAG_DOUBLE: + case GI_TYPE_TAG_TIME_T: + case GI_TYPE_TAG_GTYPE: + if (g_type_info_is_pointer(type_info)) { + size = sizeof(gpointer); + } else { size = _pygi_g_type_tag_size(type_tag); g_assert(size > 0); - break; - case GI_TYPE_TAG_INTERFACE: - { - GIBaseInfo *info; - GIInfoType info_type; + } + break; + case GI_TYPE_TAG_INTERFACE: + { + GIBaseInfo *info; + GIInfoType info_type; - info = g_type_info_get_interface(type_info); - info_type = g_base_info_get_type(info); + info = g_type_info_get_interface(type_info); + info_type = g_base_info_get_type(info); - switch (info_type) { - case GI_INFO_TYPE_STRUCT: + switch (info_type) { + case GI_INFO_TYPE_STRUCT: + if (g_type_info_is_pointer(type_info)) { + size = sizeof(gpointer); + } else { size = g_struct_info_get_size((GIStructInfo *)info); - break; - case GI_INFO_TYPE_UNION: + } + break; + case GI_INFO_TYPE_UNION: + if (g_type_info_is_pointer(type_info)) { + size = sizeof(gpointer); + } else { size = g_union_info_get_size((GIUnionInfo *)info); - break; - case GI_INFO_TYPE_ENUM: - case GI_INFO_TYPE_FLAGS: - { + } + break; + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: + if (g_type_info_is_pointer(type_info)) { + size = sizeof(gpointer); + } else { GITypeTag type_tag; type_tag = g_enum_info_get_storage_type((GIEnumInfo *)info); size = _pygi_g_type_tag_size(type_tag); - break; } - case GI_INFO_TYPE_BOXED: - case GI_INFO_TYPE_OBJECT: - case GI_INFO_TYPE_INTERFACE: - case GI_INFO_TYPE_CALLBACK: - /* Should have been catched by is_pointer above. */ - case GI_INFO_TYPE_VFUNC: - case GI_INFO_TYPE_INVALID: - case GI_INFO_TYPE_FUNCTION: - case GI_INFO_TYPE_CONSTANT: - case GI_INFO_TYPE_ERROR_DOMAIN: - case GI_INFO_TYPE_VALUE: - case GI_INFO_TYPE_SIGNAL: - case GI_INFO_TYPE_PROPERTY: - case GI_INFO_TYPE_FIELD: - case GI_INFO_TYPE_ARG: - case GI_INFO_TYPE_TYPE: - case GI_INFO_TYPE_UNRESOLVED: - g_assert_not_reached(); - break; - } - - g_base_info_unref(info); - break; + break; + case GI_INFO_TYPE_BOXED: + case GI_INFO_TYPE_OBJECT: + case GI_INFO_TYPE_INTERFACE: + case GI_INFO_TYPE_CALLBACK: + size = sizeof(gpointer); + break; + case GI_INFO_TYPE_VFUNC: + case GI_INFO_TYPE_INVALID: + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CONSTANT: + case GI_INFO_TYPE_ERROR_DOMAIN: + case GI_INFO_TYPE_VALUE: + case GI_INFO_TYPE_SIGNAL: + case GI_INFO_TYPE_PROPERTY: + case GI_INFO_TYPE_FIELD: + case GI_INFO_TYPE_ARG: + case GI_INFO_TYPE_TYPE: + case GI_INFO_TYPE_UNRESOLVED: + g_assert_not_reached(); + break; } - case GI_TYPE_TAG_ARRAY: - case GI_TYPE_TAG_VOID: - case GI_TYPE_TAG_UTF8: - case GI_TYPE_TAG_FILENAME: - case GI_TYPE_TAG_GLIST: - case GI_TYPE_TAG_GSLIST: - case GI_TYPE_TAG_GHASH: - case GI_TYPE_TAG_ERROR: - /* Should have been catched by is_pointer above. */ - g_assert_not_reached(); - break; + + g_base_info_unref(info); + break; } + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_VOID: + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + case GI_TYPE_TAG_ERROR: + size = sizeof(gpointer); + break; } return size; @@ -1335,95 +1342,99 @@ pygi_g_struct_info_is_simple (GIStructInfo *struct_info) for (i = 0; i < n_field_infos && is_simple; i++) { GIFieldInfo *field_info; GITypeInfo *field_type_info; - gboolean is_pointer; field_info = g_struct_info_get_field(struct_info, i); field_type_info = g_field_info_get_type(field_info); - is_pointer = g_type_info_is_pointer(field_type_info); - - if (is_pointer) { - is_simple = FALSE; - } else { - GITypeTag field_type_tag; - - field_type_tag = g_type_info_get_tag(field_type_info); - - switch (field_type_tag) { - case GI_TYPE_TAG_BOOLEAN: - case GI_TYPE_TAG_INT8: - case GI_TYPE_TAG_UINT8: - case GI_TYPE_TAG_INT16: - case GI_TYPE_TAG_UINT16: - case GI_TYPE_TAG_INT32: - case GI_TYPE_TAG_UINT32: - case GI_TYPE_TAG_SHORT: - case GI_TYPE_TAG_USHORT: - case GI_TYPE_TAG_INT: - case GI_TYPE_TAG_UINT: - case GI_TYPE_TAG_INT64: - case GI_TYPE_TAG_UINT64: - case GI_TYPE_TAG_LONG: - case GI_TYPE_TAG_ULONG: - case GI_TYPE_TAG_SSIZE: - case GI_TYPE_TAG_SIZE: - case GI_TYPE_TAG_FLOAT: - case GI_TYPE_TAG_DOUBLE: - case GI_TYPE_TAG_TIME_T: - break; - case GI_TYPE_TAG_VOID: - case GI_TYPE_TAG_GTYPE: - case GI_TYPE_TAG_ERROR: - case GI_TYPE_TAG_UTF8: - case GI_TYPE_TAG_FILENAME: - case GI_TYPE_TAG_ARRAY: - case GI_TYPE_TAG_GLIST: - case GI_TYPE_TAG_GSLIST: - case GI_TYPE_TAG_GHASH: - /* Should have been catched by is_pointer above. */ - g_assert_not_reached(); - break; - case GI_TYPE_TAG_INTERFACE: - { - GIBaseInfo *info; - GIInfoType info_type; - info = g_type_info_get_interface(field_type_info); - info_type = g_base_info_get_type(info); + GITypeTag field_type_tag; - switch (info_type) { - case GI_INFO_TYPE_BOXED: - case GI_INFO_TYPE_STRUCT: - is_simple = pygi_g_struct_info_is_simple((GIStructInfo *)info); - break; - case GI_INFO_TYPE_UNION: - /* TODO */ + field_type_tag = g_type_info_get_tag(field_type_info); + + switch (field_type_tag) { + case GI_TYPE_TAG_BOOLEAN: + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_SHORT: + case GI_TYPE_TAG_USHORT: + case GI_TYPE_TAG_INT: + case GI_TYPE_TAG_UINT: + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + case GI_TYPE_TAG_LONG: + case GI_TYPE_TAG_ULONG: + case GI_TYPE_TAG_SSIZE: + case GI_TYPE_TAG_SIZE: + case GI_TYPE_TAG_FLOAT: + case GI_TYPE_TAG_DOUBLE: + case GI_TYPE_TAG_TIME_T: + if (g_type_info_is_pointer(field_type_info)) { + is_simple = FALSE; + } + break; + case GI_TYPE_TAG_VOID: + case GI_TYPE_TAG_GTYPE: + case GI_TYPE_TAG_ERROR: + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + is_simple = FALSE; + break; + case GI_TYPE_TAG_INTERFACE: + { + GIBaseInfo *info; + GIInfoType info_type; + + info = g_type_info_get_interface(field_type_info); + info_type = g_base_info_get_type(info); + + switch (info_type) { + case GI_INFO_TYPE_STRUCT: + if (g_type_info_is_pointer(field_type_info)) { is_simple = FALSE; - break; - case GI_INFO_TYPE_ENUM: - case GI_INFO_TYPE_FLAGS: - break; - case GI_INFO_TYPE_OBJECT: - case GI_INFO_TYPE_VFUNC: - case GI_INFO_TYPE_CALLBACK: - case GI_INFO_TYPE_INVALID: - case GI_INFO_TYPE_INTERFACE: - case GI_INFO_TYPE_FUNCTION: - case GI_INFO_TYPE_CONSTANT: - case GI_INFO_TYPE_ERROR_DOMAIN: - case GI_INFO_TYPE_VALUE: - case GI_INFO_TYPE_SIGNAL: - case GI_INFO_TYPE_PROPERTY: - case GI_INFO_TYPE_FIELD: - case GI_INFO_TYPE_ARG: - case GI_INFO_TYPE_TYPE: - case GI_INFO_TYPE_UNRESOLVED: + } else { + is_simple = pygi_g_struct_info_is_simple((GIStructInfo *)info); + } + break; + case GI_INFO_TYPE_UNION: + /* TODO */ + is_simple = FALSE; + break; + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: + if (g_type_info_is_pointer(field_type_info)) { is_simple = FALSE; - break; - } + } + break; + case GI_INFO_TYPE_BOXED: + case GI_INFO_TYPE_OBJECT: + case GI_INFO_TYPE_CALLBACK: + case GI_INFO_TYPE_INTERFACE: + is_simple = FALSE; + break; + case GI_INFO_TYPE_VFUNC: + case GI_INFO_TYPE_INVALID: + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CONSTANT: + case GI_INFO_TYPE_ERROR_DOMAIN: + case GI_INFO_TYPE_VALUE: + case GI_INFO_TYPE_SIGNAL: + case GI_INFO_TYPE_PROPERTY: + case GI_INFO_TYPE_FIELD: + case GI_INFO_TYPE_ARG: + case GI_INFO_TYPE_TYPE: + case GI_INFO_TYPE_UNRESOLVED: + g_assert_not_reached(); + } - g_base_info_unref(info); - break; - } + g_base_info_unref(info); + break; } } |