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;
684 _arg_cache_to_py_interface_callback_setup (void)
686 PyErr_Format(PyExc_NotImplementedError,
687 "Callback returns are not supported");
691 _arg_cache_from_py_interface_enum_setup (PyGIArgCache *arg_cache,
694 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_enum;
698 _arg_cache_to_py_interface_enum_setup (PyGIArgCache *arg_cache,
701 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_enum;
705 _arg_cache_from_py_interface_flags_setup (PyGIArgCache *arg_cache,
708 arg_cache->from_py_marshaller = _pygi_marshal_from_py_interface_flags;
712 _arg_cache_to_py_interface_flags_setup (PyGIArgCache *arg_cache,
715 arg_cache->to_py_marshaller = _pygi_marshal_to_py_interface_flags;
719 _arg_cache_new_for_interface (GIInterfaceInfo *iface_info,
720 PyGICallableCache *callable_cache,
723 PyGIDirection direction,
727 PyGIInterfaceCache *iface_cache = NULL;
728 PyGIArgCache *arg_cache = NULL;
729 gssize child_offset = 0;
730 GIInfoType info_type;
732 if (callable_cache != NULL)
734 (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
735 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) ? 1: 0;
737 info_type = g_base_info_get_type ( (GIBaseInfo *)iface_info);
739 /* Callbacks are special cased */
740 if (info_type != GI_INFO_TYPE_CALLBACK) {
741 iface_cache = _interface_cache_new (iface_info);
743 arg_cache = (PyGIArgCache *)iface_cache;
744 if (arg_cache == NULL)
749 case GI_INFO_TYPE_UNION:
750 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
751 _arg_cache_from_py_interface_union_setup (arg_cache, transfer);
753 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
754 _arg_cache_to_py_interface_union_setup (arg_cache, transfer);
757 case GI_INFO_TYPE_STRUCT:
758 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
759 _arg_cache_from_py_interface_struct_setup (arg_cache,
763 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
764 _arg_cache_to_py_interface_struct_setup (arg_cache,
768 case GI_INFO_TYPE_OBJECT:
769 case GI_INFO_TYPE_INTERFACE:
770 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
771 _arg_cache_from_py_interface_object_setup (arg_cache, transfer);
773 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
774 _arg_cache_to_py_interface_object_setup (arg_cache, transfer);
777 case GI_INFO_TYPE_BOXED:
778 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
779 _arg_cache_from_py_interface_struct_setup (arg_cache,
783 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
784 _arg_cache_to_py_interface_struct_setup (arg_cache,
788 case GI_INFO_TYPE_CALLBACK:
790 PyGICallbackCache *callback_cache;
792 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
793 _arg_cache_to_py_interface_callback_setup ();
798 _callback_cache_new (arg_info,
802 arg_cache = (PyGIArgCache *)callback_cache;
803 if (arg_cache == NULL)
806 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
807 _arg_cache_from_py_interface_callback_setup (arg_cache, callable_cache);
811 case GI_INFO_TYPE_ENUM:
812 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
813 _arg_cache_from_py_interface_enum_setup (arg_cache, transfer);
815 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
816 _arg_cache_to_py_interface_enum_setup (arg_cache, transfer);
819 case GI_INFO_TYPE_FLAGS:
820 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
821 _arg_cache_from_py_interface_flags_setup (arg_cache, transfer);
823 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
824 _arg_cache_to_py_interface_flags_setup (arg_cache, transfer);
828 g_assert_not_reached ();
831 if (arg_cache != NULL) {
832 arg_cache->direction = direction;
833 arg_cache->transfer = transfer;
834 arg_cache->type_tag = GI_TYPE_TAG_INTERFACE;
835 arg_cache->py_arg_index = py_arg_index;
836 arg_cache->c_arg_index = c_arg_index;
838 if (iface_cache != NULL) {
839 g_base_info_ref ( (GIBaseInfo *)iface_info);
840 iface_cache->interface_info = iface_info;
848 _arg_cache_new (GITypeInfo *type_info,
849 PyGICallableCache *callable_cache,
852 PyGIDirection direction,
856 PyGIArgCache *arg_cache = NULL;
857 gssize child_offset = 0;
860 type_tag = g_type_info_get_tag (type_info);
862 if (callable_cache != NULL)
864 (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
865 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) ? 1: 0;
868 case GI_TYPE_TAG_VOID:
869 arg_cache = _arg_cache_alloc ();
870 if (arg_cache == NULL)
873 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
874 _arg_cache_from_py_void_setup (arg_cache);
876 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
877 _arg_cache_to_py_void_setup (arg_cache);
880 case GI_TYPE_TAG_BOOLEAN:
881 arg_cache = _arg_cache_alloc ();
882 if (arg_cache == NULL)
885 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
886 _arg_cache_from_py_boolean_setup (arg_cache);
888 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
889 _arg_cache_to_py_boolean_setup (arg_cache);
892 case GI_TYPE_TAG_INT8:
893 arg_cache = _arg_cache_alloc ();
894 if (arg_cache == NULL)
897 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
898 _arg_cache_from_py_int8_setup (arg_cache);
900 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
901 _arg_cache_to_py_int8_setup (arg_cache);
904 case GI_TYPE_TAG_UINT8:
905 arg_cache = _arg_cache_alloc ();
906 if (arg_cache == NULL)
909 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
910 _arg_cache_from_py_uint8_setup (arg_cache);
912 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
913 _arg_cache_to_py_uint8_setup (arg_cache);
916 case GI_TYPE_TAG_INT16:
917 arg_cache = _arg_cache_alloc ();
918 if (arg_cache == NULL)
921 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
922 _arg_cache_from_py_int16_setup (arg_cache);
924 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
925 _arg_cache_to_py_int16_setup (arg_cache);
928 case GI_TYPE_TAG_UINT16:
929 arg_cache = _arg_cache_alloc ();
930 if (arg_cache == NULL)
933 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
934 _arg_cache_from_py_uint16_setup (arg_cache);
936 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
937 _arg_cache_to_py_uint16_setup (arg_cache);
939 case GI_TYPE_TAG_INT32:
940 arg_cache = _arg_cache_alloc ();
941 if (arg_cache == NULL)
944 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
945 _arg_cache_from_py_int32_setup (arg_cache);
947 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
948 _arg_cache_to_py_int32_setup (arg_cache);
951 case GI_TYPE_TAG_UINT32:
952 arg_cache = _arg_cache_alloc ();
953 if (arg_cache == NULL)
956 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
957 _arg_cache_from_py_uint32_setup (arg_cache);
959 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
960 _arg_cache_to_py_uint32_setup (arg_cache);
963 case GI_TYPE_TAG_INT64:
964 arg_cache = _arg_cache_alloc ();
965 if (arg_cache == NULL)
968 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
969 _arg_cache_from_py_int64_setup (arg_cache);
971 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
972 _arg_cache_to_py_int64_setup (arg_cache);
975 case GI_TYPE_TAG_UINT64:
976 arg_cache = _arg_cache_alloc ();
977 if (arg_cache == NULL)
980 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
981 _arg_cache_from_py_uint64_setup (arg_cache);
983 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
984 _arg_cache_to_py_uint64_setup (arg_cache);
987 case GI_TYPE_TAG_FLOAT:
988 arg_cache = _arg_cache_alloc ();
989 if (arg_cache == NULL)
992 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
993 _arg_cache_from_py_float_setup (arg_cache);
995 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
996 _arg_cache_to_py_float_setup (arg_cache);
999 case GI_TYPE_TAG_DOUBLE:
1000 arg_cache = _arg_cache_alloc ();
1001 if (arg_cache == NULL)
1004 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1005 _arg_cache_from_py_double_setup (arg_cache);
1007 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1008 _arg_cache_to_py_double_setup (arg_cache);
1011 case GI_TYPE_TAG_UNICHAR:
1012 arg_cache = _arg_cache_alloc ();
1013 if (arg_cache == NULL)
1016 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1017 _arg_cache_from_py_unichar_setup (arg_cache);
1019 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1020 _arg_cache_to_py_unichar_setup (arg_cache);
1023 case GI_TYPE_TAG_GTYPE:
1024 arg_cache = _arg_cache_alloc ();
1025 if (arg_cache == NULL)
1028 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1029 _arg_cache_from_py_gtype_setup (arg_cache);
1031 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1032 _arg_cache_to_py_gtype_setup (arg_cache);
1035 case GI_TYPE_TAG_UTF8:
1036 arg_cache = _arg_cache_alloc ();
1037 if (arg_cache == NULL)
1040 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1041 _arg_cache_from_py_utf8_setup (arg_cache, transfer);
1043 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1044 _arg_cache_to_py_utf8_setup (arg_cache, transfer);
1047 case GI_TYPE_TAG_FILENAME:
1048 arg_cache = _arg_cache_alloc ();
1049 if (arg_cache == NULL)
1052 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1053 _arg_cache_from_py_filename_setup (arg_cache, transfer);
1055 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1056 _arg_cache_to_py_filename_setup (arg_cache, transfer);
1059 case GI_TYPE_TAG_ARRAY:
1061 PyGISequenceCache *seq_cache =
1062 _sequence_cache_new (type_info,
1067 arg_cache = (PyGIArgCache *)seq_cache;
1068 if (arg_cache == NULL)
1071 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1072 _arg_cache_from_py_array_setup (arg_cache,
1079 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1080 _arg_cache_to_py_array_setup (arg_cache,
1087 /* ugly edge case code:
1089 * length can come before the array parameter which means we
1090 * need to update indexes if this happens
1092 if (seq_cache->len_arg_index > -1 &&
1093 callable_cache->args_cache[seq_cache->len_arg_index]->meta_type == PYGI_META_ARG_TYPE_CHILD_NEEDS_UPDATE) {
1095 PyGIArgCache *child_cache =
1096 callable_cache->args_cache[seq_cache->len_arg_index];
1098 child_cache->meta_type = PYGI_META_ARG_TYPE_CHILD;
1100 callable_cache->n_py_args -= 1;
1102 for (i = seq_cache->len_arg_index + 1;
1103 i < callable_cache->n_args;
1105 PyGIArgCache *update_cache = callable_cache->args_cache[i];
1106 if (update_cache == NULL)
1109 update_cache->py_arg_index -= 1;
1115 case GI_TYPE_TAG_GLIST:
1117 PyGISequenceCache *seq_cache =
1118 _sequence_cache_new (type_info,
1123 arg_cache = (PyGIArgCache *)seq_cache;
1124 if (arg_cache == NULL)
1127 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1128 _arg_cache_from_py_glist_setup (arg_cache, transfer);
1130 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1131 _arg_cache_to_py_glist_setup (arg_cache, transfer);
1136 case GI_TYPE_TAG_GSLIST:
1138 PyGISequenceCache *seq_cache =
1139 _sequence_cache_new (type_info,
1144 arg_cache = (PyGIArgCache *)seq_cache;
1145 if (arg_cache == NULL)
1148 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1149 _arg_cache_from_py_gslist_setup (arg_cache, transfer);
1151 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1152 _arg_cache_to_py_gslist_setup (arg_cache, transfer);
1156 case GI_TYPE_TAG_GHASH:
1158 (PyGIArgCache *)_hash_cache_new (type_info,
1162 if (arg_cache == NULL)
1165 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1166 _arg_cache_from_py_ghash_setup (arg_cache);
1168 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1169 _arg_cache_to_py_ghash_setup (arg_cache);
1173 case GI_TYPE_TAG_INTERFACE:
1175 GIInterfaceInfo *interface_info = g_type_info_get_interface (type_info);
1176 arg_cache = _arg_cache_new_for_interface (interface_info,
1184 g_base_info_unref ( (GIBaseInfo *)interface_info);
1187 case GI_TYPE_TAG_ERROR:
1188 arg_cache = _arg_cache_alloc ();
1189 if (arg_cache == NULL)
1192 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1193 _arg_cache_from_py_gerror_setup (arg_cache);
1195 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL)
1196 _arg_cache_to_py_gerror_setup (arg_cache);
1201 if (arg_cache != NULL) {
1202 arg_cache->direction = direction;
1203 arg_cache->transfer = transfer;
1204 arg_cache->type_tag = type_tag;
1205 arg_cache->py_arg_index = py_arg_index;
1206 arg_cache->c_arg_index = c_arg_index;
1207 arg_cache->is_pointer = g_type_info_is_pointer (type_info);
1208 g_base_info_ref ( (GIBaseInfo *) type_info);
1209 arg_cache->type_info = type_info;
1216 _arg_name_list_generate (PyGICallableCache *callable_cache)
1218 GSList * arg_name_list = NULL;
1221 if (callable_cache->arg_name_hash == NULL) {
1222 callable_cache->arg_name_hash = g_hash_table_new (g_str_hash, g_str_equal);
1224 g_hash_table_remove_all (callable_cache->arg_name_hash);
1227 for (i=0; i < callable_cache->n_args; i++) {
1228 PyGIArgCache *arg_cache = NULL;
1230 arg_cache = callable_cache->args_cache[i];
1232 if (arg_cache->meta_type != PYGI_META_ARG_TYPE_CHILD &&
1233 arg_cache->meta_type != PYGI_META_ARG_TYPE_CLOSURE &&
1234 (arg_cache->direction == PYGI_DIRECTION_FROM_PYTHON ||
1235 arg_cache->direction == PYGI_DIRECTION_BIDIRECTIONAL)) {
1237 gpointer arg_name = (gpointer)arg_cache->arg_name;
1239 arg_name_list = g_slist_prepend (arg_name_list, arg_name);
1240 if (arg_name != NULL) {
1241 g_hash_table_insert (callable_cache->arg_name_hash, arg_name, arg_name);
1246 callable_cache->arg_name_list = g_slist_reverse (arg_name_list);
1249 /* Generate the cache for the callable's arguments */
1251 _args_cache_generate (GICallableInfo *callable_info,
1252 PyGICallableCache *callable_cache)
1254 gssize arg_index = 0;
1256 GITypeInfo *return_info;
1257 GITransfer return_transfer;
1258 PyGIArgCache *return_cache;
1259 PyGIDirection return_direction;
1261 /* determine if we are marshalling the return to or from python */
1262 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1263 return_direction = PYGI_DIRECTION_FROM_PYTHON;
1265 return_direction = PYGI_DIRECTION_TO_PYTHON;
1267 /* cache the return arg */
1269 g_callable_info_get_return_type (callable_info);
1271 g_callable_info_get_caller_owns (callable_info);
1273 _arg_cache_new (return_info,
1280 if (return_cache == NULL)
1283 return_cache->is_skipped = g_callable_info_skip_return (callable_info);
1284 callable_cache->return_cache = return_cache;
1285 g_base_info_unref (return_info);
1287 /* first arg is the instance */
1288 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
1289 callable_cache->function_type == PYGI_FUNCTION_TYPE_VFUNC) {
1290 GIInterfaceInfo *interface_info;
1291 PyGIArgCache *instance_cache;
1292 PyGIDirection instance_direction;
1294 instance_direction = PYGI_DIRECTION_FROM_PYTHON;
1297 interface_info = g_base_info_get_container ( (GIBaseInfo *)callable_info);
1300 _arg_cache_new_for_interface (interface_info,
1303 GI_TRANSFER_NOTHING,
1308 /* FIXME: marshal interfaces from_py */
1309 instance_cache->from_py_marshaller = _pygi_marshal_from_py_interface_instance;
1310 g_base_info_unref ( (GIBaseInfo *)interface_info);
1312 if (instance_cache == NULL)
1315 callable_cache->args_cache[arg_index] = instance_cache;
1318 callable_cache->n_from_py_args++;
1319 callable_cache->n_py_args++;
1323 for (i=0; arg_index < callable_cache->n_args; arg_index++, i++) {
1324 PyGIArgCache *arg_cache = NULL;
1325 GIArgInfo *arg_info;
1326 GITypeInfo *type_info;
1327 GIDirection gi_direction;
1328 PyGIDirection direction;
1329 GITransfer transfer;
1331 gboolean is_caller_allocates = FALSE;
1332 gssize py_arg_index = -1;
1334 arg_info = g_callable_info_get_arg (callable_info, i);
1336 if (g_arg_info_get_closure (arg_info) == i) {
1338 arg_cache = _arg_cache_alloc ();
1339 callable_cache->args_cache[arg_index] = arg_cache;
1341 arg_cache->arg_name = g_base_info_get_name ((GIBaseInfo *) arg_info);
1342 arg_cache->direction = PYGI_DIRECTION_FROM_PYTHON;
1343 arg_cache->meta_type = PYGI_META_ARG_TYPE_CLOSURE;
1344 arg_cache->c_arg_index = i;
1346 callable_cache->n_from_py_args++;
1348 g_base_info_unref ( (GIBaseInfo *)arg_info);
1353 /* For vfuncs and callbacks our marshalling directions
1355 gi_direction = g_arg_info_get_direction (arg_info);
1356 if (gi_direction == GI_DIRECTION_INOUT) {
1357 direction = PYGI_DIRECTION_BIDIRECTIONAL;
1358 } else if (gi_direction == GI_DIRECTION_IN) {
1359 direction = PYGI_DIRECTION_FROM_PYTHON;
1360 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1361 direction = PYGI_DIRECTION_TO_PYTHON;
1363 direction = PYGI_DIRECTION_TO_PYTHON;
1364 if (callable_cache->function_type == PYGI_FUNCTION_TYPE_CALLBACK)
1365 direction = PYGI_DIRECTION_FROM_PYTHON;
1368 transfer = g_arg_info_get_ownership_transfer (arg_info);
1369 type_info = g_arg_info_get_type (arg_info);
1370 type_tag = g_type_info_get_tag (type_info);
1372 if (type_tag == GI_TYPE_TAG_INTERFACE)
1373 is_caller_allocates = g_arg_info_is_caller_allocates (arg_info);
1375 /* must be an child arg filled in by its owner
1377 * fill in it's c_arg_index, add to the in count
1379 if (callable_cache->args_cache[arg_index] != NULL) {
1380 arg_cache = callable_cache->args_cache[arg_index];
1381 if (arg_cache->meta_type == PYGI_META_ARG_TYPE_CHILD_WITH_PYARG) {
1382 arg_cache->py_arg_index = callable_cache->n_py_args;
1383 callable_cache->n_py_args++;
1386 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1387 arg_cache->c_arg_index = callable_cache->n_from_py_args;
1388 callable_cache->n_from_py_args++;
1391 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1392 callable_cache->n_to_py_args++;
1393 callable_cache->n_to_py_child_args++;
1396 arg_cache->type_tag = g_type_info_get_tag (type_info);
1398 g_base_info_unref ( (GIBaseInfo *)arg_info);
1402 if (direction == PYGI_DIRECTION_FROM_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1403 py_arg_index = callable_cache->n_py_args;
1404 callable_cache->n_from_py_args++;
1405 callable_cache->n_py_args++;
1409 _arg_cache_new (type_info,
1417 if (arg_cache == NULL)
1420 arg_cache->arg_name = g_base_info_get_name ((GIBaseInfo *) arg_info);
1421 arg_cache->allow_none = g_arg_info_may_be_null(arg_info);
1422 arg_cache->is_caller_allocates = is_caller_allocates;
1424 if (direction == PYGI_DIRECTION_TO_PYTHON || direction == PYGI_DIRECTION_BIDIRECTIONAL) {
1425 callable_cache->n_to_py_args++;
1427 if (arg_cache == NULL)
1430 callable_cache->to_py_args =
1431 g_slist_append (callable_cache->to_py_args, arg_cache);
1434 callable_cache->args_cache[arg_index] = arg_cache;
1435 g_base_info_unref( (GIBaseInfo *)type_info);
1436 g_base_info_unref( (GIBaseInfo *)arg_info);
1440 g_base_info_unref( (GIBaseInfo *)type_info);
1441 g_base_info_unref( (GIBaseInfo *)arg_info);
1445 _arg_name_list_generate (callable_cache);
1451 _pygi_callable_cache_new (GICallableInfo *callable_info, gboolean is_ccallback)
1453 PyGICallableCache *cache;
1454 GIInfoType type = g_base_info_get_type ( (GIBaseInfo *)callable_info);
1456 cache = g_slice_new0 (PyGICallableCache);
1461 cache->name = g_base_info_get_name ((GIBaseInfo *)callable_info);
1463 if (type == GI_INFO_TYPE_FUNCTION) {
1464 GIFunctionInfoFlags flags;
1466 flags = g_function_info_get_flags ( (GIFunctionInfo *)callable_info);
1468 if (flags & GI_FUNCTION_IS_CONSTRUCTOR)
1469 cache->function_type = PYGI_FUNCTION_TYPE_CONSTRUCTOR;
1470 else if (flags & GI_FUNCTION_IS_METHOD)
1471 cache->function_type = PYGI_FUNCTION_TYPE_METHOD;
1472 } else if (type == GI_INFO_TYPE_VFUNC) {
1473 cache->function_type = PYGI_FUNCTION_TYPE_VFUNC;
1474 } else if (type == GI_INFO_TYPE_CALLBACK) {
1476 cache->function_type = PYGI_FUNCTION_TYPE_CCALLBACK;
1478 cache->function_type = PYGI_FUNCTION_TYPE_CALLBACK;
1480 cache->function_type = PYGI_FUNCTION_TYPE_METHOD;
1483 cache->n_args = g_callable_info_get_n_args (callable_info);
1485 /* if we are a method or vfunc make sure the instance parameter is counted */
1486 if (cache->function_type == PYGI_FUNCTION_TYPE_METHOD ||
1487 cache->function_type == PYGI_FUNCTION_TYPE_VFUNC)
1490 if (cache->n_args > 0)
1491 cache->args_cache = g_slice_alloc0 (cache->n_args * sizeof (PyGIArgCache *));
1493 if (!_args_cache_generate (callable_info, cache))
1498 _pygi_callable_cache_free (cache);