1 /* -*- Mode: C; c-basic-offset: 4 -*-
2 * vim: tabstop=4 shiftwidth=4 expandtab
4 * Copyright (C) 2005-2009 Johan Dahlin <johan@gnome.org>
6 * pygi-argument.c: GIArgument - PyObject conversion functions.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
24 #include "pygi-private.h"
30 #include <pygobject.h>
31 #include <pyglib-python-compat.h>
35 gi_argument_to_gssize (GIArgument *arg_in,
40 case GI_TYPE_TAG_INT8:
41 *gssize_out = arg_in->v_int8;
43 case GI_TYPE_TAG_UINT8:
44 *gssize_out = arg_in->v_uint8;
46 case GI_TYPE_TAG_INT16:
47 *gssize_out = arg_in->v_int16;
49 case GI_TYPE_TAG_UINT16:
50 *gssize_out = arg_in->v_uint16;
52 case GI_TYPE_TAG_INT32:
53 *gssize_out = arg_in->v_int32;
55 case GI_TYPE_TAG_UINT32:
56 *gssize_out = arg_in->v_uint32;
58 case GI_TYPE_TAG_INT64:
59 *gssize_out = arg_in->v_int64;
61 case GI_TYPE_TAG_UINT64:
62 *gssize_out = arg_in->v_uint64;
65 PyErr_Format (PyExc_TypeError,
66 "Unable to marshal %s to gssize",
67 g_type_tag_to_string(type_tag));
73 _pygi_hash_pointer_to_arg (GIArgument *arg,
77 case GI_TYPE_TAG_INT8:
78 arg->v_int8 = GPOINTER_TO_INT (arg->v_pointer);
80 case GI_TYPE_TAG_INT16:
81 arg->v_int16 = GPOINTER_TO_INT (arg->v_pointer);
83 case GI_TYPE_TAG_INT32:
84 arg->v_int32 = GPOINTER_TO_INT (arg->v_pointer);
86 case GI_TYPE_TAG_UINT8:
87 arg->v_uint8 = GPOINTER_TO_UINT (arg->v_pointer);
89 case GI_TYPE_TAG_UINT16:
90 arg->v_uint16 = GPOINTER_TO_UINT (arg->v_pointer);
92 case GI_TYPE_TAG_UINT32:
93 arg->v_uint32 = GPOINTER_TO_UINT (arg->v_pointer);
95 case GI_TYPE_TAG_UTF8:
96 case GI_TYPE_TAG_FILENAME:
97 case GI_TYPE_TAG_INTERFACE:
100 g_critical ("Unsupported type %s", g_type_tag_to_string(type_tag));
105 _pygi_arg_to_hash_pointer (const GIArgument *arg,
109 case GI_TYPE_TAG_INT8:
110 return GINT_TO_POINTER (arg->v_int8);
111 case GI_TYPE_TAG_UINT8:
112 return GINT_TO_POINTER (arg->v_uint8);
113 case GI_TYPE_TAG_INT16:
114 return GINT_TO_POINTER (arg->v_int16);
115 case GI_TYPE_TAG_UINT16:
116 return GINT_TO_POINTER (arg->v_uint16);
117 case GI_TYPE_TAG_INT32:
118 return GINT_TO_POINTER (arg->v_int32);
119 case GI_TYPE_TAG_UINT32:
120 return GINT_TO_POINTER (arg->v_uint32);
121 case GI_TYPE_TAG_UTF8:
122 case GI_TYPE_TAG_FILENAME:
123 case GI_TYPE_TAG_INTERFACE:
124 return arg->v_pointer;
126 g_critical ("Unsupported type %s", g_type_tag_to_string(type_tag));
127 return arg->v_pointer;
132 _pygi_g_type_tag_py_bounds (GITypeTag type_tag,
137 case GI_TYPE_TAG_INT8:
138 *lower = PYGLIB_PyLong_FromLong (-128);
139 *upper = PYGLIB_PyLong_FromLong (127);
141 case GI_TYPE_TAG_UINT8:
142 *upper = PYGLIB_PyLong_FromLong (255);
143 *lower = PYGLIB_PyLong_FromLong (0);
145 case GI_TYPE_TAG_INT16:
146 *lower = PYGLIB_PyLong_FromLong (-32768);
147 *upper = PYGLIB_PyLong_FromLong (32767);
149 case GI_TYPE_TAG_UINT16:
150 *upper = PYGLIB_PyLong_FromLong (65535);
151 *lower = PYGLIB_PyLong_FromLong (0);
153 case GI_TYPE_TAG_INT32:
154 *lower = PYGLIB_PyLong_FromLong (G_MININT32);
155 *upper = PYGLIB_PyLong_FromLong (G_MAXINT32);
157 case GI_TYPE_TAG_UINT32:
158 /* Note: On 32-bit archs, this number doesn't fit in a long. */
159 *upper = PyLong_FromLongLong (G_MAXUINT32);
160 *lower = PYGLIB_PyLong_FromLong (0);
162 case GI_TYPE_TAG_INT64:
163 /* Note: On 32-bit archs, these numbers don't fit in a long. */
164 *lower = PyLong_FromLongLong (G_MININT64);
165 *upper = PyLong_FromLongLong (G_MAXINT64);
167 case GI_TYPE_TAG_UINT64:
168 *upper = PyLong_FromUnsignedLongLong (G_MAXUINT64);
169 *lower = PYGLIB_PyLong_FromLong (0);
171 case GI_TYPE_TAG_FLOAT:
172 *upper = PyFloat_FromDouble (G_MAXFLOAT);
173 *lower = PyFloat_FromDouble (-G_MAXFLOAT);
175 case GI_TYPE_TAG_DOUBLE:
176 *upper = PyFloat_FromDouble (G_MAXDOUBLE);
177 *lower = PyFloat_FromDouble (-G_MAXDOUBLE);
180 PyErr_SetString (PyExc_TypeError, "Non-numeric type tag");
181 *lower = *upper = NULL;
187 _pygi_g_registered_type_info_check_object (GIRegisteredTypeInfo *info,
188 gboolean is_instance,
195 gchar *type_name_expected = NULL;
196 GIInfoType interface_type;
198 interface_type = g_base_info_get_type (info);
199 if ( (interface_type == GI_INFO_TYPE_STRUCT) &&
200 (g_struct_info_is_foreign ( (GIStructInfo*) info))) {
201 /* TODO: Could we check is the correct foreign type? */
205 g_type = g_registered_type_info_get_g_type (info);
206 if (g_type != G_TYPE_NONE) {
207 py_type = _pygi_type_get_from_g_type (g_type);
209 py_type = _pygi_type_import_by_gi_info ( (GIBaseInfo *) info);
212 if (py_type == NULL) {
216 g_assert (PyType_Check (py_type));
219 retval = PyObject_IsInstance (object, py_type);
221 type_name_expected = _pygi_g_base_info_get_fullname (
222 (GIBaseInfo *) info);
225 if (!PyObject_Type (py_type)) {
226 type_name_expected = "type";
228 } else if (!PyType_IsSubtype ( (PyTypeObject *) object,
229 (PyTypeObject *) py_type)) {
230 type_name_expected = _pygi_g_base_info_get_fullname (
231 (GIBaseInfo *) info);
241 PyTypeObject *object_type;
243 if (type_name_expected == NULL) {
247 object_type = (PyTypeObject *) PyObject_Type (object);
248 if (object_type == NULL) {
252 PyErr_Format (PyExc_TypeError, "Must be %s, not %s",
253 type_name_expected, object_type->tp_name);
255 g_free (type_name_expected);
262 _pygi_g_type_interface_check_object (GIBaseInfo *info,
266 GIInfoType info_type;
268 info_type = g_base_info_get_type (info);
270 case GI_INFO_TYPE_CALLBACK:
271 if (!PyCallable_Check (object)) {
272 PyErr_Format (PyExc_TypeError, "Must be callable, not %s",
273 object->ob_type->tp_name);
277 case GI_INFO_TYPE_ENUM:
279 if (PyNumber_Check (object)) {
280 PyObject *number = PYGLIB_PyNumber_Long (object);
284 glong value = PYGLIB_PyLong_AsLong (number);
286 for (i = 0; i < g_enum_info_get_n_values (info); i++) {
287 GIValueInfo *value_info = g_enum_info_get_value (info, i);
288 glong enum_value = g_value_info_get_value (value_info);
289 g_base_info_unref (value_info);
290 if (value == enum_value) {
298 retval = _pygi_g_registered_type_info_check_object (
299 (GIRegisteredTypeInfo *) info, TRUE, object);
301 case GI_INFO_TYPE_FLAGS:
302 if (PyNumber_Check (object)) {
303 /* Accept 0 as a valid flag value */
304 PyObject *number = PYGLIB_PyNumber_Long (object);
308 long value = PYGLIB_PyLong_AsLong (number);
311 else if (value == -1)
315 retval = _pygi_g_registered_type_info_check_object (
316 (GIRegisteredTypeInfo *) info, TRUE, object);
318 case GI_INFO_TYPE_STRUCT:
322 /* Handle special cases. */
323 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
324 if (g_type_is_a (type, G_TYPE_CLOSURE)) {
325 if (!(PyCallable_Check (object) ||
326 pyg_type_from_object_strict (object, FALSE) == G_TYPE_CLOSURE)) {
327 PyErr_Format (PyExc_TypeError, "Must be callable, not %s",
328 object->ob_type->tp_name);
332 } else if (g_type_is_a (type, G_TYPE_VALUE)) {
333 /* we can't check g_values because we don't have
334 * enough context so just pass them through */
340 case GI_INFO_TYPE_BOXED:
341 case GI_INFO_TYPE_INTERFACE:
342 case GI_INFO_TYPE_OBJECT:
343 retval = _pygi_g_registered_type_info_check_object ( (GIRegisteredTypeInfo *) info, TRUE, object);
345 case GI_INFO_TYPE_UNION:
348 retval = _pygi_g_registered_type_info_check_object ( (GIRegisteredTypeInfo *) info, TRUE, object);
350 /* If not the same type then check to see if the object's type
351 * is the same as one of the union's members
357 n_fields = g_union_info_get_n_fields ( (GIUnionInfo *) info);
359 for (i = 0; i < n_fields; i++) {
361 GIFieldInfo *field_info;
362 GITypeInfo *field_type_info;
365 g_union_info_get_field ( (GIUnionInfo *) info, i);
366 field_type_info = g_field_info_get_type (field_info);
368 member_retval = _pygi_g_type_info_check_object(
373 g_base_info_unref ( ( GIBaseInfo *) field_type_info);
374 g_base_info_unref ( ( GIBaseInfo *) field_info);
376 if (member_retval == 1) {
377 retval = member_retval;
385 g_assert_not_reached();
392 _pygi_g_type_info_check_object (GITypeInfo *type_info,
399 if (allow_none && object == Py_None) {
403 type_tag = g_type_info_get_tag (type_info);
406 case GI_TYPE_TAG_VOID:
407 /* No check; VOID means undefined type */
409 case GI_TYPE_TAG_BOOLEAN:
410 /* No check; every Python object has a truth value. */
412 case GI_TYPE_TAG_UINT8:
413 /* UINT8 types can be characters */
414 if (PYGLIB_PyBytes_Check(object)) {
415 if (PYGLIB_PyBytes_Size(object) != 1) {
416 PyErr_Format (PyExc_TypeError, "Must be a single character");
423 case GI_TYPE_TAG_INT8:
424 case GI_TYPE_TAG_INT16:
425 case GI_TYPE_TAG_UINT16:
426 case GI_TYPE_TAG_INT32:
427 case GI_TYPE_TAG_UINT32:
428 case GI_TYPE_TAG_INT64:
429 case GI_TYPE_TAG_UINT64:
430 case GI_TYPE_TAG_FLOAT:
431 case GI_TYPE_TAG_DOUBLE:
433 PyObject *number, *lower, *upper;
435 if (!PyNumber_Check (object)) {
436 PyErr_Format (PyExc_TypeError, "Must be number, not %s",
437 object->ob_type->tp_name);
442 if (type_tag == GI_TYPE_TAG_FLOAT || type_tag == GI_TYPE_TAG_DOUBLE) {
443 number = PyNumber_Float (object);
445 number = PYGLIB_PyNumber_Long (object);
448 _pygi_g_type_tag_py_bounds (type_tag, &lower, &upper);
450 if (lower == NULL || upper == NULL || number == NULL) {
452 goto check_number_release;
456 if (PyObject_RichCompareBool (lower, number, Py_GT)
457 || PyObject_RichCompareBool (upper, number, Py_LT)) {
461 if (PyErr_Occurred()) {
463 goto check_number_release;
466 lower_str = PyObject_Str (lower);
467 upper_str = PyObject_Str (upper);
468 if (lower_str == NULL || upper_str == NULL) {
470 goto check_number_error_release;
473 #if PY_VERSION_HEX < 0x03000000
474 PyErr_Format (PyExc_ValueError, "Must range from %s to %s",
475 PyString_AS_STRING (lower_str),
476 PyString_AS_STRING (upper_str));
479 PyObject *lower_pybytes_obj = PyUnicode_AsUTF8String (lower_str);
480 if (!lower_pybytes_obj)
483 PyObject *upper_pybytes_obj = PyUnicode_AsUTF8String (upper_str);
484 if (!upper_pybytes_obj) {
485 Py_DECREF(lower_pybytes_obj);
489 PyErr_Format (PyExc_ValueError, "Must range from %s to %s",
490 PyBytes_AsString (lower_pybytes_obj),
491 PyBytes_AsString (upper_pybytes_obj));
492 Py_DECREF (lower_pybytes_obj);
493 Py_DECREF (upper_pybytes_obj);
499 check_number_error_release:
500 Py_XDECREF (lower_str);
501 Py_XDECREF (upper_str);
504 check_number_release:
510 case GI_TYPE_TAG_GTYPE:
512 if (pyg_type_from_object (object) == 0) {
513 PyErr_Format (PyExc_TypeError, "Must be gobject.GType, not %s",
514 object->ob_type->tp_name);
519 case GI_TYPE_TAG_UNICHAR:
522 if (PyUnicode_Check (object)) {
523 size = PyUnicode_GET_SIZE (object);
524 #if PY_VERSION_HEX < 0x03000000
525 } else if (PyString_Check (object)) {
526 PyObject *pyuni = PyUnicode_FromEncodedObject (object, "UTF-8", "strict");
527 size = PyUnicode_GET_SIZE (pyuni);
531 PyErr_Format (PyExc_TypeError, "Must be string, not %s",
532 object->ob_type->tp_name);
538 PyErr_Format (PyExc_TypeError, "Must be a one character string, not %" G_GINT64_FORMAT " characters",
546 case GI_TYPE_TAG_UTF8:
547 case GI_TYPE_TAG_FILENAME:
548 if (!PYGLIB_PyBaseString_Check (object) ) {
549 PyErr_Format (PyExc_TypeError, "Must be string, not %s",
550 object->ob_type->tp_name);
554 case GI_TYPE_TAG_ARRAY:
558 GITypeInfo *item_type_info;
561 if (!PySequence_Check (object)) {
562 PyErr_Format (PyExc_TypeError, "Must be sequence, not %s",
563 object->ob_type->tp_name);
568 length = PySequence_Length (object);
574 fixed_size = g_type_info_get_array_fixed_size (type_info);
575 if (fixed_size >= 0 && length != fixed_size) {
576 PyErr_Format (PyExc_ValueError, "Must contain %zd items, not %zd",
582 item_type_info = g_type_info_get_param_type (type_info, 0);
583 g_assert (item_type_info != NULL);
585 /* FIXME: This is insain. We really should only check the first
586 * object and perhaps have a debugging mode. Large arrays
587 * will cause apps to slow to a crawl.
589 for (i = 0; i < length; i++) {
592 item = PySequence_GetItem (object, i);
598 retval = _pygi_g_type_info_check_object (item_type_info, item, TRUE);
606 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
611 g_base_info_unref ( (GIBaseInfo *) item_type_info);
615 case GI_TYPE_TAG_INTERFACE:
619 info = g_type_info_get_interface (type_info);
620 g_assert (info != NULL);
622 retval = _pygi_g_type_interface_check_object(info, object);
624 g_base_info_unref (info);
627 case GI_TYPE_TAG_GLIST:
628 case GI_TYPE_TAG_GSLIST:
631 GITypeInfo *item_type_info;
634 if (!PySequence_Check (object)) {
635 PyErr_Format (PyExc_TypeError, "Must be sequence, not %s",
636 object->ob_type->tp_name);
641 length = PySequence_Length (object);
647 item_type_info = g_type_info_get_param_type (type_info, 0);
648 g_assert (item_type_info != NULL);
650 for (i = 0; i < length; i++) {
653 item = PySequence_GetItem (object, i);
659 retval = _pygi_g_type_info_check_object (item_type_info, item, TRUE);
667 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
672 g_base_info_unref ( (GIBaseInfo *) item_type_info);
675 case GI_TYPE_TAG_GHASH:
680 GITypeInfo *key_type_info;
681 GITypeInfo *value_type_info;
684 keys = PyMapping_Keys (object);
686 PyErr_Format (PyExc_TypeError, "Must be mapping, not %s",
687 object->ob_type->tp_name);
692 length = PyMapping_Length (object);
699 values = PyMapping_Values (object);
700 if (values == NULL) {
706 key_type_info = g_type_info_get_param_type (type_info, 0);
707 g_assert (key_type_info != NULL);
709 value_type_info = g_type_info_get_param_type (type_info, 1);
710 g_assert (value_type_info != NULL);
712 for (i = 0; i < length; i++) {
716 key = PyList_GET_ITEM (keys, i);
717 value = PyList_GET_ITEM (values, i);
719 retval = _pygi_g_type_info_check_object (key_type_info, key, TRUE);
724 _PyGI_ERROR_PREFIX ("Key %zd :", i);
728 retval = _pygi_g_type_info_check_object (value_type_info, value, TRUE);
733 _PyGI_ERROR_PREFIX ("Value %zd :", i);
738 g_base_info_unref ( (GIBaseInfo *) key_type_info);
739 g_base_info_unref ( (GIBaseInfo *) value_type_info);
744 case GI_TYPE_TAG_ERROR:
745 PyErr_SetString (PyExc_NotImplementedError, "Error marshalling is not supported yet");
754 * _pygi_argument_to_array
755 * @arg: The argument to convert
756 * @args: Arguments to method invocation, possibly contaning the array length.
757 * Set to NULL if this is not for a method call
758 * @callable_info: Info on the callable, if this a method call; otherwise NULL
759 * @type_info: The type info for @arg
760 * @out_free_array: A return location for a gboolean that indicates whether
761 * or not the wrapped GArray should be freed
763 * Make sure an array type argument is wrapped in a GArray.
765 * Note: This method can *not* be folded into _pygi_argument_to_object() because
766 * arrays are special in the sense that they might require access to @args in
767 * order to get the length.
769 * Returns: A GArray wrapping @arg. If @out_free_array has been set to TRUE then
770 * free the array with g_array_free() without freeing the data members.
771 * Otherwise don't free the array.
774 _pygi_argument_to_array (GIArgument *arg,
776 GICallableInfo *callable_info,
777 GITypeInfo *type_info,
778 gboolean *out_free_array)
780 GITypeInfo *item_type_info;
781 gboolean is_zero_terminated;
786 g_return_val_if_fail (g_type_info_get_tag (type_info) == GI_TYPE_TAG_ARRAY, NULL);
788 if (arg->v_pointer == NULL) {
792 switch (g_type_info_get_array_type (type_info)) {
793 case GI_ARRAY_TYPE_C:
794 is_zero_terminated = g_type_info_is_zero_terminated (type_info);
795 item_type_info = g_type_info_get_param_type (type_info, 0);
797 item_size = _pygi_g_type_info_size (item_type_info);
799 g_base_info_unref ( (GIBaseInfo *) item_type_info);
801 if (is_zero_terminated) {
802 length = g_strv_length (arg->v_pointer);
804 length = g_type_info_get_array_fixed_size (type_info);
806 if (G_UNLIKELY (args == NULL)) {
807 g_critical ("Unable to determine array length for %p",
809 g_array = g_array_new (is_zero_terminated, FALSE, item_size);
810 *out_free_array = TRUE;
814 GIArgInfo *length_arg_info;
815 GITypeInfo *length_type_info;
817 length_arg_pos = g_type_info_get_array_length (type_info);
818 g_assert (length_arg_pos >= 0);
819 g_assert (callable_info);
820 length_arg_info = g_callable_info_get_arg (callable_info, length_arg_pos);
821 length_type_info = g_arg_info_get_type (length_arg_info);
822 g_base_info_unref ( (GIBaseInfo *) length_arg_info);
823 if (!gi_argument_to_gssize (args[length_arg_pos],
824 g_type_info_get_tag (length_type_info),
826 g_base_info_unref ( (GIBaseInfo *) length_type_info);
829 g_base_info_unref ( (GIBaseInfo *) length_type_info);
833 g_assert (length >= 0);
835 g_array = g_array_new (is_zero_terminated, FALSE, item_size);
837 g_array->data = arg->v_pointer;
838 g_array->len = length;
839 *out_free_array = TRUE;
841 case GI_ARRAY_TYPE_ARRAY:
842 case GI_ARRAY_TYPE_BYTE_ARRAY:
843 /* Note: GByteArray is really just a GArray */
844 g_array = arg->v_pointer;
845 *out_free_array = FALSE;
847 case GI_ARRAY_TYPE_PTR_ARRAY:
849 GPtrArray *ptr_array = (GPtrArray*) arg->v_pointer;
850 g_array = g_array_sized_new (FALSE, FALSE,
853 g_array->data = (char*) ptr_array->pdata;
854 g_array->len = ptr_array->len;
855 *out_free_array = TRUE;
859 g_critical ("Unexpected array type %u",
860 g_type_info_get_array_type (type_info));
869 _pygi_argument_from_object (PyObject *object,
870 GITypeInfo *type_info,
876 memset(&arg, 0, sizeof(GIArgument));
877 type_tag = g_type_info_get_tag (type_info);
880 case GI_TYPE_TAG_VOID:
881 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
882 if (object == Py_None) {
883 arg.v_pointer = NULL;
884 } else if (!PYGLIB_PyLong_Check(object) && !PyLong_Check(object)) {
885 PyErr_SetString(PyExc_TypeError,
886 "Pointer assignment is restricted to integer values. "
887 "See: https://bugzilla.gnome.org/show_bug.cgi?id=683599");
889 arg.v_pointer = PyLong_AsVoidPtr (object);
892 case GI_TYPE_TAG_BOOLEAN:
894 arg.v_boolean = PyObject_IsTrue (object);
897 case GI_TYPE_TAG_INT8:
898 case GI_TYPE_TAG_INT16:
899 case GI_TYPE_TAG_INT32:
903 int_ = PYGLIB_PyNumber_Long (object);
905 PyErr_SetString (PyExc_TypeError, "expected int argument");
909 if (type_tag == GI_TYPE_TAG_INT32)
910 arg.v_int32 = PYGLIB_PyLong_AsLong (int_);
911 else if (type_tag == GI_TYPE_TAG_INT8)
912 arg.v_int8 = PYGLIB_PyLong_AsLong (int_);
913 else if (type_tag == GI_TYPE_TAG_INT16)
914 arg.v_int16 = PYGLIB_PyLong_AsLong (int_);
920 case GI_TYPE_TAG_UINT8:
921 case GI_TYPE_TAG_UINT16:
922 case GI_TYPE_TAG_UINT32:
923 case GI_TYPE_TAG_UINT64:
928 number = PYGLIB_PyNumber_Long (object);
929 if (number == NULL) {
930 PyErr_SetString (PyExc_TypeError, "expected int argument");
934 #if PY_VERSION_HEX < 0x03000000
935 if (PyInt_Check (number)) {
936 value = PyInt_AS_LONG (number);
939 value = PyLong_AsUnsignedLongLong (number);
941 if (type_tag == GI_TYPE_TAG_UINT32)
942 arg.v_uint32 = value;
943 else if (type_tag == GI_TYPE_TAG_UINT64)
944 arg.v_uint64 = value;
945 else if (type_tag == GI_TYPE_TAG_UINT8)
947 else if (type_tag == GI_TYPE_TAG_UINT16)
948 arg.v_uint16 = value;
954 case GI_TYPE_TAG_INT64:
959 number = PYGLIB_PyNumber_Long (object);
960 if (number == NULL) {
961 PyErr_SetString (PyExc_TypeError, "expected int argument");
965 #if PY_VERSION_HEX < 0x03000000
966 if (PyInt_Check (number)) {
967 value = PyInt_AS_LONG (number);
970 value = PyLong_AsLongLong (number);
978 case GI_TYPE_TAG_FLOAT:
982 float_ = PyNumber_Float (object);
983 if (float_ == NULL) {
984 PyErr_SetString (PyExc_TypeError, "expected float or int argument");
988 arg.v_float = (float) PyFloat_AsDouble (float_);
993 case GI_TYPE_TAG_DOUBLE:
997 float_ = PyNumber_Float (object);
998 if (float_ == NULL) {
999 PyErr_SetString (PyExc_TypeError, "expected float or int argument");
1003 arg.v_double = PyFloat_AsDouble (float_);
1008 case GI_TYPE_TAG_GTYPE:
1010 arg.v_long = pyg_type_from_object (object);
1014 case GI_TYPE_TAG_UNICHAR:
1018 if (object == Py_None) {
1023 #if PY_VERSION_HEX < 0x03000000
1024 if (PyUnicode_Check(object)) {
1025 PyObject *pystr_obj = PyUnicode_AsUTF8String (object);
1030 string = g_strdup(PyString_AsString (pystr_obj));
1031 Py_DECREF(pystr_obj);
1033 string = g_strdup(PyString_AsString (object));
1037 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
1041 string = g_strdup(PyBytes_AsString (pybytes_obj));
1042 Py_DECREF (pybytes_obj);
1046 arg.v_uint32 = g_utf8_get_char (string);
1050 case GI_TYPE_TAG_UTF8:
1054 if (object == Py_None) {
1055 arg.v_string = NULL;
1058 #if PY_VERSION_HEX < 0x03000000
1059 if (PyUnicode_Check(object)) {
1060 PyObject *pystr_obj = PyUnicode_AsUTF8String (object);
1065 string = g_strdup(PyString_AsString (pystr_obj));
1066 Py_DECREF(pystr_obj);
1068 string = g_strdup(PyString_AsString (object));
1072 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
1076 string = g_strdup(PyBytes_AsString (pybytes_obj));
1077 Py_DECREF (pybytes_obj);
1080 arg.v_string = string;
1084 case GI_TYPE_TAG_FILENAME:
1086 GError *error = NULL;
1089 #if PY_VERSION_HEX < 0x03000000
1090 string = g_strdup(PyString_AsString (object));
1093 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
1097 string = g_strdup(PyBytes_AsString (pybytes_obj));
1098 Py_DECREF (pybytes_obj);
1102 if (string == NULL) {
1106 arg.v_string = g_filename_from_utf8 (string, -1, NULL, NULL, &error);
1109 if (arg.v_string == NULL) {
1110 PyErr_SetString (PyExc_Exception, error->message);
1111 /* TODO: Convert the error to an exception. */
1116 case GI_TYPE_TAG_ARRAY:
1119 gboolean is_zero_terminated;
1120 GITypeInfo *item_type_info;
1123 GITransfer item_transfer;
1126 if (object == Py_None) {
1127 arg.v_pointer = NULL;
1131 /* Note, strings are sequences, but we cannot accept them here */
1132 if (!PySequence_Check (object) ||
1133 #if PY_VERSION_HEX < 0x03000000
1134 PyString_Check (object) ||
1136 PyUnicode_Check (object)) {
1137 PyErr_SetString (PyExc_TypeError, "expected sequence");
1141 length = PySequence_Length (object);
1146 is_zero_terminated = g_type_info_is_zero_terminated (type_info);
1147 item_type_info = g_type_info_get_param_type (type_info, 0);
1149 /* we handle arrays that are really strings specially, see below */
1150 if (g_type_info_get_tag (item_type_info) == GI_TYPE_TAG_UINT8)
1153 item_size = sizeof (GIArgument);
1155 array = g_array_sized_new (is_zero_terminated, FALSE, item_size, length);
1156 if (array == NULL) {
1157 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1162 if (g_type_info_get_tag (item_type_info) == GI_TYPE_TAG_UINT8 &&
1163 PYGLIB_PyBytes_Check(object)) {
1165 memcpy(array->data, PYGLIB_PyBytes_AsString(object), length);
1166 array->len = length;
1171 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1173 for (i = 0; i < length; i++) {
1177 py_item = PySequence_GetItem (object, i);
1178 if (py_item == NULL) {
1179 goto array_item_error;
1182 item = _pygi_argument_from_object (py_item, item_type_info, item_transfer);
1184 Py_DECREF (py_item);
1186 if (PyErr_Occurred()) {
1187 goto array_item_error;
1190 g_array_insert_val (array, i, item);
1194 /* Free everything we have converted so far. */
1195 _pygi_argument_release ( (GIArgument *) &array, type_info,
1196 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1199 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1204 arg.v_pointer = array;
1206 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1209 case GI_TYPE_TAG_INTERFACE:
1212 GIInfoType info_type;
1214 info = g_type_info_get_interface (type_info);
1215 info_type = g_base_info_get_type (info);
1217 switch (info_type) {
1218 case GI_INFO_TYPE_CALLBACK:
1219 /* This should be handled in invoke() */
1220 g_assert_not_reached();
1222 case GI_INFO_TYPE_BOXED:
1223 case GI_INFO_TYPE_STRUCT:
1224 case GI_INFO_TYPE_UNION:
1228 if (object == Py_None) {
1229 arg.v_pointer = NULL;
1233 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1235 /* Handle special cases first. */
1236 if (g_type_is_a (type, G_TYPE_VALUE)) {
1241 object_type = pyg_type_from_object_strict ( (PyObject *) object->ob_type, FALSE);
1242 if (object_type == G_TYPE_INVALID) {
1243 PyErr_SetString (PyExc_RuntimeError, "unable to retrieve object's GType");
1247 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1249 value = g_slice_new0 (GValue);
1251 /* if already a gvalue, copy, else marshal into gvalue */
1252 if (object_type == G_TYPE_VALUE) {
1253 /* src GValue's lifecycle is handled by Python
1254 * so we have to copy it into the destination's
1255 * GValue which is freed during the cleanup of
1258 GValue *src = (GValue *)((PyGObject *) object)->obj;
1259 g_value_init (value, G_VALUE_TYPE (src));
1260 g_value_copy(src, value);
1262 g_value_init (value, object_type);
1263 retval = pyg_value_from_pyobject (value, object);
1265 g_slice_free (GValue, value);
1266 PyErr_SetString (PyExc_RuntimeError, "PyObject conversion to GValue failed");
1271 arg.v_pointer = value;
1272 } else if (g_type_is_a (type, G_TYPE_CLOSURE)) {
1275 if (pyg_type_from_object_strict (object, FALSE) == G_TYPE_CLOSURE) {
1276 closure = (GClosure *)pyg_boxed_get (object, void);
1278 closure = pyg_closure_new (object, NULL, NULL);
1279 if (closure == NULL) {
1280 PyErr_SetString (PyExc_RuntimeError, "PyObject conversion to GClosure failed");
1285 arg.v_pointer = closure;
1286 } else if (g_struct_info_is_foreign (info)) {
1287 pygi_struct_foreign_convert_to_g_argument (object, info, transfer, &arg);
1288 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
1289 if (pyg_boxed_check (object, type)) {
1290 arg.v_pointer = pyg_boxed_get (object, void);
1291 if (transfer == GI_TRANSFER_EVERYTHING) {
1292 arg.v_pointer = g_boxed_copy (type, arg.v_pointer);
1295 PyErr_Format (PyExc_TypeError, "wrong boxed type");
1297 } else if (g_type_is_a (type, G_TYPE_POINTER) ||
1298 g_type_is_a (type, G_TYPE_VARIANT) ||
1299 type == G_TYPE_NONE) {
1300 g_warn_if_fail (g_type_is_a (type, G_TYPE_VARIANT) || !g_type_info_is_pointer (type_info) || transfer == GI_TRANSFER_NOTHING);
1302 if (g_type_is_a (type, G_TYPE_VARIANT) && pyg_type_from_object (object) != G_TYPE_VARIANT) {
1303 PyErr_SetString (PyExc_TypeError, "expected GLib.Variant");
1306 arg.v_pointer = pyg_pointer_get (object, void);
1308 PyErr_Format (PyExc_NotImplementedError, "structure type '%s' is not supported yet", g_type_name (type));
1313 case GI_INFO_TYPE_ENUM:
1314 case GI_INFO_TYPE_FLAGS:
1318 int_ = PYGLIB_PyNumber_Long (object);
1323 arg.v_int = PYGLIB_PyLong_AsLong (int_);
1329 case GI_INFO_TYPE_INTERFACE:
1330 case GI_INFO_TYPE_OBJECT:
1331 if (object == Py_None) {
1332 arg.v_pointer = NULL;
1336 arg.v_pointer = pygobject_get (object);
1337 if (transfer == GI_TRANSFER_EVERYTHING) {
1338 g_object_ref (arg.v_pointer);
1343 g_assert_not_reached();
1345 g_base_info_unref (info);
1348 case GI_TYPE_TAG_GLIST:
1349 case GI_TYPE_TAG_GSLIST:
1352 GITypeInfo *item_type_info;
1353 GSList *list = NULL;
1354 GITransfer item_transfer;
1357 if (object == Py_None) {
1358 arg.v_pointer = NULL;
1362 length = PySequence_Length (object);
1367 item_type_info = g_type_info_get_param_type (type_info, 0);
1368 g_assert (item_type_info != NULL);
1370 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1372 for (i = length - 1; i >= 0; i--) {
1376 py_item = PySequence_GetItem (object, i);
1377 if (py_item == NULL) {
1378 goto list_item_error;
1381 item = _pygi_argument_from_object (py_item, item_type_info, item_transfer);
1383 Py_DECREF (py_item);
1385 if (PyErr_Occurred()) {
1386 goto list_item_error;
1389 if (type_tag == GI_TYPE_TAG_GLIST) {
1390 list = (GSList *) g_list_prepend ( (GList *) list, item.v_pointer);
1392 list = g_slist_prepend (list, item.v_pointer);
1398 /* Free everything we have converted so far. */
1399 _pygi_argument_release ( (GIArgument *) &list, type_info,
1400 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1403 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1407 arg.v_pointer = list;
1409 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1413 case GI_TYPE_TAG_GHASH:
1418 GITypeInfo *key_type_info;
1419 GITypeInfo *value_type_info;
1420 GITypeTag key_type_tag;
1421 GHashFunc hash_func;
1422 GEqualFunc equal_func;
1423 GHashTable *hash_table;
1424 GITransfer item_transfer;
1428 if (object == Py_None) {
1429 arg.v_pointer = NULL;
1433 length = PyMapping_Length (object);
1438 keys = PyMapping_Keys (object);
1443 values = PyMapping_Values (object);
1444 if (values == NULL) {
1449 key_type_info = g_type_info_get_param_type (type_info, 0);
1450 g_assert (key_type_info != NULL);
1452 value_type_info = g_type_info_get_param_type (type_info, 1);
1453 g_assert (value_type_info != NULL);
1455 key_type_tag = g_type_info_get_tag (key_type_info);
1457 switch (key_type_tag) {
1458 case GI_TYPE_TAG_UTF8:
1459 case GI_TYPE_TAG_FILENAME:
1460 hash_func = g_str_hash;
1461 equal_func = g_str_equal;
1468 hash_table = g_hash_table_new (hash_func, equal_func);
1469 if (hash_table == NULL) {
1471 goto hash_table_release;
1474 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1476 for (i = 0; i < length; i++) {
1482 py_key = PyList_GET_ITEM (keys, i);
1483 py_value = PyList_GET_ITEM (values, i);
1485 key = _pygi_argument_from_object (py_key, key_type_info, item_transfer);
1486 if (PyErr_Occurred()) {
1487 goto hash_table_item_error;
1490 value = _pygi_argument_from_object (py_value, value_type_info, item_transfer);
1491 if (PyErr_Occurred()) {
1492 _pygi_argument_release (&key, type_info, GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1493 goto hash_table_item_error;
1496 g_hash_table_insert (hash_table, key.v_pointer,
1497 _pygi_arg_to_hash_pointer (&value, g_type_info_get_tag (value_type_info)));
1500 hash_table_item_error:
1501 /* Free everything we have converted so far. */
1502 _pygi_argument_release ( (GIArgument *) &hash_table, type_info,
1503 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1506 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1510 arg.v_pointer = hash_table;
1513 g_base_info_unref ( (GIBaseInfo *) key_type_info);
1514 g_base_info_unref ( (GIBaseInfo *) value_type_info);
1519 case GI_TYPE_TAG_ERROR:
1520 PyErr_SetString (PyExc_NotImplementedError, "error marshalling is not supported yet");
1529 * _pygi_argument_to_object:
1530 * @arg: The argument to convert to an object.
1531 * @type_info: Type info for @arg
1534 * If the argument is of type array, it must be encoded in a GArray, by calling
1535 * _pygi_argument_to_array(). This logic can not be folded into this method
1536 * as determining array lengths may require access to method call arguments.
1538 * Returns: A PyObject representing @arg
1541 _pygi_argument_to_object (GIArgument *arg,
1542 GITypeInfo *type_info,
1543 GITransfer transfer)
1546 PyObject *object = NULL;
1548 type_tag = g_type_info_get_tag (type_info);
1550 case GI_TYPE_TAG_VOID:
1552 if (g_type_info_is_pointer (type_info) &&
1553 (arg->v_pointer != NULL)) {
1554 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1555 object = PyLong_FromVoidPtr (arg->v_pointer);
1557 /* None is used instead of zero for parity with ctypes.
1558 * This is helpful in case the values are being used for
1559 * actual memory addressing, in which case None will
1560 * raise as opposed to 0 which will crash.
1567 case GI_TYPE_TAG_BOOLEAN:
1569 object = PyBool_FromLong (arg->v_boolean);
1572 case GI_TYPE_TAG_INT8:
1574 object = PYGLIB_PyLong_FromLong (arg->v_int8);
1577 case GI_TYPE_TAG_UINT8:
1579 object = PYGLIB_PyLong_FromLong (arg->v_uint8);
1582 case GI_TYPE_TAG_INT16:
1584 object = PYGLIB_PyLong_FromLong (arg->v_int16);
1587 case GI_TYPE_TAG_UINT16:
1589 object = PYGLIB_PyLong_FromLong (arg->v_uint16);
1592 case GI_TYPE_TAG_INT32:
1594 object = PYGLIB_PyLong_FromLong (arg->v_int32);
1597 case GI_TYPE_TAG_UINT32:
1599 object = PyLong_FromLongLong (arg->v_uint32);
1602 case GI_TYPE_TAG_INT64:
1604 object = PyLong_FromLongLong (arg->v_int64);
1607 case GI_TYPE_TAG_UINT64:
1609 object = PyLong_FromUnsignedLongLong (arg->v_uint64);
1612 case GI_TYPE_TAG_FLOAT:
1614 object = PyFloat_FromDouble (arg->v_float);
1617 case GI_TYPE_TAG_DOUBLE:
1619 object = PyFloat_FromDouble (arg->v_double);
1622 case GI_TYPE_TAG_GTYPE:
1624 object = pyg_type_wrapper_new ( (GType) arg->v_long);
1627 case GI_TYPE_TAG_UNICHAR:
1629 /* Preserve the bidirectional mapping between 0 and "" */
1630 if (arg->v_uint32 == 0) {
1631 object = PYGLIB_PyUnicode_FromString ("");
1632 } else if (g_unichar_validate (arg->v_uint32)) {
1636 bytes = g_unichar_to_utf8 (arg->v_uint32, utf8);
1637 object = PYGLIB_PyUnicode_FromStringAndSize ((char*)utf8, bytes);
1639 /* TODO: Convert the error to an exception. */
1640 PyErr_Format (PyExc_TypeError,
1641 "Invalid unicode codepoint %" G_GUINT32_FORMAT,
1648 case GI_TYPE_TAG_UTF8:
1649 if (arg->v_string == NULL) {
1655 object = PYGLIB_PyUnicode_FromString (arg->v_string);
1657 case GI_TYPE_TAG_FILENAME:
1659 GError *error = NULL;
1662 if (arg->v_string == NULL) {
1668 string = g_filename_to_utf8 (arg->v_string, -1, NULL, NULL, &error);
1669 if (string == NULL) {
1670 PyErr_SetString (PyExc_Exception, error->message);
1671 /* TODO: Convert the error to an exception. */
1675 object = PYGLIB_PyUnicode_FromString (string);
1681 case GI_TYPE_TAG_ARRAY:
1683 /* Arrays are assumed to be packed in a GArray */
1685 GITypeInfo *item_type_info;
1686 GITypeTag item_type_tag;
1687 GITransfer item_transfer;
1690 if (arg->v_pointer == NULL)
1691 return PyList_New (0);
1693 item_type_info = g_type_info_get_param_type (type_info, 0);
1694 g_assert (item_type_info != NULL);
1696 item_type_tag = g_type_info_get_tag (item_type_info);
1697 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1699 array = arg->v_pointer;
1700 item_size = g_array_get_element_size (array);
1702 if (G_UNLIKELY (item_size > sizeof(GIArgument))) {
1703 g_critical ("Stack overflow protection. "
1704 "Can't copy array element into GIArgument.");
1705 return PyList_New (0);
1708 if (item_type_tag == GI_TYPE_TAG_UINT8) {
1709 /* Return as a byte array */
1710 object = PYGLIB_PyBytes_FromStringAndSize (array->data, array->len);
1712 object = PyList_New (array->len);
1713 if (object == NULL) {
1714 g_critical ("Failure to allocate array for %u items", array->len);
1715 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1719 for (i = 0; i < array->len; i++) {
1720 GIArgument item = { 0 };
1723 memcpy (&item, array->data + i * item_size, item_size);
1725 py_item = _pygi_argument_to_object (&item, item_type_info, item_transfer);
1726 if (py_item == NULL) {
1728 _PyGI_ERROR_PREFIX ("Item %zu: ", i);
1732 PyList_SET_ITEM (object, i, py_item);
1736 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1739 case GI_TYPE_TAG_INTERFACE:
1742 GIInfoType info_type;
1744 info = g_type_info_get_interface (type_info);
1745 info_type = g_base_info_get_type (info);
1747 switch (info_type) {
1748 case GI_INFO_TYPE_CALLBACK:
1750 g_assert_not_reached();
1752 case GI_INFO_TYPE_BOXED:
1753 case GI_INFO_TYPE_STRUCT:
1754 case GI_INFO_TYPE_UNION:
1758 if (arg->v_pointer == NULL) {
1764 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1765 if (g_type_is_a (type, G_TYPE_VALUE)) {
1766 object = pyg_value_as_pyobject (arg->v_pointer, FALSE);
1767 } else if (g_struct_info_is_foreign (info)) {
1768 object = pygi_struct_foreign_convert_from_g_argument (info, arg->v_pointer);
1769 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
1772 py_type = _pygi_type_get_from_g_type (type);
1773 if (py_type == NULL)
1776 object = _pygi_boxed_new ( (PyTypeObject *) py_type, arg->v_pointer, transfer == GI_TRANSFER_EVERYTHING);
1778 Py_DECREF (py_type);
1779 } else if (g_type_is_a (type, G_TYPE_POINTER)) {
1782 py_type = _pygi_type_get_from_g_type (type);
1784 if (py_type == NULL || !PyType_IsSubtype ( (PyTypeObject *) type, &PyGIStruct_Type)) {
1785 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1786 object = pyg_pointer_new (type, arg->v_pointer);
1788 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer, transfer == GI_TRANSFER_EVERYTHING);
1791 Py_XDECREF (py_type);
1792 } else if (type == G_TYPE_VARIANT) {
1795 g_variant_ref_sink (arg->v_pointer);
1796 py_type = _pygi_type_import_by_gi_info (info);
1797 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer,
1798 transfer == GI_TRANSFER_EVERYTHING);
1799 } else if (type == G_TYPE_NONE) {
1802 py_type = _pygi_type_import_by_gi_info (info);
1803 if (py_type == NULL) {
1807 /* Only structs created in invoke can be safely marked
1808 * GI_TRANSFER_EVERYTHING. Trust that invoke has
1809 * filtered correctly
1811 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer,
1812 transfer == GI_TRANSFER_EVERYTHING);
1814 Py_DECREF (py_type);
1816 PyErr_Format (PyExc_NotImplementedError, "structure type '%s' is not supported yet", g_type_name (type));
1821 case GI_INFO_TYPE_ENUM:
1822 case GI_INFO_TYPE_FLAGS:
1826 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1828 if (type == G_TYPE_NONE) {
1829 /* An enum with a GType of None is an enum without GType */
1830 PyObject *py_type = _pygi_type_import_by_gi_info (info);
1831 PyObject *py_args = NULL;
1836 py_args = PyTuple_New (1);
1837 if (PyTuple_SetItem (py_args, 0, PyLong_FromLong (arg->v_int)) != 0) {
1838 Py_DECREF (py_args);
1839 Py_DECREF (py_type);
1843 object = PyObject_CallFunction (py_type, "i", arg->v_int);
1845 Py_DECREF (py_args);
1846 Py_DECREF (py_type);
1848 } else if (info_type == GI_INFO_TYPE_ENUM) {
1849 object = pyg_enum_from_gtype (type, arg->v_int);
1851 object = pyg_flags_from_gtype (type, arg->v_int);
1856 case GI_INFO_TYPE_INTERFACE:
1857 case GI_INFO_TYPE_OBJECT:
1858 if (arg->v_pointer == NULL) {
1864 if (G_IS_PARAM_SPEC (arg->v_pointer)) {
1865 object = pyg_param_spec_new (arg->v_pointer);
1869 /* since we will unref the object when the
1870 * wrapper is destroyed and we don't want
1871 * GTK removing the object while the
1872 * wrapper is live, we take a gobject reference
1873 * when one is not transfered to us
1875 if (transfer == GI_TRANSFER_NOTHING)
1876 g_object_ref (G_OBJECT(arg->v_pointer));
1878 object = pygobject_new (arg->v_pointer);
1881 g_assert_not_reached();
1884 g_base_info_unref (info);
1887 case GI_TYPE_TAG_GLIST:
1888 case GI_TYPE_TAG_GSLIST:
1892 GITypeInfo *item_type_info;
1893 GITransfer item_transfer;
1896 list = arg->v_pointer;
1897 length = g_slist_length (list);
1899 object = PyList_New (length);
1900 if (object == NULL) {
1904 item_type_info = g_type_info_get_param_type (type_info, 0);
1905 g_assert (item_type_info != NULL);
1907 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1909 for (i = 0; list != NULL; list = g_slist_next (list), i++) {
1913 item.v_pointer = list->data;
1915 py_item = _pygi_argument_to_object (&item, item_type_info, item_transfer);
1916 if (py_item == NULL) {
1918 _PyGI_ERROR_PREFIX ("Item %zu: ", i);
1922 PyList_SET_ITEM (object, i, py_item);
1925 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1928 case GI_TYPE_TAG_GHASH:
1930 GITypeInfo *key_type_info;
1931 GITypeInfo *value_type_info;
1932 GITransfer item_transfer;
1933 GHashTableIter hash_table_iter;
1937 if (arg->v_pointer == NULL) {
1943 object = PyDict_New();
1944 if (object == NULL) {
1948 key_type_info = g_type_info_get_param_type (type_info, 0);
1949 g_assert (key_type_info != NULL);
1950 g_assert (g_type_info_get_tag (key_type_info) != GI_TYPE_TAG_VOID);
1952 value_type_info = g_type_info_get_param_type (type_info, 1);
1953 g_assert (value_type_info != NULL);
1954 g_assert (g_type_info_get_tag (value_type_info) != GI_TYPE_TAG_VOID);
1956 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1958 g_hash_table_iter_init (&hash_table_iter, (GHashTable *) arg->v_pointer);
1959 while (g_hash_table_iter_next (&hash_table_iter, &key.v_pointer, &value.v_pointer)) {
1964 py_key = _pygi_argument_to_object (&key, key_type_info, item_transfer);
1965 if (py_key == NULL) {
1969 _pygi_hash_pointer_to_arg (&value, g_type_info_get_tag (value_type_info));
1970 py_value = _pygi_argument_to_object (&value, value_type_info, item_transfer);
1971 if (py_value == NULL) {
1976 retval = PyDict_SetItem (object, py_key, py_value);
1979 Py_DECREF (py_value);
1987 g_base_info_unref ( (GIBaseInfo *) key_type_info);
1988 g_base_info_unref ( (GIBaseInfo *) value_type_info);
1991 case GI_TYPE_TAG_ERROR:
1993 GError *error = (GError *) arg->v_pointer;
1994 if (error != NULL && transfer == GI_TRANSFER_NOTHING) {
1995 /* If we have not been transferred the ownership we must copy
1996 * the error, because pyglib_error_check() is going to free it.
1998 error = g_error_copy (error);
2001 if (pyglib_error_check (&error)) {
2003 PyObject *err_value;
2004 PyObject *err_trace;
2005 PyErr_Fetch (&err_type, &err_value, &err_trace);
2006 Py_XDECREF (err_type);
2007 Py_XDECREF (err_trace);
2022 _pygi_argument_from_g_value(const GValue *value,
2023 GITypeInfo *type_info)
2025 GIArgument arg = { 0, };
2027 GITypeTag type_tag = g_type_info_get_tag (type_info);
2029 /* For the long handling: long can be equivalent to
2030 int32 or int64, depending on the architecture, but
2031 gi doesn't tell us (and same for ulong)
2034 case GI_TYPE_TAG_BOOLEAN:
2035 arg.v_boolean = g_value_get_boolean (value);
2037 case GI_TYPE_TAG_INT8:
2038 case GI_TYPE_TAG_INT16:
2039 case GI_TYPE_TAG_INT32:
2040 if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_LONG))
2041 arg.v_int = g_value_get_long (value);
2043 arg.v_int = g_value_get_int (value);
2045 case GI_TYPE_TAG_INT64:
2046 if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_LONG))
2047 arg.v_int64 = g_value_get_long (value);
2049 arg.v_int64 = g_value_get_int64 (value);
2051 case GI_TYPE_TAG_UINT8:
2052 case GI_TYPE_TAG_UINT16:
2053 case GI_TYPE_TAG_UINT32:
2054 if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_ULONG))
2055 arg.v_uint = g_value_get_ulong (value);
2057 arg.v_uint = g_value_get_uint (value);
2059 case GI_TYPE_TAG_UINT64:
2060 if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_ULONG))
2061 arg.v_uint64 = g_value_get_ulong (value);
2063 arg.v_uint64 = g_value_get_uint64 (value);
2065 case GI_TYPE_TAG_UNICHAR:
2066 arg.v_uint32 = g_value_get_schar (value);
2068 case GI_TYPE_TAG_FLOAT:
2069 arg.v_float = g_value_get_float (value);
2071 case GI_TYPE_TAG_DOUBLE:
2072 arg.v_double = g_value_get_double (value);
2074 case GI_TYPE_TAG_GTYPE:
2075 arg.v_long = g_value_get_gtype (value);
2077 case GI_TYPE_TAG_UTF8:
2078 case GI_TYPE_TAG_FILENAME:
2079 arg.v_string = g_value_dup_string (value);
2081 case GI_TYPE_TAG_GLIST:
2082 case GI_TYPE_TAG_GSLIST:
2083 arg.v_pointer = g_value_get_pointer (value);
2085 case GI_TYPE_TAG_ARRAY:
2086 case GI_TYPE_TAG_GHASH:
2087 arg.v_pointer = g_value_get_boxed (value);
2089 case GI_TYPE_TAG_INTERFACE:
2092 GIInfoType info_type;
2094 info = g_type_info_get_interface (type_info);
2095 info_type = g_base_info_get_type (info);
2097 g_base_info_unref (info);
2099 switch (info_type) {
2100 case GI_INFO_TYPE_FLAGS:
2101 arg.v_long = g_value_get_flags (value);
2103 case GI_INFO_TYPE_ENUM:
2104 arg.v_long = g_value_get_enum (value);
2106 case GI_INFO_TYPE_INTERFACE:
2107 case GI_INFO_TYPE_OBJECT:
2108 if (G_VALUE_HOLDS_PARAM (value))
2109 arg.v_pointer = g_value_get_param (value);
2111 arg.v_pointer = g_value_get_object (value);
2113 case GI_INFO_TYPE_BOXED:
2114 case GI_INFO_TYPE_STRUCT:
2115 case GI_INFO_TYPE_UNION:
2116 if (G_VALUE_HOLDS(value, G_TYPE_BOXED)) {
2117 arg.v_pointer = g_value_get_boxed (value);
2118 } else if (G_VALUE_HOLDS(value, G_TYPE_VARIANT)) {
2119 arg.v_pointer = g_value_get_variant (value);
2121 arg.v_pointer = g_value_get_pointer (value);
2125 g_warning("Converting of type '%s' is not implemented", g_info_type_to_string(info_type));
2126 g_assert_not_reached();
2130 case GI_TYPE_TAG_ERROR:
2131 arg.v_pointer = g_value_get_boxed (value);
2133 case GI_TYPE_TAG_VOID:
2134 g_critical("Converting of type '%s' is not implemented", g_type_tag_to_string(type_tag));
2135 g_assert_not_reached();
2142 _pygi_argument_release (GIArgument *arg,
2143 GITypeInfo *type_info,
2144 GITransfer transfer,
2145 GIDirection direction)
2148 gboolean is_out = (direction == GI_DIRECTION_OUT || direction == GI_DIRECTION_INOUT);
2150 type_tag = g_type_info_get_tag (type_info);
2153 case GI_TYPE_TAG_VOID:
2154 /* Don't do anything, it's transparent to the C side */
2156 case GI_TYPE_TAG_BOOLEAN:
2157 case GI_TYPE_TAG_INT8:
2158 case GI_TYPE_TAG_UINT8:
2159 case GI_TYPE_TAG_INT16:
2160 case GI_TYPE_TAG_UINT16:
2161 case GI_TYPE_TAG_INT32:
2162 case GI_TYPE_TAG_UINT32:
2163 case GI_TYPE_TAG_INT64:
2164 case GI_TYPE_TAG_UINT64:
2165 case GI_TYPE_TAG_FLOAT:
2166 case GI_TYPE_TAG_DOUBLE:
2167 case GI_TYPE_TAG_GTYPE:
2168 case GI_TYPE_TAG_UNICHAR:
2170 case GI_TYPE_TAG_FILENAME:
2171 case GI_TYPE_TAG_UTF8:
2172 /* With allow-none support the string could be NULL */
2173 if ((arg->v_string != NULL &&
2174 (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING))
2175 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2176 g_free (arg->v_string);
2179 case GI_TYPE_TAG_ARRAY:
2184 if (arg->v_pointer == NULL) {
2188 array = arg->v_pointer;
2190 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
2191 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2192 GITypeInfo *item_type_info;
2193 GITransfer item_transfer;
2195 item_type_info = g_type_info_get_param_type (type_info, 0);
2197 item_transfer = direction == GI_DIRECTION_IN ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING;
2199 /* Free the items */
2200 for (i = 0; i < array->len; i++) {
2202 item = &_g_array_index (array, GIArgument, i);
2203 _pygi_argument_release (item, item_type_info, item_transfer, direction);
2206 g_base_info_unref ( (GIBaseInfo *) item_type_info);
2209 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2210 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2211 g_array_free (array, TRUE);
2216 case GI_TYPE_TAG_INTERFACE:
2219 GIInfoType info_type;
2221 info = g_type_info_get_interface (type_info);
2222 info_type = g_base_info_get_type (info);
2224 switch (info_type) {
2225 case GI_INFO_TYPE_CALLBACK:
2228 case GI_INFO_TYPE_BOXED:
2229 case GI_INFO_TYPE_STRUCT:
2230 case GI_INFO_TYPE_UNION:
2234 if (arg->v_pointer == NULL) {
2238 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
2240 if (g_type_is_a (type, G_TYPE_VALUE)) {
2243 value = arg->v_pointer;
2245 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
2246 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2247 g_value_unset (value);
2250 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2251 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2252 g_slice_free (GValue, value);
2254 } else if (g_type_is_a (type, G_TYPE_CLOSURE)) {
2255 if (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING) {
2256 g_closure_unref (arg->v_pointer);
2258 } else if (g_struct_info_is_foreign ( (GIStructInfo*) info)) {
2259 if (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING) {
2260 pygi_struct_foreign_release (info, arg->v_pointer);
2262 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
2263 } else if (g_type_is_a (type, G_TYPE_POINTER) || type == G_TYPE_NONE) {
2264 g_warn_if_fail (!g_type_info_is_pointer (type_info) || transfer == GI_TRANSFER_NOTHING);
2269 case GI_INFO_TYPE_ENUM:
2270 case GI_INFO_TYPE_FLAGS:
2272 case GI_INFO_TYPE_INTERFACE:
2273 case GI_INFO_TYPE_OBJECT:
2274 if (arg->v_pointer == NULL) {
2277 if (is_out && transfer == GI_TRANSFER_EVERYTHING) {
2278 g_object_unref (arg->v_pointer);
2282 g_assert_not_reached();
2285 g_base_info_unref (info);
2288 case GI_TYPE_TAG_GLIST:
2289 case GI_TYPE_TAG_GSLIST:
2293 if (arg->v_pointer == NULL) {
2297 list = arg->v_pointer;
2299 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
2300 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2301 GITypeInfo *item_type_info;
2302 GITransfer item_transfer;
2305 item_type_info = g_type_info_get_param_type (type_info, 0);
2306 g_assert (item_type_info != NULL);
2308 item_transfer = direction == GI_DIRECTION_IN ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING;
2310 /* Free the items */
2311 for (item = list; item != NULL; item = g_slist_next (item)) {
2312 _pygi_argument_release ( (GIArgument *) &item->data, item_type_info,
2313 item_transfer, direction);
2316 g_base_info_unref ( (GIBaseInfo *) item_type_info);
2319 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2320 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2321 if (type_tag == GI_TYPE_TAG_GLIST) {
2322 g_list_free ( (GList *) list);
2324 /* type_tag == GI_TYPE_TAG_GSLIST */
2325 g_slist_free (list);
2331 case GI_TYPE_TAG_GHASH:
2333 GHashTable *hash_table;
2335 if (arg->v_pointer == NULL) {
2339 hash_table = arg->v_pointer;
2341 if (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING) {
2342 /* We created the table without a destroy function, so keys and
2343 * values need to be released. */
2344 GITypeInfo *key_type_info;
2345 GITypeInfo *value_type_info;
2346 GITransfer item_transfer;
2347 GHashTableIter hash_table_iter;
2351 key_type_info = g_type_info_get_param_type (type_info, 0);
2352 g_assert (key_type_info != NULL);
2354 value_type_info = g_type_info_get_param_type (type_info, 1);
2355 g_assert (value_type_info != NULL);
2357 if (direction == GI_DIRECTION_IN) {
2358 item_transfer = GI_TRANSFER_NOTHING;
2360 item_transfer = GI_TRANSFER_EVERYTHING;
2363 g_hash_table_iter_init (&hash_table_iter, hash_table);
2364 while (g_hash_table_iter_next (&hash_table_iter, &key, &value)) {
2365 _pygi_argument_release ( (GIArgument *) &key, key_type_info,
2366 item_transfer, direction);
2367 _pygi_argument_release ( (GIArgument *) &value, value_type_info,
2368 item_transfer, direction);
2371 g_base_info_unref ( (GIBaseInfo *) key_type_info);
2372 g_base_info_unref ( (GIBaseInfo *) value_type_info);
2373 } else if (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_CONTAINER) {
2374 /* Be careful to avoid keys and values being freed if the
2375 * callee gave a destroy function. */
2376 g_hash_table_steal_all (hash_table);
2379 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2380 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2381 g_hash_table_unref (hash_table);
2386 case GI_TYPE_TAG_ERROR:
2390 if (arg->v_pointer == NULL) {
2394 error = * (GError **) arg->v_pointer;
2396 if (error != NULL) {
2397 g_error_free (error);
2400 g_slice_free (GError *, arg->v_pointer);
2407 _pygi_argument_init (void)
2410 _pygobject_import();