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 >= 0x02070000 + 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 >= 0x02070000 +# 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 >= 0x02070000 + 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;