[pygobject2] add patch to work with PyCapsule since PyCObject is removed from Python 3.2

John Palmieri (J5) johnp at fedoraproject.org
Tue Sep 28 19:26:47 UTC 2010


commit 9a1804d42051f70654a5fcd8b26a21a7441cfccb
Author: John (J5) Palmieri <johnp at redhat.com>
Date:   Tue Sep 28 15:25:44 2010 -0400

    add patch to work with PyCapsule since PyCObject is removed from Python 3.2
    
    * Python 3.2 is what we ship in rawhide

 pygobject-pycapsule.patch |  185 +++++++++++++++++++++++++++++++++++++++++++++
 pygobject2.spec           |    8 ++-
 2 files changed, 192 insertions(+), 1 deletions(-)
---
diff --git a/pygobject-pycapsule.patch b/pygobject-pycapsule.patch
new file mode 100644
index 0000000..ce4ac48
--- /dev/null
+++ b/pygobject-pycapsule.patch
@@ -0,0 +1,185 @@
+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;
diff --git a/pygobject2.spec b/pygobject2.spec
index fcea2d8..49b56dd 100644
--- a/pygobject2.spec
+++ b/pygobject2.spec
@@ -12,7 +12,7 @@
 
 Name: pygobject2
 Version: 2.26.0
-Release: 2%{?dist}
+Release: 3%{?dist}
 License: LGPLv2+
 Group: Development/Languages
 Summary: Python 2 bindings for GObject 
@@ -22,6 +22,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-root
 Source: http://ftp.gnome.org/pub/GNOME/sources/pygobject/2.21/pygobject-%{version}.tar.bz2
 Patch1: pygobject-py3m4.patch
 Patch2: pygobject2-py3k-dist.patch
+Patch3: pygobject-pycapsule.patch
 ### Build Dependencies ###
 
 BuildRequires: glib2-devel >= %{glib2_version}
@@ -93,6 +94,7 @@ for use in Python 3 programs.
 %setup -q -n pygobject-%{version}
 %patch1 -p1 -b .pygobject-py3m4
 %patch2 -p1 -b .pygobject-py3k-dist
+%patch3 -p1 -b .pygobject-pycapsule
 
 %if 0%{?with_python3}
 rm -rf %{py3dir}
@@ -181,6 +183,10 @@ rm examples/Makefile*
 %endif # with_python3
 
 %changelog
+* Tue Sep 28 2010 John (J5) Palmieri <johnp at redhat.com> - 2.26.0-3
+- add patch to work with PyCapsule since PyCObject is removed from 
+  Python 3.2 which we ship in rawhide
+
 * Tue Sep 28 2010 John (J5) Palmieri <johnp at redhat.com> - 2.26.0-2
 - add another py3k patch so that we compile correctly under python 3
 - fixes a couple of print syntax and a try, except syntax


More information about the scm-commits mailing list