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;
158 sc->is_zero_terminated = g_type_info_is_zero_terminated (type_info);
159 sc->fixed_size = g_type_info_get_array_fixed_size (type_info);
160 sc->len_arg_index = g_type_info_get_array_length (type_info);
161 if (sc->len_arg_index >= 0)
162 sc->len_arg_index += child_offset;
164 item_type_info = g_type_info_get_param_type (type_info, 0);
167 transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
169 sc->item_cache = _arg_cache_new (item_type_info,
176 if (sc->item_cache == NULL) {
177 _pygi_arg_cache_free ( (PyGIArgCache *)sc);
181 sc->item_size = _pygi_g_type_info_size (item_type_info);
182 g_base_info_unref ( (GIBaseInfo *)item_type_info);
186 static PyGIHashCache *
187 _hash_cache_new (GITypeInfo *type_info,
188 GIDirection direction,
192 GITypeInfo *key_type_info;
193 GITypeInfo *value_type_info;
194 GITransfer item_transfer;
196 hc = g_slice_new0 (PyGIHashCache);
197 ( (PyGIArgCache *)hc)->destroy_notify = (GDestroyNotify)_hash_cache_free_func;
198 key_type_info = g_type_info_get_param_type (type_info, 0);
199 value_type_info = g_type_info_get_param_type (type_info, 1);
202 transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
204 hc->key_cache = _arg_cache_new (key_type_info,
211 if (hc->key_cache == NULL) {
212 _pygi_arg_cache_free ( (PyGIArgCache *)hc);
216 hc->value_cache = _arg_cache_new (value_type_info,
223 if (hc->value_cache == NULL) {
224 _pygi_arg_cache_free ( (PyGIArgCache *)hc);
228 g_base_info_unref( (GIBaseInfo *)key_type_info);
229 g_base_info_unref( (GIBaseInfo *)value_type_info);
234 static PyGICallbackCache *
235 _callback_cache_new (GIArgInfo *arg_info,
236 GIInterfaceInfo *iface_info,
239 PyGICallbackCache *cc;
241 cc = g_slice_new0 (PyGICallbackCache);
242 ( (PyGIArgCache *)cc)->destroy_notify = (GDestroyNotify)_callback_cache_free_func;
244 cc->user_data_index = g_arg_info_get_closure (arg_info);
245 if (cc->user_data_index != -1)
246 cc->user_data_index += child_offset;
247 cc->destroy_notify_index = g_arg_info_get_destroy (arg_info);
248 if (cc->destroy_notify_index != -1)
249 cc->destroy_notify_index += child_offset;
250 cc->scope = g_arg_info_get_scope (arg_info);
251 g_base_info_ref( (GIBaseInfo *)iface_info);
252 cc->interface_info = iface_info;
256 static PyGIArgCache *
257 _arg_cache_alloc (void)
259 return g_slice_new0 (PyGIArgCache);
263 _arg_cache_from_py_void_setup (PyGIArgCache *arg_cache)
265 arg_cache->from_py_marshaller = _pygi_marshal_from_py_void;
269 _arg_cache_to_py_void_setup (PyGIArgCache *arg_cache)
271 arg_cache->to_py_marshaller = _pygi_marshal_to_py_void;
275 _arg_cache_from_py_boolean_setup (PyGIArgCache *arg_cache)
277 arg_cache->from_py_marshaller = _pygi_marshal_from_py_boolean;
281 _arg_cache_to_py_boolean_setup (PyGIArgCache *arg_cache)
283 arg_cache->to_py_marshaller = _pygi_marshal_to_py_boolean;
287 _arg_cache_from_py_int8_setup (PyGIArgCache *arg_cache)
289 arg_cache->from_py_marshaller = _pygi_marshal_from_py_int8;
293 _arg_cache_to_py_int8_setup (PyGIArgCache *arg_cache)
295 arg_cache->to_py_marshaller = _pygi_marshal_to_py_int8;
299 _arg_cache_from_py_uint8_setup (PyGIArgCache *arg_cache)
301 arg_cache->from_py_marshaller = _pygi_marshal_from_py_uint8;
305 _arg_cache_to_py_uint8_setup (PyGIArgCache *arg_cache)
307 arg_cache->to_py_marshaller = _pygi_marshal_to_py_uint8;
311 _arg_cache_from_py_int16_setup (PyGIArgCache *arg_cache)
313 arg_cache->from_py_marshaller = _pygi_marshal_from_py_int16;
317 _arg_cache_to_py_int16_setup (PyGIArgCache *arg_cache)
319 arg_cache->to_py_marshaller = _pygi_marshal_to_py_int16;
323 _arg_cache_from_py_uint16_setup (PyGIArgCache *arg_cache)
325 arg_cache->from_py_marshaller = _pygi_marshal_from_py_uint16;
329 _arg_cache_to_py_uint16_setup (PyGIArgCache *arg_cache)
331 arg_cache->to_py_marshaller = _pygi_marshal_to_py_uint16;
335 _arg_cache_from_py_int32_setup (PyGIArgCache *arg_cache)
337 arg_cache->from_py_marshaller = _pygi_marshal_from_py_int32;
341 _arg_cache_to_py_int32_setup (PyGIArgCache *arg_cache)
343 arg_cache->to_py_marshaller = _pygi_marshal_to_py_int32;
347 _arg_cache_from_py_uint32_setup (PyGIArgCache *arg_cache)
349 arg_cache->from_py_marshaller = _pygi_marshal_from_py_uint32;
353 _arg_cache_to_py_uint32_setup (PyGIArgCache *arg_cache)
355 arg_cache->to_py_marshaller = _pygi_marshal_to_py_uint32;
359 _arg_cache_from_py_int64_setup (PyGIArgCache *arg_cache)
361 arg_cache->from_py_marshaller = _pygi_marshal_from_py_int64;
365 _arg_cache_to_py_int64_setup (PyGIArgCache *arg_cache)
367 arg_cache->to_py_marshaller = _pygi_marshal_to_py_int64;
371 _arg_cache_from_py_uint64_setup (PyGIArgCache *arg_cache)
373 arg_cache->from_py_marshaller = _pygi_marshal_from_py_uint64;
377 _arg_cache_to_py_uint64_setup (PyGIArgCache *arg_cache)
379 arg_cache->to_py_marshaller = _pygi_marshal_to_py_uint64;
383 _arg_cache_from_py_float_setup (PyGIArgCache *arg_cache)
385 arg_cache->from_py_marshaller = _pygi_marshal_from_py_float;
389 _arg_cache_to_py_float_setup (PyGIArgCache *arg_cache)
391 arg_cache->to_py_marshaller = _pygi_marshal_to_py_float;
395 _arg_cache_from_py_double_setup (PyGIArgCache *arg_cache)
397 arg_cache->from_py_marshaller = _pygi_marshal_from_py_double;
401 _arg_cache_to_py_double_setup (PyGIArgCache *arg_cache)
403 arg_cache->to_py_marshaller = _pygi_marshal_to_py_double;
407 _arg_cache_from_py_unichar_setup (PyGIArgCache *arg_cache)
409 arg_cache->from_py_marshaller = _pygi_marshal_from_py_unichar;
413 _arg_cache_to_py_unichar_setup (PyGIArgCache *arg_cache)
415 arg_cache->to_py_marshaller = _pygi_marshal_to_py_unichar;
419 _arg_cache_from_py_gtype_setup (PyGIArgCache *arg_cache)
421 arg_cache->from_py_marshaller = _pygi_marshal_from_py_gtype;
425 _arg_cache_to_py_gtype_setup (PyGIArgCache *arg_cache)
427 arg_cache->to_py_marshaller = _pygi_marshal_to_py_gtype;
431 _arg_cache_from_py_utf8_setup (PyGIArgCache *arg_cache,
434 arg_cache->from_py_marshaller = _pygi_marshal_from_py_utf8;
435 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_utf8;
439 _arg_cache_to_py_utf8_setup (PyGIArgCache *arg_cache,
442 arg_cache->to_py_marshaller = _pygi_marshal_to_py_utf8;
443 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_utf8;
447 _arg_cache_from_py_filename_setup (PyGIArgCache *arg_cache,
450 arg_cache->from_py_marshaller = _pygi_marshal_from_py_filename;
451 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_utf8;
455 _arg_cache_to_py_filename_setup (PyGIArgCache *arg_cache,
458 arg_cache->to_py_marshaller = _pygi_marshal_to_py_filename;
459 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_utf8;
463 _arg_cache_from_py_array_setup (PyGIArgCache *arg_cache,
464 PyGICallableCache *callable_cache,
465 GITypeInfo *type_info,
467 PyGIDirection direction,
470 PyGISequenceCache *seq_cache = (PyGISequenceCache *)arg_cache;
471 seq_cache->array_type = g_type_info_get_array_type (type_info);
473 arg_cache->from_py_marshaller = _pygi_marshal_from_py_array;
475 if (seq_cache->len_arg_index >= 0) {
476 PyGIArgCache *child_cache =
477 callable_cache->args_cache[seq_cache->len_arg_index];
479 if (child_cache == NULL) {
480 child_cache = _arg_cache_alloc ();
481 } else if (child_cache->meta_type == PYGI_META_ARG_TYPE_CHILD ||
482 child_cache->meta_type == PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE) {
486 if (seq_cache->len_arg_index < arg_index)
487 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE;
489 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
491 child_cache->direction = direction;
492 child_cache->to_py_marshaller = NULL;
493 child_cache->from_py_marshaller = NULL;
495 callable_cache->args_cache[seq_cache->len_arg_index] = child_cache;
498 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_array;
504 _arg_cache_to_py_array_setup (PyGIArgCache *arg_cache,
505 PyGICallableCache *callable_cache,
506 GITypeInfo *type_info,
508 PyGIDirection direction,
511 PyGISequenceCache *seq_cache = (PyGISequenceCache *)arg_cache;
512 arg_cache->to_py_marshaller = _pygi_marshal_to_py_array;
513 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_array;
515 seq_cache->array_type = g_type_info_get_array_type (type_info);
517 if (seq_cache->len_arg_index >= 0) {
518 PyGIArgCache *child_cache = callable_cache->args_cache[seq_cache->len_arg_index];
519 if (seq_cache->len_arg_index < arg_index)
520 callable_cache->n_to_py_child_args++;
522 if (child_cache != NULL) {
523 callable_cache->to_py_args =
524 g_slist_remove (callable_cache->to_py_args, child_cache);
526 if (child_cache->meta_type == PYGI_META_ARG_TYPE_CHILD ||
527 child_cache->meta_type == PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE)
530 child_cache = _arg_cache_alloc ();
533 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
534 child_cache->direction = direction;
535 child_cache->to_py_marshaller = NULL;
536 child_cache->from_py_marshaller = NULL;
538 callable_cache->args_cache[seq_cache->len_arg_index] = child_cache;
545 _arg_cache_from_py_glist_setup (PyGIArgCache *arg_cache,
548 arg_cache->from_py_marshaller = _pygi_marshal_from_py_glist;
549 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_glist;
553 _arg_cache_to_py_glist_setup (PyGIArgCache *arg_cache,
556 arg_cache->to_py_marshaller = _pygi_marshal_to_py_glist;
557 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_glist;
561 _arg_cache_from_py_gslist_setup (PyGIArgCache *arg_cache,
564 arg_cache->from_py_marshaller = _pygi_marshal_from_py_gslist;
565 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_glist;
569 _arg_cache_to_py_gslist_setup (PyGIArgCache *arg_cache,
572 arg_cache->to_py_marshaller = _pygi_marshal_to_py_gslist;
573 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_glist;
577 _arg_cache_from_py_ghash_setup (PyGIArgCache *arg_cache)
579 arg_cache->from_py_marshaller = _pygi_marshal_from_py_ghash;
580 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_ghash;
584 _arg_cache_to_py_ghash_setup (PyGIArgCache *arg_cache)
586 arg_cache->to_py_marshaller = _pygi_marshal_to_py_ghash;
587 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_ghash;
591 _arg_cache_from_py_gerror_setup (PyGIArgCache *arg_cache)
593 arg_cache->from_py_marshaller = _pygi_marshal_from_py_gerror;
594 arg_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
598 _arg_cache_to_py_gerror_setup (PyGIArgCache *arg_cache)
600 arg_cache->to_py_marshaller = _pygi_marshal_to_py_gerror;
601 arg_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
605 _arg_cache_from_py_interface_union_setup (PyGIArgCache *arg_cache,
608 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_struct;
612 _arg_cache_to_py_interface_union_setup (PyGIArgCache *arg_cache,
615 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_struct;
619 _arg_cache_from_py_interface_struct_setup (PyGIArgCache *arg_cache,
620 GIInterfaceInfo *iface_info,
623 PyGIInterfaceCache *iface_cache = (PyGIInterfaceCache *)arg_cache;
624 iface_cache->is_foreign = g_struct_info_is_foreign ( (GIStructInfo*)iface_info);
625 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_struct;
627 if (iface_cache->g_type == G_TYPE_VALUE)
628 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_interface_struct_gvalue;
629 else if (iface_cache->is_foreign)
630 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_interface_struct_foreign;
634 _arg_cache_to_py_interface_struct_setup (PyGIArgCache *arg_cache,
635 GIInterfaceInfo *iface_info,
638 PyGIInterfaceCache *iface_cache = (PyGIInterfaceCache *)arg_cache;
639 iface_cache->is_foreign = g_struct_info_is_foreign ( (GIStructInfo*)iface_info);
640 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_struct;
642 if (iface_cache->is_foreign)
643 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_interface_struct_foreign;
647 _arg_cache_from_py_interface_object_setup (PyGIArgCache *arg_cache,
650 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_object;
651 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_interface_object;
655 _arg_cache_to_py_interface_object_setup (PyGIArgCache *arg_cache,
658 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_object;
659 arg_cache->to_py_cleanup = _pygi_marshal_cleanup_to_py_interface_object;
663 _arg_cache_from_py_interface_callback_setup (PyGIArgCache *arg_cache,
664 PyGICallableCache *callable_cache)
666 PyGICallbackCache *callback_cache = (PyGICallbackCache *)arg_cache;
667 if (callback_cache->user_data_index >= 0) {
668 PyGIArgCache *user_data_arg_cache = _arg_cache_alloc ();
669 user_data_arg_cache->meta_type = PYGI_META_ARG_TYPE_CHILD_WITH_PYARG;
670 user_data_arg_cache->direction = PYGI_DIRECTION_FROM_PYTHON;
671 callable_cache->args_cache[callback_cache->user_data_index] = user_data_arg_cache;
674 if (callback_cache->destroy_notify_index >= 0) {
675 PyGIArgCache *destroy_arg_cache = _arg_cache_alloc ();
676 destroy_arg_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
677 destroy_arg_cache->direction = PYGI_DIRECTION_FROM_PYTHON;
678 callable_cache->args_cache[callback_cache->destroy_notify_index] = destroy_arg_cache;
680 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_callback;
681 arg_cache->from_py_cleanup = _pygi_marshal_cleanup_from_py_interface_callback;
685 _arg_cache_to_py_interface_callback_setup (void)
687 PyErr_Format(PyExc_NotImplementedError,
688 "Callback returns are not supported");
692 _arg_cache_from_py_interface_enum_setup (PyGIArgCache *arg_cache,
695 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_enum;
699 _arg_cache_to_py_interface_enum_setup (PyGIArgCache *arg_cache,
702 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_enum;
706 _arg_cache_from_py_interface_flags_setup (PyGIArgCache *arg_cache,
709 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_flags;
713 _arg_cache_to_py_interface_flags_setup (PyGIArgCache *arg_cache,
716 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_flags;
720 _arg_cache_new_for_interface (GIInterfaceInfo *iface_info,
721 PyGICallableCache *callable_cache,
724 PyGIDirection direction,
728 PyGIInterfaceCache *iface_cache = NULL;
729 PyGIArgCache *arg_cache = NULL;
730 gssize child_offset = 0;
731 GIInfoType info_type;
733 if (callable_cache != NULL)
735 (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
736 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) ? 1: 0;
738 info_type = g_base_info_get_type ( (GIBaseInfo *)iface_info);
740 /* Callbacks are special cased */
741 if (info_type != GI_INFO_TYPE_CALLBACK) {
742 iface_cache = _interface_cache_new (iface_info);
744 arg_cache = (PyGIArgCache *)iface_cache;
745 if (arg_cache == NULL)
750 case GI_INFO_TYPE_UNION:
751 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
752 _arg_cache_from_py_interface_union_setup (arg_cache, transfer);
754 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
755 _arg_cache_to_py_interface_union_setup (arg_cache, transfer);
758 case GI_INFO_TYPE_STRUCT:
759 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
760 _arg_cache_from_py_interface_struct_setup (arg_cache,
764 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
765 _arg_cache_to_py_interface_struct_setup (arg_cache,
769 case GI_INFO_TYPE_OBJECT:
770 case GI_INFO_TYPE_INTERFACE:
771 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
772 _arg_cache_from_py_interface_object_setup (arg_cache, transfer);
774 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
775 _arg_cache_to_py_interface_object_setup (arg_cache, transfer);
778 case GI_INFO_TYPE_BOXED:
779 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
780 _arg_cache_from_py_interface_struct_setup (arg_cache,
784 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
785 _arg_cache_to_py_interface_struct_setup (arg_cache,
789 case GI_INFO_TYPE_CALLBACK:
791 PyGICallbackCache *callback_cache;
793 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
794 _arg_cache_to_py_interface_callback_setup ();
799 _callback_cache_new (arg_info,
803 arg_cache = (PyGIArgCache *)callback_cache;
804 if (arg_cache == NULL)
807 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
808 _arg_cache_from_py_interface_callback_setup (arg_cache, callable_cache);
812 case GI_INFO_TYPE_ENUM:
813 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
814 _arg_cache_from_py_interface_enum_setup (arg_cache, transfer);
816 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
817 _arg_cache_to_py_interface_enum_setup (arg_cache, transfer);
820 case GI_INFO_TYPE_FLAGS:
821 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
822 _arg_cache_from_py_interface_flags_setup (arg_cache, transfer);
824 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
825 _arg_cache_to_py_interface_flags_setup (arg_cache, transfer);
829 g_assert_not_reached ();
832 if (arg_cache != NULL) {
833 arg_cache->direction = direction;
834 arg_cache->transfer = transfer;
835 arg_cache->type_tag = GI_TYPE_TAG_INTERFACE;
836 arg_cache->py_arg_index = py_arg_index;
837 arg_cache->c_arg_index = c_arg_index;
839 if (iface_cache != NULL) {
840 g_base_info_ref ( (GIBaseInfo *)iface_info);
841 iface_cache->interface_info = iface_info;
849 _arg_cache_new (GITypeInfo *type_info,
850 PyGICallableCache *callable_cache,
853 PyGIDirection direction,
857 PyGIArgCache *arg_cache = NULL;
858 gssize child_offset = 0;
861 type_tag = g_type_info_get_tag (type_info);
863 if (callable_cache != NULL)
865 (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
866 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) ? 1: 0;
869 case GI_TYPE_TAG_VOID:
870 arg_cache = _arg_cache_alloc ();
871 if (arg_cache == NULL)
874 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
875 _arg_cache_from_py_void_setup (arg_cache);
877 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
878 _arg_cache_to_py_void_setup (arg_cache);
881 case GI_TYPE_TAG_BOOLEAN:
882 arg_cache = _arg_cache_alloc ();
883 if (arg_cache == NULL)
886 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
887 _arg_cache_from_py_boolean_setup (arg_cache);
889 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
890 _arg_cache_to_py_boolean_setup (arg_cache);
893 case GI_TYPE_TAG_INT8:
894 arg_cache = _arg_cache_alloc ();
895 if (arg_cache == NULL)
898 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
899 _arg_cache_from_py_int8_setup (arg_cache);
901 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
902 _arg_cache_to_py_int8_setup (arg_cache);
905 case GI_TYPE_TAG_UINT8:
906 arg_cache = _arg_cache_alloc ();
907 if (arg_cache == NULL)
910 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
911 _arg_cache_from_py_uint8_setup (arg_cache);
913 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
914 _arg_cache_to_py_uint8_setup (arg_cache);
917 case GI_TYPE_TAG_INT16:
918 arg_cache = _arg_cache_alloc ();
919 if (arg_cache == NULL)
922 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
923 _arg_cache_from_py_int16_setup (arg_cache);
925 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
926 _arg_cache_to_py_int16_setup (arg_cache);
929 case GI_TYPE_TAG_UINT16:
930 arg_cache = _arg_cache_alloc ();
931 if (arg_cache == NULL)
934 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
935 _arg_cache_from_py_uint16_setup (arg_cache);
937 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
938 _arg_cache_to_py_uint16_setup (arg_cache);
940 case GI_TYPE_TAG_INT32:
941 arg_cache = _arg_cache_alloc ();
942 if (arg_cache == NULL)
945 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
946 _arg_cache_from_py_int32_setup (arg_cache);
948 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
949 _arg_cache_to_py_int32_setup (arg_cache);
952 case GI_TYPE_TAG_UINT32:
953 arg_cache = _arg_cache_alloc ();
954 if (arg_cache == NULL)
957 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
958 _arg_cache_from_py_uint32_setup (arg_cache);
960 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
961 _arg_cache_to_py_uint32_setup (arg_cache);
964 case GI_TYPE_TAG_INT64:
965 arg_cache = _arg_cache_alloc ();
966 if (arg_cache == NULL)
969 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
970 _arg_cache_from_py_int64_setup (arg_cache);
972 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
973 _arg_cache_to_py_int64_setup (arg_cache);
976 case GI_TYPE_TAG_UINT64:
977 arg_cache = _arg_cache_alloc ();
978 if (arg_cache == NULL)
981 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
982 _arg_cache_from_py_uint64_setup (arg_cache);
984 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
985 _arg_cache_to_py_uint64_setup (arg_cache);
988 case GI_TYPE_TAG_FLOAT:
989 arg_cache = _arg_cache_alloc ();
990 if (arg_cache == NULL)
993 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
994 _arg_cache_from_py_float_setup (arg_cache);
996 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
997 _arg_cache_to_py_float_setup (arg_cache);
1000 case GI_TYPE_TAG_DOUBLE:
1001 arg_cache = _arg_cache_alloc ();
1002 if (arg_cache == NULL)
1005 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1006 _arg_cache_from_py_double_setup (arg_cache);
1008 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1009 _arg_cache_to_py_double_setup (arg_cache);
1012 case GI_TYPE_TAG_UNICHAR:
1013 arg_cache = _arg_cache_alloc ();
1014 if (arg_cache == NULL)
1017 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1018 _arg_cache_from_py_unichar_setup (arg_cache);
1020 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1021 _arg_cache_to_py_unichar_setup (arg_cache);
1024 case GI_TYPE_TAG_GTYPE:
1025 arg_cache = _arg_cache_alloc ();
1026 if (arg_cache == NULL)
1029 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1030 _arg_cache_from_py_gtype_setup (arg_cache);
1032 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1033 _arg_cache_to_py_gtype_setup (arg_cache);
1036 case GI_TYPE_TAG_UTF8:
1037 arg_cache = _arg_cache_alloc ();
1038 if (arg_cache == NULL)
1041 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1042 _arg_cache_from_py_utf8_setup (arg_cache, transfer);
1044 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1045 _arg_cache_to_py_utf8_setup (arg_cache, transfer);
1048 case GI_TYPE_TAG_FILENAME:
1049 arg_cache = _arg_cache_alloc ();
1050 if (arg_cache == NULL)
1053 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1054 _arg_cache_from_py_filename_setup (arg_cache, transfer);
1056 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1057 _arg_cache_to_py_filename_setup (arg_cache, transfer);
1060 case GI_TYPE_TAG_ARRAY:
1062 PyGISequenceCache *seq_cache =
1063 _sequence_cache_new (type_info,
1068 arg_cache = (PyGIArgCache *)seq_cache;
1069 if (arg_cache == NULL)
1072 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1073 _arg_cache_from_py_array_setup (arg_cache,
1080 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1081 _arg_cache_to_py_array_setup (arg_cache,
1088 /* ugly edge case code:
1090 * length can come before the array parameter which means we
1091 * need to update indexes if this happens
1093 if (seq_cache->len_arg_index > -1 &&
1094 callable_cache->args_cache[seq_cache->len_arg_index]->meta_type == PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE) {
1096 PyGIArgCache *child_cache =
1097 callable_cache->args_cache[seq_cache->len_arg_index];
1099 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
1101 callable_cache->n_py_args -= 1;
1103 for (i = seq_cache->len_arg_index + 1;
1104 i < callable_cache->n_args;
1106 PyGIArgCache *update_cache = callable_cache->args_cache[i];
1107 if (update_cache == NULL)
1110 update_cache->py_arg_index -= 1;
1116 case GI_TYPE_TAG_GLIST:
1118 PyGISequenceCache *seq_cache =
1119 _sequence_cache_new (type_info,
1124 arg_cache = (PyGIArgCache *)seq_cache;
1125 if (arg_cache == NULL)
1128 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1129 _arg_cache_from_py_glist_setup (arg_cache, transfer);
1131 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1132 _arg_cache_to_py_glist_setup (arg_cache, transfer);
1137 case GI_TYPE_TAG_GSLIST:
1139 PyGISequenceCache *seq_cache =
1140 _sequence_cache_new (type_info,
1145 arg_cache = (PyGIArgCache *)seq_cache;
1146 if (arg_cache == NULL)
1149 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1150 _arg_cache_from_py_gslist_setup (arg_cache, transfer);
1152 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1153 _arg_cache_to_py_gslist_setup (arg_cache, transfer);
1157 case GI_TYPE_TAG_GHASH:
1159 (PyGIArgCache *)_hash_cache_new (type_info,
1163 if (arg_cache == NULL)
1166 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1167 _arg_cache_from_py_ghash_setup (arg_cache);
1169 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1170 _arg_cache_to_py_ghash_setup (arg_cache);
1174 case GI_TYPE_TAG_INTERFACE:
1176 GIInterfaceInfo *interface_info = g_type_info_get_interface (type_info);
1177 arg_cache = _arg_cache_new_for_interface (interface_info,
1185 g_base_info_unref ( (GIBaseInfo *)interface_info);
1188 case GI_TYPE_TAG_ERROR:
1189 arg_cache = _arg_cache_alloc ();
1190 if (arg_cache == NULL)
1193 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1194 _arg_cache_from_py_gerror_setup (arg_cache);
1196 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1197 _arg_cache_to_py_gerror_setup (arg_cache);
1202 if (arg_cache != NULL) {
1203 arg_cache->direction = direction;
1204 arg_cache->transfer = transfer;
1205 arg_cache->type_tag = type_tag;
1206 arg_cache->py_arg_index = py_arg_index;
1207 arg_cache->c_arg_index = c_arg_index;
1208 arg_cache->is_pointer = g_type_info_is_pointer (type_info);
1209 g_base_info_ref ( (GIBaseInfo *) type_info);
1210 arg_cache->type_info = type_info;
1217 _arg_name_list_generate (PyGICallableCache *callable_cache)
1219 GSList * arg_name_list = NULL;
1222 if (callable_cache->arg_name_hash == NULL) {
1223 callable_cache->arg_name_hash = g_hash_table_new (g_str_hash, g_str_equal);
1225 g_hash_table_remove_all (callable_cache->arg_name_hash);
1228 for (i=0; i < callable_cache->n_args; i++) {
1229 PyGIArgCache *arg_cache = NULL;
1231 arg_cache = callable_cache->args_cache[i];
1233 if (arg_cache->meta_type != PYGI_META_ARG_TYPE_CHILD &&
1234 arg_cache->meta_type != PYGI_META_ARG_TYPE_CLOSURE &&
1235 (arg_cache->direction == PYGI_DIRECTION_FROM_PYTHON ||
1236 arg_cache->direction == PYGI_DIRECTION_BIDIRECTIONAL)) {
1238 gpointer arg_name = (gpointer)arg_cache->arg_name;
1240 arg_name_list = g_slist_prepend (arg_name_list, arg_name);
1241 if (arg_name != NULL) {
1242 g_hash_table_insert (callable_cache->arg_name_hash, arg_name, arg_name);
1247 callable_cache->arg_name_list = g_slist_reverse (arg_name_list);
1250 /* Generate the cache for the callable's arguments */
1252 _args_cache_generate (GICallableInfo *callable_info,
1253 PyGICallableCache *callable_cache)
1255 gssize arg_index = 0;
1257 GITypeInfo *return_info;
1258 GITransfer return_transfer;
1259 PyGIArgCache *return_cache;
1260 PyGIDirection return_direction;
1262 /* determine if we are marshalling the return to or from python */
1263 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1264 return_direction = PYGI_DIRECTION_FROM_PYTHON;
1266 return_direction = PYGI_DIRECTION_TO_PYTHON;
1268 /* cache the return arg */
1270 g_callable_info_get_return_type (callable_info);
1272 g_callable_info_get_caller_owns (callable_info);
1274 _arg_cache_new (return_info,
1281 if (return_cache == NULL)
1284 return_cache->is_skipped = g_callable_info_skip_return (callable_info);
1285 callable_cache->return_cache = return_cache;
1286 g_base_info_unref (return_info);
1288 /* first arg is the instance */
1289 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
1290 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) {
1291 GIInterfaceInfo *interface_info;
1292 PyGIArgCache *instance_cache;
1293 PyGIDirection instance_direction;
1295 instance_direction = PYGI_DIRECTION_FROM_PYTHON;
1298 interface_info = g_base_info_get_container ( (GIBaseInfo *)callable_info);
1301 _arg_cache_new_for_interface (interface_info,
1304 GI_TRANSFER_NOTHING,
1309 /* FIXME: marshal interfaces from_py */
1310 instance_cache->from_py_marshaller = _pygi_marshal_from_py_interface_instance;
1311 g_base_info_unref ( (GIBaseInfo *)interface_info);
1313 if (instance_cache == NULL)
1316 callable_cache->args_cache[arg_index] = instance_cache;
1319 callable_cache->n_from_py_args++;
1320 callable_cache->n_py_args++;
1324 for (i=0; arg_index < callable_cache->n_args; arg_index++, i++) {
1325 PyGIArgCache *arg_cache = NULL;
1326 GIArgInfo *arg_info;
1327 GITypeInfo *type_info;
1328 GIDirection gi_direction;
1329 PyGIDirection direction;
1330 GITransfer transfer;
1332 gboolean is_caller_allocates = FALSE;
1333 gssize py_arg_index = -1;
1335 arg_info = g_callable_info_get_arg (callable_info, i);
1337 if (g_arg_info_get_closure (arg_info) == i) {
1339 arg_cache = _arg_cache_alloc ();
1340 callable_cache->args_cache[arg_index] = arg_cache;
1342 arg_cache->arg_name = g_base_info_get_name ((GIBaseInfo *) arg_info);
1343 arg_cache->direction = PYGI_DIRECTION_FROM_PYTHON;
1344 arg_cache->meta_type = PYGI_META_ARG_TYPE_CLOSURE;
1345 arg_cache->c_arg_index = i;
1347 callable_cache->n_from_py_args++;
1349 g_base_info_unref ( (GIBaseInfo *)arg_info);
1354 /* For vfuncs and callbacks our marshalling directions
1356 gi_direction = g_arg_info_get_direction (arg_info);
1357 if (gi_direction == GI_DIRECTION_INOUT) {
1358 direction = PYGI_DIRECTION_BIDIRECTIONAL;
1359 } else if (gi_direction == GI_DIRECTION_IN) {
1360 direction = PYGI_DIRECTION_FROM_PYTHON;
1361 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1362 direction = PYGI_DIRECTION_TO_PYTHON;
1364 direction = PYGI_DIRECTION_TO_PYTHON;
1365 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1366 direction = PYGI_DIRECTION_FROM_PYTHON;
1369 transfer = g_arg_info_get_ownership_transfer (arg_info);
1370 type_info = g_arg_info_get_type (arg_info);
1371 type_tag = g_type_info_get_tag (type_info);
1373 if (type_tag == GI_TYPE_TAG_INTERFACE || type_tag == GI_TYPE_TAG_ARRAY)
1374 is_caller_allocates = g_arg_info_is_caller_allocates (arg_info);
1376 /* must be an child arg filled in by its owner
1378 * fill in it's c_arg_index, add to the in count
1380 if (callable_cache->args_cache[arg_index] != NULL) {
1381 arg_cache = callable_cache->args_cache[arg_index];
1382 if (arg_cache->meta_type == PYGI_META_ARG_TYPE_CHILD_WITH_PYARG) {
1383 arg_cache->py_arg_index = callable_cache->n_py_args;
1384 callable_cache->n_py_args++;
1387 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1388 arg_cache->c_arg_index = callable_cache->n_from_py_args;
1389 callable_cache->n_from_py_args++;
1392 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1393 callable_cache->n_to_py_args++;
1394 callable_cache->n_to_py_child_args++;
1397 arg_cache->type_tag = g_type_info_get_tag (type_info);
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);