[pygobject/gsoc2009: 139/160] Register introspected objects
- From: Simon van der Linden <svdlinden src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [pygobject/gsoc2009: 139/160] Register introspected objects
- Date: Fri, 14 Aug 2009 21:35:25 +0000 (UTC)
commit a17c5cb6e180eaf517c992e78d246ce16d4d38b6
Author: Simon van der Linden <svdlinden src gnome org>
Date: Wed Aug 12 15:39:44 2009 +0200
Register introspected objects
gi/pygi-info.c | 27 +++++++++++++++++++++++++++
gi/types.py | 3 +--
gobject/gobjectmodule.c | 3 ++-
gobject/pyginterface.c | 2 +-
gobject/pygobject-private.h | 2 ++
gobject/pygobject.c | 11 +++++++++--
gobject/pygobject.h | 8 ++++++--
7 files changed, 48 insertions(+), 8 deletions(-)
---
diff --git a/gi/pygi-info.c b/gi/pygi-info.c
index 93e6518..75b7f93 100644
--- a/gi/pygi-info.c
+++ b/gi/pygi-info.c
@@ -1282,11 +1282,38 @@ _wrap_g_object_info_get_interfaces (PyGIBaseInfo *self)
return infos;
}
+static PyObject *
+_wrap_g_object_info_register_type (PyGIBaseInfo *self,
+ PyObject *args,
+ PyObject *kwargs)
+{
+ static char *kwlist[] = { "type", NULL };
+ PyTypeObject *type;
+ GType g_type;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "O!:ObjectInfo.register_type",
+ kwlist, &PyType_Type, &type)) {
+ return NULL;
+ }
+
+ if (!PyType_IsSubtype(type, &PyGObject_Type)) {
+ PyErr_SetString(PyExc_TypeError, "argument 1: Must be a subtype of gobject.GObject");
+ return NULL;
+ }
+
+ g_type = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)self->info);
+ pyg_register_object_type(g_type, type);
+
+ Py_RETURN_NONE;
+}
+
static PyMethodDef _PyGIObjectInfo_methods[] = {
{ "get_parent", (PyCFunction)_wrap_g_object_info_get_parent, METH_NOARGS },
{ "get_methods", (PyCFunction)_wrap_g_object_info_get_methods, METH_NOARGS },
{ "get_fields", (PyCFunction)_wrap_g_object_info_get_fields, METH_NOARGS },
{ "get_interfaces", (PyCFunction)_wrap_g_object_info_get_interfaces, METH_NOARGS },
+ { "register_type", (PyCFunction)_wrap_g_object_info_register_type, METH_VARARGS | METH_KEYWORDS },
{ NULL, NULL, 0 }
};
diff --git a/gi/types.py b/gi/types.py
index 64e9a8c..d400035 100644
--- a/gi/types.py
+++ b/gi/types.py
@@ -99,8 +99,7 @@ class GObjectMeta(gobject.GObjectMeta, MetaClassHelper):
if hasattr(cls, '__gtype__'):
setObjectHasNewConstructor(cls.__gtype__)
- if (isinstance(cls.__info__, InterfaceInfo)):
- cls.__info__.register_type(cls)
+ cls.__info__.register_type(cls)
class StructMeta(type, MetaClassHelper):
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index 929153a..aeebb8c 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -2573,9 +2573,10 @@ struct _PyGObject_Functions pygobject_api_functions = {
pyglib_option_group_new,
- &PyGObject_Type,
&PyGTypeWrapper_Type,
+ &PyGObject_Type,
+ pyg_register_object_type,
pygobject_new_from_type,
&PyGInterface_Type,
diff --git a/gobject/pyginterface.c b/gobject/pyginterface.c
index 4f43d92..1c169e5 100644
--- a/gobject/pyginterface.c
+++ b/gobject/pyginterface.c
@@ -92,7 +92,7 @@ pyg_register_interface(PyObject *dict, const gchar *class_name,
Py_DECREF(o);
}
- pyg_register_interface_type(type, gtype);
+ pyg_register_interface_type(gtype, type);
PyDict_SetItemString(dict, (char *)class_name, (PyObject *)type);
diff --git a/gobject/pygobject-private.h b/gobject/pygobject-private.h
index 18ab07d..f8efcf6 100644
--- a/gobject/pygobject-private.h
+++ b/gobject/pygobject-private.h
@@ -157,6 +157,8 @@ void pygobject_register_sinkfunc(GType type,
void (* sinkfunc)(GObject *object));
int pyg_type_register (PyTypeObject *class,
const gchar *type_name);
+void pyg_register_object_type (GType g_type,
+ PyTypeObject *type);
/* from pygboxed.c */
extern PyTypeObject PyGBoxed_Type;
diff --git a/gobject/pygobject.c b/gobject/pygobject.c
index 2a47ddb..2e47f53 100644
--- a/gobject/pygobject.c
+++ b/gobject/pygobject.c
@@ -648,6 +648,14 @@ pyg_type_get_bases(GType gtype)
return bases;
}
+void
+pyg_register_object_type (GType g_type,
+ PyTypeObject *type)
+{
+ Py_INCREF(type);
+ g_type_set_qdata(g_type, pygobject_class_key, type);
+}
+
/**
* pygobject_new_with_interfaces
* @gtype: the GType of the GObject subclass.
@@ -748,8 +756,7 @@ pygobject_new_with_interfaces(GType gtype)
}
/* stash a pointer to the python class with the GType */
- Py_INCREF(type);
- g_type_set_qdata(gtype, pygobject_class_key, type);
+ pyg_register_object_type(gtype, type);
pyglib_gil_state_release(state);
diff --git a/gobject/pygobject.h b/gobject/pygobject.h
index 14987f1..bad52ad 100644
--- a/gobject/pygobject.h
+++ b/gobject/pygobject.h
@@ -199,9 +199,11 @@ struct _PyGObject_Functions {
gboolean (*gerror_exception_check) (GError **error);
PyObject* (*option_group_new) (GOptionGroup *group);
- PyTypeObject *object_type;
PyTypeObject *type_wrapper_type;
+ PyTypeObject *object_type;
+ void (*register_object_type) (GType g_type,
+ PyTypeObject *type);
PyObject *(*object_new_from_type) (PyTypeObject *type,
GObject *obj,
gboolean sink);
@@ -275,8 +277,10 @@ struct _PyGObject_Functions *_PyGObject_API;
#define pyg_type_register_custom_callback (_PyGObject_API->type_register_custom)
#define pyg_gerror_exception_check (_PyGObject_API->gerror_exception_check)
#define pyg_option_group_new (_PyGObject_API->option_group_new)
-#define PyGObject_Type (*_PyGObject_API->object_type)
#define PyGTypeWrapper_Type (*_PyGObject_API->type_wrapper_type)
+
+#define PyGObject_Type (*_PyGObject_API->object_type)
+#define pyg_register_object_type (_PyGObject_API->register_object_type)
#define pygobject_new_from_type (_PyGObject_API->object_new_from_type)
#define PyGInterface_Type (*_PyGObject_API->interface_type)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]