diff options
Diffstat (limited to 'bank/bank-argument.c')
-rw-r--r-- | bank/bank-argument.c | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/bank/bank-argument.c b/bank/bank-argument.c index 0e64b79..ae2371b 100644 --- a/bank/bank-argument.c +++ b/bank/bank-argument.c @@ -169,6 +169,53 @@ glist_to_pyobject(GITypeTag list_tag, GITypeInfo *type_info, GList *list, GSList } PyObject * +pyarray_to_pyobject(gpointer array, int length, GITypeInfo *type_info) +{ + PyObject *py_list; + PyObject *child_obj; + GITypeInfo *element_type = g_type_info_get_param_type (type_info, 0); + GITypeTag type_tag = g_type_info_get_tag(element_type); + gsize size; + char buf[256]; + int i; + + if (array == NULL) + return Py_None; + + // FIXME: Doesn't seem right to have this here: + switch (type_tag) { + case GI_TYPE_TAG_INT: + size = sizeof(int); + break; + case GI_TYPE_TAG_INTERFACE: + size = sizeof(gpointer); + break; + default: + snprintf(buf, sizeof(buf), "Unimplemented type: %s\n", g_type_tag_to_string(type_tag)); + PyErr_SetString(PyExc_TypeError, buf); + return NULL; + } + + if ((py_list = PyList_New(0)) == NULL) { + return NULL; + } + + for( i = 0; i < length; i++ ) { + gpointer current_element = array + i * size; + + child_obj = pyg_argument_to_pyobject(current_element, element_type); + if (child_obj == NULL) { + Py_DECREF(py_list); + return NULL; + } + PyList_Append(py_list, child_obj); + Py_DECREF(child_obj); + } + + return py_list; +} + +PyObject * pyg_argument_to_pyobject(GArgument *arg, GITypeInfo *type_info) { GITypeTag type_tag; @@ -312,8 +359,9 @@ pyg_argument_to_pyobject(GArgument *arg, GITypeInfo *type_info) } break; case GI_TYPE_TAG_ARRAY: - obj = Py_None; - break; + g_warning("pyg_argument_to_pyobject: use pyarray_to_pyobject instead for arrays"); + obj = Py_None; + break; default: g_print("<GArg->PyO> GITypeTag %s is unhandled\n", g_type_tag_to_string(type_tag)); @@ -321,7 +369,9 @@ pyg_argument_to_pyobject(GArgument *arg, GITypeInfo *type_info) break; } - Py_INCREF(obj); + if (obj != NULL) + Py_INCREF(obj); + return obj; } |