diff -up pygobject-3.2.2/gi/pygi-argument.c.fix-argument-to-array pygobject-3.2.2/gi/pygi-argument.c
--- pygobject-3.2.2/gi/pygi-argument.c.fix-argument-to-array 2012-08-13 14:04:12.042265495 -0400
+++ pygobject-3.2.2/gi/pygi-argument.c 2012-08-13 14:05:39.579171131 -0400
@@ -31,6 +31,44 @@
#include <pyglib-python-compat.h>
#include <pyglib.h>
+static gboolean
+gi_argument_to_gssize (GIArgument *arg_in,
+ GITypeTag type_tag,
+ gssize *gssize_out)
+{
+ switch (type_tag) {
+ case GI_TYPE_TAG_INT8:
+ *gssize_out = arg_in->v_int8;
+ return TRUE;
+ case GI_TYPE_TAG_UINT8:
+ *gssize_out = arg_in->v_uint8;
+ return TRUE;
+ case GI_TYPE_TAG_INT16:
+ *gssize_out = arg_in->v_int16;
+ return TRUE;
+ case GI_TYPE_TAG_UINT16:
+ *gssize_out = arg_in->v_uint16;
+ return TRUE;
+ case GI_TYPE_TAG_INT32:
+ *gssize_out = arg_in->v_int32;
+ return TRUE;
+ case GI_TYPE_TAG_UINT32:
+ *gssize_out = arg_in->v_uint32;
+ return TRUE;
+ case GI_TYPE_TAG_INT64:
+ *gssize_out = arg_in->v_int64;
+ return TRUE;
+ case GI_TYPE_TAG_UINT64:
+ *gssize_out = arg_in->v_uint64;
+ return TRUE;
+ default:
+ PyErr_Format (PyExc_TypeError,
+ "Unable to marshal %s to gssize",
+ g_type_tag_to_string(type_tag));
+ return FALSE;
+ }
+}
+
void
_pygi_hash_pointer_to_arg (GIArgument *arg,
GITypeTag type_tag)
@@ -706,6 +744,7 @@ check_number_release:
GArray *
_pygi_argument_to_array (GIArgument *arg,
GIArgument *args[],
+ GICallableInfo *callable_info,
GITypeInfo *type_info,
gboolean is_method)
{
@@ -732,12 +771,20 @@ _pygi_argument_to_array (GIArgument *ar
length = g_type_info_get_array_fixed_size (type_info);
if (length < 0) {
gint length_arg_pos;
+ GIArgInfo *length_arg_info;
+ GITypeInfo *length_type_info;
length_arg_pos = g_type_info_get_array_length (type_info);
g_assert (length_arg_pos >= 0);
- /* FIXME: Take into account the type of the argument. */
- length = args[length_arg_pos]->v_int;
+ g_assert (callable_info);
+ length_arg_info = g_callable_info_get_arg(callable_info, length_arg_pos);
+ length_type_info = g_arg_info_get_type(length_arg_info);
+ if (!gi_argument_to_gssize (args[length_arg_pos],
+ g_type_info_get_tag(length_type_info),
+ &length)) {
+ return NULL;
+ }
}
}
diff -up pygobject-3.2.2/gi/pygi-argument.h.fix-argument-to-array pygobject-3.2.2/gi/pygi-argument.h
--- pygobject-3.2.2/gi/pygi-argument.h.fix-argument-to-array 2012-08-13 14:04:12.000000000 -0400
+++ pygobject-3.2.2/gi/pygi-argument.h 2012-08-13 14:05:57.652945179 -0400
@@ -50,6 +50,7 @@ gint _pygi_g_registered_type_info_check_
GArray* _pygi_argument_to_array (GIArgument *arg,
GIArgument *args[],
+ GICallableInfo *callable_info,
GITypeInfo *type_info,
gboolean is_method);
diff -up pygobject-3.2.2/gi/pygi-closure.c.fix-argument-to-array pygobject-3.2.2/gi/pygi-closure.c
diff -up pygobject-3.2.2/gi/pygi-info.c.fix-argument-to-array pygobject-3.2.2/gi/pygi-info.c
--- pygobject-3.2.2/gi/pygi-info.c.fix-argument-to-array 2012-05-14 12:49:12.000000000 -0400
+++ pygobject-3.2.2/gi/pygi-info.c 2012-08-13 14:06:37.788443416 -0400
@@ -1236,7 +1236,7 @@ _wrap_g_field_info_get_value (PyGIBaseIn
if ( (g_type_info_get_tag (field_type_info) == GI_TYPE_TAG_ARRAY) &&
(g_type_info_get_array_type (field_type_info) == GI_ARRAY_TYPE_C)) {
- value.v_pointer = _pygi_argument_to_array (&value, NULL,
+ value.v_pointer = _pygi_argument_to_array (&value, NULL, NULL,
field_type_info, FALSE);
}
diff -up pygobject-3.2.2/gi/pygi-signal-closure.c.fix-argument-to-array pygobject-3.2.2/gi/pygi-signal-closure.c