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_UTF8:
87 case GI_TYPE_TAG_FILENAME:
88 case GI_TYPE_TAG_INTERFACE:
91 g_critical ("Unsupported type %s", g_type_tag_to_string(type_tag));
96 _pygi_arg_to_hash_pointer (const GIArgument *arg,
100 case GI_TYPE_TAG_INT8:
101 return GINT_TO_POINTER (arg->v_int8);
102 case GI_TYPE_TAG_UINT8:
103 return GINT_TO_POINTER (arg->v_uint8);
104 case GI_TYPE_TAG_INT16:
105 return GINT_TO_POINTER (arg->v_int16);
106 case GI_TYPE_TAG_UINT16:
107 return GINT_TO_POINTER (arg->v_uint16);
108 case GI_TYPE_TAG_INT32:
109 return GINT_TO_POINTER (arg->v_int32);
110 case GI_TYPE_TAG_UINT32:
111 return GINT_TO_POINTER (arg->v_uint32);
112 case GI_TYPE_TAG_UTF8:
113 case GI_TYPE_TAG_FILENAME:
114 case GI_TYPE_TAG_INTERFACE:
115 return arg->v_pointer;
117 g_critical ("Unsupported type %s", g_type_tag_to_string(type_tag));
118 return arg->v_pointer;
123 _pygi_g_type_tag_py_bounds (GITypeTag type_tag,
128 case GI_TYPE_TAG_INT8:
129 *lower = PYGLIB_PyLong_FromLong (-128);
130 *upper = PYGLIB_PyLong_FromLong (127);
132 case GI_TYPE_TAG_UINT8:
133 *upper = PYGLIB_PyLong_FromLong (255);
134 *lower = PYGLIB_PyLong_FromLong (0);
136 case GI_TYPE_TAG_INT16:
137 *lower = PYGLIB_PyLong_FromLong (-32768);
138 *upper = PYGLIB_PyLong_FromLong (32767);
140 case GI_TYPE_TAG_UINT16:
141 *upper = PYGLIB_PyLong_FromLong (65535);
142 *lower = PYGLIB_PyLong_FromLong (0);
144 case GI_TYPE_TAG_INT32:
145 *lower = PYGLIB_PyLong_FromLong (G_MININT32);
146 *upper = PYGLIB_PyLong_FromLong (G_MAXINT32);
148 case GI_TYPE_TAG_UINT32:
149 /* Note: On 32-bit archs, this number doesn't fit in a long. */
150 *upper = PyLong_FromLongLong (G_MAXUINT32);
151 *lower = PYGLIB_PyLong_FromLong (0);
153 case GI_TYPE_TAG_INT64:
154 /* Note: On 32-bit archs, these numbers don't fit in a long. */
155 *lower = PyLong_FromLongLong (G_MININT64);
156 *upper = PyLong_FromLongLong (G_MAXINT64);
158 case GI_TYPE_TAG_UINT64:
159 *upper = PyLong_FromUnsignedLongLong (G_MAXUINT64);
160 *lower = PYGLIB_PyLong_FromLong (0);
162 case GI_TYPE_TAG_FLOAT:
163 *upper = PyFloat_FromDouble (G_MAXFLOAT);
164 *lower = PyFloat_FromDouble (-G_MAXFLOAT);
166 case GI_TYPE_TAG_DOUBLE:
167 *upper = PyFloat_FromDouble (G_MAXDOUBLE);
168 *lower = PyFloat_FromDouble (-G_MAXDOUBLE);
171 PyErr_SetString (PyExc_TypeError, "Non-numeric type tag");
172 *lower = *upper = NULL;
178 _pygi_g_registered_type_info_check_object (GIRegisteredTypeInfo *info,
179 gboolean is_instance,
186 gchar *type_name_expected = NULL;
187 GIInfoType interface_type;
189 interface_type = g_base_info_get_type (info);
190 if ( (interface_type == GI_INFO_TYPE_STRUCT) &&
191 (g_struct_info_is_foreign ( (GIStructInfo*) info))) {
192 /* TODO: Could we check is the correct foreign type? */
196 g_type = g_registered_type_info_get_g_type (info);
197 if (g_type != G_TYPE_NONE) {
198 py_type = _pygi_type_get_from_g_type (g_type);
200 py_type = _pygi_type_import_by_gi_info ( (GIBaseInfo *) info);
203 if (py_type == NULL) {
207 g_assert (PyType_Check (py_type));
210 retval = PyObject_IsInstance (object, py_type);
212 type_name_expected = _pygi_g_base_info_get_fullname (
213 (GIBaseInfo *) info);
216 if (!PyObject_Type (py_type)) {
217 type_name_expected = "type";
219 } else if (!PyType_IsSubtype ( (PyTypeObject *) object,
220 (PyTypeObject *) py_type)) {
221 type_name_expected = _pygi_g_base_info_get_fullname (
222 (GIBaseInfo *) info);
232 PyTypeObject *object_type;
234 if (type_name_expected == NULL) {
238 object_type = (PyTypeObject *) PyObject_Type (object);
239 if (object_type == NULL) {
243 PyErr_Format (PyExc_TypeError, "Must be %s, not %s",
244 type_name_expected, object_type->tp_name);
246 g_free (type_name_expected);
253 _pygi_g_type_interface_check_object (GIBaseInfo *info,
257 GIInfoType info_type;
259 info_type = g_base_info_get_type (info);
261 case GI_INFO_TYPE_CALLBACK:
262 if (!PyCallable_Check (object)) {
263 PyErr_Format (PyExc_TypeError, "Must be callable, not %s",
264 object->ob_type->tp_name);
268 case GI_INFO_TYPE_ENUM:
270 if (PyNumber_Check (object)) {
271 PyObject *number = PYGLIB_PyNumber_Long (object);
275 glong value = PYGLIB_PyLong_AsLong (number);
277 for (i = 0; i < g_enum_info_get_n_values (info); i++) {
278 GIValueInfo *value_info = g_enum_info_get_value (info, i);
279 glong enum_value = g_value_info_get_value (value_info);
280 g_base_info_unref (value_info);
281 if (value == enum_value) {
289 retval = _pygi_g_registered_type_info_check_object (
290 (GIRegisteredTypeInfo *) info, TRUE, object);
292 case GI_INFO_TYPE_FLAGS:
293 if (PyNumber_Check (object)) {
294 /* Accept 0 as a valid flag value */
295 PyObject *number = PYGLIB_PyNumber_Long (object);
299 long value = PYGLIB_PyLong_AsLong (number);
302 else if (value == -1)
306 retval = _pygi_g_registered_type_info_check_object (
307 (GIRegisteredTypeInfo *) info, TRUE, object);
309 case GI_INFO_TYPE_STRUCT:
313 /* Handle special cases. */
314 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
315 if (g_type_is_a (type, G_TYPE_CLOSURE)) {
316 if (!(PyCallable_Check (object) ||
317 pyg_type_from_object_strict (object, FALSE) == G_TYPE_CLOSURE)) {
318 PyErr_Format (PyExc_TypeError, "Must be callable, not %s",
319 object->ob_type->tp_name);
323 } else if (g_type_is_a (type, G_TYPE_VALUE)) {
324 /* we can't check g_values because we don't have
325 * enough context so just pass them through */
331 case GI_INFO_TYPE_BOXED:
332 case GI_INFO_TYPE_INTERFACE:
333 case GI_INFO_TYPE_OBJECT:
334 retval = _pygi_g_registered_type_info_check_object ( (GIRegisteredTypeInfo *) info, TRUE, object);
336 case GI_INFO_TYPE_UNION:
339 retval = _pygi_g_registered_type_info_check_object ( (GIRegisteredTypeInfo *) info, TRUE, object);
341 /* If not the same type then check to see if the object's type
342 * is the same as one of the union's members
348 n_fields = g_union_info_get_n_fields ( (GIUnionInfo *) info);
350 for (i = 0; i < n_fields; i++) {
352 GIFieldInfo *field_info;
353 GITypeInfo *field_type_info;
356 g_union_info_get_field ( (GIUnionInfo *) info, i);
357 field_type_info = g_field_info_get_type (field_info);
359 member_retval = _pygi_g_type_info_check_object(
364 g_base_info_unref ( ( GIBaseInfo *) field_type_info);
365 g_base_info_unref ( ( GIBaseInfo *) field_info);
367 if (member_retval == 1) {
368 retval = member_retval;
376 g_assert_not_reached();
383 _pygi_g_type_info_check_object (GITypeInfo *type_info,
390 if (allow_none && object == Py_None) {
394 type_tag = g_type_info_get_tag (type_info);
397 case GI_TYPE_TAG_VOID:
398 /* No check; VOID means undefined type */
400 case GI_TYPE_TAG_BOOLEAN:
401 /* No check; every Python object has a truth value. */
403 case GI_TYPE_TAG_UINT8:
404 /* UINT8 types can be characters */
405 if (PYGLIB_PyBytes_Check(object)) {
406 if (PYGLIB_PyBytes_Size(object) != 1) {
407 PyErr_Format (PyExc_TypeError, "Must be a single character");
414 case GI_TYPE_TAG_INT8:
415 case GI_TYPE_TAG_INT16:
416 case GI_TYPE_TAG_UINT16:
417 case GI_TYPE_TAG_INT32:
418 case GI_TYPE_TAG_UINT32:
419 case GI_TYPE_TAG_INT64:
420 case GI_TYPE_TAG_UINT64:
421 case GI_TYPE_TAG_FLOAT:
422 case GI_TYPE_TAG_DOUBLE:
424 PyObject *number, *lower, *upper;
426 if (!PyNumber_Check (object)) {
427 PyErr_Format (PyExc_TypeError, "Must be number, not %s",
428 object->ob_type->tp_name);
433 if (type_tag == GI_TYPE_TAG_FLOAT || type_tag == GI_TYPE_TAG_DOUBLE) {
434 number = PyNumber_Float (object);
436 number = PYGLIB_PyNumber_Long (object);
439 _pygi_g_type_tag_py_bounds (type_tag, &lower, &upper);
441 if (lower == NULL || upper == NULL || number == NULL) {
443 goto check_number_release;
447 if (PyObject_RichCompareBool (lower, number, Py_GT)
448 || PyObject_RichCompareBool (upper, number, Py_LT)) {
452 if (PyErr_Occurred()) {
454 goto check_number_release;
457 lower_str = PyObject_Str (lower);
458 upper_str = PyObject_Str (upper);
459 if (lower_str == NULL || upper_str == NULL) {
461 goto check_number_error_release;
464 #if PY_VERSION_HEX < 0x03000000
465 PyErr_Format (PyExc_ValueError, "Must range from %s to %s",
466 PyString_AS_STRING (lower_str),
467 PyString_AS_STRING (upper_str));
470 PyObject *lower_pybytes_obj = PyUnicode_AsUTF8String (lower_str);
471 if (!lower_pybytes_obj)
474 PyObject *upper_pybytes_obj = PyUnicode_AsUTF8String (upper_str);
475 if (!upper_pybytes_obj) {
476 Py_DECREF(lower_pybytes_obj);
480 PyErr_Format (PyExc_ValueError, "Must range from %s to %s",
481 PyBytes_AsString (lower_pybytes_obj),
482 PyBytes_AsString (upper_pybytes_obj));
483 Py_DECREF (lower_pybytes_obj);
484 Py_DECREF (upper_pybytes_obj);
490 check_number_error_release:
491 Py_XDECREF (lower_str);
492 Py_XDECREF (upper_str);
495 check_number_release:
501 case GI_TYPE_TAG_GTYPE:
503 if (pyg_type_from_object (object) == 0) {
504 PyErr_Format (PyExc_TypeError, "Must be gobject.GType, not %s",
505 object->ob_type->tp_name);
510 case GI_TYPE_TAG_UNICHAR:
513 if (PyUnicode_Check (object)) {
514 size = PyUnicode_GET_SIZE (object);
515 #if PY_VERSION_HEX < 0x03000000
516 } else if (PyString_Check (object)) {
517 PyObject *pyuni = PyUnicode_FromEncodedObject (object, "UTF-8", "strict");
518 size = PyUnicode_GET_SIZE (pyuni);
522 PyErr_Format (PyExc_TypeError, "Must be string, not %s",
523 object->ob_type->tp_name);
529 PyErr_Format (PyExc_TypeError, "Must be a one character string, not %" G_GINT64_FORMAT " characters",
537 case GI_TYPE_TAG_UTF8:
538 case GI_TYPE_TAG_FILENAME:
539 if (!PYGLIB_PyBaseString_Check (object) ) {
540 PyErr_Format (PyExc_TypeError, "Must be string, not %s",
541 object->ob_type->tp_name);
545 case GI_TYPE_TAG_ARRAY:
549 GITypeInfo *item_type_info;
552 if (!PySequence_Check (object)) {
553 PyErr_Format (PyExc_TypeError, "Must be sequence, not %s",
554 object->ob_type->tp_name);
559 length = PySequence_Length (object);
565 fixed_size = g_type_info_get_array_fixed_size (type_info);
566 if (fixed_size >= 0 && length != fixed_size) {
567 PyErr_Format (PyExc_ValueError, "Must contain %zd items, not %zd",
573 item_type_info = g_type_info_get_param_type (type_info, 0);
574 g_assert (item_type_info != NULL);
576 /* FIXME: This is insain. We really should only check the first
577 * object and perhaps have a debugging mode. Large arrays
578 * will cause apps to slow to a crawl.
580 for (i = 0; i < length; i++) {
583 item = PySequence_GetItem (object, i);
589 retval = _pygi_g_type_info_check_object (item_type_info, item, TRUE);
597 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
602 g_base_info_unref ( (GIBaseInfo *) item_type_info);
606 case GI_TYPE_TAG_INTERFACE:
610 info = g_type_info_get_interface (type_info);
611 g_assert (info != NULL);
613 retval = _pygi_g_type_interface_check_object(info, object);
615 g_base_info_unref (info);
618 case GI_TYPE_TAG_GLIST:
619 case GI_TYPE_TAG_GSLIST:
622 GITypeInfo *item_type_info;
625 if (!PySequence_Check (object)) {
626 PyErr_Format (PyExc_TypeError, "Must be sequence, not %s",
627 object->ob_type->tp_name);
632 length = PySequence_Length (object);
638 item_type_info = g_type_info_get_param_type (type_info, 0);
639 g_assert (item_type_info != NULL);
641 for (i = 0; i < length; i++) {
644 item = PySequence_GetItem (object, i);
650 retval = _pygi_g_type_info_check_object (item_type_info, item, TRUE);
658 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
663 g_base_info_unref ( (GIBaseInfo *) item_type_info);
666 case GI_TYPE_TAG_GHASH:
671 GITypeInfo *key_type_info;
672 GITypeInfo *value_type_info;
675 keys = PyMapping_Keys (object);
677 PyErr_Format (PyExc_TypeError, "Must be mapping, not %s",
678 object->ob_type->tp_name);
683 length = PyMapping_Length (object);
690 values = PyMapping_Values (object);
691 if (values == NULL) {
697 key_type_info = g_type_info_get_param_type (type_info, 0);
698 g_assert (key_type_info != NULL);
700 value_type_info = g_type_info_get_param_type (type_info, 1);
701 g_assert (value_type_info != NULL);
703 for (i = 0; i < length; i++) {
707 key = PyList_GET_ITEM (keys, i);
708 value = PyList_GET_ITEM (values, i);
710 retval = _pygi_g_type_info_check_object (key_type_info, key, TRUE);
715 _PyGI_ERROR_PREFIX ("Key %zd :", i);
719 retval = _pygi_g_type_info_check_object (value_type_info, value, TRUE);
724 _PyGI_ERROR_PREFIX ("Value %zd :", i);
729 g_base_info_unref ( (GIBaseInfo *) key_type_info);
730 g_base_info_unref ( (GIBaseInfo *) value_type_info);
735 case GI_TYPE_TAG_ERROR:
736 PyErr_SetString (PyExc_NotImplementedError, "Error marshalling is not supported yet");
745 * _pygi_argument_to_array
746 * @arg: The argument to convert
747 * @args: Arguments to method invocation, possibly contaning the array length.
748 * Set to NULL if this is not for a method call
749 * @callable_info: Info on the callable, if this a method call; otherwise NULL
750 * @type_info: The type info for @arg
751 * @out_free_array: A return location for a gboolean that indicates whether
752 * or not the wrapped GArray should be freed
754 * Make sure an array type argument is wrapped in a GArray.
756 * Note: This method can *not* be folded into _pygi_argument_to_object() because
757 * arrays are special in the sense that they might require access to @args in
758 * order to get the length.
760 * Returns: A GArray wrapping @arg. If @out_free_array has been set to TRUE then
761 * free the array with g_array_free() without freeing the data members.
762 * Otherwise don't free the array.
765 _pygi_argument_to_array (GIArgument *arg,
767 GICallableInfo *callable_info,
768 GITypeInfo *type_info,
769 gboolean *out_free_array)
771 GITypeInfo *item_type_info;
772 gboolean is_zero_terminated;
777 g_return_val_if_fail (g_type_info_get_tag (type_info) == GI_TYPE_TAG_ARRAY, NULL);
779 if (arg->v_pointer == NULL) {
783 switch (g_type_info_get_array_type (type_info)) {
784 case GI_ARRAY_TYPE_C:
785 is_zero_terminated = g_type_info_is_zero_terminated (type_info);
786 item_type_info = g_type_info_get_param_type (type_info, 0);
788 item_size = _pygi_g_type_info_size (item_type_info);
790 g_base_info_unref ( (GIBaseInfo *) item_type_info);
792 if (is_zero_terminated) {
793 length = g_strv_length (arg->v_pointer);
795 length = g_type_info_get_array_fixed_size (type_info);
797 if (G_UNLIKELY (args == NULL)) {
798 g_critical ("Unable to determine array length for %p",
800 g_array = g_array_new (is_zero_terminated, FALSE, item_size);
801 *out_free_array = TRUE;
805 GIArgInfo *length_arg_info;
806 GITypeInfo *length_type_info;
808 length_arg_pos = g_type_info_get_array_length (type_info);
809 g_assert (length_arg_pos >= 0);
810 g_assert (callable_info);
811 length_arg_info = g_callable_info_get_arg (callable_info, length_arg_pos);
812 length_type_info = g_arg_info_get_type (length_arg_info);
813 if (!gi_argument_to_gssize (args[length_arg_pos],
814 g_type_info_get_tag (length_type_info),
821 g_assert (length >= 0);
823 g_array = g_array_new (is_zero_terminated, FALSE, item_size);
825 g_array->data = arg->v_pointer;
826 g_array->len = length;
827 *out_free_array = TRUE;
829 case GI_ARRAY_TYPE_ARRAY:
830 case GI_ARRAY_TYPE_BYTE_ARRAY:
831 /* Note: GByteArray is really just a GArray */
832 g_array = arg->v_pointer;
833 *out_free_array = FALSE;
835 case GI_ARRAY_TYPE_PTR_ARRAY:
837 GPtrArray *ptr_array = (GPtrArray*) arg->v_pointer;
838 g_array = g_array_sized_new (FALSE, FALSE,
841 g_array->data = (char*) ptr_array->pdata;
842 g_array->len = ptr_array->len;
843 *out_free_array = TRUE;
847 g_critical ("Unexpected array type %u",
848 g_type_info_get_array_type (type_info));
857 _pygi_argument_from_object (PyObject *object,
858 GITypeInfo *type_info,
864 memset(&arg, 0, sizeof(GIArgument));
865 type_tag = g_type_info_get_tag (type_info);
868 case GI_TYPE_TAG_VOID:
869 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
870 arg.v_pointer = object == Py_None ? NULL : object;
872 case GI_TYPE_TAG_BOOLEAN:
874 arg.v_boolean = PyObject_IsTrue (object);
877 case GI_TYPE_TAG_INT8:
878 case GI_TYPE_TAG_INT16:
879 case GI_TYPE_TAG_INT32:
883 int_ = PYGLIB_PyNumber_Long (object);
885 PyErr_SetString (PyExc_TypeError, "expected int argument");
889 if (type_tag == GI_TYPE_TAG_INT32)
890 arg.v_int32 = PYGLIB_PyLong_AsLong (int_);
891 else if (type_tag == GI_TYPE_TAG_INT8)
892 arg.v_int8 = PYGLIB_PyLong_AsLong (int_);
893 else if (type_tag == GI_TYPE_TAG_INT16)
894 arg.v_int16 = PYGLIB_PyLong_AsLong (int_);
900 case GI_TYPE_TAG_UINT8:
901 case GI_TYPE_TAG_UINT16:
902 case GI_TYPE_TAG_UINT32:
903 case GI_TYPE_TAG_UINT64:
908 number = PYGLIB_PyNumber_Long (object);
909 if (number == NULL) {
910 PyErr_SetString (PyExc_TypeError, "expected int argument");
914 #if PY_VERSION_HEX < 0x03000000
915 if (PyInt_Check (number)) {
916 value = PyInt_AS_LONG (number);
919 value = PyLong_AsUnsignedLongLong (number);
921 if (type_tag == GI_TYPE_TAG_UINT32)
922 arg.v_uint32 = value;
923 else if (type_tag == GI_TYPE_TAG_UINT64)
924 arg.v_uint64 = value;
925 else if (type_tag == GI_TYPE_TAG_UINT8)
927 else if (type_tag == GI_TYPE_TAG_UINT16)
928 arg.v_uint16 = value;
934 case GI_TYPE_TAG_INT64:
939 number = PYGLIB_PyNumber_Long (object);
940 if (number == NULL) {
941 PyErr_SetString (PyExc_TypeError, "expected int argument");
945 #if PY_VERSION_HEX < 0x03000000
946 if (PyInt_Check (number)) {
947 value = PyInt_AS_LONG (number);
950 value = PyLong_AsLongLong (number);
958 case GI_TYPE_TAG_FLOAT:
962 float_ = PyNumber_Float (object);
963 if (float_ == NULL) {
964 PyErr_SetString (PyExc_TypeError, "expected float or int argument");
968 arg.v_float = (float) PyFloat_AsDouble (float_);
973 case GI_TYPE_TAG_DOUBLE:
977 float_ = PyNumber_Float (object);
978 if (float_ == NULL) {
979 PyErr_SetString (PyExc_TypeError, "expected float or int argument");
983 arg.v_double = PyFloat_AsDouble (float_);
988 case GI_TYPE_TAG_GTYPE:
990 arg.v_long = pyg_type_from_object (object);
994 case GI_TYPE_TAG_UNICHAR:
998 if (object == Py_None) {
1003 #if PY_VERSION_HEX < 0x03000000
1004 if (PyUnicode_Check(object)) {
1005 PyObject *pystr_obj = PyUnicode_AsUTF8String (object);
1010 string = g_strdup(PyString_AsString (pystr_obj));
1011 Py_DECREF(pystr_obj);
1013 string = g_strdup(PyString_AsString (object));
1017 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
1021 string = g_strdup(PyBytes_AsString (pybytes_obj));
1022 Py_DECREF (pybytes_obj);
1026 arg.v_uint32 = g_utf8_get_char (string);
1030 case GI_TYPE_TAG_UTF8:
1034 if (object == Py_None) {
1035 arg.v_string = NULL;
1038 #if PY_VERSION_HEX < 0x03000000
1039 if (PyUnicode_Check(object)) {
1040 PyObject *pystr_obj = PyUnicode_AsUTF8String (object);
1045 string = g_strdup(PyString_AsString (pystr_obj));
1046 Py_DECREF(pystr_obj);
1048 string = g_strdup(PyString_AsString (object));
1052 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
1056 string = g_strdup(PyBytes_AsString (pybytes_obj));
1057 Py_DECREF (pybytes_obj);
1060 arg.v_string = string;
1064 case GI_TYPE_TAG_FILENAME:
1066 GError *error = NULL;
1069 #if PY_VERSION_HEX < 0x03000000
1070 string = g_strdup(PyString_AsString (object));
1073 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
1077 string = g_strdup(PyBytes_AsString (pybytes_obj));
1078 Py_DECREF (pybytes_obj);
1082 if (string == NULL) {
1086 arg.v_string = g_filename_from_utf8 (string, -1, NULL, NULL, &error);
1089 if (arg.v_string == NULL) {
1090 PyErr_SetString (PyExc_Exception, error->message);
1091 /* TODO: Convert the error to an exception. */
1096 case GI_TYPE_TAG_ARRAY:
1099 gboolean is_zero_terminated;
1100 GITypeInfo *item_type_info;
1103 GITransfer item_transfer;
1106 if (object == Py_None) {
1107 arg.v_pointer = NULL;
1111 /* Note, strings are sequences, but we cannot accept them here */
1112 if (!PySequence_Check (object) ||
1113 #if PY_VERSION_HEX < 0x03000000
1114 PyString_Check (object) ||
1116 PyUnicode_Check (object)) {
1117 PyErr_SetString (PyExc_TypeError, "expected sequence");
1121 length = PySequence_Length (object);
1126 is_zero_terminated = g_type_info_is_zero_terminated (type_info);
1127 item_type_info = g_type_info_get_param_type (type_info, 0);
1129 item_size = _pygi_g_type_info_size (item_type_info);
1131 array = g_array_sized_new (is_zero_terminated, FALSE, item_size, length);
1132 if (array == NULL) {
1133 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1138 if (g_type_info_get_tag (item_type_info) == GI_TYPE_TAG_UINT8 &&
1139 PYGLIB_PyBytes_Check(object)) {
1141 memcpy(array->data, PYGLIB_PyBytes_AsString(object), length);
1142 array->len = length;
1147 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1149 for (i = 0; i < length; i++) {
1153 py_item = PySequence_GetItem (object, i);
1154 if (py_item == NULL) {
1155 goto array_item_error;
1158 item = _pygi_argument_from_object (py_item, item_type_info, item_transfer);
1160 Py_DECREF (py_item);
1162 if (PyErr_Occurred()) {
1163 goto array_item_error;
1166 g_array_insert_val (array, i, item);
1170 /* Free everything we have converted so far. */
1171 _pygi_argument_release ( (GIArgument *) &array, type_info,
1172 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1175 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1180 arg.v_pointer = array;
1182 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1185 case GI_TYPE_TAG_INTERFACE:
1188 GIInfoType info_type;
1190 info = g_type_info_get_interface (type_info);
1191 info_type = g_base_info_get_type (info);
1193 switch (info_type) {
1194 case GI_INFO_TYPE_CALLBACK:
1195 /* This should be handled in invoke() */
1196 g_assert_not_reached();
1198 case GI_INFO_TYPE_BOXED:
1199 case GI_INFO_TYPE_STRUCT:
1200 case GI_INFO_TYPE_UNION:
1204 if (object == Py_None) {
1205 arg.v_pointer = NULL;
1209 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1211 /* Handle special cases first. */
1212 if (g_type_is_a (type, G_TYPE_VALUE)) {
1217 object_type = pyg_type_from_object_strict ( (PyObject *) object->ob_type, FALSE);
1218 if (object_type == G_TYPE_INVALID) {
1219 PyErr_SetString (PyExc_RuntimeError, "unable to retrieve object's GType");
1223 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1225 value = g_slice_new0 (GValue);
1227 /* if already a gvalue, copy, else marshal into gvalue */
1228 if (object_type == G_TYPE_VALUE) {
1229 /* src GValue's lifecycle is handled by Python
1230 * so we have to copy it into the destination's
1231 * GValue which is freed during the cleanup of
1234 GValue *src = (GValue *)((PyGObject *) object)->obj;
1235 g_value_init (value, G_VALUE_TYPE (src));
1236 g_value_copy(src, value);
1238 g_value_init (value, object_type);
1239 retval = pyg_value_from_pyobject (value, object);
1241 g_slice_free (GValue, value);
1242 PyErr_SetString (PyExc_RuntimeError, "PyObject conversion to GValue failed");
1247 arg.v_pointer = value;
1248 } else if (g_type_is_a (type, G_TYPE_CLOSURE)) {
1251 if (pyg_type_from_object_strict (object, FALSE) == G_TYPE_CLOSURE) {
1252 closure = (GClosure *)pyg_boxed_get (object, void);
1254 closure = pyg_closure_new (object, NULL, NULL);
1255 if (closure == NULL) {
1256 PyErr_SetString (PyExc_RuntimeError, "PyObject conversion to GClosure failed");
1261 arg.v_pointer = closure;
1262 } else if (g_struct_info_is_foreign (info)) {
1264 result = pygi_struct_foreign_convert_to_g_argument (
1265 object, info, transfer, &arg);
1266 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
1267 if (pyg_boxed_check (object, type)) {
1268 arg.v_pointer = pyg_boxed_get (object, void);
1269 if (transfer == GI_TRANSFER_EVERYTHING) {
1270 arg.v_pointer = g_boxed_copy (type, arg.v_pointer);
1273 PyErr_Format (PyExc_TypeError, "wrong boxed type");
1275 } else if (g_type_is_a (type, G_TYPE_POINTER) ||
1276 g_type_is_a (type, G_TYPE_VARIANT) ||
1277 type == G_TYPE_NONE) {
1278 g_warn_if_fail (g_type_is_a (type, G_TYPE_VARIANT) || !g_type_info_is_pointer (type_info) || transfer == GI_TRANSFER_NOTHING);
1279 arg.v_pointer = pyg_pointer_get (object, void);
1281 PyErr_Format (PyExc_NotImplementedError, "structure type '%s' is not supported yet", g_type_name (type));
1286 case GI_INFO_TYPE_ENUM:
1287 case GI_INFO_TYPE_FLAGS:
1291 int_ = PYGLIB_PyNumber_Long (object);
1296 arg.v_int = PYGLIB_PyLong_AsLong (int_);
1302 case GI_INFO_TYPE_INTERFACE:
1303 case GI_INFO_TYPE_OBJECT:
1304 if (object == Py_None) {
1305 arg.v_pointer = NULL;
1309 arg.v_pointer = pygobject_get (object);
1310 if (transfer == GI_TRANSFER_EVERYTHING) {
1311 g_object_ref (arg.v_pointer);
1316 g_assert_not_reached();
1318 g_base_info_unref (info);
1321 case GI_TYPE_TAG_GLIST:
1322 case GI_TYPE_TAG_GSLIST:
1325 GITypeInfo *item_type_info;
1326 GSList *list = NULL;
1327 GITransfer item_transfer;
1330 if (object == Py_None) {
1331 arg.v_pointer = NULL;
1335 length = PySequence_Length (object);
1340 item_type_info = g_type_info_get_param_type (type_info, 0);
1341 g_assert (item_type_info != NULL);
1343 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1345 for (i = length - 1; i >= 0; i--) {
1349 py_item = PySequence_GetItem (object, i);
1350 if (py_item == NULL) {
1351 goto list_item_error;
1354 item = _pygi_argument_from_object (py_item, item_type_info, item_transfer);
1356 Py_DECREF (py_item);
1358 if (PyErr_Occurred()) {
1359 goto list_item_error;
1362 if (type_tag == GI_TYPE_TAG_GLIST) {
1363 list = (GSList *) g_list_prepend ( (GList *) list, item.v_pointer);
1365 list = g_slist_prepend (list, item.v_pointer);
1371 /* Free everything we have converted so far. */
1372 _pygi_argument_release ( (GIArgument *) &list, type_info,
1373 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1376 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1380 arg.v_pointer = list;
1382 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1386 case GI_TYPE_TAG_GHASH:
1391 GITypeInfo *key_type_info;
1392 GITypeInfo *value_type_info;
1393 GITypeTag key_type_tag;
1394 GHashFunc hash_func;
1395 GEqualFunc equal_func;
1396 GHashTable *hash_table;
1397 GITransfer item_transfer;
1401 if (object == Py_None) {
1402 arg.v_pointer = NULL;
1406 length = PyMapping_Length (object);
1411 keys = PyMapping_Keys (object);
1416 values = PyMapping_Values (object);
1417 if (values == NULL) {
1422 key_type_info = g_type_info_get_param_type (type_info, 0);
1423 g_assert (key_type_info != NULL);
1425 value_type_info = g_type_info_get_param_type (type_info, 1);
1426 g_assert (value_type_info != NULL);
1428 key_type_tag = g_type_info_get_tag (key_type_info);
1430 switch (key_type_tag) {
1431 case GI_TYPE_TAG_UTF8:
1432 case GI_TYPE_TAG_FILENAME:
1433 hash_func = g_str_hash;
1434 equal_func = g_str_equal;
1441 hash_table = g_hash_table_new (hash_func, equal_func);
1442 if (hash_table == NULL) {
1444 goto hash_table_release;
1447 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1449 for (i = 0; i < length; i++) {
1455 py_key = PyList_GET_ITEM (keys, i);
1456 py_value = PyList_GET_ITEM (values, i);
1458 key = _pygi_argument_from_object (py_key, key_type_info, item_transfer);
1459 if (PyErr_Occurred()) {
1460 goto hash_table_item_error;
1463 value = _pygi_argument_from_object (py_value, value_type_info, item_transfer);
1464 if (PyErr_Occurred()) {
1465 _pygi_argument_release (&key, type_info, GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1466 goto hash_table_item_error;
1469 g_hash_table_insert (hash_table, key.v_pointer,
1470 _pygi_arg_to_hash_pointer (&value, g_type_info_get_tag (value_type_info)));
1473 hash_table_item_error:
1474 /* Free everything we have converted so far. */
1475 _pygi_argument_release ( (GIArgument *) &hash_table, type_info,
1476 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1479 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1483 arg.v_pointer = hash_table;
1486 g_base_info_unref ( (GIBaseInfo *) key_type_info);
1487 g_base_info_unref ( (GIBaseInfo *) value_type_info);
1492 case GI_TYPE_TAG_ERROR:
1493 PyErr_SetString (PyExc_NotImplementedError, "error marshalling is not supported yet");
1502 * _pygi_argument_to_object:
1503 * @arg: The argument to convert to an object.
1504 * @type_info: Type info for @arg
1507 * If the argument is of type array, it must be encoded in a GArray, by calling
1508 * _pygi_argument_to_array(). This logic can not be folded into this method
1509 * as determining array lengths may require access to method call arguments.
1511 * Returns: A PyObject representing @arg
1514 _pygi_argument_to_object (GIArgument *arg,
1515 GITypeInfo *type_info,
1516 GITransfer transfer)
1519 PyObject *object = NULL;
1521 type_tag = g_type_info_get_tag (type_info);
1523 case GI_TYPE_TAG_VOID:
1524 if (g_type_info_is_pointer (type_info) &&
1525 (arg->v_pointer != NULL)) {
1526 /* Raw Python objects are passed to void* args */
1527 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1528 object = arg->v_pointer;
1531 Py_XINCREF (object);
1533 case GI_TYPE_TAG_BOOLEAN:
1535 object = PyBool_FromLong (arg->v_boolean);
1538 case GI_TYPE_TAG_INT8:
1540 object = PYGLIB_PyLong_FromLong (arg->v_int8);
1543 case GI_TYPE_TAG_UINT8:
1545 object = PYGLIB_PyLong_FromLong (arg->v_uint8);
1548 case GI_TYPE_TAG_INT16:
1550 object = PYGLIB_PyLong_FromLong (arg->v_int16);
1553 case GI_TYPE_TAG_UINT16:
1555 object = PYGLIB_PyLong_FromLong (arg->v_uint16);
1558 case GI_TYPE_TAG_INT32:
1560 object = PYGLIB_PyLong_FromLong (arg->v_int32);
1563 case GI_TYPE_TAG_UINT32:
1565 object = PyLong_FromLongLong (arg->v_uint32);
1568 case GI_TYPE_TAG_INT64:
1570 object = PyLong_FromLongLong (arg->v_int64);
1573 case GI_TYPE_TAG_UINT64:
1575 object = PyLong_FromUnsignedLongLong (arg->v_uint64);
1578 case GI_TYPE_TAG_FLOAT:
1580 object = PyFloat_FromDouble (arg->v_float);
1583 case GI_TYPE_TAG_DOUBLE:
1585 object = PyFloat_FromDouble (arg->v_double);
1588 case GI_TYPE_TAG_GTYPE:
1590 object = pyg_type_wrapper_new ( (GType) arg->v_long);
1593 case GI_TYPE_TAG_UNICHAR:
1595 /* Preserve the bidirectional mapping between 0 and "" */
1596 if (arg->v_uint32 == 0) {
1597 object = PYGLIB_PyUnicode_FromString ("");
1598 } else if (g_unichar_validate (arg->v_uint32)) {
1602 bytes = g_unichar_to_utf8 (arg->v_uint32, utf8);
1603 object = PYGLIB_PyUnicode_FromStringAndSize ((char*)utf8, bytes);
1605 /* TODO: Convert the error to an exception. */
1606 PyErr_Format (PyExc_TypeError,
1607 "Invalid unicode codepoint %" G_GUINT32_FORMAT,
1614 case GI_TYPE_TAG_UTF8:
1615 if (arg->v_string == NULL) {
1621 object = PYGLIB_PyUnicode_FromString (arg->v_string);
1623 case GI_TYPE_TAG_FILENAME:
1625 GError *error = NULL;
1628 if (arg->v_string == NULL) {
1634 string = g_filename_to_utf8 (arg->v_string, -1, NULL, NULL, &error);
1635 if (string == NULL) {
1636 PyErr_SetString (PyExc_Exception, error->message);
1637 /* TODO: Convert the error to an exception. */
1641 object = PYGLIB_PyUnicode_FromString (string);
1647 case GI_TYPE_TAG_ARRAY:
1649 /* Arrays are assumed to be packed in a GArray */
1651 GITypeInfo *item_type_info;
1652 GITypeTag item_type_tag;
1653 GITransfer item_transfer;
1656 if (arg->v_pointer == NULL)
1657 return PyList_New (0);
1659 item_type_info = g_type_info_get_param_type (type_info, 0);
1660 g_assert (item_type_info != NULL);
1662 item_type_tag = g_type_info_get_tag (item_type_info);
1663 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1665 array = arg->v_pointer;
1666 item_size = g_array_get_element_size (array);
1668 if (G_UNLIKELY (item_size > sizeof(GIArgument))) {
1669 g_critical ("Stack overflow protection. "
1670 "Can't copy array element into GIArgument.");
1671 return PyList_New (0);
1674 if (item_type_tag == GI_TYPE_TAG_UINT8) {
1675 /* Return as a byte array */
1676 object = PYGLIB_PyBytes_FromStringAndSize (array->data, array->len);
1678 object = PyList_New (array->len);
1679 if (object == NULL) {
1680 g_critical ("Failure to allocate array for %u items", array->len);
1681 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1685 for (i = 0; i < array->len; i++) {
1686 GIArgument item = { 0 };
1689 memcpy (&item, array->data + i * item_size, item_size);
1691 py_item = _pygi_argument_to_object (&item, item_type_info, item_transfer);
1692 if (py_item == NULL) {
1694 _PyGI_ERROR_PREFIX ("Item %zu: ", i);
1698 PyList_SET_ITEM (object, i, py_item);
1702 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1705 case GI_TYPE_TAG_INTERFACE:
1708 GIInfoType info_type;
1710 info = g_type_info_get_interface (type_info);
1711 info_type = g_base_info_get_type (info);
1713 switch (info_type) {
1714 case GI_INFO_TYPE_CALLBACK:
1716 g_assert_not_reached();
1718 case GI_INFO_TYPE_BOXED:
1719 case GI_INFO_TYPE_STRUCT:
1720 case GI_INFO_TYPE_UNION:
1724 if (arg->v_pointer == NULL) {
1730 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1731 if (g_type_is_a (type, G_TYPE_VALUE)) {
1732 object = pyg_value_as_pyobject (arg->v_pointer, FALSE);
1733 } else if (g_struct_info_is_foreign (info)) {
1734 object = pygi_struct_foreign_convert_from_g_argument (info, arg->v_pointer);
1735 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
1738 py_type = _pygi_type_get_from_g_type (type);
1739 if (py_type == NULL)
1742 object = _pygi_boxed_new ( (PyTypeObject *) py_type, arg->v_pointer, transfer == GI_TRANSFER_EVERYTHING);
1744 Py_DECREF (py_type);
1745 } else if (g_type_is_a (type, G_TYPE_POINTER)) {
1748 py_type = _pygi_type_get_from_g_type (type);
1750 if (py_type == NULL || !PyType_IsSubtype ( (PyTypeObject *) type, &PyGIStruct_Type)) {
1751 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1752 object = pyg_pointer_new (type, arg->v_pointer);
1754 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer, transfer == GI_TRANSFER_EVERYTHING);
1757 Py_XDECREF (py_type);
1758 } else if (type == G_TYPE_VARIANT) {
1761 g_variant_ref_sink (arg->v_pointer);
1762 py_type = _pygi_type_import_by_gi_info (info);
1763 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer,
1764 transfer == GI_TRANSFER_EVERYTHING);
1765 } else if (type == G_TYPE_NONE) {
1768 py_type = _pygi_type_import_by_gi_info (info);
1769 if (py_type == NULL) {
1773 /* Only structs created in invoke can be safely marked
1774 * GI_TRANSFER_EVERYTHING. Trust that invoke has
1775 * filtered correctly
1777 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer,
1778 transfer == GI_TRANSFER_EVERYTHING);
1780 Py_DECREF (py_type);
1782 PyErr_Format (PyExc_NotImplementedError, "structure type '%s' is not supported yet", g_type_name (type));
1787 case GI_INFO_TYPE_ENUM:
1788 case GI_INFO_TYPE_FLAGS:
1792 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1794 if (type == G_TYPE_NONE) {
1795 /* An enum with a GType of None is an enum without GType */
1796 PyObject *py_type = _pygi_type_import_by_gi_info (info);
1797 PyObject *py_args = NULL;
1802 py_args = PyTuple_New (1);
1803 if (PyTuple_SetItem (py_args, 0, PyLong_FromLong (arg->v_int)) != 0) {
1804 Py_DECREF (py_args);
1805 Py_DECREF (py_type);
1809 object = PyObject_CallFunction (py_type, "i", arg->v_int);
1811 Py_DECREF (py_args);
1812 Py_DECREF (py_type);
1814 } else if (info_type == GI_INFO_TYPE_ENUM) {
1815 object = pyg_enum_from_gtype (type, arg->v_int);
1817 object = pyg_flags_from_gtype (type, arg->v_int);
1822 case GI_INFO_TYPE_INTERFACE:
1823 case GI_INFO_TYPE_OBJECT:
1824 if (arg->v_pointer == NULL) {
1830 if (G_IS_PARAM_SPEC (arg->v_pointer)) {
1831 object = pyg_param_spec_new (arg->v_pointer);
1835 /* since we will unref the object when the
1836 * wrapper is destroyed and we don't want
1837 * GTK removing the object while the
1838 * wrapper is live, we take a gobject reference
1839 * when one is not transfered to us
1841 if (transfer == GI_TRANSFER_NOTHING)
1842 g_object_ref (G_OBJECT(arg->v_pointer));
1844 object = pygobject_new (arg->v_pointer);
1847 g_assert_not_reached();
1850 g_base_info_unref (info);
1853 case GI_TYPE_TAG_GLIST:
1854 case GI_TYPE_TAG_GSLIST:
1858 GITypeInfo *item_type_info;
1859 GITransfer item_transfer;
1862 list = arg->v_pointer;
1863 length = g_slist_length (list);
1865 object = PyList_New (length);
1866 if (object == NULL) {
1870 item_type_info = g_type_info_get_param_type (type_info, 0);
1871 g_assert (item_type_info != NULL);
1873 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1875 for (i = 0; list != NULL; list = g_slist_next (list), i++) {
1879 item.v_pointer = list->data;
1881 py_item = _pygi_argument_to_object (&item, item_type_info, item_transfer);
1882 if (py_item == NULL) {
1884 _PyGI_ERROR_PREFIX ("Item %zu: ", i);
1888 PyList_SET_ITEM (object, i, py_item);
1891 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1894 case GI_TYPE_TAG_GHASH:
1896 GITypeInfo *key_type_info;
1897 GITypeInfo *value_type_info;
1898 GITransfer item_transfer;
1899 GHashTableIter hash_table_iter;
1903 if (arg->v_pointer == NULL) {
1909 object = PyDict_New();
1910 if (object == NULL) {
1914 key_type_info = g_type_info_get_param_type (type_info, 0);
1915 g_assert (key_type_info != NULL);
1916 g_assert (g_type_info_get_tag (key_type_info) != GI_TYPE_TAG_VOID);
1918 value_type_info = g_type_info_get_param_type (type_info, 1);
1919 g_assert (value_type_info != NULL);
1920 g_assert (g_type_info_get_tag (value_type_info) != GI_TYPE_TAG_VOID);
1922 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1924 g_hash_table_iter_init (&hash_table_iter, (GHashTable *) arg->v_pointer);
1925 while (g_hash_table_iter_next (&hash_table_iter, &key.v_pointer, &value.v_pointer)) {
1930 py_key = _pygi_argument_to_object (&key, key_type_info, item_transfer);
1931 if (py_key == NULL) {
1935 _pygi_hash_pointer_to_arg (&value, g_type_info_get_tag (value_type_info));
1936 py_value = _pygi_argument_to_object (&value, value_type_info, item_transfer);
1937 if (py_value == NULL) {
1942 retval = PyDict_SetItem (object, py_key, py_value);
1945 Py_DECREF (py_value);
1953 g_base_info_unref ( (GIBaseInfo *) key_type_info);
1954 g_base_info_unref ( (GIBaseInfo *) value_type_info);
1957 case GI_TYPE_TAG_ERROR:
1959 GError *error = (GError *) arg->v_pointer;
1960 if (error != NULL && transfer == GI_TRANSFER_NOTHING) {
1961 /* If we have not been transferred the ownership we must copy
1962 * the error, because pyglib_error_check() is going to free it.
1964 error = g_error_copy (error);
1967 if (pyglib_error_check (&error)) {
1969 PyObject *err_value;
1970 PyObject *err_trace;
1971 PyErr_Fetch (&err_type, &err_value, &err_trace);
1972 Py_XDECREF (err_type);
1973 Py_XDECREF (err_trace);
1988 _pygi_argument_from_g_value(const GValue *value,
1989 GITypeInfo *type_info)
1991 GIArgument arg = { 0, };
1993 GITypeTag type_tag = g_type_info_get_tag (type_info);
1995 case GI_TYPE_TAG_BOOLEAN:
1996 arg.v_boolean = g_value_get_boolean (value);
1998 case GI_TYPE_TAG_INT8:
1999 case GI_TYPE_TAG_INT16:
2000 case GI_TYPE_TAG_INT32:
2001 arg.v_int = g_value_get_int (value);
2003 case GI_TYPE_TAG_INT64:
2004 arg.v_int64 = g_value_get_int64 (value);
2006 case GI_TYPE_TAG_UINT8:
2007 case GI_TYPE_TAG_UINT16:
2008 case GI_TYPE_TAG_UINT32:
2009 arg.v_uint = g_value_get_uint (value);
2011 case GI_TYPE_TAG_UINT64:
2012 arg.v_uint64 = g_value_get_uint64 (value);
2014 case GI_TYPE_TAG_UNICHAR:
2015 arg.v_uint32 = g_value_get_schar (value);
2017 case GI_TYPE_TAG_FLOAT:
2018 arg.v_float = g_value_get_float (value);
2020 case GI_TYPE_TAG_DOUBLE:
2021 arg.v_double = g_value_get_double (value);
2023 case GI_TYPE_TAG_GTYPE:
2024 arg.v_long = g_value_get_gtype (value);
2026 case GI_TYPE_TAG_UTF8:
2027 case GI_TYPE_TAG_FILENAME:
2028 arg.v_string = g_value_dup_string (value);
2030 case GI_TYPE_TAG_GLIST:
2031 case GI_TYPE_TAG_GSLIST:
2032 arg.v_pointer = g_value_get_pointer (value);
2034 case GI_TYPE_TAG_ARRAY:
2035 case GI_TYPE_TAG_GHASH:
2036 arg.v_pointer = g_value_get_boxed (value);
2038 case GI_TYPE_TAG_INTERFACE:
2041 GIInfoType info_type;
2043 info = g_type_info_get_interface (type_info);
2044 info_type = g_base_info_get_type (info);
2046 g_base_info_unref (info);
2048 switch (info_type) {
2049 case GI_INFO_TYPE_FLAGS:
2050 arg.v_long = g_value_get_flags (value);
2052 case GI_INFO_TYPE_ENUM:
2053 arg.v_long = g_value_get_enum (value);
2055 case GI_INFO_TYPE_INTERFACE:
2056 case GI_INFO_TYPE_OBJECT:
2057 if (G_VALUE_HOLDS_PARAM (value))
2058 arg.v_pointer = g_value_get_param (value);
2060 arg.v_pointer = g_value_get_object (value);
2062 case GI_INFO_TYPE_BOXED:
2063 case GI_INFO_TYPE_STRUCT:
2064 case GI_INFO_TYPE_UNION:
2065 if (G_VALUE_HOLDS(value, G_TYPE_BOXED)) {
2066 arg.v_pointer = g_value_get_boxed (value);
2067 } else if (G_VALUE_HOLDS(value, G_TYPE_VARIANT)) {
2068 arg.v_pointer = g_value_get_variant (value);
2070 arg.v_pointer = g_value_get_pointer (value);
2074 g_warning("Converting of type '%s' is not implemented", g_info_type_to_string(info_type));
2075 g_assert_not_reached();
2079 case GI_TYPE_TAG_ERROR:
2080 arg.v_pointer = g_value_get_boxed (value);
2082 case GI_TYPE_TAG_VOID:
2083 g_critical("Converting of type '%s' is not implemented", g_type_tag_to_string(type_tag));
2084 g_assert_not_reached();
2091 _pygi_argument_release (GIArgument *arg,
2092 GITypeInfo *type_info,
2093 GITransfer transfer,
2094 GIDirection direction)
2097 gboolean is_out = (direction == GI_DIRECTION_OUT || direction == GI_DIRECTION_INOUT);
2099 type_tag = g_type_info_get_tag (type_info);
2102 case GI_TYPE_TAG_VOID:
2103 /* Don't do anything, it's transparent to the C side */
2105 case GI_TYPE_TAG_BOOLEAN:
2106 case GI_TYPE_TAG_INT8:
2107 case GI_TYPE_TAG_UINT8:
2108 case GI_TYPE_TAG_INT16:
2109 case GI_TYPE_TAG_UINT16:
2110 case GI_TYPE_TAG_INT32:
2111 case GI_TYPE_TAG_UINT32:
2112 case GI_TYPE_TAG_INT64:
2113 case GI_TYPE_TAG_UINT64:
2114 case GI_TYPE_TAG_FLOAT:
2115 case GI_TYPE_TAG_DOUBLE:
2116 case GI_TYPE_TAG_GTYPE:
2117 case GI_TYPE_TAG_UNICHAR:
2119 case GI_TYPE_TAG_FILENAME:
2120 case GI_TYPE_TAG_UTF8:
2121 /* With allow-none support the string could be NULL */
2122 if ((arg->v_string != NULL &&
2123 (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING))
2124 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2125 g_free (arg->v_string);
2128 case GI_TYPE_TAG_ARRAY:
2133 if (arg->v_pointer == NULL) {
2137 array = arg->v_pointer;
2139 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
2140 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2141 GITypeInfo *item_type_info;
2142 GITransfer item_transfer;
2144 item_type_info = g_type_info_get_param_type (type_info, 0);
2146 item_transfer = direction == GI_DIRECTION_IN ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING;
2148 /* Free the items */
2149 for (i = 0; i < array->len; i++) {
2151 item = &_g_array_index (array, GIArgument, i);
2152 _pygi_argument_release (item, item_type_info, item_transfer, direction);
2155 g_base_info_unref ( (GIBaseInfo *) item_type_info);
2158 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2159 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2160 g_array_free (array, TRUE);
2165 case GI_TYPE_TAG_INTERFACE:
2168 GIInfoType info_type;
2170 info = g_type_info_get_interface (type_info);
2171 info_type = g_base_info_get_type (info);
2173 switch (info_type) {
2174 case GI_INFO_TYPE_CALLBACK:
2177 case GI_INFO_TYPE_BOXED:
2178 case GI_INFO_TYPE_STRUCT:
2179 case GI_INFO_TYPE_UNION:
2183 if (arg->v_pointer == NULL) {
2187 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
2189 if (g_type_is_a (type, G_TYPE_VALUE)) {
2192 value = arg->v_pointer;
2194 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
2195 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2196 g_value_unset (value);
2199 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2200 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2201 g_slice_free (GValue, value);
2203 } else if (g_type_is_a (type, G_TYPE_CLOSURE)) {
2204 if (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING) {
2205 g_closure_unref (arg->v_pointer);
2207 } else if (g_struct_info_is_foreign ( (GIStructInfo*) info)) {
2208 if (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING) {
2209 pygi_struct_foreign_release (info, arg->v_pointer);
2211 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
2212 } else if (g_type_is_a (type, G_TYPE_POINTER) || type == G_TYPE_NONE) {
2213 g_warn_if_fail (!g_type_info_is_pointer (type_info) || transfer == GI_TRANSFER_NOTHING);
2218 case GI_INFO_TYPE_ENUM:
2219 case GI_INFO_TYPE_FLAGS:
2221 case GI_INFO_TYPE_INTERFACE:
2222 case GI_INFO_TYPE_OBJECT:
2223 if (arg->v_pointer == NULL) {
2226 if (is_out && transfer == GI_TRANSFER_EVERYTHING) {
2227 g_object_unref (arg->v_pointer);
2231 g_assert_not_reached();
2234 g_base_info_unref (info);
2237 case GI_TYPE_TAG_GLIST:
2238 case GI_TYPE_TAG_GSLIST:
2242 if (arg->v_pointer == NULL) {
2246 list = arg->v_pointer;
2248 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
2249 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2250 GITypeInfo *item_type_info;
2251 GITransfer item_transfer;
2254 item_type_info = g_type_info_get_param_type (type_info, 0);
2255 g_assert (item_type_info != NULL);
2257 item_transfer = direction == GI_DIRECTION_IN ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING;
2259 /* Free the items */
2260 for (item = list; item != NULL; item = g_slist_next (item)) {
2261 _pygi_argument_release ( (GIArgument *) &item->data, item_type_info,
2262 item_transfer, direction);
2265 g_base_info_unref ( (GIBaseInfo *) item_type_info);
2268 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2269 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2270 if (type_tag == GI_TYPE_TAG_GLIST) {
2271 g_list_free ( (GList *) list);
2273 /* type_tag == GI_TYPE_TAG_GSLIST */
2274 g_slist_free (list);
2280 case GI_TYPE_TAG_GHASH:
2282 GHashTable *hash_table;
2284 if (arg->v_pointer == NULL) {
2288 hash_table = arg->v_pointer;
2290 if (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING) {
2291 /* We created the table without a destroy function, so keys and
2292 * values need to be released. */
2293 GITypeInfo *key_type_info;
2294 GITypeInfo *value_type_info;
2295 GITransfer item_transfer;
2296 GHashTableIter hash_table_iter;
2300 key_type_info = g_type_info_get_param_type (type_info, 0);
2301 g_assert (key_type_info != NULL);
2303 value_type_info = g_type_info_get_param_type (type_info, 1);
2304 g_assert (value_type_info != NULL);
2306 if (direction == GI_DIRECTION_IN) {
2307 item_transfer = GI_TRANSFER_NOTHING;
2309 item_transfer = GI_TRANSFER_EVERYTHING;
2312 g_hash_table_iter_init (&hash_table_iter, hash_table);
2313 while (g_hash_table_iter_next (&hash_table_iter, &key, &value)) {
2314 _pygi_argument_release ( (GIArgument *) &key, key_type_info,
2315 item_transfer, direction);
2316 _pygi_argument_release ( (GIArgument *) &value, value_type_info,
2317 item_transfer, direction);
2320 g_base_info_unref ( (GIBaseInfo *) key_type_info);
2321 g_base_info_unref ( (GIBaseInfo *) value_type_info);
2322 } else if (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_CONTAINER) {
2323 /* Be careful to avoid keys and values being freed if the
2324 * callee gave a destroy function. */
2325 g_hash_table_steal_all (hash_table);
2328 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2329 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2330 g_hash_table_unref (hash_table);
2335 case GI_TYPE_TAG_ERROR:
2339 if (arg->v_pointer == NULL) {
2343 error = * (GError **) arg->v_pointer;
2345 if (error != NULL) {
2346 g_error_free (error);
2349 g_slice_free (GError *, arg->v_pointer);
2356 _pygi_argument_init (void)
2359 _pygobject_import();