diff options
author | Tomeu Vizoso <tomeu@sugarlabs.org> | 2009-11-27 12:06:59 +0000 |
---|---|---|
committer | Tomeu Vizoso <tomeu@sugarlabs.org> | 2009-11-27 12:48:16 +0000 |
commit | ac80e64c9f7d257865aa820753e52d56cf2871c8 (patch) | |
tree | 3edd28b8fd14ff34fb0031f7d5e7b526f7a36639 /gi/pygi-argument.c | |
parent | 4a373b8ad6ec137e911b92a3e745e0fd76541292 (diff) | |
download | pygi-ac80e64c9f7d257865aa820753e52d56cf2871c8.tar.gz pygi-ac80e64c9f7d257865aa820753e52d56cf2871c8.tar.xz pygi-ac80e64c9f7d257865aa820753e52d56cf2871c8.zip |
Structs in arrays are not marshalled correctly
https://bugzilla.gnome.org/show_bug.cgi?id=602709
Diffstat (limited to 'gi/pygi-argument.c')
-rw-r--r-- | gi/pygi-argument.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c index 7f66b1f..8411b62 100644 --- a/gi/pygi-argument.c +++ b/gi/pygi-argument.c @@ -1480,8 +1480,9 @@ _pygi_argument_to_object (GArgument *arg, { GArray *array; GITypeInfo *item_type_info; + GITypeTag item_type_tag; GITransfer item_transfer; - gsize i; + gsize i, item_size; array = arg->v_pointer; @@ -1493,13 +1494,31 @@ _pygi_argument_to_object (GArgument *arg, item_type_info = g_type_info_get_param_type(type_info, 0); g_assert(item_type_info != NULL); + item_type_tag = g_type_info_get_tag(item_type_info); item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer; + item_size = g_array_get_element_size(array); for(i = 0; i < array->len; i++) { GArgument item; PyObject *py_item; + gboolean is_struct = FALSE; + + if (item_type_tag == GI_TYPE_TAG_INTERFACE) { + GIBaseInfo *iface_info = g_type_info_get_interface(item_type_info); + switch (g_base_info_get_type(iface_info)) { + case GI_INFO_TYPE_STRUCT: + case GI_INFO_TYPE_BOXED: + is_struct = TRUE; + } + g_base_info_unref((GIBaseInfo *)iface_info); + } + + if (is_struct) { + item.v_pointer = &_g_array_index(array, GArgument, i); + } else { + memcpy(&item, &_g_array_index(array, GArgument, i), item_size); + } - item = _g_array_index(array, GArgument, i); py_item = _pygi_argument_to_object(&item, item_type_info, item_transfer); if (py_item == NULL) { Py_CLEAR(object); @@ -1789,9 +1808,9 @@ _pygi_argument_release (GArgument *arg, /* Free the items */ for (i = 0; i < array->len; i++) { - GArgument item; - item = _g_array_index(array, GArgument, i); - _pygi_argument_release(&item, item_type_info, item_transfer, direction); + GArgument *item; + item = &_g_array_index(array, GArgument, i); + _pygi_argument_release(item, item_type_info, item_transfer, direction); } g_base_info_unref((GIBaseInfo *)item_type_info); |