Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/bank/bank-argument.c
diff options
context:
space:
mode:
Diffstat (limited to 'bank/bank-argument.c')
-rw-r--r--bank/bank-argument.c56
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;
}