diff options
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); |