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, see <http://www.gnu.org/licenses/>.
22 #include "pygi-private.h"
23 #include "pygobject-private.h"
28 #include <pyglib-python-compat.h>
31 #include "pygi-value.h"
32 #include "pygi-basictype.h"
33 #include "pygi-object.h"
34 #include "pygi-struct-marshal.h"
35 #include "pygi-error.h"
38 pygi_argument_to_gssize (GIArgument *arg_in,
43 case GI_TYPE_TAG_INT8:
44 *gssize_out = arg_in->v_int8;
46 case GI_TYPE_TAG_UINT8:
47 *gssize_out = arg_in->v_uint8;
49 case GI_TYPE_TAG_INT16:
50 *gssize_out = arg_in->v_int16;
52 case GI_TYPE_TAG_UINT16:
53 *gssize_out = arg_in->v_uint16;
55 case GI_TYPE_TAG_INT32:
56 *gssize_out = arg_in->v_int32;
58 case GI_TYPE_TAG_UINT32:
59 *gssize_out = arg_in->v_uint32;
61 case GI_TYPE_TAG_INT64:
62 *gssize_out = arg_in->v_int64;
64 case GI_TYPE_TAG_UINT64:
65 *gssize_out = arg_in->v_uint64;
68 PyErr_Format (PyExc_TypeError,
69 "Unable to marshal %s to gssize",
70 g_type_tag_to_string(type_tag));
76 _pygi_hash_pointer_to_arg (GIArgument *arg,
80 case GI_TYPE_TAG_INT8:
81 arg->v_int8 = GPOINTER_TO_INT (arg->v_pointer);
83 case GI_TYPE_TAG_INT16:
84 arg->v_int16 = GPOINTER_TO_INT (arg->v_pointer);
86 case GI_TYPE_TAG_INT32:
87 arg->v_int32 = GPOINTER_TO_INT (arg->v_pointer);
89 case GI_TYPE_TAG_UINT8:
90 arg->v_uint8 = GPOINTER_TO_UINT (arg->v_pointer);
92 case GI_TYPE_TAG_UINT16:
93 arg->v_uint16 = GPOINTER_TO_UINT (arg->v_pointer);
95 case GI_TYPE_TAG_UINT32:
96 arg->v_uint32 = GPOINTER_TO_UINT (arg->v_pointer);
98 case GI_TYPE_TAG_GTYPE:
99 arg->v_size = GPOINTER_TO_SIZE (arg->v_pointer);
101 case GI_TYPE_TAG_UTF8:
102 case GI_TYPE_TAG_FILENAME:
103 case GI_TYPE_TAG_INTERFACE:
106 g_critical ("Unsupported type %s", g_type_tag_to_string(type_tag));
111 _pygi_arg_to_hash_pointer (const GIArgument *arg,
115 case GI_TYPE_TAG_INT8:
116 return GINT_TO_POINTER (arg->v_int8);
117 case GI_TYPE_TAG_UINT8:
118 return GINT_TO_POINTER (arg->v_uint8);
119 case GI_TYPE_TAG_INT16:
120 return GINT_TO_POINTER (arg->v_int16);
121 case GI_TYPE_TAG_UINT16:
122 return GINT_TO_POINTER (arg->v_uint16);
123 case GI_TYPE_TAG_INT32:
124 return GINT_TO_POINTER (arg->v_int32);
125 case GI_TYPE_TAG_UINT32:
126 return GINT_TO_POINTER (arg->v_uint32);
127 case GI_TYPE_TAG_GTYPE:
128 return GSIZE_TO_POINTER (arg->v_size);
129 case GI_TYPE_TAG_UTF8:
130 case GI_TYPE_TAG_FILENAME:
131 case GI_TYPE_TAG_INTERFACE:
132 return arg->v_pointer;
134 g_critical ("Unsupported type %s", g_type_tag_to_string(type_tag));
135 return arg->v_pointer;
141 * _pygi_argument_array_length_marshal:
142 * @length_arg_index: Index of length argument in the callables args list.
143 * @user_data1: (type Array(GValue)): Array of GValue arguments to retrieve length
144 * @user_data2: (type GICallableInfo): Callable info to get the argument from.
146 * Generic marshalling policy for array length arguments in callables.
148 * Returns: The length of the array or -1 on failure.
151 _pygi_argument_array_length_marshal (gsize length_arg_index,
155 GIArgInfo length_arg_info;
156 GITypeInfo length_type_info;
157 GIArgument length_arg;
158 gssize array_len = -1;
159 GValue *values = (GValue *)user_data1;
160 GICallableInfo *callable_info = (GICallableInfo *)user_data2;
162 g_callable_info_load_arg (callable_info, length_arg_index, &length_arg_info);
163 g_arg_info_load_type (&length_arg_info, &length_type_info);
165 length_arg = _pygi_argument_from_g_value (&(values[length_arg_index]),
167 if (!pygi_argument_to_gssize (&length_arg,
168 g_type_info_get_tag (&length_type_info),
177 * _pygi_argument_to_array
178 * @arg: The argument to convert
179 * @array_length_policy: Closure for marshalling the array length argument when needed.
180 * @user_data1: Generic user data passed to the array_length_policy.
181 * @user_data2: Generic user data passed to the array_length_policy.
182 * @type_info: The type info for @arg
183 * @out_free_array: A return location for a gboolean that indicates whether
184 * or not the wrapped GArray should be freed
186 * Make sure an array type argument is wrapped in a GArray.
188 * Note: This method can *not* be folded into _pygi_argument_to_object() because
189 * arrays are special in the sense that they might require access to @args in
190 * order to get the length.
192 * Returns: A GArray wrapping @arg. If @out_free_array has been set to TRUE then
193 * free the array with g_array_free() without freeing the data members.
194 * Otherwise don't free the array.
197 _pygi_argument_to_array (GIArgument *arg,
198 PyGIArgArrayLengthPolicy array_length_policy,
201 GITypeInfo *type_info,
202 gboolean *out_free_array)
204 GITypeInfo *item_type_info;
205 gboolean is_zero_terminated;
210 g_return_val_if_fail (g_type_info_get_tag (type_info) == GI_TYPE_TAG_ARRAY, NULL);
212 if (arg->v_pointer == NULL) {
216 switch (g_type_info_get_array_type (type_info)) {
217 case GI_ARRAY_TYPE_C:
218 is_zero_terminated = g_type_info_is_zero_terminated (type_info);
219 item_type_info = g_type_info_get_param_type (type_info, 0);
221 item_size = _pygi_g_type_info_size (item_type_info);
223 g_base_info_unref ( (GIBaseInfo *) item_type_info);
225 if (is_zero_terminated) {
226 length = g_strv_length (arg->v_pointer);
228 length = g_type_info_get_array_fixed_size (type_info);
232 if (G_UNLIKELY (array_length_policy == NULL)) {
233 g_critical ("Unable to determine array length for %p",
235 g_array = g_array_new (is_zero_terminated, FALSE, item_size);
236 *out_free_array = TRUE;
240 length_arg_pos = g_type_info_get_array_length (type_info);
241 g_assert (length_arg_pos >= 0);
243 length = array_length_policy (length_arg_pos, user_data1, user_data2);
250 g_assert (length >= 0);
252 g_array = g_array_new (is_zero_terminated, FALSE, item_size);
254 g_free (g_array->data);
255 g_array->data = arg->v_pointer;
256 g_array->len = length;
257 *out_free_array = TRUE;
259 case GI_ARRAY_TYPE_ARRAY:
260 case GI_ARRAY_TYPE_BYTE_ARRAY:
261 /* Note: GByteArray is really just a GArray */
262 g_array = arg->v_pointer;
263 *out_free_array = FALSE;
265 case GI_ARRAY_TYPE_PTR_ARRAY:
267 GPtrArray *ptr_array = (GPtrArray*) arg->v_pointer;
268 g_array = g_array_sized_new (FALSE, FALSE,
271 g_array->data = (char*) ptr_array->pdata;
272 g_array->len = ptr_array->len;
273 *out_free_array = TRUE;
277 g_critical ("Unexpected array type %u",
278 g_type_info_get_array_type (type_info));
287 _pygi_argument_from_object (PyObject *object,
288 GITypeInfo *type_info,
293 gpointer cleanup_data = NULL;
295 memset(&arg, 0, sizeof(GIArgument));
296 type_tag = g_type_info_get_tag (type_info);
298 /* Ignores cleanup data for now. */
299 if (_pygi_marshal_from_py_basic_type (object, &arg, type_tag, transfer, &cleanup_data) ||
305 case GI_TYPE_TAG_ARRAY:
308 gboolean is_zero_terminated;
309 GITypeInfo *item_type_info;
312 GITransfer item_transfer;
315 if (object == Py_None) {
316 arg.v_pointer = NULL;
320 /* Note, strings are sequences, but we cannot accept them here */
321 if (!PySequence_Check (object) ||
322 #if PY_VERSION_HEX < 0x03000000
323 PyString_Check (object) ||
325 PyUnicode_Check (object)) {
326 PyErr_SetString (PyExc_TypeError, "expected sequence");
330 length = PySequence_Length (object);
335 is_zero_terminated = g_type_info_is_zero_terminated (type_info);
336 item_type_info = g_type_info_get_param_type (type_info, 0);
338 /* we handle arrays that are really strings specially, see below */
339 if (g_type_info_get_tag (item_type_info) == GI_TYPE_TAG_UINT8)
342 item_size = sizeof (GIArgument);
344 array = g_array_sized_new (is_zero_terminated, FALSE, item_size, length);
346 g_base_info_unref ( (GIBaseInfo *) item_type_info);
351 if (g_type_info_get_tag (item_type_info) == GI_TYPE_TAG_UINT8 &&
352 PYGLIB_PyBytes_Check(object)) {
354 memcpy(array->data, PYGLIB_PyBytes_AsString(object), length);
360 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
362 for (i = 0; i < length; i++) {
366 py_item = PySequence_GetItem (object, i);
367 if (py_item == NULL) {
368 goto array_item_error;
371 item = _pygi_argument_from_object (py_item, item_type_info, item_transfer);
375 if (PyErr_Occurred()) {
376 goto array_item_error;
379 g_array_insert_val (array, i, item);
383 /* Free everything we have converted so far. */
384 _pygi_argument_release ( (GIArgument *) &array, type_info,
385 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
388 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
393 arg.v_pointer = array;
395 g_base_info_unref ( (GIBaseInfo *) item_type_info);
398 case GI_TYPE_TAG_INTERFACE:
401 GIInfoType info_type;
403 info = g_type_info_get_interface (type_info);
404 info_type = g_base_info_get_type (info);
407 case GI_INFO_TYPE_CALLBACK:
408 /* This should be handled in invoke() */
409 g_assert_not_reached();
411 case GI_INFO_TYPE_BOXED:
412 case GI_INFO_TYPE_STRUCT:
413 case GI_INFO_TYPE_UNION:
417 gboolean is_foreign = (info_type == GI_INFO_TYPE_STRUCT) &&
418 (g_struct_info_is_foreign ((GIStructInfo *) info));
420 g_type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
421 py_type = _pygi_type_import_by_gi_info ( (GIBaseInfo *) info);
423 /* Note for G_TYPE_VALUE g_type:
424 * This will currently leak the GValue that is allocated and
425 * stashed in arg.v_pointer. Out argument marshaling for caller
426 * allocated GValues already pass in memory for the GValue.
427 * Further re-factoring is needed to fix this leak.
428 * See: https://bugzilla.gnome.org/show_bug.cgi?id=693405
430 pygi_arg_struct_from_py_marshal (object,
433 info, /*interface_info*/
437 FALSE, /*copy_reference*/
439 g_type_info_is_pointer (type_info));
444 case GI_INFO_TYPE_ENUM:
445 case GI_INFO_TYPE_FLAGS:
449 int_ = PYGLIB_PyNumber_Long (object);
454 arg.v_int = PYGLIB_PyLong_AsLong (int_);
460 case GI_INFO_TYPE_INTERFACE:
461 case GI_INFO_TYPE_OBJECT:
462 /* An error within this call will result in a NULL arg */
463 pygi_arg_gobject_out_arg_from_py (object, &arg, transfer);
467 g_assert_not_reached();
469 g_base_info_unref (info);
472 case GI_TYPE_TAG_GLIST:
473 case GI_TYPE_TAG_GSLIST:
476 GITypeInfo *item_type_info;
478 GITransfer item_transfer;
481 if (object == Py_None) {
482 arg.v_pointer = NULL;
486 length = PySequence_Length (object);
491 item_type_info = g_type_info_get_param_type (type_info, 0);
492 g_assert (item_type_info != NULL);
494 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
496 for (i = length - 1; i >= 0; i--) {
500 py_item = PySequence_GetItem (object, i);
501 if (py_item == NULL) {
502 goto list_item_error;
505 item = _pygi_argument_from_object (py_item, item_type_info, item_transfer);
509 if (PyErr_Occurred()) {
510 goto list_item_error;
513 if (type_tag == GI_TYPE_TAG_GLIST) {
514 list = (GSList *) g_list_prepend ( (GList *) list, item.v_pointer);
516 list = g_slist_prepend (list, item.v_pointer);
522 /* Free everything we have converted so far. */
523 _pygi_argument_release ( (GIArgument *) &list, type_info,
524 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
527 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
531 arg.v_pointer = list;
533 g_base_info_unref ( (GIBaseInfo *) item_type_info);
537 case GI_TYPE_TAG_GHASH:
542 GITypeInfo *key_type_info;
543 GITypeInfo *value_type_info;
544 GITypeTag key_type_tag;
546 GEqualFunc equal_func;
547 GHashTable *hash_table;
548 GITransfer item_transfer;
552 if (object == Py_None) {
553 arg.v_pointer = NULL;
557 length = PyMapping_Length (object);
562 keys = PyMapping_Keys (object);
567 values = PyMapping_Values (object);
568 if (values == NULL) {
573 key_type_info = g_type_info_get_param_type (type_info, 0);
574 g_assert (key_type_info != NULL);
576 value_type_info = g_type_info_get_param_type (type_info, 1);
577 g_assert (value_type_info != NULL);
579 key_type_tag = g_type_info_get_tag (key_type_info);
581 switch (key_type_tag) {
582 case GI_TYPE_TAG_UTF8:
583 case GI_TYPE_TAG_FILENAME:
584 hash_func = g_str_hash;
585 equal_func = g_str_equal;
592 hash_table = g_hash_table_new (hash_func, equal_func);
593 if (hash_table == NULL) {
595 goto hash_table_release;
598 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
600 for (i = 0; i < length; i++) {
606 py_key = PyList_GET_ITEM (keys, i);
607 py_value = PyList_GET_ITEM (values, i);
609 key = _pygi_argument_from_object (py_key, key_type_info, item_transfer);
610 if (PyErr_Occurred()) {
611 goto hash_table_item_error;
614 value = _pygi_argument_from_object (py_value, value_type_info, item_transfer);
615 if (PyErr_Occurred()) {
616 _pygi_argument_release (&key, type_info, GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
617 goto hash_table_item_error;
620 g_hash_table_insert (hash_table, key.v_pointer,
621 _pygi_arg_to_hash_pointer (&value, g_type_info_get_tag (value_type_info)));
624 hash_table_item_error:
625 /* Free everything we have converted so far. */
626 _pygi_argument_release ( (GIArgument *) &hash_table, type_info,
627 GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
630 _PyGI_ERROR_PREFIX ("Item %zd: ", i);
634 arg.v_pointer = hash_table;
637 g_base_info_unref ( (GIBaseInfo *) key_type_info);
638 g_base_info_unref ( (GIBaseInfo *) value_type_info);
643 case GI_TYPE_TAG_ERROR:
644 PyErr_SetString (PyExc_NotImplementedError, "error marshalling is not supported yet");
648 g_assert_not_reached ();
655 * _pygi_argument_to_object:
656 * @arg: The argument to convert to an object.
657 * @type_info: Type info for @arg
660 * If the argument is of type array, it must be encoded in a GArray, by calling
661 * _pygi_argument_to_array(). This logic can not be folded into this method
662 * as determining array lengths may require access to method call arguments.
664 * Returns: A PyObject representing @arg
667 _pygi_argument_to_object (GIArgument *arg,
668 GITypeInfo *type_info,
672 PyObject *object = NULL;
674 type_tag = g_type_info_get_tag (type_info);
675 object = _pygi_marshal_to_py_basic_type (arg, type_tag, transfer);
680 case GI_TYPE_TAG_VOID:
682 if (g_type_info_is_pointer (type_info)) {
683 g_warn_if_fail (transfer == GI_TRANSFER_NOTHING);
684 object = PyLong_FromVoidPtr (arg->v_pointer);
688 case GI_TYPE_TAG_ARRAY:
690 /* Arrays are assumed to be packed in a GArray */
692 GITypeInfo *item_type_info;
693 GITypeTag item_type_tag;
694 GITransfer item_transfer;
697 if (arg->v_pointer == NULL)
698 return PyList_New (0);
700 item_type_info = g_type_info_get_param_type (type_info, 0);
701 g_assert (item_type_info != NULL);
703 item_type_tag = g_type_info_get_tag (item_type_info);
704 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
706 array = arg->v_pointer;
707 item_size = g_array_get_element_size (array);
709 if (G_UNLIKELY (item_size > sizeof(GIArgument))) {
710 g_critical ("Stack overflow protection. "
711 "Can't copy array element into GIArgument.");
712 return PyList_New (0);
715 if (item_type_tag == GI_TYPE_TAG_UINT8) {
716 /* Return as a byte array */
717 object = PYGLIB_PyBytes_FromStringAndSize (array->data, array->len);
719 object = PyList_New (array->len);
720 if (object == NULL) {
721 g_critical ("Failure to allocate array for %u items", array->len);
722 g_base_info_unref ( (GIBaseInfo *) item_type_info);
726 for (i = 0; i < array->len; i++) {
727 GIArgument item = { 0 };
730 memcpy (&item, array->data + i * item_size, item_size);
732 py_item = _pygi_argument_to_object (&item, item_type_info, item_transfer);
733 if (py_item == NULL) {
735 _PyGI_ERROR_PREFIX ("Item %zu: ", i);
739 PyList_SET_ITEM (object, i, py_item);
743 g_base_info_unref ( (GIBaseInfo *) item_type_info);
746 case GI_TYPE_TAG_INTERFACE:
749 GIInfoType info_type;
751 info = g_type_info_get_interface (type_info);
752 info_type = g_base_info_get_type (info);
755 case GI_INFO_TYPE_CALLBACK:
757 g_assert_not_reached();
759 case GI_INFO_TYPE_BOXED:
760 case GI_INFO_TYPE_STRUCT:
761 case GI_INFO_TYPE_UNION:
764 GType g_type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
765 gboolean is_foreign = (info_type == GI_INFO_TYPE_STRUCT) &&
766 (g_struct_info_is_foreign ((GIStructInfo *) info));
768 /* Special case variant and none to force loading from py module. */
769 if (g_type == G_TYPE_VARIANT || g_type == G_TYPE_NONE) {
770 py_type = _pygi_type_import_by_gi_info (info);
772 py_type = _pygi_type_get_from_g_type (g_type);
775 object = pygi_arg_struct_to_py_marshal (arg,
776 info, /*interface_info*/
780 FALSE, /*is_allocated*/
783 Py_XDECREF (py_type);
786 case GI_INFO_TYPE_ENUM:
787 case GI_INFO_TYPE_FLAGS:
791 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
793 if (type == G_TYPE_NONE) {
794 /* An enum with a GType of None is an enum without GType */
795 PyObject *py_type = _pygi_type_import_by_gi_info (info);
796 PyObject *py_args = NULL;
801 py_args = PyTuple_New (1);
802 if (PyTuple_SetItem (py_args, 0, PyLong_FromLong (arg->v_int)) != 0) {
808 object = PyObject_CallFunction (py_type, "i", arg->v_int);
813 } else if (info_type == GI_INFO_TYPE_ENUM) {
814 object = pyg_enum_from_gtype (type, arg->v_int);
816 object = pyg_flags_from_gtype (type, arg->v_uint);
821 case GI_INFO_TYPE_INTERFACE:
822 case GI_INFO_TYPE_OBJECT:
823 object = pygi_arg_gobject_to_py_called_from_c (arg, transfer);
827 g_assert_not_reached();
830 g_base_info_unref (info);
833 case GI_TYPE_TAG_GLIST:
834 case GI_TYPE_TAG_GSLIST:
838 GITypeInfo *item_type_info;
839 GITransfer item_transfer;
842 list = arg->v_pointer;
843 length = g_slist_length (list);
845 object = PyList_New (length);
846 if (object == NULL) {
850 item_type_info = g_type_info_get_param_type (type_info, 0);
851 g_assert (item_type_info != NULL);
853 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
855 for (i = 0; list != NULL; list = g_slist_next (list), i++) {
859 item.v_pointer = list->data;
861 py_item = _pygi_argument_to_object (&item, item_type_info, item_transfer);
862 if (py_item == NULL) {
864 _PyGI_ERROR_PREFIX ("Item %zu: ", i);
868 PyList_SET_ITEM (object, i, py_item);
871 g_base_info_unref ( (GIBaseInfo *) item_type_info);
874 case GI_TYPE_TAG_GHASH:
876 GITypeInfo *key_type_info;
877 GITypeInfo *value_type_info;
878 GITransfer item_transfer;
879 GHashTableIter hash_table_iter;
883 if (arg->v_pointer == NULL) {
889 object = PyDict_New();
890 if (object == NULL) {
894 key_type_info = g_type_info_get_param_type (type_info, 0);
895 g_assert (key_type_info != NULL);
896 g_assert (g_type_info_get_tag (key_type_info) != GI_TYPE_TAG_VOID);
898 value_type_info = g_type_info_get_param_type (type_info, 1);
899 g_assert (value_type_info != NULL);
900 g_assert (g_type_info_get_tag (value_type_info) != GI_TYPE_TAG_VOID);
902 item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
904 g_hash_table_iter_init (&hash_table_iter, (GHashTable *) arg->v_pointer);
905 while (g_hash_table_iter_next (&hash_table_iter, &key.v_pointer, &value.v_pointer)) {
910 py_key = _pygi_argument_to_object (&key, key_type_info, item_transfer);
911 if (py_key == NULL) {
915 _pygi_hash_pointer_to_arg (&value, g_type_info_get_tag (value_type_info));
916 py_value = _pygi_argument_to_object (&value, value_type_info, item_transfer);
917 if (py_value == NULL) {
922 retval = PyDict_SetItem (object, py_key, py_value);
925 Py_DECREF (py_value);
933 g_base_info_unref ( (GIBaseInfo *) key_type_info);
934 g_base_info_unref ( (GIBaseInfo *) value_type_info);
937 case GI_TYPE_TAG_ERROR:
939 GError *error = (GError *) arg->v_pointer;
940 if (error != NULL && transfer == GI_TRANSFER_NOTHING) {
941 /* If we have not been transferred the ownership we must copy
942 * the error, because pygi_error_check() is going to free it.
944 error = g_error_copy (error);
947 if (pygi_error_check (&error)) {
951 PyErr_Fetch (&err_type, &err_value, &err_trace);
952 Py_XDECREF (err_type);
953 Py_XDECREF (err_trace);
964 g_assert_not_reached();
972 _pygi_argument_release (GIArgument *arg,
973 GITypeInfo *type_info,
975 GIDirection direction)
978 gboolean is_out = (direction == GI_DIRECTION_OUT || direction == GI_DIRECTION_INOUT);
980 type_tag = g_type_info_get_tag (type_info);
983 case GI_TYPE_TAG_VOID:
984 /* Don't do anything, it's transparent to the C side */
986 case GI_TYPE_TAG_BOOLEAN:
987 case GI_TYPE_TAG_INT8:
988 case GI_TYPE_TAG_UINT8:
989 case GI_TYPE_TAG_INT16:
990 case GI_TYPE_TAG_UINT16:
991 case GI_TYPE_TAG_INT32:
992 case GI_TYPE_TAG_UINT32:
993 case GI_TYPE_TAG_INT64:
994 case GI_TYPE_TAG_UINT64:
995 case GI_TYPE_TAG_FLOAT:
996 case GI_TYPE_TAG_DOUBLE:
997 case GI_TYPE_TAG_GTYPE:
998 case GI_TYPE_TAG_UNICHAR:
1000 case GI_TYPE_TAG_FILENAME:
1001 case GI_TYPE_TAG_UTF8:
1002 /* With allow-none support the string could be NULL */
1003 if ((arg->v_string != NULL &&
1004 (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING))
1005 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
1006 g_free (arg->v_string);
1009 case GI_TYPE_TAG_ARRAY:
1014 if (arg->v_pointer == NULL) {
1018 array = arg->v_pointer;
1020 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
1021 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
1022 GITypeInfo *item_type_info;
1023 GITransfer item_transfer;
1025 item_type_info = g_type_info_get_param_type (type_info, 0);
1027 item_transfer = direction == GI_DIRECTION_IN ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING;
1029 /* Free the items */
1030 for (i = 0; i < array->len; i++) {
1032 item = &_g_array_index (array, GIArgument, i);
1033 _pygi_argument_release (item, item_type_info, item_transfer, direction);
1036 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1039 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
1040 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
1041 g_array_free (array, TRUE);
1046 case GI_TYPE_TAG_INTERFACE:
1049 GIInfoType info_type;
1051 info = g_type_info_get_interface (type_info);
1052 info_type = g_base_info_get_type (info);
1054 switch (info_type) {
1055 case GI_INFO_TYPE_CALLBACK:
1058 case GI_INFO_TYPE_BOXED:
1059 case GI_INFO_TYPE_STRUCT:
1060 case GI_INFO_TYPE_UNION:
1064 if (arg->v_pointer == NULL) {
1068 type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *) info);
1070 if (g_type_is_a (type, G_TYPE_VALUE)) {
1073 value = arg->v_pointer;
1075 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
1076 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
1077 g_value_unset (value);
1080 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
1081 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
1082 g_slice_free (GValue, value);
1084 } else if (g_type_is_a (type, G_TYPE_CLOSURE)) {
1085 if (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING) {
1086 g_closure_unref (arg->v_pointer);
1088 } else if (info_type == GI_INFO_TYPE_STRUCT &&
1089 g_struct_info_is_foreign ((GIStructInfo*) info)) {
1090 if (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING) {
1091 pygi_struct_foreign_release (info, arg->v_pointer);
1093 } else if (g_type_is_a (type, G_TYPE_BOXED)) {
1094 } else if (g_type_is_a (type, G_TYPE_POINTER) || type == G_TYPE_NONE) {
1095 g_warn_if_fail (!g_type_info_is_pointer (type_info) || transfer == GI_TRANSFER_NOTHING);
1100 case GI_INFO_TYPE_ENUM:
1101 case GI_INFO_TYPE_FLAGS:
1103 case GI_INFO_TYPE_INTERFACE:
1104 case GI_INFO_TYPE_OBJECT:
1105 if (arg->v_pointer == NULL) {
1108 if (is_out && transfer == GI_TRANSFER_EVERYTHING) {
1109 g_object_unref (arg->v_pointer);
1113 g_assert_not_reached();
1116 g_base_info_unref (info);
1119 case GI_TYPE_TAG_GLIST:
1120 case GI_TYPE_TAG_GSLIST:
1124 if (arg->v_pointer == NULL) {
1128 list = arg->v_pointer;
1130 if ( (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING)
1131 || (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_EVERYTHING)) {
1132 GITypeInfo *item_type_info;
1133 GITransfer item_transfer;
1136 item_type_info = g_type_info_get_param_type (type_info, 0);
1137 g_assert (item_type_info != NULL);
1139 item_transfer = direction == GI_DIRECTION_IN ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING;
1141 /* Free the items */
1142 for (item = list; item != NULL; item = g_slist_next (item)) {
1143 _pygi_argument_release ( (GIArgument *) &item->data, item_type_info,
1144 item_transfer, direction);
1147 g_base_info_unref ( (GIBaseInfo *) item_type_info);
1150 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
1151 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
1152 if (type_tag == GI_TYPE_TAG_GLIST) {
1153 g_list_free ( (GList *) list);
1155 /* type_tag == GI_TYPE_TAG_GSLIST */
1156 g_slist_free (list);
1162 case GI_TYPE_TAG_GHASH:
1164 GHashTable *hash_table;
1166 if (arg->v_pointer == NULL) {
1170 hash_table = arg->v_pointer;
1172 if (direction == GI_DIRECTION_IN && transfer != GI_TRANSFER_EVERYTHING) {
1173 /* We created the table without a destroy function, so keys and
1174 * values need to be released. */
1175 GITypeInfo *key_type_info;
1176 GITypeInfo *value_type_info;
1177 GITransfer item_transfer;
1178 GHashTableIter hash_table_iter;
1182 key_type_info = g_type_info_get_param_type (type_info, 0);
1183 g_assert (key_type_info != NULL);
1185 value_type_info = g_type_info_get_param_type (type_info, 1);
1186 g_assert (value_type_info != NULL);
1188 if (direction == GI_DIRECTION_IN) {
1189 item_transfer = GI_TRANSFER_NOTHING;
1191 item_transfer = GI_TRANSFER_EVERYTHING;
1194 g_hash_table_iter_init (&hash_table_iter, hash_table);
1195 while (g_hash_table_iter_next (&hash_table_iter, &key, &value)) {
1196 _pygi_argument_release ( (GIArgument *) &key, key_type_info,
1197 item_transfer, direction);
1198 _pygi_argument_release ( (GIArgument *) &value, value_type_info,
1199 item_transfer, direction);
1202 g_base_info_unref ( (GIBaseInfo *) key_type_info);
1203 g_base_info_unref ( (GIBaseInfo *) value_type_info);
1204 } else if (direction == GI_DIRECTION_OUT && transfer == GI_TRANSFER_CONTAINER) {
1205 /* Be careful to avoid keys and values being freed if the
1206 * callee gave a destroy function. */
1207 g_hash_table_steal_all (hash_table);
1210 if ( (direction == GI_DIRECTION_IN && transfer == GI_TRANSFER_NOTHING)
1211 || (direction == GI_DIRECTION_OUT && transfer != GI_TRANSFER_NOTHING)) {
1212 g_hash_table_unref (hash_table);
1217 case GI_TYPE_TAG_ERROR:
1221 if (arg->v_pointer == NULL) {
1225 error = * (GError **) arg->v_pointer;
1227 if (error != NULL) {
1228 g_error_free (error);
1231 g_slice_free (GError *, arg->v_pointer);