dev-python/cython: Improve py39 patch to avoid breaking py27

Signed-off-by: Michał Górny <mgorny@gentoo.org>
This commit is contained in:
Michał Górny
2020-06-15 13:03:57 +02:00
parent ce45a861d7
commit 3e1e36e8d5
2 changed files with 22 additions and 47 deletions

View File

@@ -1,59 +1,34 @@
From 1bb26b964060392ecb08c3b6c8ca4626e5c1eec7 Mon Sep 17 00:00:00 2001
From: Jeroen Demeyer <jeroen.k.demeyer@gmail.com>
Date: Wed, 28 Aug 2019 10:56:28 +0200
Subject: [PATCH] Always bind Cython functions
From c29a7818d3b6806a457af698aec446d3d28d4f80 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
Date: Sun, 14 Jun 2020 13:45:21 +0200
Subject: [PATCH] Always bind Cython functions in py3
Rebased for cython 0.29.x, and made conditional to Python 3. This
does not solve the original staticmethod problem in Python 2 but it does
resolve classmethod problems in Python 3.9. Therefore, it unbreaks
other packages on Python 3.9, improves overall state for Python 3
and does not introduce regressions in Python 2.
---
Cython/Utility/CythonFunction.c | 15 ---------------
tests/run/cyfunction.pyx | 12 ++++++++++++
2 files changed, 12 insertions(+), 15 deletions(-)
Cython/Utility/CythonFunction.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Cython/Utility/CythonFunction.c b/Cython/Utility/CythonFunction.c
index 01ff1e0dd4..0758548cb3 100644
index a65c8eee36..33d0a4750a 100644
--- a/Cython/Utility/CythonFunction.c
+++ b/Cython/Utility/CythonFunction.c
@@ -552,21 +552,6 @@ static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit,
@@ -548,6 +548,7 @@ static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit,
static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
{
- __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
-
- if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
- Py_INCREF(func);
- return func;
- }
-
- if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
- if (type == NULL)
- type = (PyObject *)(Py_TYPE(obj));
- return __Pyx_PyMethod_New(func, type, (PyObject *)(Py_TYPE(type)));
- }
-
- if (obj == Py_None)
- obj = NULL;
+#if PY_MAJOR_VERSION < 3
__pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
@@ -563,6 +564,7 @@ static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObj
if (obj == Py_None)
obj = NULL;
+#endif
return __Pyx_PyMethod_New(func, obj, type);
}
diff --git a/tests/run/cyfunction.pyx b/tests/run/cyfunction.pyx
index cbce48bcfc..bbd2cefb83 100644
--- a/tests/run/cyfunction.pyx
+++ b/tests/run/cyfunction.pyx
@@ -376,6 +376,18 @@ class TestUnboundMethod:
def meth(self): pass
+class TestStaticmethod(object):
+ """
+ >>> x = TestStaticmethod()
+ >>> x.staticmeth(42)
+ 42
+ >>> x.staticmeth.__get__(42)()
+ 42
+ """
+ @staticmethod
+ def staticmeth(arg): return arg
+
+
cdef class TestOptimisedBuiltinMethod:
"""
>>> obj = TestOptimisedBuiltinMethod()