pygobject2/pygobject-pycapsule.patch
John (J5) Palmieri a781b5c135 - Edit PyCapsule patch to only use PyCapsule in Python 3.x
since this effects header files which require other modules to
  be recompiled.  There is actually discussion upstream to undeprecate it
  for the 2.x series
2010-09-30 15:59:38 -04:00

186 lines
6.5 KiB
Diff

diff --git a/gi/gimodule.c b/gi/gimodule.c
index 89caf4e..d42e7e4 100644
--- a/gi/gimodule.c
+++ b/gi/gimodule.c
@@ -328,7 +328,7 @@ PYGLIB_MODULE_START(_gi, "_gi")
_pygi_boxed_register_types (module);
_pygi_argument_init();
- api = PyCObject_FromVoidPtr ( (void *) &CAPI, NULL);
+ api = PYGLIB_PyCapsule_New ( (void *) &CAPI, "gi._API");
if (api == NULL) {
return;
}
diff --git a/gi/pygi.h b/gi/pygi.h
index d1eaf05..551bb6f 100644
--- a/gi/pygi.h
+++ b/gi/pygi.h
@@ -83,8 +83,11 @@ _pygi_import (void)
if (PyGI_API != NULL) {
return 1;
}
-
+#if PY_VERSION_HEX >= 0x03000000
+ PyGI_API = (struct PyGI_API*) PyCapsule_Import("gi._API", FALSE);
+#else
PyGI_API = (struct PyGI_API*) PyCObject_Import("gi", "_API");
+#endif
if (PyGI_API == NULL) {
return -1;
}
diff --git a/glib/glibmodule.c b/glib/glibmodule.c
index ebea163..f1c8168 100644
--- a/glib/glibmodule.c
+++ b/glib/glibmodule.c
@@ -627,7 +627,7 @@ pyglib_uri_list_extract_uris(PyObject *self, PyObject *args, PyObject *kwargs)
ret = PyTuple_New(i);
for (j = 0; j < i; j++)
- PyTuple_SetItem(ret, j, PyString_FromString(uris[j]));
+ PyTuple_SetItem(ret, j, PYGLIB_PyUnicode_FromString(uris[j]));
g_strfreev(uris);
@@ -797,7 +797,7 @@ pyglib_register_api(PyObject *d)
/* for addon libraries ... */
PyDict_SetItemString(d, "_PyGLib_API",
- o=PyCObject_FromVoidPtr(&pyglib_api,NULL));
+ o=PYGLIB_PyCapsule_New(&pyglib_api,"glib._PyGLib_API"));
Py_DECREF(o);
pyglib_init_internal(o);
diff --git a/glib/pyglib-python-compat.h b/glib/pyglib-python-compat.h
index bb7bcad..222fc8c 100644
--- a/glib/pyglib-python-compat.h
+++ b/glib/pyglib-python-compat.h
@@ -41,6 +41,25 @@ typedef int Py_ssize_t;
typedef inquiry lenfunc;
#endif
+/* PyCObject superceded by PyCapsule on Python >= 2.7 */
+#if PY_VERSION_HEX >= 0x03000000
+# define PYGLIB_PyCapsule_Check PyCapsule_CheckExact
+# define PYGLIB_PyCapsule_New(ptr, typename) \
+ PyCapsule_New(ptr, typename, NULL)
+# define PYGLIB_PyCapsule_GetPointer(obj, typename) \
+ PyCapsule_GetPointer(obj, typename)
+# define PYGLIB_PyCapsule_Import(module, symbol) \
+ PyCapsule_Import(##module##.##symbol##, FALSE)
+#else
+# define PYGLIB_PyCapsule_Check PyCObject_Check
+# define PYGLIB_PyCapsule_New(ptr, typename) \
+ PyCObject_FromVoidPtr(ptr, NULL)
+# define PYGLIB_PyCapsule_GetPointer(obj, typename) \
+ PyCObject_AsVoidPtr(obj)
+# define PYGLIB_PyCapsule_Import(module, symbol) \
+ PyCObject_Import(module, symbol)
+#endif
+
#if PY_VERSION_HEX < 0x03000000
#define PYGLIB_INIT_FUNCTION(modname, fullpkgname, functions) \
diff --git a/glib/pyglib.c b/glib/pyglib.c
index 07db579..7e1b106 100644
--- a/glib/pyglib.c
+++ b/glib/pyglib.c
@@ -71,8 +71,8 @@ pyglib_init(void)
}
cobject = PyObject_GetAttrString(glib, "_PyGLib_API");
- if (cobject && PyCObject_Check(cobject))
- _PyGLib_API = (struct _PyGLib_Functions *) PyCObject_AsVoidPtr(cobject);
+ if (cobject && PYGLIB_PyCapsule_Check(cobject))
+ _PyGLib_API = (struct _PyGLib_Functions *) PYGLIB_PyCapsule_GetPointer(cobject, "glib._PyGLib_API");
else {
PyErr_SetString(PyExc_ImportError,
"could not import glib (could not find _PyGLib_API object)");
@@ -88,7 +88,7 @@ pyglib_init(void)
void
pyglib_init_internal(PyObject *api)
{
- _PyGLib_API = (struct _PyGLib_Functions *) PyCObject_AsVoidPtr(api);
+ _PyGLib_API = (struct _PyGLib_Functions *) PYGLIB_PyCapsule_GetPointer(api, "glib._PyGLib_API");
}
gboolean
diff --git a/glib/pygoptioncontext.c b/glib/pygoptioncontext.c
index 1d67ac5..fe0a2b3 100644
--- a/glib/pygoptioncontext.c
+++ b/glib/pygoptioncontext.c
@@ -288,7 +288,7 @@ pyg_option_context_richcompare(PyObject *self, PyObject *other, int op)
static PyObject *
pyg_option_get_context(PyGOptionContext *self)
{
- return PyCObject_FromVoidPtr(self->context, NULL);
+ return PYGLIB_PyCapsule_New(self->context, "goption.context");
}
static PyMethodDef pyg_option_context_methods[] = {
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index 4e9c07d..b6d6f1d 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -2511,7 +2511,7 @@ pygobject_register_api(PyObject *d)
{
PyObject *api;
- api = PyCObject_FromVoidPtr(&pygobject_api_functions,NULL);
+ api = PYGLIB_PyCapsule_New(&pygobject_api_functions, "gobject._PyGObject_API");
PyDict_SetItemString(d, "_PyGObject_API", api);
Py_DECREF(api);
}
diff --git a/gobject/pygobject.h b/gobject/pygobject.h
index e75c890..c803634 100644
--- a/gobject/pygobject.h
+++ b/gobject/pygobject.h
@@ -352,8 +352,14 @@ pygobject_init(int req_major, int req_minor, int req_micro)
}
cobject = PyObject_GetAttrString(gobject, "_PyGObject_API");
+#if PY_VERSION_HEX >= 0x03000000
+ if (cobject && PyCapsule_CheckExact(cobject))
+ _PyGObject_API = (struct _PyGObject_Functions *) PyCapsule_GetPointer(cobject, "gobject._PyGObject_API");
+
+#else
if (cobject && PyCObject_Check(cobject))
_PyGObject_API = (struct _PyGObject_Functions *) PyCObject_AsVoidPtr(cobject);
+#endif
else {
PyErr_SetString(PyExc_ImportError,
"could not import gobject (could not find _PyGObject_API object)");
diff --git a/gobject/pygtype.c b/gobject/pygtype.c
index c875aa2..19d8b64 100644
--- a/gobject/pygtype.c
+++ b/gobject/pygtype.c
@@ -864,8 +864,8 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj)
else if (PyObject_TypeCheck(obj, &PyGPointer_Type) &&
G_VALUE_HOLDS(value, ((PyGPointer *)obj)->gtype))
g_value_set_pointer(value, pyg_pointer_get(obj, gpointer));
- else if (PyCObject_Check(obj))
- g_value_set_pointer(value, PyCObject_AsVoidPtr(obj));
+ else if (PYGLIB_PyCapsule_Check(obj))
+ g_value_set_pointer(value, PYGLIB_PyCapsule_GetPointer(obj, NULL));
else
return -1;
break;
@@ -910,15 +910,15 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj)
}
else if ((bm = pyg_type_lookup(G_VALUE_TYPE(value))) != NULL)
return bm->tovalue(value, obj);
- else if (PyCObject_Check(obj))
- g_value_set_boxed(value, PyCObject_AsVoidPtr(obj));
+ else if (PYGLIB_PyCapsule_Check(obj))
+ g_value_set_boxed(value, PYGLIB_PyCapsule_GetPointer(obj, NULL));
else
return -1;
break;
}
case G_TYPE_PARAM:
if (PyGParamSpec_Check(obj))
- g_value_set_param(value, PyCObject_AsVoidPtr(obj));
+ g_value_set_param(value, PYGLIB_PyCapsule_GetPointer(obj, NULL));
else
return -1;
break;