summaryrefslogtreecommitdiffstats
path: root/gobject/pygobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'gobject/pygobject.c')
-rw-r--r--gobject/pygobject.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/gobject/pygobject.c b/gobject/pygobject.c
index 2c7913d..2b2b2c4 100644
--- a/gobject/pygobject.c
+++ b/gobject/pygobject.c
@@ -1244,21 +1244,42 @@ PyTypeObject PyGObject_Type = {
};
+static int
+pygobjectmeta_register(PyTypeObject *subtype, PyObject *instance_dict)
+{
+ PyObject *pytype_name;
+ char *type_name = NULL;
+ int retval = 0;
+
+ if (!instance_dict) {
+ PyErr_Clear();
+ goto out;
+ }
+
+ /* If it's already registered, skip registration */
+ if (PyDict_GetItemString(instance_dict, "__gtype__"))
+ goto out;
+
+ pytype_name = PyDict_GetItemString(instance_dict, "__gtype_name__");
+ if (pytype_name)
+ type_name = g_strdup(PyString_AsString(pytype_name));
+ retval = pyg_type_register(subtype, type_name);
- /* -------- GObject MetaClass -----------*/
+out:
+ return retval;
+}
+
+/* -------- GObject MetaClass -----------*/
static int
pygobjectmeta_init(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
{
PyObject *instance_dict;
+
if (PyType_Type.tp_init((PyObject *) subtype, args, kwargs))
return -1;
+
instance_dict = PyTuple_GetItem(args, 2);
- if (instance_dict) {
- if (PyDict_GetItemString(instance_dict, "__gtype__") == NULL)
- return pyg_type_register(subtype);
- } else
- PyErr_Clear();
- return 0;
+ return pygobjectmeta_register(subtype, instance_dict);
}