[pygobject/gsoc2009: 92/160] Refactor _wrap_g_struct_info_get_fields



commit c809be5440f50ef3dbf9fdaadeeb295313019ec0
Author: Simon van der Linden <svdlinden src gnome org>
Date:   Mon Aug 3 14:15:35 2009 +0200

    Refactor _wrap_g_struct_info_get_fields

 gi/pygiinfo.c |   42 ++++++++++++++++++++++++++++++------------
 1 files changed, 30 insertions(+), 12 deletions(-)
---
diff --git a/gi/pygiinfo.c b/gi/pygiinfo.c
index 82f3b51..7875291 100644
--- a/gi/pygiinfo.c
+++ b/gi/pygiinfo.c
@@ -1037,6 +1037,7 @@ static PyMethodDef _PyGIFunctionInfo_methods[] = {
     { NULL, NULL, 0 }
 };
 
+
 /* RegisteredTypeInfo */
 PYGIINFO_DEFINE_TYPE("RegisteredTypeInfo", GIRegisteredTypeInfo, PyGIBaseInfo_Type);
 
@@ -1046,6 +1047,7 @@ _wrap_g_registered_type_info_get_g_type(PyGIBaseInfo *self)
     GType type;
 
     type = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)self->info);
+
     return pyg_type_wrapper_new(type);
 }
 
@@ -1054,28 +1056,44 @@ static PyMethodDef _PyGIRegisteredTypeInfo_methods[] = {
     { NULL, NULL, 0 }
 };
 
+
 /* GIStructInfo */
 PYGIINFO_DEFINE_TYPE("StructInfo", GIStructInfo, PyGIRegisteredTypeInfo_Type);
 
 static PyObject *
 _wrap_g_struct_info_get_fields(PyGIBaseInfo *self)
 {
-    int i, length;
-    PyObject *retval;
+    gssize n_infos;
+    PyObject *infos;
+    gssize i;
 
-    g_base_info_ref(self->info);
-    length = g_struct_info_get_n_fields((GIStructInfo*)self->info);
-    retval = PyTuple_New(length);
+    n_infos = g_struct_info_get_n_fields((GIStructInfo *)self->info);
 
-    for (i = 0; i < length; i++) {
-        GIFieldInfo *field;
-        field = g_struct_info_get_field((GIStructInfo*)self->info, i);
-        PyTuple_SetItem(retval, i, pyg_info_new(field));
-        g_base_info_unref((GIBaseInfo*)field);
+    infos = PyTuple_New(n_infos);
+    if (infos == NULL) {
+        return NULL;
     }
-    g_base_info_unref(self->info);
 
-    return retval;
+    for (i = 0; i < n_infos; i++) {
+        GIBaseInfo *info;
+        PyObject *py_info;
+
+        info = (GIBaseInfo *)g_struct_info_get_field((GIStructInfo *)self->info, i);
+        g_assert(info != NULL);
+
+        py_info = pyg_info_new(info);
+
+        g_base_info_unref(info);
+
+        if (py_info == NULL) {
+            Py_CLEAR(infos);
+            break;
+        }
+
+        PyTuple_SET_ITEM(infos, i, py_info);
+    }
+
+    return infos;
 }
 
 static PyObject *



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]