[pygobject/gsoc2009: 138/160] Register introspected interfaces
- From: Simon van der Linden <svdlinden src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [pygobject/gsoc2009: 138/160] Register introspected interfaces
- Date: Fri, 14 Aug 2009 21:35:20 +0000 (UTC)
commit bf2367c170f84478886b90ea0161e7f09f7224e0
Author: Simon van der Linden <svdlinden src gnome org>
Date: Wed Aug 12 15:25:44 2009 +0200
Register introspected interfaces
gi/pygi-info.c | 69 +++++++++++++----------------------------------
gi/types.py | 3 ++
gobject/gobjectmodule.c | 5 +++-
gobject/pyginterface.c | 15 ++++++++--
gobject/pyginterface.h | 2 +
gobject/pygobject.h | 7 +++++
6 files changed, 47 insertions(+), 54 deletions(-)
---
diff --git a/gi/pygi-info.c b/gi/pygi-info.c
index bc3a3c3..93e6518 100644
--- a/gi/pygi-info.c
+++ b/gi/pygi-info.c
@@ -1330,66 +1330,35 @@ _wrap_g_interface_info_get_methods (PyGIBaseInfo *self)
return infos;
}
-static void
-initialize_interface (GTypeInterface *iface,
- PyTypeObject *pytype)
+static PyObject *
+_wrap_g_interface_info_register_type (PyGIBaseInfo *self,
+ PyObject *args,
+ PyObject *kwargs)
{
- // TODO: Implement this when g-i adds supports for vfunc offsets:
- // http://bugzilla.gnome.org/show_bug.cgi?id=560281
- /*
- GIRepository *repo = g_irepository_get_default();
- GIBaseInfo *iface_info = g_irepository_find_by_gtype(repo, G_TYPE_FROM_INTERFACE(iface));
- int length, i;
- GTypeInterface *parent_iface = g_type_interface_peek_parent(iface);
-
- length = g_interface_info_get_n_methods((GIInterfaceInfo *) iface_info);
-
- for (i = 0; i < length; i++) {
- GIFunctionInfo *method = g_interface_info_get_method((GIInterfaceInfo *) iface_info, i);
- const gchar *method_name = g_base_info_get_name((GIBaseInfo *) method);
- gchar pymethod_name[250];
- PyObject *py_method;
- void *method_ptr = iface + i * sizeof(void*);
-
- printf("%s\n", method_name);
-
- g_snprintf(pymethod_name, sizeof(pymethod_name), "do_%s", pymethod_name);
- py_method = PyObject_GetAttrString((PyObject *) pytype, pymethod_name);
- if (py_method && !PyObject_TypeCheck(py_method, &PyCFunction_Type)) {
- method_ptr = interface_method;
- } else {
- PyErr_Clear();
- if (parent_iface) {
- method_ptr = parent_iface + i * sizeof(void*);
- }
- Py_XDECREF(py_method);
- }
+ static char *kwlist[] = { "type", NULL };
+ PyTypeObject *type;
+ GType g_type;
- g_base_info_unref((GIBaseInfo *) method);
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "O!:InterfaceInfo.register_type",
+ kwlist, &PyType_Type, &type)) {
+ return NULL;
}
- */
-}
-static PyObject *
-_wrap_g_interface_info_register (PyGIBaseInfo *self)
-{
- GType gtype;
- GInterfaceInfo *info_struct = g_new0(GInterfaceInfo, 1);
-
- info_struct->interface_init = (GInterfaceInitFunc) initialize_interface;
- info_struct->interface_finalize = NULL;
- info_struct->interface_data = NULL;
+ if (!PyType_IsSubtype(type, &PyGInterface_Type)) {
+ PyErr_SetString(PyExc_TypeError, "argument 1: Must be a subtype of gobject.GInterface");
+ return NULL;
+ }
- gtype = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *) self->info);
- pyg_register_interface_info(gtype, info_struct);
+ g_type = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)self->info);
+ pyg_register_interface_type(g_type, type);
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyMethodDef _PyGIInterfaceInfo_methods[] = {
{ "get_methods", (PyCFunction)_wrap_g_interface_info_get_methods, METH_NOARGS },
- { "register", (PyCFunction)_wrap_g_interface_info_register, METH_NOARGS },
+ { "register_type", (PyCFunction)_wrap_g_interface_info_register_type, METH_VARARGS | METH_KEYWORDS },
{ NULL, NULL, 0 }
};
diff --git a/gi/types.py b/gi/types.py
index c27119f..64e9a8c 100644
--- a/gi/types.py
+++ b/gi/types.py
@@ -99,6 +99,9 @@ class GObjectMeta(gobject.GObjectMeta, MetaClassHelper):
if hasattr(cls, '__gtype__'):
setObjectHasNewConstructor(cls.__gtype__)
+ if (isinstance(cls.__info__, InterfaceInfo)):
+ cls.__info__.register_type(cls)
+
class StructMeta(type, MetaClassHelper):
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index e877711..929153a 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -2576,7 +2576,10 @@ struct _PyGObject_Functions pygobject_api_functions = {
&PyGObject_Type,
&PyGTypeWrapper_Type,
- pygobject_new_from_type
+ pygobject_new_from_type,
+
+ &PyGInterface_Type,
+ pyg_register_interface_type
};
/* for addon libraries ... */
diff --git a/gobject/pyginterface.c b/gobject/pyginterface.c
index 29af546..4f43d92 100644
--- a/gobject/pyginterface.c
+++ b/gobject/pyginterface.c
@@ -53,6 +53,14 @@ pyg_interface_free(PyObject *op)
PyObject_FREE(op);
}
+void
+pyg_register_interface_type (GType g_type,
+ PyTypeObject *type)
+{
+ Py_INCREF((PyObject *)type);
+ g_type_set_qdata(g_type, pyginterface_type_key, type);
+}
+
/**
* pyg_register_interface:
* @dict: a module dictionary.
@@ -84,10 +92,11 @@ pyg_register_interface(PyObject *dict, const gchar *class_name,
Py_DECREF(o);
}
- g_type_set_qdata(gtype, pyginterface_type_key, type);
-
+ pyg_register_interface_type(type, gtype);
+
PyDict_SetItemString(dict, (char *)class_name, (PyObject *)type);
-
+
+ Py_DECREF(type);
}
void
diff --git a/gobject/pyginterface.h b/gobject/pyginterface.h
index 0f390c2..20eb382 100644
--- a/gobject/pyginterface.h
+++ b/gobject/pyginterface.h
@@ -28,6 +28,8 @@ extern GQuark pyginterface_info_key;
extern PyTypeObject PyGInterface_Type;
+void pyg_register_interface_type (GType g_type,
+ PyTypeObject *type);
void pyg_register_interface(PyObject *dict,
const gchar *class_name,
GType gtype,
diff --git a/gobject/pygobject.h b/gobject/pygobject.h
index 2db7cd7..14987f1 100644
--- a/gobject/pygobject.h
+++ b/gobject/pygobject.h
@@ -205,6 +205,10 @@ struct _PyGObject_Functions {
PyObject *(*object_new_from_type) (PyTypeObject *type,
GObject *obj,
gboolean sink);
+
+ PyTypeObject *interface_type;
+ void (*register_interface_type) (GType g_type,
+ PyTypeObject *type);
};
#ifndef _INSIDE_PYGOBJECT_
@@ -275,6 +279,9 @@ struct _PyGObject_Functions *_PyGObject_API;
#define PyGTypeWrapper_Type (*_PyGObject_API->type_wrapper_type)
#define pygobject_new_from_type (_PyGObject_API->object_new_from_type)
+#define PyGInterface_Type (*_PyGObject_API->interface_type)
+#define pyg_register_interface_type (_PyGObject_API->register_interface_type)
+
#define pyg_block_threads() G_STMT_START { \
if (_PyGObject_API->block_threads != NULL) \
(* _PyGObject_API->block_threads)(); \
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]