diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2020-06-20 16:57:38 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2020-06-20 16:57:38 +0200 |
commit | c8f537ff7de54f90c5e4272ab88b93eed44b9958 (patch) | |
tree | 78d043f9d283e86ec9f8d09ea50576c765fd31fb | |
parent | 0bf060f9cb9e4f5db0d44e4727c0d27ce775ca8c (diff) | |
parent | e87fb0ab2b5bc830d738ab96e2ea159ae3d28372 (diff) | |
download | cython-c8f537ff7de54f90c5e4272ab88b93eed44b9958.tar.gz |
Merge branch '0.29.x'
-rw-r--r-- | CHANGES.rst | 4 | ||||
-rw-r--r-- | Cython/Utility/Builtins.c | 3 | ||||
-rw-r--r-- | tests/run/exectest.pyx | 15 |
3 files changed, 22 insertions, 0 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index dbdb1a7bf..1eee17ceb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -462,6 +462,10 @@ Bugs fixed * Fix a regression in 0.29.20 where ``__div__`` failed to be found in extension types. (Github issue #3688) +* ``exec()`` did not allow recent Python syntax features in Py3.8+ due to + https://bugs.python.org/issue35975. + (Github issue #3695) + * Binding staticmethods of Cython functions were not behaving like Python methods in Py3. Patch by Jeroen Demeyer and Michał Górny. (Github issue #3106) diff --git a/Cython/Utility/Builtins.c b/Cython/Utility/Builtins.c index 421c07d9f..16cf9a710 100644 --- a/Cython/Utility/Builtins.c +++ b/Cython/Utility/Builtins.c @@ -100,6 +100,9 @@ static PyObject* __Pyx_PyExec3(PyObject* o, PyObject* globals, PyObject* locals) } else { PyCompilerFlags cf; cf.cf_flags = 0; +#if PY_VERSION_HEX >= 0x030800A3 + cf.cf_feature_version = PY_MINOR_VERSION; +#endif if (PyUnicode_Check(o)) { cf.cf_flags = PyCF_SOURCE_IS_UTF8; s = PyUnicode_AsUTF8String(o); diff --git a/tests/run/exectest.pyx b/tests/run/exectest.pyx index ec659511d..6b5f849ab 100644 --- a/tests/run/exectest.pyx +++ b/tests/run/exectest.pyx @@ -145,3 +145,18 @@ def exec_invalid_type(x): TypeError: exec: arg 1 must be string, bytes or code object, got int """ exec x in {} + + +def exec_with_new_features(s, d): + """ + >>> import sys + >>> pyversion = sys.version_info[:2] + + >>> d = {} + >>> exec_with_new_features('print(123)', d) + 123 + >>> if pyversion == (2, 7): exec_with_new_features('exec "123"', d) + >>> if pyversion >= (3, 6): exec_with_new_features('f = f"abc"', d) + >>> if pyversion >= (3, 8): exec_with_new_features('a = (b := 1)', d) + """ + exec s in d |