Accepting request 60446 from devel:languages:python

Accepted submit request 60446 from user matejcik

OBS-URL: https://build.opensuse.org/request/show/60446
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-gobject?expand=0&rev=3
This commit is contained in:
Ruediger Oertel 2011-02-11 01:10:30 +00:00 committed by Git OBS Bridge
parent 070d1359a6
commit 230b81171f
3 changed files with 197 additions and 0 deletions

View File

@ -0,0 +1,187 @@
diff --git a/gi/gimodule.c b/gi/gimodule.c
index 89caf4e..f7624ae 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_CPointer_WrapPointer ( (void *) &CAPI, "gi._API");
if (api == NULL) {
return;
}
diff --git a/gi/pygi.h b/gi/pygi.h
index c5a0f26..1d3d686 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 4a58bc2..29a4713 100644
--- a/glib/glibmodule.c
+++ b/glib/glibmodule.c
@@ -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_CPointer_WrapPointer(&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..097a6ab 100644
--- a/glib/pyglib-python-compat.h
+++ b/glib/pyglib-python-compat.h
@@ -41,6 +41,34 @@ typedef int Py_ssize_t;
typedef inquiry lenfunc;
#endif
+/* PyCObject superceded by PyCapsule on Python >= 2.7
+ * However since this effects header files used by
+ * static bindings we are only applying the change to
+ * Python 3.x where we don't support the static bindings.
+ * 3.2 removed PyCObject so we don't have any choice here.
+ *
+ * For SUSE we need to apply this for 2.7 and above because
+ * the deprecated code fails when warnings are turned into
+ * exceptions. When this is undeprecated, the patch becomes obsolete.
+ * */
+#if PY_VERSION_HEX >= 0x02070000
+# define PYGLIB_CPointer_Check PyCapsule_CheckExact
+# define PYGLIB_CPointer_WrapPointer(ptr, typename) \
+ PyCapsule_New(ptr, typename, NULL)
+# define PYGLIB_CPointer_GetPointer(obj, typename) \
+ PyCapsule_GetPointer(obj, typename)
+# define PYGLIB_CPointer_Import(module, symbol) \
+ PyCapsule_Import(##module##.##symbol##, FALSE)
+#else
+# define PYGLIB_CPointer_Check PyCObject_Check
+# define PYGLIB_CPointer_WrapPointer(ptr, typename) \
+ PyCObject_FromVoidPtr(ptr, NULL)
+# define PYGLIB_CPointer_GetPointer(obj, typename) \
+ PyCObject_AsVoidPtr(obj)
+# define PYGLIB_CPointer_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..c85a628 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_CPointer_Check(cobject))
+ _PyGLib_API = (struct _PyGLib_Functions *) PYGLIB_CPointer_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_CPointer_GetPointer(api, "glib._PyGLib_API");
}
gboolean
diff --git a/glib/pygoptioncontext.c b/glib/pygoptioncontext.c
index 1d67ac5..93d9b24 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_CPointer_WrapPointer(self->context, "goption.context");
}
static PyMethodDef pyg_option_context_methods[] = {
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index ca3a2d8..9d4b0a7 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -2512,7 +2512,7 @@ pygobject_register_api(PyObject *d)
{
PyObject *api;
- api = PyCObject_FromVoidPtr(&pygobject_api_functions,NULL);
+ api = PYGLIB_CPointer_WrapPointer(&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 6555392..434ba3f 100644
--- a/gobject/pygobject.h
+++ b/gobject/pygobject.h
@@ -354,8 +354,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 8536bed..0cbf8cd 100644
--- a/gobject/pygtype.c
+++ b/gobject/pygtype.c
@@ -890,8 +890,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_CPointer_Check(obj))
+ g_value_set_pointer(value, PYGLIB_CPointer_GetPointer(obj, NULL));
else
return -1;
break;
@@ -936,15 +936,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_CPointer_Check(obj))
+ g_value_set_boxed(value, PYGLIB_CPointer_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_CPointer_GetPointer(obj, NULL));
else
return -1;
break;
--
1.7.2.3

View File

@ -1,3 +1,10 @@
-------------------------------------------------------------------
Wed Feb 9 18:09:19 UTC 2011 - jmatejek@novell.com
- added patch that switches to new Capsule API, because the deprecated
PyCObject API will cause a segfault when warnings are exceptions
(bnc#669802)
-------------------------------------------------------------------
Fri Jan 7 15:05:51 CET 2011 - vuntz@opensuse.org

View File

@ -28,6 +28,8 @@ License: LGPLv2.1+
Group: Development/Libraries/Python
Url: http://ftp.gnome.org/pub/GNOME/sources/pygobject/
Source: %{_name}-%{version}.tar.bz2
# conditionally use the new Capsule API instead of PyCObject, bnc#669802
Patch0: pygobject-2.26.0-capsule.patch
BuildRequires: fdupes
BuildRequires: glib2-devel
BuildRequires: gobject-introspection-devel
@ -79,6 +81,7 @@ addon libraries such as pygtk.
%prep
%setup -q -n %{_name}-%{version}
%patch0 -p1
%build
%configure