All pastes #49077 Raw Edit

Diff

public text v1 · immutable
#49077 ·published 2006-04-11 21:42 UTC
rendered paste body
Index: 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:41:29 -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:41:29 -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:41:31 -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:41:31 -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:41:31 -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 */ };