rendered paste bodyIndex: ChangeLog===================================================================RCS file: /cvs/gnome/gnome-python/pygobject/ChangeLog,vretrieving revision 1.29diff -u -p -d -r1.29 ChangeLog--- ChangeLog 11 Apr 2006 20:13:26 -0000 1.29+++ ChangeLog 11 Apr 2006 21:40:14 -0000@@ -1,5 +1,17 @@ 2006-04-11 Gustavo J. A. M. Carneiro <gjc@gnome.org> + * gobject/__init__.py:+ * gobject/gobjectmodule.c (_wrap_pyg_type_register),+ (pyg__install_metaclass, init_gobject): GObjectMeta now moved to+ python-land (__init__.py).+ + * gobject/pygobject-private.h:+ * gobject/pygobject.c (pygobject_register_class):+ PyGObject_MetaType is now a pointer, not structure.++ * gobject/gobjectmodule.c (_wrap_pyg_type_register): Add optional+ type name parameter.+ * tests/common.py (importModule): Include original exception string in the raised SystemExit. Index: gobject/__init__.py===================================================================RCS file: /cvs/gnome/gnome-python/pygobject/gobject/__init__.py,vretrieving revision 1.1diff -u -p -d -r1.1 __init__.py--- gobject/__init__.py 11 Apr 2006 15:14:36 -0000 1.1+++ gobject/__init__.py 11 Apr 2006 21:40:14 -0000@@ -28,3 +28,24 @@ except ImportError: pass from _gobject import *++class GObjectMeta(type):+ "Metaclass for automatically gobject.type_register()ing GObject classes"+ def __init__(cls, name, bases, dict_):+ type.__init__(cls, name, bases, dict_)+ ## don't register the class if already registered+ if '__gtype__' in cls.__dict__:+ return++ if not ('__gproperties__' in cls.__dict__ or+ '__gsignals__' in cls.__dict__ or+ '__gtype_name__' in cls.__dict__):+ return++ if '__gtype_name__' in cls.__dict__:+ type_register(cls, cls.__dict__['__gtype_name__'])+ else:+ type_register(cls)++_gobject._install_metaclass(GObjectMeta)+Index: gobject/gobjectmodule.c===================================================================RCS file: /cvs/gnome/gnome-python/pygobject/gobject/gobjectmodule.c,vretrieving revision 1.212diff -u -p -d -r1.212 gobjectmodule.c--- gobject/gobjectmodule.c 11 Apr 2006 15:14:36 -0000 1.212+++ gobject/gobjectmodule.c 11 Apr 2006 21:40:16 -0000@@ -1070,8 +1070,9 @@ static PyObject * _wrap_pyg_type_register(PyObject *self, PyObject *args) { PyTypeObject *class;+ char *type_name = NULL; - if (!PyArg_ParseTuple(args, "O!:gobject.type_register", &PyType_Type, &class))+ if (!PyArg_ParseTuple(args, "O!|s:gobject.type_register", &PyType_Type, &class, &type_name)) return NULL; if (!PyType_IsSubtype(class, &PyGObject_Type)) { PyErr_SetString(PyExc_TypeError,"argument must be a GObject subclass");@@ -1082,7 +1083,7 @@ _wrap_pyg_type_register(PyObject *self, if (pyg_type_from_object((PyObject *) class) == pyg_type_from_object((PyObject *) class->tp_base)) {- if (pyg_type_register(class, NULL))+ if (pyg_type_register(class, type_name)) return NULL; } @@ -2461,6 +2462,16 @@ pyg_remove_emission_hook(PyGObject *self return Py_None; } +static PyObject *+pyg__install_metaclass(PyObject *dummy, PyTypeObject *metaclass)+{+ Py_INCREF(metaclass);+ PyGObject_MetaType = metaclass;+ Py_INCREF(metaclass);+ PyGObject_Type.ob_type = metaclass;+ Py_INCREF(Py_None);+ return Py_None;+} static PyMethodDef pygobject_functions[] = { { "type_name", pyg_type_name, METH_VARARGS },@@ -2492,6 +2503,7 @@ static PyMethodDef pygobject_functions[] { "signal_accumulator_true_handled", (PyCFunction)pyg_signal_accumulator_true_handled, METH_VARARGS }, { "add_emission_hook", (PyCFunction)pyg_add_emission_hook, METH_VARARGS }, { "remove_emission_hook", (PyCFunction)pyg_remove_emission_hook, METH_VARARGS },+ { "_install_metaclass", (PyCFunction)pyg__install_metaclass, METH_O }, { NULL, NULL, 0 } };@@ -3001,13 +3013,6 @@ init_gobject(void) gerror_exc = PyErr_NewException("gobject.GError", PyExc_RuntimeError,NULL); PyDict_SetItemString(d, "GError", gerror_exc);-- PyGObject_MetaType.tp_base = &PyType_Type;- 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;Index: gobject/pygobject-private.h===================================================================RCS file: /cvs/gnome/gnome-python/pygobject/gobject/pygobject-private.h,vretrieving revision 1.44diff -u -p -d -r1.44 pygobject-private.h--- gobject/pygobject-private.h 9 Nov 2005 19:45:19 -0000 1.44+++ gobject/pygobject-private.h 11 Apr 2006 21:40:16 -0000@@ -101,7 +101,7 @@ GClosure *pyg_signal_class_closure_get(v PyObject *pyg_object_descr_doc_get(void); -extern PyTypeObject PyGObject_MetaType;+extern PyTypeObject *PyGObject_MetaType; /* from pygobject.h */ extern PyTypeObject PyGObject_Type;Index: gobject/pygobject.c===================================================================RCS file: /cvs/gnome/gnome-python/pygobject/gobject/pygobject.c,vretrieving revision 1.67diff -u -p -d -r1.67 pygobject.c--- gobject/pygobject.c 19 Mar 2006 12:12:08 -0000 1.67+++ gobject/pygobject.c 11 Apr 2006 21:40:16 -0000@@ -34,6 +34,8 @@ typedef struct { } SinkFunc; static GArray *sink_funcs = NULL; +PyTypeObject *PyGObject_MetaType = NULL;+ /** * pygobject_sink: * @obj: a GObject@@ -514,7 +516,7 @@ pygobject_register_class(PyObject *dict, } else bases = runtime_bases; - type->ob_type = &PyGObject_MetaType;+ type->ob_type = PyGObject_MetaType; type->tp_bases = bases; if (G_LIKELY(bases)) { type->tp_base = (PyTypeObject *)PyTuple_GetItem(bases, 0);@@ -1723,94 +1725,6 @@ PyTypeObject PyGObject_Type = { (freefunc)pygobject_free, /* tp_free */ (inquiry)0, /* tp_is_gc */ (PyObject *)0, /* tp_bases */-};---static int-pygobjectmeta_register(PyTypeObject *subtype)-{- PyObject *pytype_name;- const char *type_name = NULL;- int retval = 0;- - /* Maybe the type doesn't really need to registered? */- if (subtype->tp_dict == NULL)- goto out;- - if (!(PyDict_GetItemString(subtype->tp_dict, "__gtype_name__")- || PyDict_GetItemString(subtype->tp_dict, "__gproperties__")- || PyDict_GetItemString(subtype->tp_dict, "__gsignals__")))- goto out;-- /* If it's already registered, skip registration */- if (PyDict_GetItemString(subtype->tp_dict, "__gtype__"))- goto out;-- pytype_name = PyDict_GetItemString(subtype->tp_dict, "__gtype_name__");- if (pytype_name)- type_name = PyString_AsString(pytype_name);- retval = pyg_type_register(subtype, type_name);--out:- return retval;-}--/* -------- GObject MetaClass -----------*/-static int-pygobjectmeta_init(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)-{- if (PyType_Type.tp_init((PyObject *) subtype, args, kwargs))- return -1;- - return pygobjectmeta_register(subtype);-}---PyTypeObject PyGObject_MetaType = {- PyObject_HEAD_INIT(NULL)- 0, /* ob_size */- "gobject.GObjectMeta", /* tp_name */- 0, /* tp_basicsize */- 0, /* tp_itemsize */- /* methods */- (destructor)0, /* tp_dealloc */- (printfunc)0, /* tp_print */- (getattrfunc)0, /* tp_getattr */- (setattrfunc)0, /* tp_setattr */- (cmpfunc)0, /* tp_compare */- (reprfunc)0, /* tp_repr */- 0, /* tp_as_number */- 0, /* tp_as_sequence */- 0, /* tp_as_mapping */- (hashfunc)0, /* tp_hash */- (ternaryfunc)0, /* tp_call */- (reprfunc)0, /* tp_str */- (getattrofunc)0, /* tp_getattro */- (setattrofunc)0, /* tp_setattro */- 0, /* tp_as_buffer */- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_BASETYPE, /* tp_flags */- "GObject Metaclass -- automatically registers GObject subclasses "- "as new GType's", /* Documentation string */- (traverseproc)0, /* tp_traverse */- (inquiry)0, /* tp_clear */- (richcmpfunc)0, /* tp_richcompare */- 0, /* tp_weaklistoffset */- (getiterfunc)0, /* tp_iter */- (iternextfunc)0, /* tp_iternext */- 0, /* tp_methods */- 0, /* tp_members */- 0, /* tp_getset */- NULL, /* tp_base */- (PyObject *)0, /* tp_dict */- 0, /* tp_descr_get */- 0, /* tp_descr_set */- 0, /* tp_dictoffset */- (initproc)pygobjectmeta_init, /* tp_init */- (allocfunc)0, /* tp_alloc */- (newfunc)0, /* tp_new */- 0, /* tp_free */- (inquiry)0, /* tp_is_gc */- NULL, /* tp_bases */ };