[pygobject/gsoc2009: 145/160] Lookup introspected type when creating boxed instances



commit 5858f3e1f05676f9502628973b7e89f8d42fc67f
Author: Simon van der Linden <svdlinden src gnome org>
Date:   Wed Aug 12 17:03:00 2009 +0200

    Lookup introspected type when creating boxed instances
    
    Normally, introspected boxed types are registered. They might not have been
    registered yet, though.

 gobject/pygboxed.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
---
diff --git a/gobject/pygboxed.c b/gobject/pygboxed.c
index 71ec9e9..15cb368 100644
--- a/gobject/pygboxed.c
+++ b/gobject/pygboxed.c
@@ -178,6 +178,30 @@ pyg_boxed_new(GType boxed_type, gpointer boxed, gboolean copy_boxed,
     }
 
     tp = g_type_get_qdata(boxed_type, pygboxed_type_key);
+
+#if HAVE_PYGI_H
+    if (tp == NULL) {
+        GIRepository *repository;
+        GIBaseInfo *info;
+
+        repository = g_irepository_get_default();
+
+        info = g_irepository_find_by_gtype(repository, boxed_type);
+
+        if (info != NULL) {
+            pygi_import();
+            tp = (PyTypeObject *)pygi_type_find_by_gi_info(info);
+            g_base_info_unref(info);
+            if (tp == NULL) {
+                PyErr_Clear();
+            } else {
+                /* Note: The type is registered, so at least a reference remains. */
+                Py_DECREF((PyObject *)tp);
+            }
+        }
+    }
+#endif
+
     if (!tp)
 	tp = (PyTypeObject *)&PyGBoxed_Type; /* fallback */
     self = PyObject_NEW(PyGBoxed, tp);



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