diff options
author | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-05-22 22:38:55 +0000 |
---|---|---|
committer | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-05-22 22:38:55 +0000 |
commit | 4b01307e0d9edcc71560a6e30f05dfed702cebdf (patch) | |
tree | 9a1630d0c38b86874570e642fda2656f78d73aa9 /gobject/gobjectmodule.c | |
parent | 500a5306d2868dcde7c5b3f1a9c1b7b09aedcb8e (diff) | |
download | pygobject-4b01307e0d9edcc71560a6e30f05dfed702cebdf.tar.gz pygobject-4b01307e0d9edcc71560a6e30f05dfed702cebdf.tar.xz pygobject-4b01307e0d9edcc71560a6e30f05dfed702cebdf.zip |
Bug 128765: GObject metaclass
Diffstat (limited to 'gobject/gobjectmodule.c')
-rw-r--r-- | gobject/gobjectmodule.c | 67 |
1 files changed, 48 insertions, 19 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index b8e6f77..5d288e3 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -900,12 +900,42 @@ pyg_run_class_init(GType gtype, gpointer gclass, PyTypeObject *pyclass) return 0; } - static PyObject * -pyg_type_register(PyObject *self, PyObject *args) +_wrap_pyg_type_register(PyObject *self, PyObject *args) { - PyObject *gtype, *module, *gsignals, *gproperties; PyTypeObject *class; + PyObject *gtype; + + if (PyErr_Warn(PyExc_DeprecationWarning, "gobject.type_register is deprecated;" + " now types are automatically registered")) + return NULL; + + if (!PyArg_ParseTuple(args, "O:gobject.type_register", &class)) + return NULL; + if (!PyType_IsSubtype(class, &PyGObject_Type)) { + PyErr_SetString(PyExc_TypeError,"argument must be a GObject subclass"); + return NULL; + } + + /* Check if type already registered */ + gtype = PyObject_GetAttrString((PyObject *)class, "__gtype__"); + if (gtype == NULL) { + PyErr_Clear(); + /* not registered */ + if (pyg_type_register(class)) + return NULL; + } else + /* already registered */ + Py_DECREF(gtype); + + Py_INCREF(class); + return (PyObject *) class; +} + +int +pyg_type_register(PyTypeObject *class) +{ + PyObject *gtype, *module, *gsignals, *gproperties; GType parent_type, instance_type; gchar *type_name = NULL; gint i, name_serial; @@ -926,17 +956,11 @@ pyg_type_register(PyObject *self, PyObject *args) (GInstanceInitFunc) NULL }; - if (!PyArg_ParseTuple(args, "O:gobject.type_register", &class)) - return NULL; - if (!PyType_IsSubtype(class, &PyGObject_Type)) { - PyErr_SetString(PyExc_TypeError,"argument must be a GObject subclass"); - return NULL; - } /* find the GType of the parent */ parent_type = pyg_type_from_object((PyObject *)class); if (!parent_type) { - return NULL; + return -1; } /* make name for new GType */ @@ -985,7 +1009,7 @@ pyg_type_register(PyObject *self, PyObject *args) g_free(type_name); if (instance_type == 0) { PyErr_SetString(PyExc_RuntimeError, "could not create new GType"); - return NULL; + return -1; } /* store pointer to the class with the GType */ @@ -1011,10 +1035,10 @@ pyg_type_register(PyObject *self, PyObject *args) if (!PyDict_Check(gsignals)) { PyErr_SetString(PyExc_TypeError, "__gsignals__ attribute not a dict!"); - return NULL; + return -1; } if (!add_signals(instance_type, gsignals)) { - return NULL; + return -1; } PyDict_DelItemString(class->tp_dict, "__gsignals__"); /* Borrowed reference. Py_DECREF(gsignals); */ @@ -1029,10 +1053,10 @@ pyg_type_register(PyObject *self, PyObject *args) if (!PyDict_Check(gproperties)) { PyErr_SetString(PyExc_TypeError, "__gproperties__ attribute not a dict!"); - return NULL; + return -1; } if (!add_properties(instance_type, gproperties)) { - return NULL; + return -1; } PyDict_DelItemString(class->tp_dict, "__gproperties__"); /* Borrowed reference. Py_DECREF(gproperties); */ @@ -1043,7 +1067,7 @@ pyg_type_register(PyObject *self, PyObject *args) gclass = g_type_class_ref(instance_type); if (pyg_run_class_init(instance_type, gclass, class)) { g_type_class_unref(gclass); - return NULL; + return -1; } g_type_class_unref(gclass); @@ -1074,8 +1098,7 @@ pyg_type_register(PyObject *self, PyObject *args) } else g_warning("type has no tp_bases"); - Py_INCREF(class); - return (PyObject *) class; + return 0; } static PyObject * @@ -2085,7 +2108,7 @@ static PyMethodDef pygobject_functions[] = { { "type_is_a", pyg_type_is_a, METH_VARARGS }, { "type_children", pyg_type_children, METH_VARARGS }, { "type_interfaces", pyg_type_interfaces, METH_VARARGS }, - { "type_register", pyg_type_register, METH_VARARGS }, + { "type_register", _wrap_pyg_type_register, METH_VARARGS }, { "signal_new", pyg_signal_new, METH_VARARGS }, { "signal_list_names", (PyCFunction)pyg_signal_list_names, METH_VARARGS|METH_KEYWORDS }, { "signal_list_ids", (PyCFunction)pyg_signal_list_ids, METH_VARARGS|METH_KEYWORDS }, @@ -2463,6 +2486,12 @@ initgobject(void) gerror_exc = PyErr_NewException("gobject.GError", PyExc_RuntimeError,NULL); PyDict_SetItemString(d, "GError", gerror_exc); + + PyGObject_MetaType.tp_traverse = PyType_Type.tp_traverse; + PyGObject_MetaType.tp_clear = PyType_Type.tp_clear; + PyGObject_MetaType.tp_is_gc = PyType_Type.tp_is_gc; + PyType_Ready(&PyGObject_MetaType); + PyDict_SetItemString(d, "GObjectMeta", (PyObject *) &PyGObject_MetaType); PyGObject_Type.tp_alloc = PyType_GenericAlloc; PyGObject_Type.tp_new = PyType_GenericNew; |