summaryrefslogtreecommitdiffstats
path: root/gi/pygi-info.c
diff options
context:
space:
mode:
authorSimon van der Linden <svdlinden@src.gnome.org>2009-11-28 00:22:21 +0100
committerTomeu Vizoso <tomeu@sugarlabs.org>2009-11-30 11:43:23 +0000
commitcfa7d005487e17e8f7c1ceb14282d3a5baadb736 (patch)
treea3cd0bb5b0682087e5e584e7a9a2cfca2965a5dd /gi/pygi-info.c
parentd1ae73f3cf7cebdb74c9ec56b08928a2a53b9de6 (diff)
downloadpygi-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.c333
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;
}
}