1 /* -*- Mode: C; c-basic-offset: 4 -*-
2 * vim: tabstop=4 shiftwidth=4 expandtab
4 * Copyright (C) 2011 John (J5) Palmieri <johnp@redhat.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
22 #include "pygi-info.h"
23 #include "pygi-cache.h"
24 #include "pygi-marshal-to-py.h"
25 #include "pygi-marshal-from-py.h"
26 #include "pygi-marshal-cleanup.h"
27 #include "pygi-type.h"
28 #include <girepository.h>
30 PyGIArgCache * _arg_cache_new (GITypeInfo *type_info,
31 PyGICallableCache *callable_cache,
34 PyGIDirection direction,
38 PyGIArgCache * _arg_cache_new_for_interface (GIInterfaceInfo *iface_info,
39 PyGICallableCache *callable_cache,
42 PyGIDirection direction,
47 _pygi_arg_cache_free (PyGIArgCache *cache)
52 if (cache->type_info != NULL)
53 g_base_info_unref ( (GIBaseInfo *)cache->type_info);
54 if (cache->destroy_notify)
55 cache->destroy_notify (cache);
57 g_slice_free (PyGIArgCache, cache);
61 _interface_cache_free_func (PyGIInterfaceCache *cache)
64 Py_XDECREF (cache->py_type);
65 if (cache->type_name != NULL)
66 g_free (cache->type_name);
67 if (cache->interface_info != NULL)
68 g_base_info_unref ( (GIBaseInfo *)cache->interface_info);
69 g_slice_free (PyGIInterfaceCache, cache);
74 _hash_cache_free_func (PyGIHashCache *cache)
77 _pygi_arg_cache_free (cache->key_cache);
78 _pygi_arg_cache_free (cache->value_cache);
79 g_slice_free (PyGIHashCache, cache);
84 _sequence_cache_free_func (PyGISequenceCache *cache)
87 _pygi_arg_cache_free (cache->item_cache);
88 g_slice_free (PyGISequenceCache, cache);
93 _callback_cache_free_func (PyGICallbackCache *cache)
96 if (cache->interface_info != NULL)
97 g_base_info_unref ( (GIBaseInfo *)cache->interface_info);
99 g_slice_free (PyGICallbackCache, cache);
104 _pygi_callable_cache_free (PyGICallableCache *cache)
111 g_slist_free (cache->to_py_args);
112 g_slist_free (cache->arg_name_list);
113 g_hash_table_destroy (cache->arg_name_hash);
115 for (i = 0; i < cache->n_args; i++) {
116 PyGIArgCache *tmp = cache->args_cache[i];
117 _pygi_arg_cache_free (tmp);
119 if (cache->return_cache != NULL)
120 _pygi_arg_cache_free (cache->return_cache);
122 g_slice_free1 (cache->n_args * sizeof (PyGIArgCache *), cache->args_cache);
123 g_slice_free (PyGICallableCache, cache);
126 /* cache generation */
128 static PyGIInterfaceCache *
129 _interface_cache_new (GIInterfaceInfo *iface_info)
131 PyGIInterfaceCache *ic;
133 ic = g_slice_new0 (PyGIInterfaceCache);
134 ( (PyGIArgCache *)ic)->destroy_notify = (GDestroyNotify)_interface_cache_free_func;
135 ic->g_type = g_registered_type_info_get_g_type ( (GIRegisteredTypeInfo *)iface_info);
136 ic->py_type = _pygi_type_import_by_gi_info ( (GIBaseInfo *) iface_info);
138 if (ic->py_type == NULL)
141 ic->type_name = _pygi_g_base_info_get_fullname (iface_info);
145 static PyGISequenceCache *
146 _sequence_cache_new (GITypeInfo *type_info,
147 GIDirection direction,
151 PyGISequenceCache *sc;
152 GITypeInfo *item_type_info;
153 GITransfer item_transfer;
155 sc = g_slice_new0 (PyGISequenceCache);
156 ( (PyGIArgCache *)sc)->destroy_notify = (GDestroyNotify)_sequence_cache_free_func;
159 sc->len_arg_index = -1;
160 sc->is_zero_terminated = g_type_info_is_zero_terminated (type_info);
161 if (!sc->is_zero_terminated) {
162 sc->fixed_size = g_type_info_get_array_fixed_size (type_info);
163 if (sc->fixed_size < 0)
164 sc->len_arg_index = g_type_info_get_array_length (type_info);
165 if (sc->len_arg_index >= 0)
166 sc->len_arg_index += child_offset;
169 item_type_info = g_type_info_get_param_type (type_info, 0);
172 transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
174 sc->item_cache = _arg_cache_new (item_type_info,
181 if (sc->item_cache == NULL) {
182 _pygi_arg_cache_free ( (PyGIArgCache *)sc);
186 sc->item_size = _pygi_g_type_info_size (item_type_info);
187 g_base_info_unref ( (GIBaseInfo *)item_type_info);
191 static PyGIHashCache *
192 _hash_cache_new (GITypeInfo *type_info,
193 GIDirection direction,
197 GITypeInfo *key_type_info;
198 GITypeInfo *value_type_info;
199 GITransfer item_transfer;
201 hc = g_slice_new0 (PyGIHashCache);
202 ( (PyGIArgCache *)hc)->destroy_notify = (GDestroyNotify)_hash_cache_free_func;
203 key_type_info = g_type_info_get_param_type (type_info, 0);
204 value_type_info = g_type_info_get_param_type (type_info, 1);
207 transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
209 hc->key_cache = _arg_cache_new (key_type_info,
216 if (hc->key_cache == NULL) {
217 _pygi_arg_cache_free ( (PyGIArgCache *)hc);
221 hc->value_cache = _arg_cache_new (value_type_info,
228 if (hc->value_cache == NULL) {
229 _pygi_arg_cache_free ( (PyGIArgCache *)hc);
233 g_base_info_unref( (GIBaseInfo *)key_type_info);
234 g_base_info_unref( (GIBaseInfo *)value_type_info);
239 static PyGICallbackCache *
240 _callback_cache_new (GIArgInfo *arg_info,
241 GIInterfaceInfo *iface_info,
244 PyGICallbackCache *cc;
246 cc = g_slice_new0 (PyGICallbackCache);
247 ( (PyGIArgCache *)cc)->destroy_notify = (GDestroyNotify)_callback_cache_free_func;
249 cc->user_data_index = g_arg_info_get_closure (arg_info);
250 if (cc->user_data_index != -1)
251 cc->user_data_index += child_offset;
252 cc->destroy_notify_index = g_arg_info_get_destroy (arg_info);
253 if (cc->destroy_notify_index != -1)
254 cc->destroy_notify_index += child_offset;
255 cc->scope = g_arg_info_get_scope (arg_info);
256 g_base_info_ref( (GIBaseInfo *)iface_info);
257 cc->interface_info = iface_info;
261 static PyGIArgCache *
262 _arg_cache_alloc (void)
264 return g_slice_new0 (PyGIArgCache);
268 _arg_cache_from_py_void_setup (PyGIArgCache *arg_cache)
270 arg_cache->from_py_marshaller = _pygi_marshal_from_py_void;
274 _arg_cache_to_py_void_setup (PyGIArgCache *arg_cache)
276 arg_cache->to_py_marshaller = _pygi_marshal_to_py_void;
280 _arg_cache_from_py_boolean_setup (PyGIArgCache *arg_cache)
282 arg_cache->from_py_marshaller = _pygi_marshal_from_py_boolean;
286 _arg_cache_to_py_boolean_setup (PyGIArgCache *arg_cache)
288 arg_cache->to_py_marshaller = _pygi_marshal_to_py_boolean;
292 _arg_cache_from_py_int8_setup (PyGIArgCache *arg_cache)
294 arg_cache->from_py_marshaller = _pygi_marshal_from_py_int8;
298 _arg_cache_to_py_int8_setup (PyGIArgCache *arg_cache)
300 arg_cache->to_py_marshaller = _pygi_marshal_to_py_int8;
304 _arg_cache_from_py_uint8_setup (PyGIArgCache *arg_cache)
306 arg_cache->from_py_marshaller = _pygi_marshal_from_py_uint8;
310 _arg_cache_to_py_uint8_setup (PyGIArgCache *arg_cache)
312 arg_cache->to_py_marshaller = _pygi_marshal_to_py_uint8;
316 _arg_cache_from_py_int16_setup (PyGIArgCache *arg_cache)
318 arg_cache->from_py_marshaller = _pygi_marshal_from_py_int16;
322 _arg_cache_to_py_int16_setup (PyGIArgCache *arg_cache)
324 arg_cache->to_py_marshaller = _pygi_marshal_to_py_int16;
328 _arg_cache_from_py_uint16_setup (PyGIArgCache *arg_cache)
330 arg_cache->from_py_marshaller = _pygi_marshal_from_py_uint16;
334 _arg_cache_to_py_uint16_setup (PyGIArgCache *arg_cache)
336 arg_cache->to_py_marshaller = _pygi_marshal_to_py_uint16;
340 _arg_cache_from_py_int32_setup (PyGIArgCache *arg_cache)
342 arg_cache->from_py_marshaller = _pygi_marshal_from_py_int32;
346 _arg_cache_to_py_int32_setup (PyGIArgCache *arg_cache)
348 arg_cache->to_py_marshaller = _pygi_marshal_to_py_int32;
352 _arg_cache_from_py_uint32_setup (PyGIArgCache *arg_cache)
354 arg_cache->from_py_marshaller = _pygi_marshal_from_py_uint32;
358 _arg_cache_to_py_uint32_setup (PyGIArgCache *arg_cache)
360 arg_cache->to_py_marshaller = _pygi_marshal_to_py_uint32;
364 _arg_cache_from_py_int64_setup (PyGIArgCache *arg_cache)
366 arg_cache->from_py_marshaller = _pygi_marshal_from_py_int64;
370 _arg_cache_to_py_int64_setup (PyGIArgCache *arg_cache)
372 arg_cache->to_py_marshaller = _pygi_marshal_to_py_int64;
376 _arg_cache_from_py_uint64_setup (PyGIArgCache *arg_cache)
378 arg_cache->from_py_marshaller = _pygi_marshal_from_py_uint64;
382 _arg_cache_to_py_uint64_setup (PyGIArgCache *arg_cache)
384 arg_cache->to_py_marshaller = _pygi_marshal_to_py_uint64;
388 _arg_cache_from_py_float_setup (PyGIArgCache *arg_cache)
390 arg_cache->from_py_marshaller = _pygi_marshal_from_py_float;
394 _arg_cache_to_py_float_setup (PyGIArgCache *arg_cache)
396 arg_cache->to_py_marshaller = _pygi_marshal_to_py_float;
400 _arg_cache_from_py_double_setup (PyGIArgCache *arg_cache)
402 arg_cache->from_py_marshaller = _pygi_marshal_from_py_double;
406 _arg_cache_to_py_double_setup (PyGIArgCache *arg_cache)
408 arg_cache->to_py_marshaller = _pygi_marshal_to_py_double;
412 _arg_cache_from_py_unichar_setup (PyGIArgCache *arg_cache)
414 arg_cache->from_py_marshaller = _pygi_marshal_from_py_unichar;
418 _arg_cache_to_py_unichar_setup (PyGIArgCache *arg_cache)
420 arg_cache->to_py_marshaller = _pygi_marshal_to_py_unichar;
424 _arg_cache_from_py_gtype_setup (PyGIArgCache *arg_cache)
426 arg_cache->from_py_marshaller = _pygi_marshal_from_py_gtype;
430 _arg_cache_to_py_gtype_setup (PyGIArgCache *arg_cache)
432 arg_cache->to_py_marshaller = _pygi_marshal_to_py_gtype;
436 _arg_cache_from_py_utf8_setup (PyGIArgCache *arg_cache,
439 arg_cache->from_py_marshaller = _pygi_marshal_from_py_utf8;
440 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_utf8;
444 _arg_cache_to_py_utf8_setup (PyGIArgCache *arg_cache,
447 arg_cache->to_py_marshaller = _pygi_marshal_to_py_utf8;
448 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_utf8;
452 _arg_cache_from_py_filename_setup (PyGIArgCache *arg_cache,
455 arg_cache->from_py_marshaller = _pygi_marshal_from_py_filename;
456 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_utf8;
460 _arg_cache_to_py_filename_setup (PyGIArgCache *arg_cache,
463 arg_cache->to_py_marshaller = _pygi_marshal_to_py_filename;
464 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_utf8;
468 _arg_cache_from_py_array_setup (PyGIArgCache *arg_cache,
469 PyGICallableCache *callable_cache,
470 GITypeInfo *type_info,
472 PyGIDirection direction,
475 PyGISequenceCache *seq_cache = (PyGISequenceCache *)arg_cache;
476 seq_cache->array_type = g_type_info_get_array_type (type_info);
478 arg_cache->from_py_marshaller = _pygi_marshal_from_py_array;
480 if (seq_cache->len_arg_index >= 0) {
481 PyGIArgCache *child_cache =
482 callable_cache->args_cache[seq_cache->len_arg_index];
484 if (child_cache == NULL) {
485 child_cache = _arg_cache_alloc ();
486 } else if (child_cache->meta_type == PYGI_META_ARG_TYPE_CHILD ||
487 child_cache->meta_type == PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE) {
491 if (seq_cache->len_arg_index < arg_index)
492 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE;
494 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
496 child_cache->direction = direction;
497 child_cache->to_py_marshaller = NULL;
498 child_cache->from_py_marshaller = NULL;
500 callable_cache->args_cache[seq_cache->len_arg_index] = child_cache;
503 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_array;
509 _arg_cache_to_py_array_setup (PyGIArgCache *arg_cache,
510 PyGICallableCache *callable_cache,
511 GITypeInfo *type_info,
513 PyGIDirection direction,
516 PyGISequenceCache *seq_cache = (PyGISequenceCache *)arg_cache;
517 arg_cache->to_py_marshaller = _pygi_marshal_to_py_array;
518 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_array;
520 seq_cache->array_type = g_type_info_get_array_type (type_info);
522 if (seq_cache->len_arg_index >= 0) {
523 PyGIArgCache *child_cache = callable_cache->args_cache[seq_cache->len_arg_index];
524 if (seq_cache->len_arg_index < arg_index)
525 callable_cache->n_to_py_child_args++;
527 if (child_cache != NULL) {
528 callable_cache->to_py_args =
529 g_slist_remove (callable_cache->to_py_args, child_cache);
531 if (child_cache->meta_type == PYGI_META_ARG_TYPE_CHILD ||
532 child_cache->meta_type == PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE)
535 child_cache = _arg_cache_alloc ();
538 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
539 child_cache->direction = direction;
540 child_cache->to_py_marshaller = NULL;
541 child_cache->from_py_marshaller = NULL;
543 callable_cache->args_cache[seq_cache->len_arg_index] = child_cache;
550 _arg_cache_from_py_glist_setup (PyGIArgCache *arg_cache,
553 arg_cache->from_py_marshaller = _pygi_marshal_from_py_glist;
554 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_glist;
558 _arg_cache_to_py_glist_setup (PyGIArgCache *arg_cache,
561 arg_cache->to_py_marshaller = _pygi_marshal_to_py_glist;
562 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_glist;
566 _arg_cache_from_py_gslist_setup (PyGIArgCache *arg_cache,
569 arg_cache->from_py_marshaller = _pygi_marshal_from_py_gslist;
570 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_glist;
574 _arg_cache_to_py_gslist_setup (PyGIArgCache *arg_cache,
577 arg_cache->to_py_marshaller = _pygi_marshal_to_py_gslist;
578 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_glist;
582 _arg_cache_from_py_ghash_setup (PyGIArgCache *arg_cache)
584 arg_cache->from_py_marshaller = _pygi_marshal_from_py_ghash;
585 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_ghash;
589 _arg_cache_to_py_ghash_setup (PyGIArgCache *arg_cache)
591 arg_cache->to_py_marshaller = _pygi_marshal_to_py_ghash;
592 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_ghash;
596 _arg_cache_from_py_gerror_setup (PyGIArgCache *arg_cache)
598 arg_cache->from_py_marshaller = _pygi_marshal_from_py_gerror;
599 arg_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
603 _arg_cache_to_py_gerror_setup (PyGIArgCache *arg_cache)
605 arg_cache->to_py_marshaller = _pygi_marshal_to_py_gerror;
606 arg_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
610 _arg_cache_from_py_interface_union_setup (PyGIArgCache *arg_cache,
613 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_struct;
617 _arg_cache_to_py_interface_union_setup (PyGIArgCache *arg_cache,
620 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_struct;
624 _arg_cache_from_py_interface_struct_setup (PyGIArgCache *arg_cache,
625 GIInterfaceInfo *iface_info,
628 PyGIInterfaceCache *iface_cache = (PyGIInterfaceCache *)arg_cache;
629 iface_cache->is_foreign = g_struct_info_is_foreign ( (GIStructInfo*)iface_info);
630 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_struct;
632 if (iface_cache->g_type == G_TYPE_VALUE)
633 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_interface_struct_gvalue;
634 else if (iface_cache->is_foreign)
635 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_interface_struct_foreign;
639 _arg_cache_to_py_interface_struct_setup (PyGIArgCache *arg_cache,
640 GIInterfaceInfo *iface_info,
643 PyGIInterfaceCache *iface_cache = (PyGIInterfaceCache *)arg_cache;
644 iface_cache->is_foreign = g_struct_info_is_foreign ( (GIStructInfo*)iface_info);
645 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_struct;
647 if (iface_cache->is_foreign)
648 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_interface_struct_foreign;
652 _arg_cache_from_py_interface_object_setup (PyGIArgCache *arg_cache,
655 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_object;
656 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_interface_object;
660 _arg_cache_to_py_interface_object_setup (PyGIArgCache *arg_cache,
663 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_object;
664 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_interface_object;
668 _arg_cache_from_py_interface_callback_setup (PyGIArgCache *arg_cache,
669 PyGICallableCache *callable_cache)
671 PyGICallbackCache *callback_cache = (PyGICallbackCache *)arg_cache;
672 if (callback_cache->user_data_index >= 0) {
673 PyGIArgCache *user_data_arg_cache = _arg_cache_alloc ();
674 user_data_arg_cache->meta_type = PYGI_META_ARG_TYPE_CHILD_WITH_PYARG;
675 user_data_arg_cache->direction = PYGI_DIRECTION_FROM_PYTHON;
676 callable_cache->args_cache[callback_cache->user_data_index] = user_data_arg_cache;
679 if (callback_cache->destroy_notify_index >= 0) {
680 PyGIArgCache *destroy_arg_cache = _arg_cache_alloc ();
681 destroy_arg_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
682 destroy_arg_cache->direction = PYGI_DIRECTION_FROM_PYTHON;
683 callable_cache->args_cache[callback_cache->destroy_notify_index] = destroy_arg_cache;
685 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_callback;
689 _arg_cache_to_py_interface_callback_setup (void)
691 PyErr_Format(PyExc_NotImplementedError,
692 "Callback returns are not supported");
696 _arg_cache_from_py_interface_enum_setup (PyGIArgCache *arg_cache,
699 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_enum;
703 _arg_cache_to_py_interface_enum_setup (PyGIArgCache *arg_cache,
706 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_enum;
710 _arg_cache_from_py_interface_flags_setup (PyGIArgCache *arg_cache,
713 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_flags;
717 _arg_cache_to_py_interface_flags_setup (PyGIArgCache *arg_cache,
720 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_flags;
724 _arg_cache_new_for_interface (GIInterfaceInfo *iface_info,
725 PyGICallableCache *callable_cache,
728 PyGIDirection direction,
732 PyGIInterfaceCache *iface_cache = NULL;
733 PyGIArgCache *arg_cache = NULL;
734 gssize child_offset = 0;
735 GIInfoType info_type;
737 if (callable_cache != NULL)
739 (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
740 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) ? 1: 0;
742 info_type = g_base_info_get_type ( (GIBaseInfo *)iface_info);
744 /* Callbacks are special cased */
745 if (info_type != GI_INFO_TYPE_CALLBACK) {
746 iface_cache = _interface_cache_new (iface_info);
748 arg_cache = (PyGIArgCache *)iface_cache;
749 if (arg_cache == NULL)
754 case GI_INFO_TYPE_UNION:
755 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
756 _arg_cache_from_py_interface_union_setup (arg_cache, transfer);
758 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
759 _arg_cache_to_py_interface_union_setup (arg_cache, transfer);
762 case GI_INFO_TYPE_STRUCT:
763 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
764 _arg_cache_from_py_interface_struct_setup (arg_cache,
768 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
769 _arg_cache_to_py_interface_struct_setup (arg_cache,
773 case GI_INFO_TYPE_OBJECT:
774 case GI_INFO_TYPE_INTERFACE:
775 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
776 _arg_cache_from_py_interface_object_setup (arg_cache, transfer);
778 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
779 _arg_cache_to_py_interface_object_setup (arg_cache, transfer);
782 case GI_INFO_TYPE_BOXED:
783 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
784 _arg_cache_from_py_interface_struct_setup (arg_cache,
788 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
789 _arg_cache_to_py_interface_struct_setup (arg_cache,
793 case GI_INFO_TYPE_CALLBACK:
795 PyGICallbackCache *callback_cache;
797 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
798 _arg_cache_to_py_interface_callback_setup ();
803 _callback_cache_new (arg_info,
807 arg_cache = (PyGIArgCache *)callback_cache;
808 if (arg_cache == NULL)
811 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
812 _arg_cache_from_py_interface_callback_setup (arg_cache, callable_cache);
816 case GI_INFO_TYPE_ENUM:
817 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
818 _arg_cache_from_py_interface_enum_setup (arg_cache, transfer);
820 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
821 _arg_cache_to_py_interface_enum_setup (arg_cache, transfer);
824 case GI_INFO_TYPE_FLAGS:
825 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
826 _arg_cache_from_py_interface_flags_setup (arg_cache, transfer);
828 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
829 _arg_cache_to_py_interface_flags_setup (arg_cache, transfer);
833 g_assert_not_reached ();
836 if (arg_cache != NULL) {
837 arg_cache->direction = direction;
838 arg_cache->transfer = transfer;
839 arg_cache->type_tag = GI_TYPE_TAG_INTERFACE;
840 arg_cache->py_arg_index = py_arg_index;
841 arg_cache->c_arg_index = c_arg_index;
843 if (iface_cache != NULL) {
844 g_base_info_ref ( (GIBaseInfo *)iface_info);
845 iface_cache->interface_info = iface_info;
853 _arg_cache_new (GITypeInfo *type_info,
854 PyGICallableCache *callable_cache,
857 PyGIDirection direction,
861 PyGIArgCache *arg_cache = NULL;
862 gssize child_offset = 0;
865 type_tag = g_type_info_get_tag (type_info);
867 if (callable_cache != NULL)
869 (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
870 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) ? 1: 0;
873 case GI_TYPE_TAG_VOID:
874 arg_cache = _arg_cache_alloc ();
875 if (arg_cache == NULL)
878 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
879 _arg_cache_from_py_void_setup (arg_cache);
881 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
882 _arg_cache_to_py_void_setup (arg_cache);
885 case GI_TYPE_TAG_BOOLEAN:
886 arg_cache = _arg_cache_alloc ();
887 if (arg_cache == NULL)
890 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
891 _arg_cache_from_py_boolean_setup (arg_cache);
893 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
894 _arg_cache_to_py_boolean_setup (arg_cache);
897 case GI_TYPE_TAG_INT8:
898 arg_cache = _arg_cache_alloc ();
899 if (arg_cache == NULL)
902 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
903 _arg_cache_from_py_int8_setup (arg_cache);
905 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
906 _arg_cache_to_py_int8_setup (arg_cache);
909 case GI_TYPE_TAG_UINT8:
910 arg_cache = _arg_cache_alloc ();
911 if (arg_cache == NULL)
914 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
915 _arg_cache_from_py_uint8_setup (arg_cache);
917 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
918 _arg_cache_to_py_uint8_setup (arg_cache);
921 case GI_TYPE_TAG_INT16:
922 arg_cache = _arg_cache_alloc ();
923 if (arg_cache == NULL)
926 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
927 _arg_cache_from_py_int16_setup (arg_cache);
929 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
930 _arg_cache_to_py_int16_setup (arg_cache);
933 case GI_TYPE_TAG_UINT16:
934 arg_cache = _arg_cache_alloc ();
935 if (arg_cache == NULL)
938 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
939 _arg_cache_from_py_uint16_setup (arg_cache);
941 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
942 _arg_cache_to_py_uint16_setup (arg_cache);
944 case GI_TYPE_TAG_INT32:
945 arg_cache = _arg_cache_alloc ();
946 if (arg_cache == NULL)
949 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
950 _arg_cache_from_py_int32_setup (arg_cache);
952 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
953 _arg_cache_to_py_int32_setup (arg_cache);
956 case GI_TYPE_TAG_UINT32:
957 arg_cache = _arg_cache_alloc ();
958 if (arg_cache == NULL)
961 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
962 _arg_cache_from_py_uint32_setup (arg_cache);
964 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
965 _arg_cache_to_py_uint32_setup (arg_cache);
968 case GI_TYPE_TAG_INT64:
969 arg_cache = _arg_cache_alloc ();
970 if (arg_cache == NULL)
973 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
974 _arg_cache_from_py_int64_setup (arg_cache);
976 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
977 _arg_cache_to_py_int64_setup (arg_cache);
980 case GI_TYPE_TAG_UINT64:
981 arg_cache = _arg_cache_alloc ();
982 if (arg_cache == NULL)
985 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
986 _arg_cache_from_py_uint64_setup (arg_cache);
988 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
989 _arg_cache_to_py_uint64_setup (arg_cache);
992 case GI_TYPE_TAG_FLOAT:
993 arg_cache = _arg_cache_alloc ();
994 if (arg_cache == NULL)
997 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
998 _arg_cache_from_py_float_setup (arg_cache);
1000 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1001 _arg_cache_to_py_float_setup (arg_cache);
1004 case GI_TYPE_TAG_DOUBLE:
1005 arg_cache = _arg_cache_alloc ();
1006 if (arg_cache == NULL)
1009 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1010 _arg_cache_from_py_double_setup (arg_cache);
1012 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1013 _arg_cache_to_py_double_setup (arg_cache);
1016 case GI_TYPE_TAG_UNICHAR:
1017 arg_cache = _arg_cache_alloc ();
1018 if (arg_cache == NULL)
1021 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1022 _arg_cache_from_py_unichar_setup (arg_cache);
1024 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1025 _arg_cache_to_py_unichar_setup (arg_cache);
1028 case GI_TYPE_TAG_GTYPE:
1029 arg_cache = _arg_cache_alloc ();
1030 if (arg_cache == NULL)
1033 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1034 _arg_cache_from_py_gtype_setup (arg_cache);
1036 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1037 _arg_cache_to_py_gtype_setup (arg_cache);
1040 case GI_TYPE_TAG_UTF8:
1041 arg_cache = _arg_cache_alloc ();
1042 if (arg_cache == NULL)
1045 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1046 _arg_cache_from_py_utf8_setup (arg_cache, transfer);
1048 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1049 _arg_cache_to_py_utf8_setup (arg_cache, transfer);
1052 case GI_TYPE_TAG_FILENAME:
1053 arg_cache = _arg_cache_alloc ();
1054 if (arg_cache == NULL)
1057 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1058 _arg_cache_from_py_filename_setup (arg_cache, transfer);
1060 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1061 _arg_cache_to_py_filename_setup (arg_cache, transfer);
1064 case GI_TYPE_TAG_ARRAY:
1066 PyGISequenceCache *seq_cache =
1067 _sequence_cache_new (type_info,
1072 arg_cache = (PyGIArgCache *)seq_cache;
1073 if (arg_cache == NULL)
1076 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1077 _arg_cache_from_py_array_setup (arg_cache,
1084 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1085 _arg_cache_to_py_array_setup (arg_cache,
1092 /* ugly edge case code:
1094 * length can come before the array parameter which means we
1095 * need to update indexes if this happens
1097 if (seq_cache->len_arg_index > -1 &&
1098 callable_cache->args_cache[seq_cache->len_arg_index]->meta_type == PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE) {
1100 PyGIArgCache *child_cache =
1101 callable_cache->args_cache[seq_cache->len_arg_index];
1103 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
1105 callable_cache->n_py_args -= 1;
1107 for (i = seq_cache->len_arg_index + 1;
1108 i < callable_cache->n_args;
1110 PyGIArgCache *update_cache = callable_cache->args_cache[i];
1111 if (update_cache == NULL)
1114 update_cache->py_arg_index -= 1;
1120 case GI_TYPE_TAG_GLIST:
1122 PyGISequenceCache *seq_cache =
1123 _sequence_cache_new (type_info,
1128 arg_cache = (PyGIArgCache *)seq_cache;
1129 if (arg_cache == NULL)
1132 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1133 _arg_cache_from_py_glist_setup (arg_cache, transfer);
1135 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1136 _arg_cache_to_py_glist_setup (arg_cache, transfer);
1141 case GI_TYPE_TAG_GSLIST:
1143 PyGISequenceCache *seq_cache =
1144 _sequence_cache_new (type_info,
1149 arg_cache = (PyGIArgCache *)seq_cache;
1150 if (arg_cache == NULL)
1153 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1154 _arg_cache_from_py_gslist_setup (arg_cache, transfer);
1156 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1157 _arg_cache_to_py_gslist_setup (arg_cache, transfer);
1161 case GI_TYPE_TAG_GHASH:
1163 (PyGIArgCache *)_hash_cache_new (type_info,
1167 if (arg_cache == NULL)
1170 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1171 _arg_cache_from_py_ghash_setup (arg_cache);
1173 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1174 _arg_cache_to_py_ghash_setup (arg_cache);
1178 case GI_TYPE_TAG_INTERFACE:
1180 GIInterfaceInfo *interface_info = g_type_info_get_interface (type_info);
1181 arg_cache = _arg_cache_new_for_interface (interface_info,
1189 g_base_info_unref ( (GIBaseInfo *)interface_info);
1192 case GI_TYPE_TAG_ERROR:
1193 arg_cache = _arg_cache_alloc ();
1194 if (arg_cache == NULL)
1197 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1198 _arg_cache_from_py_gerror_setup (arg_cache);
1200 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1201 _arg_cache_to_py_gerror_setup (arg_cache);
1206 if (arg_cache != NULL) {
1207 arg_cache->direction = direction;
1208 arg_cache->transfer = transfer;
1209 arg_cache->type_tag = type_tag;
1210 arg_cache->py_arg_index = py_arg_index;
1211 arg_cache->c_arg_index = c_arg_index;
1212 arg_cache->is_pointer = g_type_info_is_pointer (type_info);
1213 g_base_info_ref ( (GIBaseInfo *) type_info);
1214 arg_cache->type_info = type_info;
1221 _arg_name_list_generate (PyGICallableCache *callable_cache)
1223 GSList * arg_name_list = NULL;
1226 if (callable_cache->arg_name_hash == NULL) {
1227 callable_cache->arg_name_hash = g_hash_table_new (g_str_hash, g_str_equal);
1229 g_hash_table_remove_all (callable_cache->arg_name_hash);
1232 for (i=0; i < callable_cache->n_args; i++) {
1233 PyGIArgCache *arg_cache = NULL;
1235 arg_cache = callable_cache->args_cache[i];
1237 if (arg_cache->meta_type != PYGI_META_ARG_TYPE_CHILD &&
1238 arg_cache->meta_type != PYGI_META_ARG_TYPE_CLOSURE &&
1239 (arg_cache->direction == PYGI_DIRECTION_FROM_PYTHON ||
1240 arg_cache->direction == PYGI_DIRECTION_BIDIRECTIONAL)) {
1242 gpointer arg_name = (gpointer)arg_cache->arg_name;
1244 arg_name_list = g_slist_prepend (arg_name_list, arg_name);
1245 if (arg_name != NULL) {
1246 g_hash_table_insert (callable_cache->arg_name_hash, arg_name, arg_name);
1251 callable_cache->arg_name_list = g_slist_reverse (arg_name_list);
1254 /* Generate the cache for the callable's arguments */
1256 _args_cache_generate (GICallableInfo *callable_info,
1257 PyGICallableCache *callable_cache)
1259 gssize arg_index = 0;
1261 GITypeInfo *return_info;
1262 GITransfer return_transfer;
1263 PyGIArgCache *return_cache;
1264 PyGIDirection return_direction;
1266 /* determine if we are marshalling the return to or from python */
1267 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1268 return_direction = PYGI_DIRECTION_FROM_PYTHON;
1270 return_direction = PYGI_DIRECTION_TO_PYTHON;
1272 /* cache the return arg */
1274 g_callable_info_get_return_type (callable_info);
1276 g_callable_info_get_caller_owns (callable_info);
1278 _arg_cache_new (return_info,
1286 return_cache->is_skipped = g_callable_info_skip_return (callable_info);
1287 callable_cache->return_cache = return_cache;
1288 g_base_info_unref (return_info);
1290 /* first arg is the instance */
1291 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
1292 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) {
1293 GIInterfaceInfo *interface_info;
1294 PyGIArgCache *instance_cache;
1295 PyGIDirection instance_direction;
1297 instance_direction = PYGI_DIRECTION_FROM_PYTHON;
1300 interface_info = g_base_info_get_container ( (GIBaseInfo *)callable_info);
1303 _arg_cache_new_for_interface (interface_info,
1306 GI_TRANSFER_NOTHING,
1311 /* FIXME: marshal interfaces from_py */
1312 instance_cache->from_py_marshaller = _pygi_marshal_from_py_interface_instance;
1313 g_base_info_unref ( (GIBaseInfo *)interface_info);
1315 if (instance_cache == NULL)
1318 callable_cache->args_cache[arg_index] = instance_cache;
1321 callable_cache->n_from_py_args++;
1322 callable_cache->n_py_args++;
1326 for (i=0; arg_index < callable_cache->n_args; arg_index++, i++) {
1327 PyGIArgCache *arg_cache = NULL;
1328 GIArgInfo *arg_info;
1329 GITypeInfo *type_info;
1330 GIDirection gi_direction;
1331 PyGIDirection direction;
1332 GITransfer transfer;
1334 gboolean is_caller_allocates = FALSE;
1335 gssize py_arg_index = -1;
1337 arg_info = g_callable_info_get_arg (callable_info, i);
1339 if (g_arg_info_get_closure (arg_info) == i) {
1341 arg_cache = _arg_cache_alloc ();
1342 callable_cache->args_cache[arg_index] = arg_cache;
1344 arg_cache->arg_name = g_base_info_get_name ((GIBaseInfo *) arg_info);
1345 arg_cache->direction = PYGI_DIRECTION_FROM_PYTHON;
1346 arg_cache->meta_type = PYGI_META_ARG_TYPE_CLOSURE;
1347 arg_cache->c_arg_index = i;
1349 callable_cache->n_from_py_args++;
1351 g_base_info_unref ( (GIBaseInfo *)arg_info);
1356 /* For vfuncs and callbacks our marshalling directions
1358 gi_direction = g_arg_info_get_direction (arg_info);
1359 if (gi_direction == GI_DIRECTION_INOUT) {
1360 direction = PYGI_DIRECTION_BIDIRECTIONAL;
1361 } else if (gi_direction == GI_DIRECTION_IN) {
1362 direction = PYGI_DIRECTION_FROM_PYTHON;
1363 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1364 direction = PYGI_DIRECTION_TO_PYTHON;
1366 direction = PYGI_DIRECTION_TO_PYTHON;
1367 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1368 direction = PYGI_DIRECTION_FROM_PYTHON;
1371 transfer = g_arg_info_get_ownership_transfer (arg_info);
1372 type_info = g_arg_info_get_type (arg_info);
1373 type_tag = g_type_info_get_tag (type_info);
1375 if (type_tag == GI_TYPE_TAG_INTERFACE)
1376 is_caller_allocates = g_arg_info_is_caller_allocates (arg_info);
1378 /* must be an child arg filled in by its owner
1380 * fill in it's c_arg_index, add to the in count
1382 if (callable_cache->args_cache[arg_index] != NULL) {
1383 arg_cache = callable_cache->args_cache[arg_index];
1384 if (arg_cache->meta_type == PYGI_META_ARG_TYPE_CHILD_WITH_PYARG) {
1385 arg_cache->py_arg_index = callable_cache->n_py_args;
1386 callable_cache->n_py_args++;
1389 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1390 arg_cache->c_arg_index = callable_cache->n_from_py_args;
1391 callable_cache->n_from_py_args++;
1394 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1395 callable_cache->n_to_py_args++;
1396 callable_cache->n_to_py_child_args++;
1399 g_base_info_unref ( (GIBaseInfo *)arg_info);
1403 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1404 py_arg_index = callable_cache->n_py_args;
1405 callable_cache->n_from_py_args++;
1406 callable_cache->n_py_args++;
1410 _arg_cache_new (type_info,
1418 if (arg_cache == NULL)
1421 arg_cache->arg_name = g_base_info_get_name ((GIBaseInfo *) arg_info);
1422 arg_cache->allow_none = g_arg_info_may_be_null(arg_info);
1423 arg_cache->is_caller_allocates = is_caller_allocates;
1425 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1426 callable_cache->n_to_py_args++;
1428 if (arg_cache == NULL)
1431 callable_cache->to_py_args =
1432 g_slist_append (callable_cache->to_py_args, arg_cache);
1435 callable_cache->args_cache[arg_index] = arg_cache;
1436 g_base_info_unref( (GIBaseInfo *)type_info);
1437 g_base_info_unref( (GIBaseInfo *)arg_info);
1441 g_base_info_unref( (GIBaseInfo *)type_info);
1442 g_base_info_unref( (GIBaseInfo *)arg_info);
1446 _arg_name_list_generate (callable_cache);
1452 _pygi_callable_cache_new (GICallableInfo *callable_info, gboolean is_ccallback)
1454 PyGICallableCache *cache;
1455 GIInfoType type = g_base_info_get_type ( (GIBaseInfo *)callable_info);
1457 cache = g_slice_new0 (PyGICallableCache);
1462 cache->name = g_base_info_get_name ((GIBaseInfo *)callable_info);
1464 if (type == GI_INFO_TYPE_FUNCTION) {
1465 GIFunctionInfoFlags flags;
1467 flags = g_function_info_get_flags ( (GIFunctionInfo *)callable_info);
1469 if (flags & GI_FUNCTION_IS_CONSTRUCTOR)
1470 cache->function_type = PYGI_FUNCTION_TYPE_CONSTRUCTOR;
1471 else if (flags & GI_FUNCTION_IS_METHOD)
1472 cache->function_type = PYGI_FUNCTION_TYPE_METHOD;
1473 } else if (type == GI_INFO_TYPE_VFUNC) {
1474 cache->function_type = PYGI_FUNCTION_TYPE_VFUNC;
1475 } else if (type == GI_INFO_TYPE_CALLBACK) {
1477 cache->function_type = PYGI_FUNCTION_TYPE_CCALLBACK;
1479 cache->function_type = PYGI_FUNCTION_TYPE_CALLBACK;
1481 cache->function_type = PYGI_FUNCTION_TYPE_METHOD;
1484 cache->n_args = g_callable_info_get_n_args (callable_info);
1486 /* if we are a method or vfunc make sure the instance parameter is counted */
1487 if (cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
1488 cache->function_type == PYGI_FUNCTION_TYPE_VFUNC)
1491 if (cache->n_args > 0)
1492 cache->args_cache = g_slice_alloc0 (cache->n_args * sizeof (PyGIArgCache *));
1494 if (!_args_cache_generate (callable_info, cache))
1499 _pygi_callable_cache_free (cache);