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 _pygi_g_type_tag_py_bounds (GITypeTag type_tag,
40 case GI_TYPE_TAG_INT8:
41 *lower = PYGLIB_PyLong_FromLong (-128);
42 *upper = PYGLIB_PyLong_FromLong (127);
44 case GI_TYPE_TAG_UINT8:
45 *upper = PYGLIB_PyLong_FromLong (255);
46 *lower = PYGLIB_PyLong_FromLong (0);
48 case GI_TYPE_TAG_INT16:
49 *lower = PYGLIB_PyLong_FromLong (-32768);
50 *upper = PYGLIB_PyLong_FromLong (32767);
52 case GI_TYPE_TAG_UINT16:
53 *upper = PYGLIB_PyLong_FromLong (65535);
54 *lower = PYGLIB_PyLong_FromLong (0);
56 case GI_TYPE_TAG_INT32:
57 *lower = PYGLIB_PyLong_FromLong (G_MININT32);
58 *upper = PYGLIB_PyLong_FromLong (G_MAXINT32);
60 case GI_TYPE_TAG_UINT32:
61 /* Note: On 32-bit archs, this number doesn't fit in a long. */
62 *upper = PyLong_FromLongLong (G_MAXUINT32);
63 *lower = PYGLIB_PyLong_FromLong (0);
65 case GI_TYPE_TAG_INT64:
66 /* Note: On 32-bit archs, these numbers don't fit in a long. */
67 *lower = PyLong_FromLongLong (G_MININT64);
68 *upper = PyLong_FromLongLong (G_MAXINT64);
70 case GI_TYPE_TAG_UINT64:
71 *upper = PyLong_FromUnsignedLongLong (G_MAXUINT64);
72 *lower = PYGLIB_PyLong_FromLong (0);
74 case GI_TYPE_TAG_FLOAT:
75 *upper = PyFloat_FromDouble (G_MAXFLOAT);
76 *lower = PyFloat_FromDouble (-G_MAXFLOAT);
78 case GI_TYPE_TAG_DOUBLE:
79 *upper = PyFloat_FromDouble (G_MAXDOUBLE);
80 *lower = PyFloat_FromDouble (-G_MAXDOUBLE);
83 PyErr_SetString (PyExc_TypeError, "Non-numeric type tag");
84 *lower = *upper = NULL;
90 _pygi_g_registered_type_info_check_object (GIRegisteredTypeInfo *info,
98 gchar *type_name_expected = NULL;
99 GIInfoType interface_type;
101 interface_type = g_base_info_get_type (info);
102 if ( (interface_type == GI_INFO_TYPE_STRUCT) &&
103 (g_struct_info_is_foreign ( (GIStructInfo*) info))) {
104 /* TODO: Could we check is the correct foreign type? */
108 g_type = g_registered_type_info_get_g_type (info);
109 if (g_type != G_TYPE_NONE) {
110 py_type = _pygi_type_get_from_g_type (g_type);
112 py_type = _pygi_type_import_by_gi_info ( (GIBaseInfo *) info);
115 if (py_type == NULL) {
119 g_assert (PyType_Check (py_type));
122 retval = PyObject_IsInstance (object, py_type);
124 type_name_expected = _pygi_g_base_info_get_fullname (
125 (GIBaseInfo *) info);
128 if (!PyObject_Type (py_type)) {
129 type_name_expected = "type";
131 } else if (!PyType_IsSubtype ( (PyTypeObject *) object,
132 (PyTypeObject *) py_type)) {
133 type_name_expected = _pygi_g_base_info_get_fullname (
134 (GIBaseInfo *) info);
144 PyTypeObject *object_type;
146 if (type_name_expected == NULL) {
150 object_type = (PyTypeObject *) PyObject_Type (object);
151 if (object_type == NULL) {
155 PyErr_Format (PyExc_TypeError, "Must be %s, not %s",
156 type_name_expected, object_type->tp_name);
158 g_free (type_name_expected);
165 _pygi_g_type_interface_check_object (GIBaseInfo *info,
169 GIInfoType info_type;
171 info_type = g_base_info_get_type (info);
173 case GI_INFO_TYPE_CALLBACK:
174 if (!PyCallable_Check (object)) {
175 PyErr_Format (PyExc_TypeError, "Must be callable, not %s",
176 object->ob_type->tp_name);
180 case GI_INFO_TYPE_ENUM:
182 if (PyNumber_Check (object)) {
183 PyObject *number = PYGLIB_PyNumber_Long (object);
187 glong value = PYGLIB_PyLong_AsLong (number);
189 for (i = 0; i < g_enum_info_get_n_values (info); i++) {
190 GIValueInfo *value_info = g_enum_info_get_value (info, i);
191 glong enum_value = g_value_info_get_value (value_info);
192 g_base_info_unref (value_info);
193 if (value == enum_value) {
201 retval = _pygi_g_registered_type_info_check_object (
202 (GIRegisteredTypeInfo *) info, TRUE, object);
204 case GI_INFO_TYPE_FLAGS:
205 if (PyNumber_Check (object)) {
206 /* Accept 0 as a valid flag value */
207 PyObject *number = PYGLIB_PyNumber_Long (object);
211 long value = PYGLIB_PyLong_AsLong (number);
214 else if (value == -1)
218 retval = _pygi_g_registered_type_info_check_object (
219 (GIRegisteredTypeInfo *) info, TRUE, object);
221 case GI_INFO_TYPE_STRUCT:
225 /* Handle special cases. */
226 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
227 if (g_type_is_a (type, G_TYPE_CLOSURE)) {
228 if (!(PyCallable_Check (object) ||
229 pyg_type_from_object_strict (object, FALSE) == G_TYPE_CLOSURE)) {
230 PyErr_Format (PyExc_TypeError, "Must be callable, not %s",
231 object->ob_type->tp_name);
235 } else if (g_type_is_a (type, G_TYPE_VALUE)) {
236 /* we can't check g_values because we don't have
237 * enough context so just pass them through */
243 case GI_INFO_TYPE_BOXED:
244 case GI_INFO_TYPE_INTERFACE:
245 case GI_INFO_TYPE_OBJECT:
246 retval = _pygi_g_registered_type_info_check_object ( (GIRegisteredTypeInfo *) info, TRUE, object);
248 case GI_INFO_TYPE_UNION:
251 retval = _pygi_g_registered_type_info_check_object ( (GIRegisteredTypeInfo *) info, TRUE, object);
253 /* If not the same type then check to see if the object's type
254 * is the same as one of the union's members
260 n_fields = g_union_info_get_n_fields ( (GIUnionInfo *) info);
262 for (i = 0; i < n_fields; i++) {
264 GIFieldInfo *field_info;
265 GITypeInfo *field_type_info;
268 g_union_info_get_field ( (GIUnionInfo *) info, i);
269 field_type_info = g_field_info_get_type (field_info);
271 member_retval = _pygi_g_type_info_check_object(
276 g_base_info_unref ( ( GIBaseInfo *) field_type_info);
277 g_base_info_unref ( ( GIBaseInfo *) field_info);
279 if (member_retval == 1) {
280 retval = member_retval;
288 g_assert_not_reached();
295 _pygi_g_type_info_check_object (GITypeInfo *type_info,
302 if (allow_none && object == Py_None) {
306 type_tag = g_type_info_get_tag (type_info);
309 case GI_TYPE_TAG_VOID:
310 /* No check; VOID means undefined type */
312 case GI_TYPE_TAG_BOOLEAN:
313 /* No check; every Python object has a truth value. */
315 case GI_TYPE_TAG_UINT8:
316 /* UINT8 types can be characters */
317 if (PYGLIB_PyBytes_Check(object)) {
318 if (PYGLIB_PyBytes_Size(object) != 1) {
319 PyErr_Format (PyExc_TypeError, "Must be a single character");
326 case GI_TYPE_TAG_INT8:
327 case GI_TYPE_TAG_INT16:
328 case GI_TYPE_TAG_UINT16:
329 case GI_TYPE_TAG_INT32:
330 case GI_TYPE_TAG_UINT32:
331 case GI_TYPE_TAG_INT64:
332 case GI_TYPE_TAG_UINT64:
333 case GI_TYPE_TAG_FLOAT:
334 case GI_TYPE_TAG_DOUBLE:
336 PyObject *number, *lower, *upper;
338 if (!PyNumber_Check (object)) {
339 PyErr_Format (PyExc_TypeError, "Must be number, not %s",
340 object->ob_type->tp_name);
345 if (type_tag == GI_TYPE_TAG_FLOAT || type_tag == GI_TYPE_TAG_DOUBLE) {
346 number = PyNumber_Float (object);
348 number = PYGLIB_PyNumber_Long (object);
351 _pygi_g_type_tag_py_bounds (type_tag, &lower, &upper);
353 if (lower == NULL || upper == NULL || number == NULL) {
355 goto check_number_release;
359 if (PyObject_RichCompareBool (lower, number, Py_GT)
360 || PyObject_RichCompareBool (upper, number, Py_LT)) {
364 if (PyErr_Occurred()) {
366 goto check_number_release;
369 lower_str = PyObject_Str (lower);
370 upper_str = PyObject_Str (upper);
371 if (lower_str == NULL || upper_str == NULL) {
373 goto check_number_error_release;
376 #if PY_VERSION_HEX < 0x03000000
377 PyErr_Format (PyExc_ValueError, "Must range from %s to %s",
378 PyString_AS_STRING (lower_str),
379 PyString_AS_STRING (upper_str));
382 PyObject *lower_pybytes_obj = PyUnicode_AsUTF8String (lower_str);
383 if (!lower_pybytes_obj)
386 PyObject *upper_pybytes_obj = PyUnicode_AsUTF8String (upper_str);
387 if (!upper_pybytes_obj) {
388 Py_DECREF(lower_pybytes_obj);
392 PyErr_Format (PyExc_ValueError, "Must range from %s to %s",
393 PyBytes_AsString (lower_pybytes_obj),
394 PyBytes_AsString (upper_pybytes_obj));
395 Py_DECREF (lower_pybytes_obj);
396 Py_DECREF (upper_pybytes_obj);
402 check_number_error_release:
403 Py_XDECREF (lower_str);
404 Py_XDECREF (upper_str);
407 check_number_release:
413 case GI_TYPE_TAG_GTYPE:
415 if (pyg_type_from_object (object) == 0) {
416 PyErr_Format (PyExc_TypeError, "Must be gobject.GType, not %s",
417 object->ob_type->tp_name);
422 case GI_TYPE_TAG_UNICHAR:
425 if (PyUnicode_Check (object)) {
426 size = PyUnicode_GET_SIZE (object);
427 #if PY_VERSION_HEX < 0x03000000
428 } else if (PyString_Check (object)) {
429 PyObject *pyuni = PyUnicode_FromEncodedObject (object, "UTF-8", "strict");
430 size = PyUnicode_GET_SIZE (pyuni);
434 PyErr_Format (PyExc_TypeError, "Must be string, not %s",
435 object->ob_type->tp_name);
441 PyErr_Format (PyExc_TypeError, "Must be a one character string, not %ld characters",
449 case GI_TYPE_TAG_UTF8:
450 case GI_TYPE_TAG_FILENAME:
451 if (!PYGLIB_PyBaseString_Check (object) ) {
452 PyErr_Format (PyExc_TypeError, "Must be string, not %s",
453 object->ob_type->tp_name);
457 case GI_TYPE_TAG_ARRAY:
461 GITypeInfo *item_type_info;
464 if (!PySequence_Check (object)) {
465 PyErr_Format (PyExc_TypeError, "Must be sequence, not %s",
466 object->ob_type->tp_name);
471 length = PySequence_Length (object);
477 fixed_size = g_type_info_get_array_fixed_size (type_info);
478 if (fixed_size >= 0 && length != fixed_size) {
479 PyErr_Format (PyExc_ValueError, "Must contain %zd items, not %zd",
485 item_type_info = g_type_info_get_param_type (type_info, 0);
486 g_assert (item_type_info != NULL);
488 /* FIXME: This is insain. We really should only check the first
489 * object and perhaps have a debugging mode. Large arrays
490 * will cause apps to slow to a crawl.
492 for (i = 0; i < length; i++) {
495 item = PySequence_GetItem (object, i);
501 retval = _pygi_g_type_info_check_object (item_type_info, item, TRUE);
509 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
514 g_base_info_unref ( (GIBaseInfo *) item_type_info);
518 case GI_TYPE_TAG_INTERFACE:
522 info = g_type_info_get_interface (type_info);
523 g_assert (info != NULL);
525 retval = _pygi_g_type_interface_check_object(info, object);
527 g_base_info_unref (info);
530 case GI_TYPE_TAG_GLIST:
531 case GI_TYPE_TAG_GSLIST:
534 GITypeInfo *item_type_info;
537 if (!PySequence_Check (object)) {
538 PyErr_Format (PyExc_TypeError, "Must be sequence, not %s",
539 object->ob_type->tp_name);
544 length = PySequence_Length (object);
550 item_type_info = g_type_info_get_param_type (type_info, 0);
551 g_assert (item_type_info != NULL);
553 for (i = 0; i < length; i++) {
556 item = PySequence_GetItem (object, i);
562 retval = _pygi_g_type_info_check_object (item_type_info, item, TRUE);
570 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
575 g_base_info_unref ( (GIBaseInfo *) item_type_info);
578 case GI_TYPE_TAG_GHASH:
583 GITypeInfo *key_type_info;
584 GITypeInfo *value_type_info;
587 keys = PyMapping_Keys (object);
589 PyErr_Format (PyExc_TypeError, "Must be mapping, not %s",
590 object->ob_type->tp_name);
595 length = PyMapping_Length (object);
602 values = PyMapping_Values (object);
603 if (values == NULL) {
609 key_type_info = g_type_info_get_param_type (type_info, 0);
610 g_assert (key_type_info != NULL);
612 value_type_info = g_type_info_get_param_type (type_info, 1);
613 g_assert (value_type_info != NULL);
615 for (i = 0; i < length; i++) {
619 key = PyList_GET_ITEM (keys, i);
620 value = PyList_GET_ITEM (values, i);
622 retval = _pygi_g_type_info_check_object (key_type_info, key, TRUE);
627 _PyGI_ERROR_PREFIX ("Key %zd :", i);
631 retval = _pygi_g_type_info_check_object (value_type_info, value, TRUE);
636 _PyGI_ERROR_PREFIX ("Value %zd :", i);
641 g_base_info_unref ( (GIBaseInfo *) key_type_info);
642 g_base_info_unref ( (GIBaseInfo *) value_type_info);
647 case GI_TYPE_TAG_ERROR:
648 PyErr_SetString (PyExc_NotImplementedError, "Error marshalling is not supported yet");
657 _pygi_argument_to_array (GIArgument *arg,
659 GITypeInfo *type_info,
662 GITypeInfo *item_type_info;
663 gboolean is_zero_terminated;
668 if (arg->v_pointer == NULL) {
672 is_zero_terminated = g_type_info_is_zero_terminated (type_info);
673 item_type_info = g_type_info_get_param_type (type_info, 0);
675 item_size = _pygi_g_type_info_size (item_type_info);
677 g_base_info_unref ( (GIBaseInfo *) item_type_info);
679 if (is_zero_terminated) {
680 length = g_strv_length (arg->v_pointer);
682 length = g_type_info_get_array_fixed_size (type_info);
686 length_arg_pos = g_type_info_get_array_length (type_info);
687 g_assert (length_arg_pos >= 0);
689 /* FIXME: Take into account the type of the argument. */
690 length = args[length_arg_pos]->v_int;
694 g_assert (length >= 0);
696 g_array = g_array_new (is_zero_terminated, FALSE, item_size);
698 g_array->data = arg->v_pointer;
699 g_array->len = length;
705 _pygi_argument_from_object (PyObject *object,
706 GITypeInfo *type_info,
712 memset(&arg, 0, sizeof(GIArgument));
713 type_tag = g_type_info_get_tag (type_info);
716 case GI_TYPE_TAG_VOID:
717 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
718 arg.v_pointer = object;
720 case GI_TYPE_TAG_BOOLEAN:
722 arg.v_boolean = PyObject_IsTrue (object);
725 case GI_TYPE_TAG_UINT8:
726 if (PYGLIB_PyBytes_Check(object)) {
727 arg.v_long = (long)(PYGLIB_PyBytes_AsString(object)[0]);
731 case GI_TYPE_TAG_INT8:
732 case GI_TYPE_TAG_INT16:
733 case GI_TYPE_TAG_UINT16:
734 case GI_TYPE_TAG_INT32:
738 int_ = PYGLIB_PyNumber_Long (object);
743 arg.v_long = PYGLIB_PyLong_AsLong (int_);
749 case GI_TYPE_TAG_UINT32:
750 case GI_TYPE_TAG_UINT64:
755 number = PYGLIB_PyNumber_Long (object);
756 if (number == NULL) {
760 #if PY_VERSION_HEX < 0x03000000
761 if (PyInt_Check (number)) {
762 value = PyInt_AS_LONG (number);
765 value = PyLong_AsUnsignedLongLong (number);
767 arg.v_uint64 = value;
773 case GI_TYPE_TAG_INT64:
778 number = PYGLIB_PyNumber_Long (object);
779 if (number == NULL) {
783 #if PY_VERSION_HEX < 0x03000000
784 if (PyInt_Check (number)) {
785 value = PyInt_AS_LONG (number);
788 value = PyLong_AsLongLong (number);
796 case GI_TYPE_TAG_FLOAT:
800 float_ = PyNumber_Float (object);
801 if (float_ == NULL) {
805 arg.v_float = (float) PyFloat_AsDouble (float_);
810 case GI_TYPE_TAG_DOUBLE:
814 float_ = PyNumber_Float (object);
815 if (float_ == NULL) {
819 arg.v_double = PyFloat_AsDouble (float_);
824 case GI_TYPE_TAG_GTYPE:
826 arg.v_long = pyg_type_from_object (object);
830 case GI_TYPE_TAG_UNICHAR:
834 if (object == Py_None) {
839 #if PY_VERSION_HEX < 0x03000000
840 if (PyUnicode_Check(object)) {
841 PyObject *pystr_obj = PyUnicode_AsUTF8String (object);
846 string = g_strdup(PyString_AsString (pystr_obj));
847 Py_DECREF(pystr_obj);
849 string = g_strdup(PyString_AsString (object));
853 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
857 string = g_strdup(PyBytes_AsString (pybytes_obj));
858 Py_DECREF (pybytes_obj);
862 arg.v_uint32 = g_utf8_get_char (string);
866 case GI_TYPE_TAG_UTF8:
870 if (object == Py_None) {
874 #if PY_VERSION_HEX < 0x03000000
875 if (PyUnicode_Check(object)) {
876 PyObject *pystr_obj = PyUnicode_AsUTF8String (object);
881 string = g_strdup(PyString_AsString (pystr_obj));
882 Py_DECREF(pystr_obj);
884 string = g_strdup(PyString_AsString (object));
888 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
892 string = g_strdup(PyBytes_AsString (pybytes_obj));
893 Py_DECREF (pybytes_obj);
896 arg.v_string = string;
900 case GI_TYPE_TAG_FILENAME:
902 GError *error = NULL;
905 #if PY_VERSION_HEX < 0x03000000
906 string = g_strdup(PyString_AsString (object));
909 PyObject *pybytes_obj = PyUnicode_AsUTF8String (object);
913 string = g_strdup(PyBytes_AsString (pybytes_obj));
914 Py_DECREF (pybytes_obj);
918 if (string == NULL) {
922 arg.v_string = g_filename_from_utf8 (string, -1, NULL, NULL, &error);
925 if (arg.v_string == NULL) {
926 PyErr_SetString (PyExc_Exception, error->message);
927 /* TODO: Convert the error to an exception. */
932 case GI_TYPE_TAG_ARRAY:
935 gboolean is_zero_terminated;
936 GITypeInfo *item_type_info;
939 GITransfer item_transfer;
942 if (object == Py_None) {
943 arg.v_pointer = NULL;
947 length = PySequence_Length (object);
952 is_zero_terminated = g_type_info_is_zero_terminated (type_info);
953 item_type_info = g_type_info_get_param_type (type_info, 0);
955 item_size = _pygi_g_type_info_size (item_type_info);
957 array = g_array_sized_new (is_zero_terminated, FALSE, item_size, length);
959 g_base_info_unref ( (GIBaseInfo *) item_type_info);
964 if (g_type_info_get_tag (item_type_info) == GI_TYPE_TAG_UINT8 &&
965 PYGLIB_PyBytes_Check(object)) {
967 memcpy(array->data, PYGLIB_PyBytes_AsString(object), length);
973 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
975 for (i = 0; i < length; i++) {
979 py_item = PySequence_GetItem (object, i);
980 if (py_item == NULL) {
981 goto array_item_error;
984 item = _pygi_argument_from_object (py_item, item_type_info, item_transfer);
988 if (PyErr_Occurred()) {
989 goto array_item_error;
992 g_array_insert_val (array, i, item);
996 /* Free everything we have converted so far. */
997 _pygi_argument_release ( (GIArgument *) &array, type_info,
998 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1001 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1006 arg.v_pointer = array;
1008 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1011 case GI_TYPE_TAG_INTERFACE:
1014 GIInfoType info_type;
1016 info = g_type_info_get_interface (type_info);
1017 info_type = g_base_info_get_type (info);
1019 switch (info_type) {
1020 case GI_INFO_TYPE_CALLBACK:
1021 /* This should be handled in invoke() */
1022 g_assert_not_reached();
1024 case GI_INFO_TYPE_BOXED:
1025 case GI_INFO_TYPE_STRUCT:
1026 case GI_INFO_TYPE_UNION:
1030 if (object == Py_None) {
1031 arg.v_pointer = NULL;
1035 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1037 /* Handle special cases first. */
1038 if (g_type_is_a (type, G_TYPE_VALUE)) {
1043 object_type = pyg_type_from_object_strict ( (PyObject *) object->ob_type, FALSE);
1044 if (object_type == G_TYPE_INVALID) {
1045 PyErr_SetString (PyExc_RuntimeError, "unable to retrieve object's GType");
1049 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1051 value = g_slice_new0 (GValue);
1053 /* if already a gvalue, copy, else marshal into gvalue */
1054 if (object_type == G_TYPE_VALUE) {
1055 /* src GValue's lifecycle is handled by Python
1056 * so we have to copy it into the destination's
1057 * GValue which is freed during the cleanup of
1060 GValue *src = (GValue *)((PyGObject *) object)->obj;
1061 g_value_init (value, G_VALUE_TYPE (src));
1062 g_value_copy(src, value);
1064 g_value_init (value, object_type);
1065 retval = pyg_value_from_pyobject (value, object);
1067 g_slice_free (GValue, value);
1068 PyErr_SetString (PyExc_RuntimeError, "PyObject conversion to GValue failed");
1073 arg.v_pointer = value;
1074 } else if (g_type_is_a (type, G_TYPE_CLOSURE)) {
1077 if (pyg_type_from_object_strict (object, FALSE) == G_TYPE_CLOSURE) {
1078 closure = (GClosure *)pyg_boxed_get (object, void);
1080 closure = pyg_closure_new (object, NULL, NULL);
1081 if (closure == NULL) {
1082 PyErr_SetString (PyExc_RuntimeError, "PyObject conversion to GClosure failed");
1087 arg.v_pointer = closure;
1088 } else if (g_struct_info_is_foreign (info)) {
1090 result = pygi_struct_foreign_convert_to_g_argument (
1091 object, info, transfer, &arg);
1092 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
1093 arg.v_pointer = pyg_boxed_get (object, void);
1094 if (transfer == GI_TRANSFER_EVERYTHING) {
1095 arg.v_pointer = g_boxed_copy (type, arg.v_pointer);
1097 } else if (g_type_is_a (type, G_TYPE_POINTER) ||
1098 g_type_is_a (type, G_TYPE_VARIANT) ||
1099 type == G_TYPE_NONE) {
1100 g_warn_if_fail (g_type_is_a (type, G_TYPE_VARIANT) || !g_type_info_is_pointer (type_info) || transfer == GI_TRANSFER_NOTHING);
1101 arg.v_pointer = pyg_pointer_get (object, void);
1103 PyErr_Format (PyExc_NotImplementedError, "structure type '%s' is not supported yet", g_type_name (type));
1108 case GI_INFO_TYPE_ENUM:
1109 case GI_INFO_TYPE_FLAGS:
1113 int_ = PYGLIB_PyNumber_Long (object);
1118 arg.v_long = PYGLIB_PyLong_AsLong (int_);
1124 case GI_INFO_TYPE_INTERFACE:
1125 case GI_INFO_TYPE_OBJECT:
1126 if (object == Py_None) {
1127 arg.v_pointer = NULL;
1131 arg.v_pointer = pygobject_get (object);
1132 if (transfer == GI_TRANSFER_EVERYTHING) {
1133 g_object_ref (arg.v_pointer);
1138 g_assert_not_reached();
1140 g_base_info_unref (info);
1143 case GI_TYPE_TAG_GLIST:
1144 case GI_TYPE_TAG_GSLIST:
1147 GITypeInfo *item_type_info;
1148 GSList *list = NULL;
1149 GITransfer item_transfer;
1152 if (object == Py_None) {
1153 arg.v_pointer = NULL;
1157 length = PySequence_Length (object);
1162 item_type_info = g_type_info_get_param_type (type_info, 0);
1163 g_assert (item_type_info != NULL);
1165 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1167 for (i = length - 1; i >= 0; i--) {
1171 py_item = PySequence_GetItem (object, i);
1172 if (py_item == NULL) {
1173 goto list_item_error;
1176 item = _pygi_argument_from_object (py_item, item_type_info, item_transfer);
1178 Py_DECREF (py_item);
1180 if (PyErr_Occurred()) {
1181 goto list_item_error;
1184 if (type_tag == GI_TYPE_TAG_GLIST) {
1185 list = (GSList *) g_list_prepend ( (GList *) list, item.v_pointer);
1187 list = g_slist_prepend (list, item.v_pointer);
1193 /* Free everything we have converted so far. */
1194 _pygi_argument_release ( (GIArgument *) &list, type_info,
1195 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1198 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1202 arg.v_pointer = list;
1204 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1208 case GI_TYPE_TAG_GHASH:
1213 GITypeInfo *key_type_info;
1214 GITypeInfo *value_type_info;
1215 GITypeTag key_type_tag;
1216 GHashFunc hash_func;
1217 GEqualFunc equal_func;
1218 GHashTable *hash_table;
1219 GITransfer item_transfer;
1223 if (object == Py_None) {
1224 arg.v_pointer = NULL;
1228 length = PyMapping_Length (object);
1233 keys = PyMapping_Keys (object);
1238 values = PyMapping_Values (object);
1239 if (values == NULL) {
1244 key_type_info = g_type_info_get_param_type (type_info, 0);
1245 g_assert (key_type_info != NULL);
1247 value_type_info = g_type_info_get_param_type (type_info, 1);
1248 g_assert (value_type_info != NULL);
1250 key_type_tag = g_type_info_get_tag (key_type_info);
1252 switch (key_type_tag) {
1253 case GI_TYPE_TAG_UTF8:
1254 case GI_TYPE_TAG_FILENAME:
1255 hash_func = g_str_hash;
1256 equal_func = g_str_equal;
1263 hash_table = g_hash_table_new (hash_func, equal_func);
1264 if (hash_table == NULL) {
1266 goto hash_table_release;
1269 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1271 for (i = 0; i < length; i++) {
1277 py_key = PyList_GET_ITEM (keys, i);
1278 py_value = PyList_GET_ITEM (values, i);
1280 key = _pygi_argument_from_object (py_key, key_type_info, item_transfer);
1281 if (PyErr_Occurred()) {
1282 goto hash_table_item_error;
1285 value = _pygi_argument_from_object (py_value, value_type_info, item_transfer);
1286 if (PyErr_Occurred()) {
1287 _pygi_argument_release (&key, type_info, GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1288 goto hash_table_item_error;
1291 g_hash_table_insert (hash_table, key.v_pointer, value.v_pointer);
1294 hash_table_item_error:
1295 /* Free everything we have converted so far. */
1296 _pygi_argument_release ( (GIArgument *) &hash_table, type_info,
1297 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
1300 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
1304 arg.v_pointer = hash_table;
1307 g_base_info_unref ( (GIBaseInfo *) key_type_info);
1308 g_base_info_unref ( (GIBaseInfo *) value_type_info);
1313 case GI_TYPE_TAG_ERROR:
1314 PyErr_SetString (PyExc_NotImplementedError, "error marshalling is not supported yet");
1323 _pygi_argument_to_object (GIArgument *arg,
1324 GITypeInfo *type_info,
1325 GITransfer transfer)
1328 PyObject *object = NULL;
1330 type_tag = g_type_info_get_tag (type_info);
1332 case GI_TYPE_TAG_VOID:
1333 if (g_type_info_is_pointer (type_info)) {
1334 /* Raw Python objects are passed to void* args */
1335 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1336 object = arg->v_pointer;
1339 Py_XINCREF (object);
1341 case GI_TYPE_TAG_BOOLEAN:
1343 object = PyBool_FromLong (arg->v_boolean);
1346 case GI_TYPE_TAG_INT8:
1348 object = PYGLIB_PyLong_FromLong (arg->v_int8);
1351 case GI_TYPE_TAG_UINT8:
1353 object = PYGLIB_PyLong_FromLong (arg->v_uint8);
1356 case GI_TYPE_TAG_INT16:
1358 object = PYGLIB_PyLong_FromLong (arg->v_int16);
1361 case GI_TYPE_TAG_UINT16:
1363 object = PYGLIB_PyLong_FromLong (arg->v_uint16);
1366 case GI_TYPE_TAG_INT32:
1368 object = PYGLIB_PyLong_FromLong (arg->v_int32);
1371 case GI_TYPE_TAG_UINT32:
1373 object = PyLong_FromLongLong (arg->v_uint32);
1376 case GI_TYPE_TAG_INT64:
1378 object = PyLong_FromLongLong (arg->v_int64);
1381 case GI_TYPE_TAG_UINT64:
1383 object = PyLong_FromUnsignedLongLong (arg->v_uint64);
1386 case GI_TYPE_TAG_FLOAT:
1388 object = PyFloat_FromDouble (arg->v_float);
1391 case GI_TYPE_TAG_DOUBLE:
1393 object = PyFloat_FromDouble (arg->v_double);
1396 case GI_TYPE_TAG_GTYPE:
1398 object = pyg_type_wrapper_new ( (GType) arg->v_long);
1401 case GI_TYPE_TAG_UNICHAR:
1403 /* Preserve the bidirectional mapping between 0 and "" */
1404 if (arg->v_uint32 == 0) {
1405 object = PYGLIB_PyUnicode_FromString ("");
1406 } else if (g_unichar_validate (arg->v_uint32)) {
1410 bytes = g_unichar_to_utf8 (arg->v_uint32, utf8);
1411 object = PYGLIB_PyUnicode_FromStringAndSize ((char*)utf8, bytes);
1413 /* TODO: Convert the error to an exception. */
1414 PyErr_Format (PyExc_TypeError,
1415 "Invalid unicode codepoint %" G_GUINT32_FORMAT,
1422 case GI_TYPE_TAG_UTF8:
1423 if (arg->v_string == NULL) {
1429 object = PYGLIB_PyUnicode_FromString (arg->v_string);
1431 case GI_TYPE_TAG_FILENAME:
1433 GError *error = NULL;
1436 if (arg->v_string == NULL) {
1442 string = g_filename_to_utf8 (arg->v_string, -1, NULL, NULL, &error);
1443 if (string == NULL) {
1444 PyErr_SetString (PyExc_Exception, error->message);
1445 /* TODO: Convert the error to an exception. */
1449 object = PYGLIB_PyUnicode_FromString (string);
1455 case GI_TYPE_TAG_ARRAY:
1458 GITypeInfo *item_type_info;
1459 GITypeTag item_type_tag;
1460 GITransfer item_transfer;
1463 array = arg->v_pointer;
1465 item_type_info = g_type_info_get_param_type (type_info, 0);
1466 g_assert (item_type_info != NULL);
1468 item_type_tag = g_type_info_get_tag (item_type_info);
1469 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1471 if (item_type_tag == GI_TYPE_TAG_UINT8) {
1472 /* Return as a byte array */
1473 if (arg->v_pointer == NULL) {
1474 object = PYGLIB_PyBytes_FromString ("");
1478 object = PYGLIB_PyBytes_FromStringAndSize(array->data, array->len);
1482 if (arg->v_pointer == NULL) {
1483 object = PyList_New (0);
1487 object = PyList_New (array->len);
1488 if (object == NULL) {
1493 item_size = g_array_get_element_size (array);
1495 for (i = 0; i < array->len; i++) {
1498 gboolean is_struct = FALSE;
1500 if (item_type_tag == GI_TYPE_TAG_INTERFACE) {
1501 GIBaseInfo *iface_info = g_type_info_get_interface (item_type_info);
1502 switch (g_base_info_get_type (iface_info)) {
1503 case GI_INFO_TYPE_STRUCT:
1504 case GI_INFO_TYPE_BOXED:
1509 g_base_info_unref ( (GIBaseInfo *) iface_info);
1513 item.v_pointer = &_g_array_index (array, GIArgument, i);
1515 memcpy (&item, &_g_array_index (array, GIArgument, i), item_size);
1518 py_item = _pygi_argument_to_object (&item, item_type_info, item_transfer);
1519 if (py_item == NULL) {
1521 _PyGI_ERROR_PREFIX ("Item %zu: ", i);
1525 PyList_SET_ITEM (object, i, py_item);
1528 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1531 case GI_TYPE_TAG_INTERFACE:
1534 GIInfoType info_type;
1536 info = g_type_info_get_interface (type_info);
1537 info_type = g_base_info_get_type (info);
1539 switch (info_type) {
1540 case GI_INFO_TYPE_CALLBACK:
1542 /* There is no way we can support a callback return
1543 * as we are never sure if the callback was set from C
1544 * or Python. API that return callbacks are broken
1545 * so we print a warning and send back a None
1548 g_warning ("You are trying to use an API which returns a callback."
1549 "Callback returns can not be supported. Returning None instead.");
1554 case GI_INFO_TYPE_BOXED:
1555 case GI_INFO_TYPE_STRUCT:
1556 case GI_INFO_TYPE_UNION:
1560 if (arg->v_pointer == NULL) {
1566 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1567 if (g_type_is_a (type, G_TYPE_VALUE)) {
1568 object = pyg_value_as_pyobject (arg->v_pointer, FALSE);
1569 } else if (g_struct_info_is_foreign (info)) {
1570 object = pygi_struct_foreign_convert_from_g_argument (info, arg->v_pointer);
1571 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
1574 py_type = _pygi_type_get_from_g_type (type);
1575 if (py_type == NULL)
1578 object = _pygi_boxed_new ( (PyTypeObject *) py_type, arg->v_pointer, transfer == GI_TRANSFER_EVERYTHING);
1580 Py_DECREF (py_type);
1581 } else if (g_type_is_a (type, G_TYPE_POINTER)) {
1584 py_type = _pygi_type_get_from_g_type (type);
1586 if (py_type == NULL || !PyType_IsSubtype ( (PyTypeObject *) type, &PyGIStruct_Type)) {
1587 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
1588 object = pyg_pointer_new (type, arg->v_pointer);
1590 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer, transfer == GI_TRANSFER_EVERYTHING);
1593 Py_XDECREF (py_type);
1594 } else if (type == G_TYPE_VARIANT) {
1597 g_variant_ref_sink (arg->v_pointer);
1598 py_type = _pygi_type_import_by_gi_info (info);
1599 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer,
1600 transfer == GI_TRANSFER_EVERYTHING);
1601 } else if (type == G_TYPE_NONE) {
1604 py_type = _pygi_type_import_by_gi_info (info);
1605 if (py_type == NULL) {
1609 /* Only structs created in invoke can be safely marked
1610 * GI_TRANSFER_EVERYTHING. Trust that invoke has
1611 * filtered correctly
1613 object = _pygi_struct_new ( (PyTypeObject *) py_type, arg->v_pointer,
1614 transfer == GI_TRANSFER_EVERYTHING);
1616 Py_DECREF (py_type);
1618 PyErr_Format (PyExc_NotImplementedError, "structure type '%s' is not supported yet", g_type_name (type));
1623 case GI_INFO_TYPE_ENUM:
1624 case GI_INFO_TYPE_FLAGS:
1628 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1630 if (type == G_TYPE_NONE) {
1631 /* An enum with a GType of None is an enum without GType */
1632 PyObject *py_type = _pygi_type_import_by_gi_info (info);
1633 PyObject *py_args = NULL;
1638 py_args = PyTuple_New (1);
1639 if (PyTuple_SetItem (py_args, 0, PyLong_FromLong (arg->v_long)) != 0) {
1640 Py_DECREF (py_args);
1641 Py_DECREF (py_type);
1645 object = PyObject_CallFunction (py_type, "l", arg->v_long);
1647 Py_DECREF (py_args);
1648 Py_DECREF (py_type);
1650 } else if (info_type == GI_INFO_TYPE_ENUM) {
1651 object = pyg_enum_from_gtype (type, arg->v_long);
1653 object = pyg_flags_from_gtype (type, arg->v_long);
1658 case GI_INFO_TYPE_INTERFACE:
1659 case GI_INFO_TYPE_OBJECT:
1660 if (arg->v_pointer == NULL) {
1665 object = pygobject_new (arg->v_pointer);
1668 g_assert_not_reached();
1671 g_base_info_unref (info);
1674 case GI_TYPE_TAG_GLIST:
1675 case GI_TYPE_TAG_GSLIST:
1679 GITypeInfo *item_type_info;
1680 GITransfer item_transfer;
1683 list = arg->v_pointer;
1684 length = g_slist_length (list);
1686 object = PyList_New (length);
1687 if (object == NULL) {
1691 item_type_info = g_type_info_get_param_type (type_info, 0);
1692 g_assert (item_type_info != NULL);
1694 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1696 for (i = 0; list != NULL; list = g_slist_next (list), i++) {
1700 item.v_pointer = list->data;
1702 py_item = _pygi_argument_to_object (&item, item_type_info, item_transfer);
1703 if (py_item == NULL) {
1705 _PyGI_ERROR_PREFIX ("Item %zu: ", i);
1709 PyList_SET_ITEM (object, i, py_item);
1712 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1715 case GI_TYPE_TAG_GHASH:
1717 GITypeInfo *key_type_info;
1718 GITypeInfo *value_type_info;
1719 GITransfer item_transfer;
1720 GHashTableIter hash_table_iter;
1724 if (arg->v_pointer == NULL) {
1730 object = PyDict_New();
1731 if (object == NULL) {
1735 key_type_info = g_type_info_get_param_type (type_info, 0);
1736 g_assert (key_type_info != NULL);
1737 g_assert (g_type_info_get_tag (key_type_info) != GI_TYPE_TAG_VOID);
1739 value_type_info = g_type_info_get_param_type (type_info, 1);
1740 g_assert (value_type_info != NULL);
1741 g_assert (g_type_info_get_tag (value_type_info) != GI_TYPE_TAG_VOID);
1743 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
1745 g_hash_table_iter_init (&hash_table_iter, (GHashTable *) arg->v_pointer);
1746 while (g_hash_table_iter_next (&hash_table_iter, &key.v_pointer, &value.v_pointer)) {
1751 py_key = _pygi_argument_to_object (&key, key_type_info, item_transfer);
1752 if (py_key == NULL) {
1756 py_value = _pygi_argument_to_object (&value, value_type_info, item_transfer);
1757 if (py_value == NULL) {
1762 retval = PyDict_SetItem (object, py_key, py_value);
1765 Py_DECREF (py_value);
1773 g_base_info_unref ( (GIBaseInfo *) key_type_info);
1774 g_base_info_unref ( (GIBaseInfo *) value_type_info);
1777 case GI_TYPE_TAG_ERROR:
1778 if (pyglib_error_check (&arg->v_pointer)) {
1780 PyObject *err_value;
1781 PyObject *err_trace;
1782 PyErr_Fetch (&err_type, &err_value, &err_trace);
1783 Py_XDECREF (err_type);
1784 Py_XDECREF (err_trace);
1798 _pygi_argument_from_g_value(const GValue *value,
1799 GITypeInfo *type_info)
1801 GIArgument arg = { 0, };
1803 GITypeTag type_tag = g_type_info_get_tag (type_info);
1805 case GI_TYPE_TAG_BOOLEAN:
1806 arg.v_boolean = g_value_get_boolean (value);
1808 case GI_TYPE_TAG_INT8:
1809 case GI_TYPE_TAG_INT16:
1810 case GI_TYPE_TAG_INT32:
1811 case GI_TYPE_TAG_INT64:
1812 arg.v_int = g_value_get_int (value);
1814 case GI_TYPE_TAG_UINT8:
1815 case GI_TYPE_TAG_UINT16:
1816 case GI_TYPE_TAG_UINT32:
1817 case GI_TYPE_TAG_UINT64:
1818 arg.v_uint = g_value_get_uint (value);
1820 case GI_TYPE_TAG_UNICHAR:
1821 arg.v_uint32 = g_value_get_char (value);
1823 case GI_TYPE_TAG_FLOAT:
1824 arg.v_float = g_value_get_float (value);
1826 case GI_TYPE_TAG_DOUBLE:
1827 arg.v_double = g_value_get_double (value);
1829 case GI_TYPE_TAG_GTYPE:
1830 arg.v_long = g_value_get_gtype (value);
1832 case GI_TYPE_TAG_UTF8:
1833 case GI_TYPE_TAG_FILENAME:
1834 arg.v_string = g_value_dup_string (value);
1836 case GI_TYPE_TAG_GLIST:
1837 case GI_TYPE_TAG_GSLIST:
1838 arg.v_pointer = g_value_get_pointer (value);
1840 case GI_TYPE_TAG_ARRAY:
1841 case GI_TYPE_TAG_GHASH:
1842 arg.v_pointer = g_value_get_boxed (value);
1844 case GI_TYPE_TAG_INTERFACE:
1847 GIInfoType info_type;
1849 info = g_type_info_get_interface (type_info);
1850 info_type = g_base_info_get_type (info);
1852 g_base_info_unref (info);
1854 switch (info_type) {
1855 case GI_INFO_TYPE_FLAGS:
1856 arg.v_long = g_value_get_flags (value);
1858 case GI_INFO_TYPE_ENUM:
1859 arg.v_long = g_value_get_enum (value);
1861 case GI_INFO_TYPE_INTERFACE:
1862 case GI_INFO_TYPE_OBJECT:
1863 arg.v_pointer = g_value_get_object (value);
1865 case GI_INFO_TYPE_BOXED:
1866 case GI_INFO_TYPE_STRUCT:
1867 case GI_INFO_TYPE_UNION:
1868 if (G_VALUE_HOLDS(value, G_TYPE_BOXED)) {
1869 arg.v_pointer = g_value_get_boxed (value);
1870 } else if (G_VALUE_HOLDS(value, G_TYPE_VARIANT)) {
1871 arg.v_pointer = g_value_get_variant (value);
1873 arg.v_pointer = g_value_get_pointer (value);
1877 g_warning("Converting of type '%s' is not implemented", g_info_type_to_string(info_type));
1878 g_assert_not_reached();
1882 case GI_TYPE_TAG_ERROR:
1883 arg.v_pointer = g_value_get_boxed (value);
1885 case GI_TYPE_TAG_VOID:
1886 g_critical("Converting of type '%s' is not implemented", g_type_tag_to_string(type_tag));
1887 g_assert_not_reached();
1894 _pygi_argument_release (GIArgument *arg,
1895 GITypeInfo *type_info,
1896 GITransfer transfer,
1897 GIDirection direction)
1900 gboolean is_out = (direction == GI_DIRECTION_OUT || direction == GI_DIRECTION_INOUT);
1902 type_tag = g_type_info_get_tag (type_info);
1905 case GI_TYPE_TAG_VOID:
1906 /* Don't do anything, it's transparent to the C side */
1908 case GI_TYPE_TAG_BOOLEAN:
1909 case GI_TYPE_TAG_INT8:
1910 case GI_TYPE_TAG_UINT8:
1911 case GI_TYPE_TAG_INT16:
1912 case GI_TYPE_TAG_UINT16:
1913 case GI_TYPE_TAG_INT32:
1914 case GI_TYPE_TAG_UINT32:
1915 case GI_TYPE_TAG_INT64:
1916 case GI_TYPE_TAG_UINT64:
1917 case GI_TYPE_TAG_FLOAT:
1918 case GI_TYPE_TAG_DOUBLE:
1919 case GI_TYPE_TAG_GTYPE:
1920 case GI_TYPE_TAG_UNICHAR:
1922 case GI_TYPE_TAG_FILENAME:
1923 case GI_TYPE_TAG_UTF8:
1924 /* With allow-none support the string could be NULL */
1925 if ((arg->v_string != NULL &&
1926 (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING))
1927 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
1928 g_free (arg->v_string);
1931 case GI_TYPE_TAG_ARRAY:
1936 if (arg->v_pointer == NULL) {
1940 array = arg->v_pointer;
1942 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
1943 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
1944 GITypeInfo *item_type_info;
1945 GITransfer item_transfer;
1947 item_type_info = g_type_info_get_param_type (type_info, 0);
1949 item_transfer = direction == GI_DIRECTION_IN ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING;
1951 /* Free the items */
1952 for (i = 0; i < array->len; i++) {
1954 item = &_g_array_index (array, GIArgument, i);
1955 _pygi_argument_release (item, item_type_info, item_transfer, direction);
1958 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1961 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
1962 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
1963 g_array_free (array, TRUE);
1968 case GI_TYPE_TAG_INTERFACE:
1971 GIInfoType info_type;
1973 info = g_type_info_get_interface (type_info);
1974 info_type = g_base_info_get_type (info);
1976 switch (info_type) {
1977 case GI_INFO_TYPE_CALLBACK:
1980 case GI_INFO_TYPE_BOXED:
1981 case GI_INFO_TYPE_STRUCT:
1982 case GI_INFO_TYPE_UNION:
1986 if (arg->v_pointer == NULL) {
1990 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1992 if (g_type_is_a (type, G_TYPE_VALUE)) {
1995 value = arg->v_pointer;
1997 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
1998 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
1999 g_value_unset (value);
2002 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2003 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2004 g_slice_free (GValue, value);
2006 } else if (g_type_is_a (type, G_TYPE_CLOSURE)) {
2007 if (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING) {
2008 g_closure_unref (arg->v_pointer);
2010 } else if (g_struct_info_is_foreign ( (GIStructInfo*) info)) {
2011 if (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING) {
2012 pygi_struct_foreign_release (info, arg->v_pointer);
2014 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
2015 } else if (g_type_is_a (type, G_TYPE_POINTER) || type == G_TYPE_NONE) {
2016 g_warn_if_fail (!g_type_info_is_pointer (type_info) || transfer == GI_TRANSFER_NOTHING);
2021 case GI_INFO_TYPE_ENUM:
2022 case GI_INFO_TYPE_FLAGS:
2024 case GI_INFO_TYPE_INTERFACE:
2025 case GI_INFO_TYPE_OBJECT:
2026 if (arg->v_pointer == NULL) {
2029 if (is_out && transfer == GI_TRANSFER_EVERYTHING) {
2030 g_object_unref (arg->v_pointer);
2034 g_assert_not_reached();
2037 g_base_info_unref (info);
2040 case GI_TYPE_TAG_GLIST:
2041 case GI_TYPE_TAG_GSLIST:
2045 if (arg->v_pointer == NULL) {
2049 list = arg->v_pointer;
2051 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
2052 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
2053 GITypeInfo *item_type_info;
2054 GITransfer item_transfer;
2057 item_type_info = g_type_info_get_param_type (type_info, 0);
2058 g_assert (item_type_info != NULL);
2060 item_transfer = direction == GI_DIRECTION_IN ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING;
2062 /* Free the items */
2063 for (item = list; item != NULL; item = g_slist_next (item)) {
2064 _pygi_argument_release ( (GIArgument *) &item->data, item_type_info,
2065 item_transfer, direction);
2068 g_base_info_unref ( (GIBaseInfo *) item_type_info);
2071 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2072 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2073 if (type_tag == GI_TYPE_TAG_GLIST) {
2074 g_list_free ( (GList *) list);
2076 /* type_tag == GI_TYPE_TAG_GSLIST */
2077 g_slist_free (list);
2083 case GI_TYPE_TAG_GHASH:
2085 GHashTable *hash_table;
2087 if (arg->v_pointer == NULL) {
2091 hash_table = arg->v_pointer;
2093 if (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING) {
2094 /* We created the table without a destroy function, so keys and
2095 * values need to be released. */
2096 GITypeInfo *key_type_info;
2097 GITypeInfo *value_type_info;
2098 GITransfer item_transfer;
2099 GHashTableIter hash_table_iter;
2103 key_type_info = g_type_info_get_param_type (type_info, 0);
2104 g_assert (key_type_info != NULL);
2106 value_type_info = g_type_info_get_param_type (type_info, 1);
2107 g_assert (value_type_info != NULL);
2109 if (direction == GI_DIRECTION_IN) {
2110 item_transfer = GI_TRANSFER_NOTHING;
2112 item_transfer = GI_TRANSFER_EVERYTHING;
2115 g_hash_table_iter_init (&hash_table_iter, hash_table);
2116 while (g_hash_table_iter_next (&hash_table_iter, &key, &value)) {
2117 _pygi_argument_release ( (GIArgument *) &key, key_type_info,
2118 item_transfer, direction);
2119 _pygi_argument_release ( (GIArgument *) &value, value_type_info,
2120 item_transfer, direction);
2123 g_base_info_unref ( (GIBaseInfo *) key_type_info);
2124 g_base_info_unref ( (GIBaseInfo *) value_type_info);
2125 } else if (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_CONTAINER) {
2126 /* Be careful to avoid keys and values being freed if the
2127 * callee gave a destroy function. */
2128 g_hash_table_steal_all (hash_table);
2131 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
2132 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
2133 g_hash_table_unref (hash_table);
2138 case GI_TYPE_TAG_ERROR:
2142 if (arg->v_pointer == NULL) {
2146 error = * (GError **) arg->v_pointer;
2148 if (error != NULL) {
2149 g_error_free (error);
2152 g_slice_free (GError *, arg->v_pointer);
2159 _pygi_argument_init (void)
2162 _pygobject_import();