aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/cython
diff options
context:
space:
mode:
authororivej <orivej@yandex-team.ru>2022-02-10 16:44:49 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:44:49 +0300
commit718c552901d703c502ccbefdfc3c9028d608b947 (patch)
tree46534a98bbefcd7b1f3faa5b52c138ab27db75b7 /contrib/tools/cython
parente9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (diff)
downloadydb-718c552901d703c502ccbefdfc3c9028d608b947.tar.gz
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/tools/cython')
-rw-r--r--contrib/tools/cython/CHANGES.rst5624
-rw-r--r--contrib/tools/cython/Cython/Build/Cythonize.py94
-rw-r--r--contrib/tools/cython/Cython/Build/Dependencies.py638
-rw-r--r--contrib/tools/cython/Cython/Build/Distutils.py2
-rw-r--r--contrib/tools/cython/Cython/Build/Inline.py160
-rw-r--r--contrib/tools/cython/Cython/Build/IpythonMagic.py44
-rw-r--r--contrib/tools/cython/Cython/Build/Tests/TestCyCache.py212
-rw-r--r--contrib/tools/cython/Cython/Build/Tests/TestInline.py38
-rw-r--r--contrib/tools/cython/Cython/Build/Tests/TestIpythonMagic.py64
-rw-r--r--contrib/tools/cython/Cython/Build/Tests/TestStripLiterals.py4
-rw-r--r--contrib/tools/cython/Cython/Build/__init__.py2
-rw-r--r--contrib/tools/cython/Cython/CodeWriter.py18
-rw-r--r--contrib/tools/cython/Cython/Compiler/Annotate.py228
-rw-r--r--contrib/tools/cython/Cython/Compiler/AutoDocTransforms.py2
-rw-r--r--contrib/tools/cython/Cython/Compiler/Buffer.py72
-rw-r--r--contrib/tools/cython/Cython/Compiler/Builtin.py72
-rw-r--r--contrib/tools/cython/Cython/Compiler/CmdLine.py112
-rw-r--r--contrib/tools/cython/Cython/Compiler/Code.pxd52
-rw-r--r--contrib/tools/cython/Cython/Compiler/Code.py754
-rw-r--r--contrib/tools/cython/Cython/Compiler/CythonScope.py6
-rw-r--r--contrib/tools/cython/Cython/Compiler/Errors.py14
-rw-r--r--contrib/tools/cython/Cython/Compiler/ExprNodes.py5444
-rw-r--r--contrib/tools/cython/Cython/Compiler/FlowControl.pxd14
-rw-r--r--contrib/tools/cython/Cython/Compiler/FlowControl.py74
-rw-r--r--contrib/tools/cython/Cython/Compiler/FusedNode.py136
-rw-r--r--contrib/tools/cython/Cython/Compiler/Future.py4
-rw-r--r--contrib/tools/cython/Cython/Compiler/Lexicon.py28
-rw-r--r--contrib/tools/cython/Cython/Compiler/Main.py640
-rw-r--r--contrib/tools/cython/Cython/Compiler/MemoryView.py200
-rw-r--r--contrib/tools/cython/Cython/Compiler/ModuleNode.py1156
-rw-r--r--contrib/tools/cython/Cython/Compiler/Naming.py20
-rw-r--r--contrib/tools/cython/Cython/Compiler/Nodes.py2478
-rw-r--r--contrib/tools/cython/Cython/Compiler/Optimize.py1740
-rw-r--r--contrib/tools/cython/Cython/Compiler/Options.py512
-rw-r--r--contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.pxd6
-rw-r--r--contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py682
-rw-r--r--contrib/tools/cython/Cython/Compiler/Parsing.pxd26
-rw-r--r--contrib/tools/cython/Cython/Compiler/Parsing.py1402
-rw-r--r--contrib/tools/cython/Cython/Compiler/Pipeline.py108
-rw-r--r--contrib/tools/cython/Cython/Compiler/PyrexTypes.py1948
-rw-r--r--contrib/tools/cython/Cython/Compiler/Pythran.py102
-rw-r--r--contrib/tools/cython/Cython/Compiler/Scanning.pxd48
-rw-r--r--contrib/tools/cython/Cython/Compiler/Scanning.py166
-rw-r--r--contrib/tools/cython/Cython/Compiler/StringEncoding.py50
-rw-r--r--contrib/tools/cython/Cython/Compiler/Symtab.py436
-rw-r--r--contrib/tools/cython/Cython/Compiler/Tests/TestCmdLine.py236
-rw-r--r--contrib/tools/cython/Cython/Compiler/Tests/TestFlowControl.py136
-rw-r--r--contrib/tools/cython/Cython/Compiler/Tests/TestGrammar.py258
-rw-r--r--contrib/tools/cython/Cython/Compiler/Tests/TestSignatureMatching.py2
-rw-r--r--contrib/tools/cython/Cython/Compiler/TreeFragment.py86
-rw-r--r--contrib/tools/cython/Cython/Compiler/TreePath.py16
-rw-r--r--contrib/tools/cython/Cython/Compiler/TypeInference.py64
-rw-r--r--contrib/tools/cython/Cython/Compiler/TypeSlots.py140
-rw-r--r--contrib/tools/cython/Cython/Compiler/UtilNodes.py42
-rw-r--r--contrib/tools/cython/Cython/Compiler/UtilityCode.py116
-rw-r--r--contrib/tools/cython/Cython/Compiler/Visitor.pxd10
-rw-r--r--contrib/tools/cython/Cython/Compiler/Visitor.py274
-rw-r--r--contrib/tools/cython/Cython/Coverage.py630
-rw-r--r--contrib/tools/cython/Cython/Debugger/Cygdb.py2
-rw-r--r--contrib/tools/cython/Cython/Debugger/DebugWriter.py18
-rw-r--r--contrib/tools/cython/Cython/Debugger/Tests/TestLibCython.py36
-rw-r--r--contrib/tools/cython/Cython/Debugger/Tests/test_libcython_in_gdb.py16
-rw-r--r--contrib/tools/cython/Cython/Debugger/Tests/test_libpython_in_gdb.py4
-rw-r--r--contrib/tools/cython/Cython/Debugger/libcython.py48
-rw-r--r--contrib/tools/cython/Cython/Debugger/libpython.py14
-rw-r--r--contrib/tools/cython/Cython/Distutils/build_ext.py34
-rw-r--r--contrib/tools/cython/Cython/Distutils/extension.py2
-rw-r--r--contrib/tools/cython/Cython/Distutils/old_build_ext.py694
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_bool.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_buffer.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_bytes.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_cobject.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_complex.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_dict.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_exc.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_float.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_function.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_getargs.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_instance.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_int.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_iterator.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_list.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_long.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_mapping.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_mem.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_method.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_module.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_number.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_object.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_oldbuffer.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_pycapsule.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_ref.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_sequence.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_set.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_string.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_tuple.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_type.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_unicode.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_version.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/python_weakref.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/stdio.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/Deprecated/stdlib.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/array.pxd8
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/buffer.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/bytearray.pxd66
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/bytes.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/ceval.pxd16
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/datetime.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/dict.pxd8
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/exc.pxd18
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/function.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/int.pxd20
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/list.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/long.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/longintrepr.pxd26
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/mem.pxd72
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/method.pxd4
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/module.pxd16
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/number.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/object.pxd192
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/pylifecycle.pxd132
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/pystate.pxd16
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/ref.pxd4
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/sequence.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/slice.pxd94
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/string.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/tuple.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/unicode.pxd382
-rw-r--r--contrib/tools/cython/Cython/Includes/cpython/weakref.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/errno.pxd4
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/float.pxd60
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/limits.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/locale.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/math.pxd54
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/setjmp.pxd12
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/signal.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/stddef.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/stdint.pxd8
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/stdio.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/stdlib.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/string.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libc/time.pxd92
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/__init__.pxd4
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/algorithm.pxd38
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/cast.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/complex.pxd56
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/deque.pxd18
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/forward_list.pxd124
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/iterator.pxd60
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/limits.pxd118
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/list.pxd36
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/map.pxd50
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/memory.pxd230
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/queue.pxd10
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/set.pxd40
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/stack.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/string.pxd72
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/typeindex.pxd30
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/typeinfo.pxd20
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/unordered_map.pxd52
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/unordered_set.pxd50
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/utility.pxd4
-rw-r--r--contrib/tools/cython/Cython/Includes/libcpp/vector.pxd32
-rw-r--r--contrib/tools/cython/Cython/Includes/numpy.pxd286
-rw-r--r--contrib/tools/cython/Cython/Includes/numpy/__init__.pxd182
-rw-r--r--contrib/tools/cython/Cython/Includes/numpy/math.pxd34
-rw-r--r--contrib/tools/cython/Cython/Includes/openmp.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/dlfcn.pxd28
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/fcntl.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/ioctl.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/mman.pxd198
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/resource.pxd4
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/select.pxd38
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/signal.pxd10
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/stat.pxd4
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/stdio.pxd74
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/stdlib.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/strings.pxd18
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/time.pxd50
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/types.pxd28
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/unistd.pxd2
-rw-r--r--contrib/tools/cython/Cython/Includes/posix/wait.pxd76
-rw-r--r--contrib/tools/cython/Cython/Parser/ConcreteSyntaxTree.pyx176
-rw-r--r--contrib/tools/cython/Cython/Parser/Grammar426
-rw-r--r--contrib/tools/cython/Cython/Plex/Actions.py130
-rw-r--r--contrib/tools/cython/Cython/Plex/DFA.py286
-rw-r--r--contrib/tools/cython/Cython/Plex/Errors.py58
-rw-r--r--contrib/tools/cython/Cython/Plex/Lexicons.py328
-rw-r--r--contrib/tools/cython/Cython/Plex/Machines.py476
-rw-r--r--contrib/tools/cython/Cython/Plex/Regexps.py104
-rw-r--r--contrib/tools/cython/Cython/Plex/Scanners.pxd14
-rw-r--r--contrib/tools/cython/Cython/Plex/Scanners.py622
-rw-r--r--contrib/tools/cython/Cython/Plex/Traditional.py266
-rw-r--r--contrib/tools/cython/Cython/Plex/Transitions.py456
-rw-r--r--contrib/tools/cython/Cython/Runtime/refnanny.pyx16
-rw-r--r--contrib/tools/cython/Cython/Shadow.py126
-rw-r--r--contrib/tools/cython/Cython/StringIOTree.py12
-rw-r--r--contrib/tools/cython/Cython/Tempita/__init__.py2
-rw-r--r--contrib/tools/cython/Cython/Tempita/_tempita.py44
-rw-r--r--contrib/tools/cython/Cython/Tempita/compat3.py6
-rw-r--r--contrib/tools/cython/Cython/TestUtils.py64
-rw-r--r--contrib/tools/cython/Cython/Tests/TestCythonUtils.py22
-rw-r--r--contrib/tools/cython/Cython/Tests/TestJediTyper.py184
-rw-r--r--contrib/tools/cython/Cython/Tests/TestStringIOTree.py2
-rw-r--r--contrib/tools/cython/Cython/Tests/xmlrunner.py72
-rw-r--r--contrib/tools/cython/Cython/Utility/AsyncGen.c80
-rw-r--r--contrib/tools/cython/Cython/Utility/Buffer.c18
-rw-r--r--contrib/tools/cython/Cython/Utility/Builtins.c322
-rw-r--r--contrib/tools/cython/Cython/Utility/CConvert.pyx256
-rw-r--r--contrib/tools/cython/Cython/Utility/CMath.c186
-rw-r--r--contrib/tools/cython/Cython/Utility/Complex.c574
-rw-r--r--contrib/tools/cython/Cython/Utility/Coroutine.c3226
-rw-r--r--contrib/tools/cython/Cython/Utility/CpdefEnums.pyx132
-rw-r--r--contrib/tools/cython/Cython/Utility/CppConvert.pyx70
-rw-r--r--contrib/tools/cython/Cython/Utility/CppSupport.cpp4
-rw-r--r--contrib/tools/cython/Cython/Utility/CythonFunction.c348
-rw-r--r--contrib/tools/cython/Cython/Utility/Embed.c46
-rw-r--r--contrib/tools/cython/Cython/Utility/Exceptions.c444
-rw-r--r--contrib/tools/cython/Cython/Utility/FunctionArguments.c132
-rw-r--r--contrib/tools/cython/Cython/Utility/ImportExport.c300
-rw-r--r--contrib/tools/cython/Cython/Utility/MemoryView.pyx272
-rw-r--r--contrib/tools/cython/Cython/Utility/MemoryView_C.c78
-rw-r--r--contrib/tools/cython/Cython/Utility/ModuleSetupCode.c696
-rw-r--r--contrib/tools/cython/Cython/Utility/ObjectHandling.c1580
-rw-r--r--contrib/tools/cython/Cython/Utility/Optimize.c1168
-rw-r--r--contrib/tools/cython/Cython/Utility/Overflow.c64
-rw-r--r--contrib/tools/cython/Cython/Utility/Profile.c286
-rw-r--r--contrib/tools/cython/Cython/Utility/StringTools.c646
-rw-r--r--contrib/tools/cython/Cython/Utility/TypeConversion.c848
-rw-r--r--contrib/tools/cython/Cython/Utility/__init__.py58
-rw-r--r--contrib/tools/cython/Cython/Utility/arrayarray.h16
-rw-r--r--contrib/tools/cython/Cython/Utils.py300
-rw-r--r--contrib/tools/cython/Cython/__init__.py10
234 files changed, 24030 insertions, 24030 deletions
diff --git a/contrib/tools/cython/CHANGES.rst b/contrib/tools/cython/CHANGES.rst
index 77d8d6262f..155d94ef81 100644
--- a/contrib/tools/cython/CHANGES.rst
+++ b/contrib/tools/cython/CHANGES.rst
@@ -1,7 +1,7 @@
-================
-Cython Changelog
-================
-
+================
+Cython Changelog
+================
+
0.29.27 (2022-01-28)
====================
@@ -494,2812 +494,2812 @@ Other changes
Patch by Nathan Manville. (Github issue #2541)
-0.29.13 (2019-07-26)
-====================
-
-Bugs fixed
-----------
-
-* A reference leak for ``None`` was fixed when converting a memoryview
- to a Python object. (Github issue #3023)
-
-* The declaration of ``PyGILState_STATE`` in ``cpython.pystate`` was unusable.
- Patch by Kirill Smelkov. (Github issue #2997)
-
-
-Other changes
--------------
-
-* The declarations in ``posix.mman`` were extended.
- Patches by Kirill Smelkov. (Github issues #2893, #2894, #3012)
-
-
-0.29.12 (2019-07-07)
-====================
-
-Bugs fixed
-----------
-
-* Fix compile error in CPython 3.8b2 regarding the ``PyCode_New()`` signature.
- (Github issue #3031)
-
-* Fix a C compiler warning about a missing ``int`` downcast.
- (Github issue #3028)
-
-* Fix reported error positions of undefined builtins and constants.
- Patch by Orivej Desh. (Github issue #3030)
-
-* A 32 bit issue in the Pythran support was resolved.
- Patch by Serge Guelton. (Github issue #3032)
-
-
-0.29.11 (2019-06-30)
-====================
-
-Bugs fixed
-----------
-
-* Fix compile error in CPython 3.8b2 regarding the ``PyCode_New()`` signature.
- Patch by Nick Coghlan. (Github issue #3009)
-
-* Invalid C code generated for lambda functions in cdef methods.
- Patch by Josh Tobin. (Github issue #2967)
-
-* Support slice handling in newer Pythran versions.
- Patch by Serge Guelton. (Github issue #2989)
-
-* A reference leak in power-of-2 calculation was fixed.
- Patch by Sebastian Berg. (Github issue #3022)
-
-* The search order for include files was changed. Previously it was
- ``include_directories``, ``Cython/Includes``, ``sys.path``. Now it is
- ``include_directories``, ``sys.path``, ``Cython/Includes``. This was done to
- allow third-party ``*.pxd`` files to override the ones in Cython.
- Original patch by Matti Picus. (Github issue #2905)
-
-* Setting ``language_level=2`` in a file did not work if ``language_level=3``
- was enabled globally before.
- Patch by Jeroen Demeyer. (Github issue #2791)
-
-
-0.29.10 (2019-06-02)
-====================
-
-Bugs fixed
-----------
-
-* Fix compile errors in CPython 3.8b1 due to the new "tp_vectorcall" slots.
- (Github issue #2976)
-
-
-0.29.9 (2019-05-29)
-===================
-
-Bugs fixed
-----------
-
-* Fix a crash regression in 0.29.8 when creating code objects fails.
-
-* Remove an incorrect cast when using true-division in C++ operations.
- (Github issue #1950)
-
-
-0.29.8 (2019-05-28)
-===================
-
-Bugs fixed
-----------
-
-* C compile errors with CPython 3.8 were resolved.
- Patch by Marcel Plch. (Github issue #2938)
-
-* Python tuple constants that compare equal but have different item
- types could incorrectly be merged into a single constant.
- (Github issue #2919)
-
-* Non-ASCII characters in unprefixed strings could crash the compiler when
- used with language level ``3str``.
-
-* Starred expressions in %-formatting tuples could fail to compile for
- unicode strings. (Github issue #2939)
-
-* Passing Python class references through ``cython.inline()`` was broken.
- (Github issue #2936)
-
-
-0.29.7 (2019-04-14)
-===================
-
-Bugs fixed
-----------
-
-* Crash when the shared Cython config module gets unloaded and another Cython
- module reports an exceptions. Cython now makes sure it keeps an owned reference
- to the module.
- (Github issue #2885)
-
-* Resolved a C89 compilation problem when enabling the fast-gil sharing feature.
-
-* Coverage reporting did not include the signature line of ``cdef`` functions.
- (Github issue #1461)
-
-* Casting a GIL-requiring function into a nogil function now issues a warning.
- (Github issue #2879)
-
-* Generators and coroutines were missing their return type annotation.
- (Github issue #2884)
-
-
-0.29.6 (2019-02-27)
-===================
-
-Bugs fixed
-----------
-
-* Fix a crash when accessing the ``__kwdefaults__`` special attribute of
- fused functions. (Github issue #1470)
-
-* Fix the parsing of buffer format strings that contain numeric sizes, which
- could lead to incorrect input rejections. (Github issue #2845)
-
-* Avoid a C #pragma in old gcc versions that was only added in GCC 4.6.
- Patch by Michael Anselmi. (Github issue #2838)
-
-* Auto-encoding of Unicode strings to UTF-8 C/C++ strings failed in Python 3,
- even though the default encoding there is UTF-8.
- (Github issue #2819)
-
-
-0.29.5 (2019-02-09)
-===================
-
-Bugs fixed
-----------
-
-* Crash when defining a Python subclass of an extension type and repeatedly calling
- a cpdef method on it. (Github issue #2823)
-
-* Compiler crash when ``prange()`` loops appear inside of with-statements.
- (Github issue #2780)
-
-* Some C compiler warnings were resolved.
- Patches by Christoph Gohlke. (Github issues #2815, #2816, #2817, #2822)
-
-* Python conversion of C++ enums failed in 0.29.
- Patch by Orivej Desh. (Github issue #2767)
-
-
-0.29.4 (2019-02-01)
-===================
-
-Bugs fixed
-----------
-
-* Division of numeric constants by a runtime value of 0 could fail to raise a
- ``ZeroDivisionError``. (Github issue #2820)
-
-
-0.29.3 (2019-01-19)
-===================
-
-Bugs fixed
-----------
-
-* Some C code for memoryviews was generated in a non-deterministic order.
- Patch by Martijn van Steenbergen. (Github issue #2779)
-
-* C89 compatibility was accidentally lost since 0.28.
- Patches by gastineau and true-pasky. (Github issues #2778, #2801)
-
-* A C compiler cast warning was resolved.
- Patch by Michael Buesch. (Github issue #2774)
-
-* An compilation failure with complex numbers under MSVC++ was resolved.
- (Github issue #2797)
-
-* Coverage reporting could fail when modules were moved around after the build.
- Patch by Wenjun Si. (Github issue #2776)
-
-
-0.29.2 (2018-12-14)
-===================
-
-Bugs fixed
-----------
-
-* The code generated for deduplicated constants leaked some references.
- (Github issue #2750)
-
-* The declaration of ``sigismember()`` in ``libc.signal`` was corrected.
- (Github issue #2756)
-
-* Crashes in compiler and test runner were fixed.
- (Github issue #2736, #2755)
-
-* A C compiler warning about an invalid safety check was resolved.
- (Github issue #2731)
-
-
-0.29.1 (2018-11-24)
-===================
-
-Bugs fixed
-----------
-
-* Extensions compiled with MinGW-64 under Windows could misinterpret integer
- objects larger than 15 bit and return incorrect results.
- (Github issue #2670)
-
-* Cython no longer requires the source to be writable when copying its data
- into a memory view slice.
- Patch by Andrey Paramonov. (Github issue #2644)
-
-* Line tracing of ``try``-statements generated invalid C code.
- (Github issue #2274)
-
-* When using the ``warn.undeclared`` directive, Cython's own code generated
- warnings that are now fixed.
- Patch by Nicolas Pauss. (Github issue #2685)
-
-* Cython's memoryviews no longer require strides for setting the shape field
- but only the ``PyBUF_ND`` flag to be set.
- Patch by John Kirkham. (Github issue #2716)
-
-* Some C compiler warnings about unused memoryview code were fixed.
- Patch by Ho Cheuk Ting. (Github issue #2588)
-
-* A C compiler warning about implicit signed/unsigned conversion was fixed.
- (Github issue #2729)
-
-* Assignments to C++ references returned by ``operator[]`` could fail to compile.
- (Github issue #2671)
-
-* The power operator and the support for NumPy math functions were fixed
- in Pythran expressions.
- Patch by Serge Guelton. (Github issues #2702, #2709)
-
-* Signatures with memory view arguments now show the expected type
- when embedded in docstrings.
- Patch by Matthew Chan and Benjamin Weigel. (Github issue #2634)
-
-* Some ``from ... cimport ...`` constructs were not correctly considered
- when searching modified dependencies in ``cythonize()`` to decide
- whether to recompile a module.
- Patch by Kryštof Pilnáček. (Github issue #2638)
-
-* A struct field type in the ``cpython.array`` declarations was corrected.
- Patch by John Kirkham. (Github issue #2712)
-
-
-0.29 (2018-10-14)
-=================
-
-Features added
---------------
-
-* PEP-489 multi-phase module initialisation has been enabled again. Module
- reloads in other subinterpreters raise an exception to prevent corruption
- of the static module state.
-
-* A set of ``mypy`` compatible PEP-484 declarations were added for Cython's C data
- types to integrate with static analysers in typed Python code. They are available
- in the ``Cython/Shadow.pyi`` module and describe the types in the special ``cython``
- module that can be used for typing in Python code.
- Original patch by Julian Gethmann. (Github issue #1965)
-
-* Memoryviews are supported in PEP-484/526 style type declarations.
- (Github issue #2529)
-
-* ``@cython.nogil`` is supported as a C-function decorator in Python code.
- (Github issue #2557)
-
-* Raising exceptions from nogil code will automatically acquire the GIL, instead
- of requiring an explicit ``with gil`` block.
-
-* C++ functions can now be declared as potentially raising both C++ and Python
- exceptions, so that Cython can handle both correctly.
- (Github issue #2615)
-
-* ``cython.inline()`` supports a direct ``language_level`` keyword argument that
- was previously only available via a directive.
-
-* A new language level name ``3str`` was added that mostly corresponds to language
- level 3, but keeps unprefixed string literals as type 'str' in both Py2 and Py3,
- and the builtin 'str' type unchanged. This will become the default in the next
- Cython release and is meant to help user code a) transition more easily to this
- new default and b) migrate to Python 3 source code semantics without making support
- for Python 2.x difficult.
-
-* In CPython 3.6 and later, looking up globals in the module dict is almost
- as fast as looking up C globals.
- (Github issue #2313)
-
-* For a Python subclass of an extension type, repeated method calls to non-overridden
- cpdef methods can avoid the attribute lookup in Py3.6+, which makes them 4x faster.
- (Github issue #2313)
-
-* (In-)equality comparisons of objects to integer literals are faster.
- (Github issue #2188)
-
-* Some internal and 1-argument method calls are faster.
-
-* Modules that cimport many external extension types from other Cython modules
- execute less import requests during module initialisation.
-
-* Constant tuples and slices are deduplicated and only created once per module.
- (Github issue #2292)
-
-* The coverage plugin considers more C file extensions such as ``.cc`` and ``.cxx``.
- (Github issue #2266)
-
-* The ``cythonize`` command accepts compile time variable values (as set by ``DEF``)
- through the new ``-E`` option.
- Patch by Jerome Kieffer. (Github issue #2315)
-
-* ``pyximport`` can import from namespace packages.
- Patch by Prakhar Goel. (Github issue #2294)
-
-* Some missing numpy and CPython C-API declarations were added.
- Patch by John Kirkham. (Github issues #2523, #2520, #2537)
-
-* Declarations for the ``pylifecycle`` C-API functions were added in a new .pxd file
- ``cpython.pylifecycle``.
-
-* The Pythran support was updated to work with the latest Pythran 0.8.7.
- Original patch by Adrien Guinet. (Github issue #2600)
-
-* ``%a`` is included in the string formatting types that are optimised into f-strings.
- In this case, it is also automatically mapped to ``%r`` in Python 2.x.
-
-* New C macro ``CYTHON_HEX_VERSION`` to access Cython's version in the same style as
+0.29.13 (2019-07-26)
+====================
+
+Bugs fixed
+----------
+
+* A reference leak for ``None`` was fixed when converting a memoryview
+ to a Python object. (Github issue #3023)
+
+* The declaration of ``PyGILState_STATE`` in ``cpython.pystate`` was unusable.
+ Patch by Kirill Smelkov. (Github issue #2997)
+
+
+Other changes
+-------------
+
+* The declarations in ``posix.mman`` were extended.
+ Patches by Kirill Smelkov. (Github issues #2893, #2894, #3012)
+
+
+0.29.12 (2019-07-07)
+====================
+
+Bugs fixed
+----------
+
+* Fix compile error in CPython 3.8b2 regarding the ``PyCode_New()`` signature.
+ (Github issue #3031)
+
+* Fix a C compiler warning about a missing ``int`` downcast.
+ (Github issue #3028)
+
+* Fix reported error positions of undefined builtins and constants.
+ Patch by Orivej Desh. (Github issue #3030)
+
+* A 32 bit issue in the Pythran support was resolved.
+ Patch by Serge Guelton. (Github issue #3032)
+
+
+0.29.11 (2019-06-30)
+====================
+
+Bugs fixed
+----------
+
+* Fix compile error in CPython 3.8b2 regarding the ``PyCode_New()`` signature.
+ Patch by Nick Coghlan. (Github issue #3009)
+
+* Invalid C code generated for lambda functions in cdef methods.
+ Patch by Josh Tobin. (Github issue #2967)
+
+* Support slice handling in newer Pythran versions.
+ Patch by Serge Guelton. (Github issue #2989)
+
+* A reference leak in power-of-2 calculation was fixed.
+ Patch by Sebastian Berg. (Github issue #3022)
+
+* The search order for include files was changed. Previously it was
+ ``include_directories``, ``Cython/Includes``, ``sys.path``. Now it is
+ ``include_directories``, ``sys.path``, ``Cython/Includes``. This was done to
+ allow third-party ``*.pxd`` files to override the ones in Cython.
+ Original patch by Matti Picus. (Github issue #2905)
+
+* Setting ``language_level=2`` in a file did not work if ``language_level=3``
+ was enabled globally before.
+ Patch by Jeroen Demeyer. (Github issue #2791)
+
+
+0.29.10 (2019-06-02)
+====================
+
+Bugs fixed
+----------
+
+* Fix compile errors in CPython 3.8b1 due to the new "tp_vectorcall" slots.
+ (Github issue #2976)
+
+
+0.29.9 (2019-05-29)
+===================
+
+Bugs fixed
+----------
+
+* Fix a crash regression in 0.29.8 when creating code objects fails.
+
+* Remove an incorrect cast when using true-division in C++ operations.
+ (Github issue #1950)
+
+
+0.29.8 (2019-05-28)
+===================
+
+Bugs fixed
+----------
+
+* C compile errors with CPython 3.8 were resolved.
+ Patch by Marcel Plch. (Github issue #2938)
+
+* Python tuple constants that compare equal but have different item
+ types could incorrectly be merged into a single constant.
+ (Github issue #2919)
+
+* Non-ASCII characters in unprefixed strings could crash the compiler when
+ used with language level ``3str``.
+
+* Starred expressions in %-formatting tuples could fail to compile for
+ unicode strings. (Github issue #2939)
+
+* Passing Python class references through ``cython.inline()`` was broken.
+ (Github issue #2936)
+
+
+0.29.7 (2019-04-14)
+===================
+
+Bugs fixed
+----------
+
+* Crash when the shared Cython config module gets unloaded and another Cython
+ module reports an exceptions. Cython now makes sure it keeps an owned reference
+ to the module.
+ (Github issue #2885)
+
+* Resolved a C89 compilation problem when enabling the fast-gil sharing feature.
+
+* Coverage reporting did not include the signature line of ``cdef`` functions.
+ (Github issue #1461)
+
+* Casting a GIL-requiring function into a nogil function now issues a warning.
+ (Github issue #2879)
+
+* Generators and coroutines were missing their return type annotation.
+ (Github issue #2884)
+
+
+0.29.6 (2019-02-27)
+===================
+
+Bugs fixed
+----------
+
+* Fix a crash when accessing the ``__kwdefaults__`` special attribute of
+ fused functions. (Github issue #1470)
+
+* Fix the parsing of buffer format strings that contain numeric sizes, which
+ could lead to incorrect input rejections. (Github issue #2845)
+
+* Avoid a C #pragma in old gcc versions that was only added in GCC 4.6.
+ Patch by Michael Anselmi. (Github issue #2838)
+
+* Auto-encoding of Unicode strings to UTF-8 C/C++ strings failed in Python 3,
+ even though the default encoding there is UTF-8.
+ (Github issue #2819)
+
+
+0.29.5 (2019-02-09)
+===================
+
+Bugs fixed
+----------
+
+* Crash when defining a Python subclass of an extension type and repeatedly calling
+ a cpdef method on it. (Github issue #2823)
+
+* Compiler crash when ``prange()`` loops appear inside of with-statements.
+ (Github issue #2780)
+
+* Some C compiler warnings were resolved.
+ Patches by Christoph Gohlke. (Github issues #2815, #2816, #2817, #2822)
+
+* Python conversion of C++ enums failed in 0.29.
+ Patch by Orivej Desh. (Github issue #2767)
+
+
+0.29.4 (2019-02-01)
+===================
+
+Bugs fixed
+----------
+
+* Division of numeric constants by a runtime value of 0 could fail to raise a
+ ``ZeroDivisionError``. (Github issue #2820)
+
+
+0.29.3 (2019-01-19)
+===================
+
+Bugs fixed
+----------
+
+* Some C code for memoryviews was generated in a non-deterministic order.
+ Patch by Martijn van Steenbergen. (Github issue #2779)
+
+* C89 compatibility was accidentally lost since 0.28.
+ Patches by gastineau and true-pasky. (Github issues #2778, #2801)
+
+* A C compiler cast warning was resolved.
+ Patch by Michael Buesch. (Github issue #2774)
+
+* An compilation failure with complex numbers under MSVC++ was resolved.
+ (Github issue #2797)
+
+* Coverage reporting could fail when modules were moved around after the build.
+ Patch by Wenjun Si. (Github issue #2776)
+
+
+0.29.2 (2018-12-14)
+===================
+
+Bugs fixed
+----------
+
+* The code generated for deduplicated constants leaked some references.
+ (Github issue #2750)
+
+* The declaration of ``sigismember()`` in ``libc.signal`` was corrected.
+ (Github issue #2756)
+
+* Crashes in compiler and test runner were fixed.
+ (Github issue #2736, #2755)
+
+* A C compiler warning about an invalid safety check was resolved.
+ (Github issue #2731)
+
+
+0.29.1 (2018-11-24)
+===================
+
+Bugs fixed
+----------
+
+* Extensions compiled with MinGW-64 under Windows could misinterpret integer
+ objects larger than 15 bit and return incorrect results.
+ (Github issue #2670)
+
+* Cython no longer requires the source to be writable when copying its data
+ into a memory view slice.
+ Patch by Andrey Paramonov. (Github issue #2644)
+
+* Line tracing of ``try``-statements generated invalid C code.
+ (Github issue #2274)
+
+* When using the ``warn.undeclared`` directive, Cython's own code generated
+ warnings that are now fixed.
+ Patch by Nicolas Pauss. (Github issue #2685)
+
+* Cython's memoryviews no longer require strides for setting the shape field
+ but only the ``PyBUF_ND`` flag to be set.
+ Patch by John Kirkham. (Github issue #2716)
+
+* Some C compiler warnings about unused memoryview code were fixed.
+ Patch by Ho Cheuk Ting. (Github issue #2588)
+
+* A C compiler warning about implicit signed/unsigned conversion was fixed.
+ (Github issue #2729)
+
+* Assignments to C++ references returned by ``operator[]`` could fail to compile.
+ (Github issue #2671)
+
+* The power operator and the support for NumPy math functions were fixed
+ in Pythran expressions.
+ Patch by Serge Guelton. (Github issues #2702, #2709)
+
+* Signatures with memory view arguments now show the expected type
+ when embedded in docstrings.
+ Patch by Matthew Chan and Benjamin Weigel. (Github issue #2634)
+
+* Some ``from ... cimport ...`` constructs were not correctly considered
+ when searching modified dependencies in ``cythonize()`` to decide
+ whether to recompile a module.
+ Patch by Kryštof Pilnáček. (Github issue #2638)
+
+* A struct field type in the ``cpython.array`` declarations was corrected.
+ Patch by John Kirkham. (Github issue #2712)
+
+
+0.29 (2018-10-14)
+=================
+
+Features added
+--------------
+
+* PEP-489 multi-phase module initialisation has been enabled again. Module
+ reloads in other subinterpreters raise an exception to prevent corruption
+ of the static module state.
+
+* A set of ``mypy`` compatible PEP-484 declarations were added for Cython's C data
+ types to integrate with static analysers in typed Python code. They are available
+ in the ``Cython/Shadow.pyi`` module and describe the types in the special ``cython``
+ module that can be used for typing in Python code.
+ Original patch by Julian Gethmann. (Github issue #1965)
+
+* Memoryviews are supported in PEP-484/526 style type declarations.
+ (Github issue #2529)
+
+* ``@cython.nogil`` is supported as a C-function decorator in Python code.
+ (Github issue #2557)
+
+* Raising exceptions from nogil code will automatically acquire the GIL, instead
+ of requiring an explicit ``with gil`` block.
+
+* C++ functions can now be declared as potentially raising both C++ and Python
+ exceptions, so that Cython can handle both correctly.
+ (Github issue #2615)
+
+* ``cython.inline()`` supports a direct ``language_level`` keyword argument that
+ was previously only available via a directive.
+
+* A new language level name ``3str`` was added that mostly corresponds to language
+ level 3, but keeps unprefixed string literals as type 'str' in both Py2 and Py3,
+ and the builtin 'str' type unchanged. This will become the default in the next
+ Cython release and is meant to help user code a) transition more easily to this
+ new default and b) migrate to Python 3 source code semantics without making support
+ for Python 2.x difficult.
+
+* In CPython 3.6 and later, looking up globals in the module dict is almost
+ as fast as looking up C globals.
+ (Github issue #2313)
+
+* For a Python subclass of an extension type, repeated method calls to non-overridden
+ cpdef methods can avoid the attribute lookup in Py3.6+, which makes them 4x faster.
+ (Github issue #2313)
+
+* (In-)equality comparisons of objects to integer literals are faster.
+ (Github issue #2188)
+
+* Some internal and 1-argument method calls are faster.
+
+* Modules that cimport many external extension types from other Cython modules
+ execute less import requests during module initialisation.
+
+* Constant tuples and slices are deduplicated and only created once per module.
+ (Github issue #2292)
+
+* The coverage plugin considers more C file extensions such as ``.cc`` and ``.cxx``.
+ (Github issue #2266)
+
+* The ``cythonize`` command accepts compile time variable values (as set by ``DEF``)
+ through the new ``-E`` option.
+ Patch by Jerome Kieffer. (Github issue #2315)
+
+* ``pyximport`` can import from namespace packages.
+ Patch by Prakhar Goel. (Github issue #2294)
+
+* Some missing numpy and CPython C-API declarations were added.
+ Patch by John Kirkham. (Github issues #2523, #2520, #2537)
+
+* Declarations for the ``pylifecycle`` C-API functions were added in a new .pxd file
+ ``cpython.pylifecycle``.
+
+* The Pythran support was updated to work with the latest Pythran 0.8.7.
+ Original patch by Adrien Guinet. (Github issue #2600)
+
+* ``%a`` is included in the string formatting types that are optimised into f-strings.
+ In this case, it is also automatically mapped to ``%r`` in Python 2.x.
+
+* New C macro ``CYTHON_HEX_VERSION`` to access Cython's version in the same style as
``PY_VERSION_HEX``.
-
-* Constants in ``libc.math`` are now declared as ``const`` to simplify their handling.
-
-* An additional ``check_size`` clause was added to the ``ctypedef class`` name
- specification to allow suppressing warnings when importing modules with
- backwards-compatible ``PyTypeObject`` size changes.
- Patch by Matti Picus. (Github issue #2627)
-
-Bugs fixed
-----------
-
-* The exception handling in generators and coroutines under CPython 3.7 was adapted
- to the newly introduced exception stack. Users of Cython 0.28 who want to support
- Python 3.7 are encouraged to upgrade to 0.29 to avoid potentially incorrect error
- reporting and tracebacks. (Github issue #1958)
-
-* Crash when importing a module under Stackless Python that was built for CPython.
- Patch by Anselm Kruis. (Github issue #2534)
-
-* 2-value slicing of typed sequences failed if the start or stop index was None.
- Patch by Christian Gibson. (Github issue #2508)
-
-* Multiplied string literals lost their factor when they are part of another
- constant expression (e.g. 'x' * 10 + 'y' => 'xy').
-
-* String formatting with the '%' operator didn't call the special ``__rmod__()``
- method if the right side is a string subclass that implements it.
- (Python issue 28598)
-
-* The directive ``language_level=3`` did not apply to the first token in the
- source file. (Github issue #2230)
-
-* Overriding cpdef methods did not work in Python subclasses with slots.
- Note that this can have a performance impact on calls from Cython code.
- (Github issue #1771)
-
-* Fix declarations of builtin or C types using strings in pure python mode.
- (Github issue #2046)
-
-* Generator expressions and lambdas failed to compile in ``@cfunc`` functions.
- (Github issue #459)
-
-* Global names with ``const`` types were not excluded from star-import assignments
- which could lead to invalid C code.
- (Github issue #2621)
-
-* Several internal function signatures were fixed that lead to warnings in gcc-8.
- (Github issue #2363)
-
-* The numpy helper functions ``set_array_base()`` and ``get_array_base()``
- were adapted to the current numpy C-API recommendations.
- Patch by Matti Picus. (Github issue #2528)
-
-* Some NumPy related code was updated to avoid deprecated API usage.
- Original patch by jbrockmendel. (Github issue #2559)
-
-* Several C++ STL declarations were extended and corrected.
- Patch by Valentin Valls. (Github issue #2207)
-
-* C lines of the module init function were unconditionally not reported in
- exception stack traces.
- Patch by Jeroen Demeyer. (Github issue #2492)
-
-* When PEP-489 support is enabled, reloading the module overwrote any static
- module state. It now raises an exception instead, given that reloading is
- not actually supported.
-
-* Object-returning, C++ exception throwing functions were not checking that
- the return value was non-null.
- Original patch by Matt Wozniski (Github Issue #2603)
-
-* The source file encoding detection could get confused if the
- ``c_string_encoding`` directive appeared within the first two lines.
- (Github issue #2632)
-
-* Cython generated modules no longer emit a warning during import when the
- size of the NumPy array type is larger than what was found at compile time.
- Instead, this is assumed to be a backwards compatible change on NumPy side.
-
-Other changes
--------------
-
-* Cython now emits a warning when no ``language_level`` (2, 3 or '3str') is set
- explicitly, neither as a ``cythonize()`` option nor as a compiler directive.
- This is meant to prepare the transition of the default language level from
- currently Py2 to Py3, since that is what most new users will expect these days.
- The future default will, however, not enforce unicode literals, because this
- has proven a major obstacle in the support for both Python 2.x and 3.x. The
- next major release is intended to make this change, so that it will parse all
- code that does not request a specific language level as Python 3 code, but with
- ``str`` literals. The language level 2 will continue to be supported for an
- indefinite time.
-
-* The documentation was restructured, cleaned up and examples are now tested.
- The NumPy tutorial was also rewritten to simplify the running example.
- Contributed by Gabriel de Marmiesse. (Github issue #2245)
-
-* Cython compiles less of its own modules at build time to reduce the installed
- package size to about half of its previous size. This makes the compiler
- slightly slower, by about 5-7%.
-
-
-0.28.6 (2018-11-01)
-===================
-
-Bugs fixed
-----------
-
-* Extensions compiled with MinGW-64 under Windows could misinterpret integer
- objects larger than 15 bit and return incorrect results.
- (Github issue #2670)
-
-* Multiplied string literals lost their factor when they are part of another
- constant expression (e.g. 'x' * 10 + 'y' => 'xy').
-
-
-0.28.5 (2018-08-03)
-===================
-
-Bugs fixed
-----------
-
-* The discouraged usage of GCC's attribute ``optimize("Os")`` was replaced by the
- similar attribute ``cold`` to reduce the code impact of the module init functions.
- (Github issue #2494)
-
-* A reference leak in Py2.x was fixed when comparing str to unicode for equality.
-
-
-0.28.4 (2018-07-08)
-===================
-
-Bugs fixed
-----------
-
-* Reallowing ``tp_clear()`` in a subtype of an ``@no_gc_clear`` extension type
- generated an invalid C function call to the (non-existent) base type implementation.
- (Github issue #2309)
-
-* Exception catching based on a non-literal (runtime) tuple could fail to match the
- exception. (Github issue #2425)
-
-* Compile fix for CPython 3.7.0a2. (Github issue #2477)
-
-
-0.28.3 (2018-05-27)
-===================
-
-Bugs fixed
-----------
-
-* Set iteration was broken in non-CPython since 0.28.
-
-* ``UnicodeEncodeError`` in Py2 when ``%s`` formatting is optimised for
- unicode strings. (Github issue #2276)
-
-* Work around a crash bug in g++ 4.4.x by disabling the size reduction setting
- of the module init function in this version. (Github issue #2235)
-
-* Crash when exceptions occur early during module initialisation.
- (Github issue #2199)
-
-
-0.28.2 (2018-04-13)
-===================
-
-Features added
---------------
-
-* ``abs()`` is faster for Python long objects.
-
-* The C++11 methods ``front()`` and ``end()`` were added to the declaration of
- ``libcpp.string``. Patch by Alex Huszagh. (Github issue #2123)
-
-* The C++11 methods ``reserve()`` and ``bucket_count()`` are declared for
- ``libcpp.unordered_map``. Patch by Valentin Valls. (Github issue #2168)
-
-Bugs fixed
-----------
-
-* The copy of a read-only memoryview was considered read-only as well, whereas
- a common reason to copy a read-only view is to make it writable. The result
- of the copying is now a writable buffer by default.
- (Github issue #2134)
-
-* The ``switch`` statement generation failed to apply recursively to the body of
- converted if-statements.
-
-* ``NULL`` was sometimes rejected as exception return value when the returned
- type is a fused pointer type.
- Patch by Callie LeFave. (Github issue #2177)
-
-* Fixed compatibility with PyPy 5.11.
- Patch by Matti Picus. (Github issue #2165)
-
-Other changes
--------------
-
-* The NumPy tutorial was rewritten to use memoryviews instead of the older
- buffer declaration syntax.
- Contributed by Gabriel de Marmiesse. (Github issue #2162)
-
-
-0.28.1 (2018-03-18)
-===================
-
-Bugs fixed
-----------
-
-* ``PyFrozenSet_New()`` was accidentally used in PyPy where it is missing
- from the C-API.
-
-* Assignment between some C++ templated types were incorrectly rejected
- when the templates mix ``const`` with ``ctypedef``.
- (Github issue #2148)
-
-* Undeclared C++ no-args constructors in subclasses could make the compilation
- fail if the base class constructor was declared without ``nogil``.
- (Github issue #2157)
-
-* Bytes %-formatting inferred ``basestring`` (bytes or unicode) as result type
- in some cases where ``bytes`` would have been safe to infer.
- (Github issue #2153)
-
-* ``None`` was accidentally disallowed as typed return value of ``dict.pop()``.
- (Github issue #2152)
-
-
-0.28 (2018-03-13)
-=================
-
-Features added
---------------
-
-* Cdef classes can now multiply inherit from ordinary Python classes.
- (The primary base must still be a c class, possibly ``object``, and
- the other bases must *not* be cdef classes.)
-
-* Type inference is now supported for Pythran compiled NumPy expressions.
- Patch by Nils Braun. (Github issue #1954)
-
-* The ``const`` modifier can be applied to memoryview declarations to allow
- read-only buffers as input. (Github issues #1605, #1869)
-
-* C code in the docstring of a ``cdef extern`` block is copied verbatimly
- into the generated file.
- Patch by Jeroen Demeyer. (Github issue #1915)
-
-* When compiling with gcc, the module init function is now tuned for small
- code size instead of whatever compile flags were provided externally.
- Cython now also disables some code intensive optimisations in that function
- to further reduce the code size. (Github issue #2102)
-
-* Decorating an async coroutine with ``@cython.iterable_coroutine`` changes its
- type at compile time to make it iterable. While this is not strictly in line
- with PEP-492, it improves the interoperability with old-style coroutines that
- use ``yield from`` instead of ``await``.
-
-* The IPython magic has preliminary support for JupyterLab.
- (Github issue #1775)
-
-* The new TSS C-API in CPython 3.7 is supported and has been backported.
- Patch by Naotoshi Seo. (Github issue #1932)
-
-* Cython knows the new ``Py_tss_t`` type defined in PEP-539 and automatically
- initialises variables declared with that type to ``Py_tss_NEEDS_INIT``,
- a value which cannot be used outside of static assignments.
-
-* The set methods ``.remove()`` and ``.discard()`` are optimised.
- Patch by Antoine Pitrou. (Github issue #2042)
-
-* ``dict.pop()`` is optimised.
- Original patch by Antoine Pitrou. (Github issue #2047)
-
-* Iteration over sets and frozensets is optimised.
- (Github issue #2048)
-
-* Safe integer loops (< range(2^30)) are automatically optimised into C loops.
-
-* ``alist.extend([a,b,c])`` is optimised into sequential ``list.append()`` calls
- for short literal sequences.
-
-* Calls to builtin methods that are not specifically optimised into C-API calls
- now use a cache that avoids repeated lookups of the underlying C function.
- (Github issue #2054)
-
-* Single argument function calls can avoid the argument tuple creation in some cases.
-
-* Some redundant extension type checks are avoided.
-
-* Formatting C enum values in f-strings is faster, as well as some other special cases.
-
-* String formatting with the '%' operator is optimised into f-strings in simple cases.
-
-* Subscripting (item access) is faster in some cases.
-
-* Some ``bytearray`` operations have been optimised similar to ``bytes``.
-
-* Some PEP-484/526 container type declarations are now considered for
- loop optimisations.
-
-* Indexing into memoryview slices with ``view[i][j]`` is now optimised into
- ``view[i, j]``.
-
-* Python compatible ``cython.*`` types can now be mixed with type declarations
- in Cython syntax.
-
-* Name lookups in the module and in classes are faster.
-
-* Python attribute lookups on extension types without instance dict are faster.
-
-* Some missing signals were added to ``libc/signal.pxd``.
- Patch by Jeroen Demeyer. (Github issue #1914)
-
-* The warning about repeated extern declarations is now visible by default.
- (Github issue #1874)
-
-* The exception handling of the function types used by CPython's type slot
- functions was corrected to match the de-facto standard behaviour, so that
- code that uses them directly benefits from automatic and correct exception
- propagation. Patch by Jeroen Demeyer. (Github issue #1980)
-
-* Defining the macro ``CYTHON_NO_PYINIT_EXPORT`` will prevent the module init
- function from being exported as symbol, e.g. when linking modules statically
- in an embedding setup. Patch by AraHaan. (Github issue #1944)
-
-Bugs fixed
-----------
-
-* If a module name is explicitly provided for an ``Extension()`` that is compiled
- via ``cythonize()``, it was previously ignored and replaced by the source file
- name. It can now be used to override the target module name, e.g. for compiling
- prefixed accelerator modules from Python files. (Github issue #2038)
-
-* The arguments of the ``num_threads`` parameter of parallel sections
- were not sufficiently validated and could lead to invalid C code.
- (Github issue #1957)
-
-* Catching exceptions with a non-trivial exception pattern could call into
- CPython with a live exception set. This triggered incorrect behaviour
- and crashes, especially in CPython 3.7.
-
-* The signature of the special ``__richcmp__()`` method was corrected to recognise
- the type of the first argument as ``self``. It was previously treated as plain
- object, but CPython actually guarantees that it always has the correct type.
- Note: this can change the semantics of user code that previously relied on
- ``self`` being untyped.
-
-* Some Python 3 exceptions were not recognised as builtins when running Cython
- under Python 2.
-
-* Some async helper functions were not defined in the generated C code when
- compiling simple async code. (Github issue #2075)
-
-* Line tracing did not include generators and coroutines.
- (Github issue #1949)
-
-* C++ declarations for ``unordered_map`` were corrected.
- Patch by Michael Schatzow. (Github issue #1484)
-
-* Iterator declarations in C++ ``deque`` and ``vector`` were corrected.
- Patch by Alex Huszagh. (Github issue #1870)
-
-* The const modifiers in the C++ ``string`` declarations were corrected, together
- with the coercion behaviour of string literals into C++ strings.
- (Github issue #2132)
-
-* Some declaration types in ``libc.limits`` were corrected.
- Patch by Jeroen Demeyer. (Github issue #2016)
-
-* ``@cython.final`` was not accepted on Python classes with an ``@cython.cclass``
- decorator. (Github issue #2040)
-
-* Cython no longer creates useless and incorrect ``PyInstanceMethod`` wrappers for
- methods in Python 3. Patch by Jeroen Demeyer. (Github issue #2105)
-
-* The builtin ``bytearray`` type could not be used as base type of cdef classes.
- (Github issue #2106)
-
-Other changes
--------------
-
-
-0.27.3 (2017-11-03)
-===================
-
-Bugs fixed
-----------
-
-* String forward references to extension types like ``@cython.locals(x="ExtType")``
- failed to find the named type. (Github issue #1962)
-
-* NumPy slicing generated incorrect results when compiled with Pythran.
- Original patch by Serge Guelton (Github issue #1946).
-
-* Fix "undefined reference" linker error for generators on Windows in Py3.3-3.5.
- (Github issue #1968)
-
-* Adapt to recent C-API change of ``PyThreadState`` in CPython 3.7.
-
-* Fix signature of ``PyWeakref_GetObject()`` API declaration.
- Patch by Jeroen Demeyer (Github issue #1975).
-
-
-0.27.2 (2017-10-22)
-===================
-
-Bugs fixed
-----------
-
-* Comprehensions could incorrectly be optimised away when they appeared in boolean
- test contexts. (Github issue #1920)
-
-* The special methods ``__eq__``, ``__lt__`` etc. in extension types did not type
- their first argument as the type of the class but ``object``. (Github issue #1935)
-
-* Crash on first lookup of "cline_in_traceback" option during exception handling.
- (Github issue #1907)
-
-* Some nested module level comprehensions failed to compile.
- (Github issue #1906)
-
-* Compiler crash on some complex type declarations in pure mode.
- (Github issue #1908)
-
-* ``std::unordered_map.erase()`` was declared with an incorrect ``void`` return
- type in ``libcpp.unordered_map``. (Github issue #1484)
-
-* Invalid use of C++ ``fallthrough`` attribute before C++11 and similar issue in clang.
- (Github issue #1930)
-
-* Compiler crash on misnamed properties. (Github issue #1905)
-
-
-0.27.1 (2017-10-01)
-===================
-
-Features added
---------------
-
-* The Jupyter magic has a new debug option ``--verbose`` that shows details about
- the distutils invocation. Patch by Boris Filippov (Github issue #1881).
-
-Bugs fixed
-----------
-
-* Py3 list comprehensions in class bodies resulted in invalid C code.
- (Github issue #1889)
-
-* Modules built for later CPython 3.5.x versions failed to import in 3.5.0/3.5.1.
- (Github issue #1880)
-
-* Deallocating fused types functions and methods kept their GC tracking enabled,
- which could potentially lead to recursive deallocation attempts.
-
-* Crash when compiling in C++ mode with old setuptools versions.
- (Github issue #1879)
-
-* C++ object arguments for the constructor of Cython implemented C++ are now
- passed by reference and not by value to allow for non-copyable arguments, such
- as ``unique_ptr``.
-
-* API-exported C++ classes with Python object members failed to compile.
- (Github issue #1866)
-
-* Some issues with the new relaxed exception value handling were resolved.
-
-* Python classes as annotation types could prevent compilation.
- (Github issue #1887)
-
-* Cython annotation types in Python files could lead to import failures
- with a "cython undefined" error. Recognised types are now turned into strings.
-
-* Coverage analysis could fail to report on extension modules on some platforms.
-
-* Annotations could be parsed (and rejected) as types even with
- ``annotation_typing=False``.
-
-Other changes
--------------
-
-* PEP 489 support has been disabled by default to counter incompatibilities with
- import setups that try to reload or reinitialise modules.
-
-
-0.27 (2017-09-23)
-=================
-
-Features added
---------------
-
-* Extension module initialisation follows
- `PEP 489 <https://www.python.org/dev/peps/pep-0489/>`_ in CPython 3.5+, which
- resolves several differences with regard to normal Python modules. This makes
- the global names ``__file__`` and ``__path__`` correctly available to module
- level code and improves the support for module-level relative imports.
- (Github issues #1715, #1753, #1035)
-
-* Asynchronous generators (`PEP 525 <https://www.python.org/dev/peps/pep-0525/>`_)
- and asynchronous comprehensions (`PEP 530 <https://www.python.org/dev/peps/pep-0530/>`_)
- have been implemented. Note that async generators require finalisation support
- in order to allow for asynchronous operations during cleanup, which is only
- available in CPython 3.6+. All other functionality has been backported as usual.
-
-* Variable annotations are now parsed according to
- `PEP 526 <https://www.python.org/dev/peps/pep-0526/>`_. Cython types (e.g.
- ``cython.int``) are evaluated as C type declarations and everything else as Python
- types. This can be disabled with the directive ``annotation_typing=False``.
- Note that most complex PEP-484 style annotations are currently ignored. This will
- change in future releases. (Github issue #1850)
-
-* Extension types (also in pure Python mode) can implement the normal special methods
- ``__eq__``, ``__lt__`` etc. for comparisons instead of the low-level ``__richcmp__``
- method. (Github issue #690)
-
-* New decorator ``@cython.exceptval(x=None, check=False)`` that makes the signature
- declarations ``except x``, ``except? x`` and ``except *`` available to pure Python
- code. Original patch by Antonio Cuni. (Github issue #1653)
-
-* Signature annotations are now included in the signature docstring generated by
- the ``embedsignature`` directive. Patch by Lisandro Dalcin (Github issue #1781).
-
-* The gdb support for Python code (``libpython.py``) was updated to the latest
- version in CPython 3.7 (git rev 5fe59f8).
-
-* The compiler tries to find a usable exception return value for cdef functions
- with ``except *`` if the returned type allows it. Note that this feature is subject
- to safety limitations, so it is still better to provide an explicit declaration.
-
-* C functions can be assigned to function pointers with a compatible exception
- declaration, not only with exact matches. A side-effect is that certain compatible
- signature overrides are now allowed and some more mismatches of exception signatures
- are now detected and rejected as errors that were not detected before.
-
-* The IPython/Jupyter magic integration has a new option ``%%cython --pgo`` for profile
- guided optimisation. It compiles the cell with PGO settings for the C compiler,
- executes it to generate a runtime profile, and then compiles it again using that
- profile for C compiler optimisation. Currently only tested with gcc.
-
-* ``len(memoryview)`` can be used in nogil sections to get the size of the
- first dimension of a memory view (``shape[0]``). (Github issue #1733)
-
-* C++ classes can now contain (properly refcounted) Python objects.
-
-* NumPy dtype subarrays are now accessible through the C-API.
- Patch by Gerald Dalley (Github issue #245).
-
-* Resolves several issues with PyPy and uses faster async slots in PyPy3.
- Patch by Ronan Lamy (Github issues #1871, #1878).
-
-Bugs fixed
-----------
-
-* Extension types that were cimported from other Cython modules could disagree
- about the order of fused cdef methods in their call table. This could lead
- to wrong methods being called and potentially also crashes. The fix required
- changes to the ordering of fused methods in the call table, which may break
- existing compiled modules that call fused cdef methods across module boundaries,
- if these methods were implemented in a different order than they were declared
- in the corresponding .pxd file. (Github issue #1873)
-
-* The exception state handling in generators and coroutines could lead to
- exceptions in the caller being lost if an exception was raised and handled
- inside of the coroutine when yielding. (Github issue #1731)
-
-* Loops over ``range(enum)`` were not converted into C for-loops. Note that it
- is still recommended to use an explicit cast to a C integer type in this case.
-
-* Error positions of names (e.g. variables) were incorrectly reported after the
- name and not at the beginning of the name.
-
-* Compile time ``DEF`` assignments were evaluated even when they occur inside of
- falsy ``IF`` blocks. (Github issue #1796)
-
-* Disabling the line tracing from a trace function could fail.
- Original patch by Dmitry Trofimov. (Github issue #1769)
-
-* Several issues with the Pythran integration were resolved.
-
-* abs(signed int) now returns a signed rather than unsigned int.
- (Github issue #1837)
-
-* Reading ``frame.f_locals`` of a Cython function (e.g. from a debugger or profiler
- could modify the module globals. (Github issue #1836)
-
-* Buffer type mismatches in the NumPy buffer support could leak a reference to the
- buffer owner.
-
-* Using the "is_f_contig" and "is_c_contig" memoryview methods together could leave
- one of them undeclared. (Github issue #1872)
-
-* Compilation failed if the for-in-range loop target was not a variable but a more
- complex expression, e.g. an item assignment. (Github issue #1831)
-
-* Compile time evaluations of (partially) constant f-strings could show incorrect
- results.
-
-* Escape sequences in raw f-strings (``fr'...'``) were resolved instead of passing
- them through as expected.
-
-* Some ref-counting issues in buffer error handling have been resolved.
-
-Other changes
--------------
-
-* Type declarations in signature annotations are now parsed according to
- `PEP 484 <https://www.python.org/dev/peps/pep-0484/>`_
- typing. Only Cython types (e.g. ``cython.int``) and Python builtin types are
- currently considered as type declarations. Everything else is ignored, but this
- will change in a future Cython release.
- (Github issue #1672)
-
-* The directive ``annotation_typing`` is now ``True`` by default, which enables
- parsing type declarations from annotations.
-
-* This release no longer supports Python 3.2.
-
-
-0.26.1 (2017-08-29)
-===================
-
-Features added
---------------
-
-Bugs fixed
-----------
-
-* ``cython.view.array`` was missing ``.__len__()``.
-
-* Extension types with a ``.pxd`` override for their ``__releasebuffer__`` slot
- (e.g. as provided by Cython for the Python ``array.array`` type) could leak
- a reference to the buffer owner on release, thus not freeing the memory.
- (Github issue #1638)
-
-* Auto-decoding failed in 0.26 for strings inside of C++ containers.
- (Github issue #1790)
-
-* Compile error when inheriting from C++ container types.
- (Github issue #1788)
-
-* Invalid C code in generators (declaration after code).
- (Github issue #1801)
-
-* Arithmetic operations on ``const`` integer variables could generate invalid code.
- (Github issue #1798)
-
-* Local variables with names of special Python methods failed to compile inside of
- closures. (Github issue #1797)
-
-* Problem with indirect Emacs buffers in cython-mode.
- Patch by Martin Albrecht (Github issue #1743).
-
-* Extension types named ``result`` or ``PickleError`` generated invalid unpickling code.
- Patch by Jason Madden (Github issue #1786).
-
-* Bazel integration failed to compile ``.py`` files.
- Patch by Guro Bokum (Github issue #1784).
-
-* Some include directories and dependencies were referenced with their absolute paths
- in the generated files despite lying within the project directory.
-
-* Failure to compile in Py3.7 due to a modified signature of ``_PyCFunctionFast()``
-
-
-0.26 (2017-07-19)
-=================
-
-Features added
---------------
-
-* Pythran can be used as a backend for evaluating NumPy array expressions.
- Patch by Adrien Guinet (Github issue #1607).
-
-* cdef classes now support pickling by default when possible.
- This can be disabled with the ``auto_pickle`` directive.
-
-* Speed up comparisons of strings if their hash value is available.
- Patch by Claudio Freire (Github issue #1571).
-
-* Support pyximport from zip files.
- Patch by Sergei Lebedev (Github issue #1485).
-
-* IPython magic now respects the ``__all__`` variable and ignores
- names with leading-underscore (like ``import *`` does).
- Patch by Syrtis Major (Github issue #1625).
-
-* ``abs()`` is optimised for C complex numbers.
- Patch by da-woods (Github issue #1648).
-
-* The display of C lines in Cython tracebacks can now be enabled at runtime
- via ``import cython_runtime; cython_runtime.cline_in_traceback=True``.
- The default has been changed to False.
-
-* The overhead of calling fused types generic functions was reduced.
-
-* "cdef extern" include files are now also searched relative to the current file.
- Patch by Jeroen Demeyer (Github issue #1654).
-
-* Optional optimization for re-aquiring the GIL, controlled by the
- `fast_gil` directive.
-
-Bugs fixed
-----------
-
-* Item lookup/assignment with a unicode character as index that is typed
- (explicitly or implicitly) as ``Py_UCS4`` or ``Py_UNICODE`` used the
- integer value instead of the Unicode string value. Code that relied on
- the previous behaviour now triggers a warning that can be disabled by
- applying an explicit cast. (Github issue #1602)
-
-* f-string processing was adapted to changes in PEP 498 and CPython 3.6.
-
-* Invalid C code when decoding from UTF-16(LE/BE) byte strings.
- (Github issue #1696)
-
-* Unicode escapes in 'ur' raw-unicode strings were not resolved in Py2 code.
- Original patch by Aaron Gallagher (Github issue #1594).
-
-* File paths of code objects are now relative.
- Original patch by Jelmer Vernooij (Github issue #1565).
-
-* Decorators of cdef class methods could be executed twice.
- Patch by Jeroen Demeyer (Github issue #1724).
-
-* Dict iteration using the Py2 ``iter*`` methods failed in PyPy3.
- Patch by Armin Rigo (Github issue #1631).
-
-* Several warnings in the generated code are now suppressed.
-
-Other changes
--------------
-
-* The ``unraisable_tracebacks`` option now defaults to ``True``.
-
-* Coercion of C++ containers to Python is no longer automatic on attribute
- access (Github issue #1521).
-
-* Access to Python attributes of cimported modules without the corresponding
- import is now a compile-time (rather than runtime) error.
-
-* Do not use special dll linkage for "cdef public" functions.
- Patch by Jeroen Demeyer (Github issue #1687).
-
-* cdef/cpdef methods must match their declarations. See Github Issue #1732.
- This is now a warning and will be an error in future releases.
-
-
-0.25.2 (2016-12-08)
-===================
-
-Bugs fixed
-----------
-
-* Fixes several issues with C++ template deduction.
-
-* Fixes a issue with bound method type inference (Github issue #551).
-
-* Fixes a bug with cascaded tuple assignment (Github issue #1523).
-
-* Fixed or silenced many Clang warnings.
-
-* Fixes bug with powers of pure real complex numbers (Github issue #1538).
-
-
-0.25.1 (2016-10-26)
-===================
-
-Bugs fixed
-----------
-
-* Fixes a bug with ``isinstance(o, Exception)`` (Github issue #1496).
-
-* Fixes bug with ``cython.view.array`` missing utility code in some cases
- (Github issue #1502).
-
-Other changes
--------------
-
-* The distutils extension ``Cython.Distutils.build_ext`` has been reverted,
- temporarily, to be ``old_build_ext`` to give projects time to migrate.
- The new build_ext is available as ``new_build_ext``.
-
-
-0.25 (2016-10-25)
-=================
-
-Features added
---------------
-
-* def/cpdef methods of cdef classes benefit from Cython's internal function
- implementation, which enables introspection and line profiling for them.
- Implementation sponsored by Turbostream (www.turbostream-cfd.com).
-
-* Calls to Python functions are faster, following the recent "FastCall"
- optimisations that Victor Stinner implemented for CPython 3.6.
- See https://bugs.python.org/issue27128 and related issues.
-
-* The new METH_FASTCALL calling convention for PyCFunctions is supported
- in CPython 3.6. See https://bugs.python.org/issue27810
-
-* Initial support for using Cython modules in Pyston.
- Patch by Boxiang Sun.
-
-* Dynamic Python attributes are allowed on cdef classes if an attribute
- ``cdef dict __dict__`` is declared in the class. Patch by empyrical.
-
-* Cython implemented C++ classes can make direct calls to base class methods.
- Patch by empyrical.
-
-* C++ classes can now have typedef members. STL containers updated with
- value_type.
-
-* New directive ``cython.no_gc`` to fully disable GC for a cdef class.
- Patch by Claudio Freire.
-
-* Buffer variables are no longer excluded from ``locals()``.
- Patch by da-woods.
-
-* Building f-strings is faster, especially when formatting C integers.
-
-* for-loop iteration over "std::string".
-
-* ``libc/math.pxd`` provides ``e`` and ``pi`` as alias constants to simplify
- usage as a drop-in replacement for Python's math module.
-
-* Speed up cython.inline().
-
-* Binary lshift operations with small constant Python integers are faster.
-
-* Some integer operations on Python long objects are faster in Python 2.7.
-
-* Support for the C++ ``typeid`` operator.
-
-* Support for bazel using a the pyx_library rule in //Tools:rules.bzl.
-
-Significant Bugs fixed
-----------------------
-
-* Division of complex numbers avoids overflow by using Smith's method.
-
-* Some function signatures in ``libc.math`` and ``numpy.pxd`` were incorrect.
- Patch by Michael Seifert.
-
-Other changes
--------------
-
-* The "%%cython" IPython/jupyter magic now defaults to the language level of
- the current jupyter kernel. The language level can be set explicitly with
- "%%cython -2" or "%%cython -3".
-
-* The distutils extension ``Cython.Distutils.build_ext`` has now been updated
- to use cythonize which properly handles dependencies. The old extension can
- still be found in ``Cython.Distutils.old_build_ext`` and is now deprecated.
-
-* ``directive_defaults`` is no longer available in ``Cython.Compiler.Options``,
- use ``get_directive_defaults()`` instead.
-
-
-0.24.1 (2016-07-15)
-===================
-
-Bugs fixed
-----------
-
-* IPython cell magic was lacking a good way to enable Python 3 code semantics.
- It can now be used as "%%cython -3".
-
-* Follow a recent change in `PEP 492 <https://www.python.org/dev/peps/pep-0492/>`_
- and CPython 3.5.2 that now requires the ``__aiter__()`` method of asynchronous
- iterators to be a simple ``def`` method instead of an ``async def`` method.
-
-* Coroutines and generators were lacking the ``__module__`` special attribute.
-
-* C++ ``std::complex`` values failed to auto-convert from and to Python complex
- objects.
-
-* Namespaced C++ types could not be used as memory view types due to lack of
- name mangling. Patch by Ivan Smirnov.
-
-* Assignments between identical C++ types that were declared with differently
- typedefed template types could fail.
-
-* Rebuilds could fail to evaluate dependency timestamps in C++ mode.
- Patch by Ian Henriksen.
-
-* Macros defined in the ``distutils`` compiler option do not require values
- anymore. Patch by Ian Henriksen.
-
-* Minor fixes for MSVC, Cygwin and PyPy.
-
-
-0.24 (2016-04-04)
-=================
-
-Features added
---------------
-
-* `PEP 498 <https://www.python.org/dev/peps/pep-0498/>`_:
- Literal String Formatting (f-strings).
- Original patch by Jelle Zijlstra.
-
-* `PEP 515 <https://www.python.org/dev/peps/pep-0515/>`_:
- Underscores as visual separators in number literals.
-
-* Parser was adapted to some minor syntax changes in Py3.6, e.g.
- https://bugs.python.org/issue9232
-
-* The embedded C code comments that show the original source code
- can be discarded with the new directive ``emit_code_comments=False``.
-
-* Cpdef enums are now first-class iterable, callable types in Python.
-
-* Ctuples can now be declared in pure Python code.
-
-* Posix declarations for DLL loading and stdio extensions were added.
- Patch by Lars Buitinck.
-
-* The Py2-only builtins ``unicode()``, ``xrange()``, ``reduce()`` and
- ``long`` are now also available in compile time ``DEF`` expressions
- when compiling with Py3.
-
-* Exception type tests have slightly lower overhead.
- This fixes ticket 868.
-
-* @property syntax fully supported in cdef classes, old syntax deprecated.
-
-* C++ classes can now be declared with default template parameters.
-
-Bugs fixed
-----------
-
-* C++ exceptions raised by overloaded C++ operators were not always
- handled. Patch by Ian Henriksen.
-
-* C string literals were previously always stored as non-const global
- variables in the module. They are now stored as global constants
- when possible, and otherwise as non-const C string literals in the
- generated code that uses them. This improves compatibility with
- strict C compiler options and prevents non-const strings literals
- with the same content from being incorrectly merged.
-
-* Compile time evaluated ``str`` expressions (``DEF``) now behave in a
- more useful way by turning into Unicode strings when compiling under
- Python 3. This allows using them as intermediate values in expressions.
- Previously, they always evaluated to bytes objects.
-
-* ``isinf()`` declarations in ``libc/math.pxd`` and ``numpy/math.pxd`` now
- reflect the actual tristate ``int`` return value instead of using ``bint``.
-
-* Literal assignments to ctuples avoid Python tuple round-trips in some
- more corner cases.
-
-* Iteration over ``dict(...).items()`` failed to get optimised when dict
- arguments included keyword arguments.
-
-* cProfile now correctly profiles cpdef functions and methods.
-
-
-0.23.5 (2016-03-26)
-===================
-
-* Compile errors and warnings in integer type conversion code. This fixes
- ticket 877. Patches by Christian Neukirchen, Nikolaus Rath, Ian Henriksen.
-
-* Reference leak when "*args" argument was reassigned in closures.
-
-* Truth-testing Unicode strings could waste time and memory in Py3.3+.
-
-* Return values of async functions could be ignored and replaced by ``None``.
-
-* Compiler crash in CPython 3.6.
-
-* Fix prange() to behave identically to range(). The end condition was
- miscalculated when the range was not exactly divisible by the step.
-
-* Optimised ``all(genexpr)``/``any(genexpr)`` calls could warn about unused
- code. This fixes ticket 876.
-
-
-0.23.4 (2015-10-10)
-===================
-
-Bugs fixed
-----------
-
-* Memory leak when calling Python functions in PyPy.
-
-* Compilation problem with MSVC in C99-ish mode.
-
-* Warning about unused values in a helper macro.
-
-
-0.23.3 (2015-09-29)
-===================
-
-Bugs fixed
-----------
-
-* Invalid C code for some builtin methods. This fixes ticket 856 again.
-
-* Incorrect C code in helper functions for PyLong conversion and string
- decoding. This fixes ticket 863, ticket 864 and ticket 865.
- Original patch by Nikolaus Rath.
-
-* Large folded or inserted integer constants could use too small C
- integer types and thus trigger a value wrap-around.
-
-Other changes
--------------
-
-* The coroutine and generator types of Cython now also register directly
- with the ``Coroutine`` and ``Generator`` ABCs in the ``backports_abc``
- module if it can be imported. This fixes ticket 870.
-
-
-0.23.2 (2015-09-11)
-===================
-
-Bugs fixed
-----------
-
-* Compiler crash when analysing some optimised expressions.
-
-* Coverage plugin was adapted to coverage.py 4.0 beta 2.
-
-* C++ destructor calls could fail when '&' operator is overwritten.
-
-* Incorrect C literal generation for large integers in compile-time
- evaluated DEF expressions and constant folded expressions.
-
-* Byte string constants could end up as Unicode strings when originating
- from compile-time evaluated DEF expressions.
-
-* Invalid C code when caching known builtin methods.
- This fixes ticket 860.
-
-* ``ino_t`` in ``posix.types`` was not declared as ``unsigned``.
-
-* Declarations in ``libcpp/memory.pxd`` were missing ``operator!()``.
- Patch by Leo Razoumov.
-
-* Static cdef methods can now be declared in .pxd files.
-
-
-0.23.1 (2015-08-22)
-===================
-
-Bugs fixed
-----------
-
-* Invalid C code for generators. This fixes ticket 858.
-
-* Invalid C code for some builtin methods. This fixes ticket 856.
-
-* Invalid C code for unused local buffer variables.
- This fixes ticket 154.
-
-* Test failures on 32bit systems. This fixes ticket 857.
-
-* Code that uses ``from xyz import *`` and global C struct/union/array
- variables could fail to compile due to missing helper functions.
- This fixes ticket 851.
-
-* Misnamed PEP 492 coroutine property ``cr_yieldfrom`` renamed to
- ``cr_await`` to match CPython.
-
-* Missing deallocation code for C++ object attributes in certain
- extension class hierarchies.
-
-* Crash when async coroutine was not awaited.
-
-* Compiler crash on ``yield`` in signature annotations and default
- argument values. Both are forbidden now.
-
-* Compiler crash on certain constructs in ``finally`` clauses.
-
-* Cython failed to build when CPython's pgen is installed.
-
-
-0.23 (2015-08-08)
-=================
-
-Features added
---------------
-
-* `PEP 492 <https://www.python.org/dev/peps/pep-0492/>`_
- (async/await) was implemented.
-
-* `PEP 448 <https://www.python.org/dev/peps/pep-0448/>`_
- (Additional Unpacking Generalizations) was implemented.
-
-* Support for coverage.py 4.0+ can be enabled by adding the plugin
- "Cython.Coverage" to the ".coveragerc" config file.
-
-* Annotated HTML source pages can integrate (XML) coverage reports.
-
-* Tracing is supported in ``nogil`` functions/sections and module init code.
-
-* When generators are used in a Cython module and the module imports the
- modules "inspect" and/or "asyncio", Cython enables interoperability by
- patching these modules during the import to recognise Cython's internal
- generator and coroutine types. This can be disabled by C compiling the
- module with "-D CYTHON_PATCH_ASYNCIO=0" or "-D CYTHON_PATCH_INSPECT=0"
-
-* When generators or coroutines are used in a Cython module, their types
- are registered with the ``Generator`` and ``Coroutine`` ABCs in the
- ``collections`` or ``collections.abc`` stdlib module at import time to
- enable interoperability with code that needs to detect and process Python
- generators/coroutines. These ABCs were added in CPython 3.5 and are
- available for older Python versions through the ``backports_abc`` module
- on PyPI. See https://bugs.python.org/issue24018
-
-* Adding/subtracting/dividing/modulus and equality comparisons with
- constant Python floats and small integers are faster.
-
-* Binary and/or/xor/rshift operations with small constant Python integers
- are faster.
-
-* When called on generator expressions, the builtins ``all()``, ``any()``,
- ``dict()``, ``list()``, ``set()``, ``sorted()`` and ``unicode.join()``
- avoid the generator iteration overhead by inlining a part of their
- functionality into the for-loop.
-
-* Keyword argument dicts are no longer copied on function entry when they
- are not being used or only passed through to other function calls (e.g.
- in wrapper functions).
-
-* The ``PyTypeObject`` declaration in ``cpython.object`` was extended.
-
-* The builtin ``type`` type is now declared as PyTypeObject in source,
- allowing for extern functions taking type parameters to have the correct
- C signatures. Note that this might break code that uses ``type`` just
- for passing around Python types in typed variables. Removing the type
- declaration provides a backwards compatible fix.
-
-* ``wraparound()`` and ``boundscheck()`` are available as no-ops in pure
- Python mode.
-
-* Const iterators were added to the provided C++ STL declarations.
-
-* Smart pointers were added to the provided C++ STL declarations.
- Patch by Daniel Filonik.
-
-* ``NULL`` is allowed as default argument when embedding signatures.
- This fixes ticket 843.
-
-* When compiling with ``--embed``, the internal module name is changed to
- ``__main__`` to allow arbitrary program names, including those that would
- be invalid for modules. Note that this prevents reuse of the generated
- C code as an importable module.
-
-* External C++ classes that overload the assignment operator can be used.
- Patch by Ian Henriksen.
-
-* Support operator bool() for C++ classes so they can be used in if statements.
-
-Bugs fixed
-----------
-
-* Calling "yield from" from Python on a Cython generator that returned a
- value triggered a crash in CPython. This is now being worked around.
- See https://bugs.python.org/issue23996
-
-* Language level 3 did not enable true division (a.k.a. float division)
- for integer operands.
-
-* Functions with fused argument types that included a generic 'object'
- fallback could end up using that fallback also for other explicitly
- listed object types.
-
-* Relative cimports could accidentally fall back to trying an absolute
- cimport on failure.
-
-* The result of calling a C struct constructor no longer requires an
- intermediate assignment when coercing to a Python dict.
-
-* C++ exception declarations with mapping functions could fail to compile
- when pre-declared in .pxd files.
-
-* ``cpdef void`` methods are now permitted.
-
-* ``abs(cint)`` could fail to compile in MSVC and used sub-optimal code
- in C++. Patch by David Vierra, original patch by Michael Enßlin.
-
-* Buffer index calculations using index variables with small C integer
- types could overflow for large buffer sizes.
- Original patch by David Vierra.
-
-* C unions use a saner way to coerce from and to Python dicts.
-
-* When compiling a module ``foo.pyx``, the directories in ``sys.path``
- are no longer searched when looking for ``foo.pxd``.
- Patch by Jeroen Demeyer.
-
-* Memory leaks in the embedding main function were fixed.
- Original patch by Michael Enßlin.
-
-* Some complex Python expressions could fail to compile inside of finally
- clauses.
-
-* Unprefixed 'str' literals were not supported as C varargs arguments.
-
-* Fixed type errors in conversion enum types to/from Python. Note that
- this imposes stricter correctness requirements on enum declarations.
-
-
-Other changes
--------------
-
-* Changed mangling scheme in header files generated by ``cdef api``
- declarations.
-
-* Installation under CPython 3.3+ no longer requires a pass of the
- 2to3 tool. This also makes it possible to run Cython in Python
- 3.3+ from a source checkout without installing it first.
- Patch by Petr Viktorin.
-
-* ``jedi-typer.py`` (in ``Tools/``) was extended and renamed to
- ``jedityper.py`` (to make it importable) and now works with and
- requires Jedi 0.9. Patch by Tzer-jen Wei.
-
-
-0.22.1 (2015-06-20)
-===================
-
-Bugs fixed
-----------
-
-* Crash when returning values on generator termination.
-
-* In some cases, exceptions raised during internal isinstance() checks were
- not propagated.
-
-* Runtime reported file paths of source files (e.g for profiling and tracing)
- are now relative to the build root directory instead of the main source file.
-
-* Tracing exception handling code could enter the trace function with an active
- exception set.
-
-* The internal generator function type was not shared across modules.
-
-* Comparisons of (inferred) ctuples failed to compile.
-
-* Closures inside of cdef functions returning ``void`` failed to compile.
-
-* Using ``const`` C++ references in intermediate parts of longer expressions
- could fail to compile.
-
-* C++ exception declarations with mapping functions could fail to compile when
- pre-declared in .pxd files.
-
-* C++ compilation could fail with an ambiguity error in recent MacOS-X Xcode
- versions.
-
-* C compilation could fail in pypy3.
-
-* Fixed a memory leak in the compiler when compiling multiple modules.
-
-* When compiling multiple modules, external library dependencies could leak
- into later compiler runs. Fix by Jeroen Demeyer. This fixes ticket 845.
-
-
-0.22 (2015-02-11)
-=================
-
-Features added
---------------
-
-* C functions can coerce to Python functions, which allows passing them
- around as callable objects.
-
-* C arrays can be assigned by value and auto-coerce from Python iterables
- and to Python lists (and tuples).
-
-* Extern C functions can now be declared as cpdef to export them to
- the module's Python namespace. Extern C functions in pxd files export
- their values to their own module, iff it exists.
-
-* Anonymous C tuple types can be declared as (ctype1, ctype2, ...).
-
-* `PEP 479 <https://www.python.org/dev/peps/pep-0479/>`_:
- turn accidental StopIteration exceptions that exit generators
- into a RuntimeError, activated with future import "generator_stop".
-
-* Looping over ``reversed(range())`` is optimised in the same way as
- ``range()``. Patch by Favian Contreras.
-
-Bugs fixed
-----------
-
-* Mismatching 'except' declarations on signatures in .pxd and .pyx files failed
- to produce a compile error.
-
-* Failure to find any files for the path pattern(s) passed into ``cythonize()``
- is now an error to more easily detect accidental typos.
-
-* The ``logaddexp`` family of functions in ``numpy.math`` now has correct
- declarations.
-
-* In Py2.6/7 and Py3.2, simple Cython memory views could accidentally be
- interpreted as non-contiguous by CPython, which could trigger a CPython
- bug when copying data from them, thus leading to data corruption.
- See CPython issues 12834 and 23349.
-
-Other changes
--------------
-
-* Preliminary support for defining the Cython language with a formal grammar.
- To try parsing your files against this grammar, use the --formal_grammar directive.
- Experimental.
-
-* ``_`` is no longer considered a cacheable builtin as it could interfere with
- gettext.
-
-* Cythonize-computed metadata now cached in the generated C files.
-
-* Several corrections and extensions in numpy, cpython, and libcpp pxd files.
-
-
-0.21.2 (2014-12-27)
-===================
-
-Bugs fixed
-----------
-
-* Crash when assigning a C value to both a Python and C target at the same time.
-
-* Automatic coercion from C++ strings to ``str`` generated incomplete code that
- failed to compile.
-
-* Declaring a constructor in a C++ child class erroneously required a default
- constructor declaration in the super class.
-
-* ``resize_smart()`` in ``cpython.array`` was broken.
-
-* Functions in ``libcpp.cast`` are now declared as ``nogil``.
-
-* Some missing C-API declarations were added.
-
-* Py3 main code in embedding program code was lacking casts.
-
-* Exception related to distutils "Distribution" class type in pyximport under
- latest CPython 2.7 and 3.4 releases when setuptools is being imported later.
-
-
-0.21.1 (2014-10-18)
-===================
-
-Features added
---------------
-
-* New ``cythonize`` option ``-a`` to generate the annotated HTML source view.
-
-* Missing C-API declarations in ``cpython.unicode`` were added.
-
-* Passing ``language='c++'`` into cythonize() globally enables C++ mode for
- all modules that were not passed as Extension objects (i.e. only source
- files and file patterns).
-
-* ``Py_hash_t`` is a known type (used in CPython for hash values).
-
-* ``PySlice_*()`` C-API functions are available from the ``cpython.slice``
- module.
-
-* Allow arrays of C++ classes.
-
-Bugs fixed
-----------
-
-* Reference leak for non-simple Python expressions in boolean and/or expressions.
-
-* To fix a name collision and to reflect availability on host platforms,
- standard C declarations [ clock(), time(), struct tm and tm* functions ]
- were moved from posix/time.pxd to a new libc/time.pxd. Patch by Charles
- Blake.
-
-* Rerunning unmodified modules in IPython's cython support failed.
- Patch by Matthias Bussonier.
-
-* Casting C++ ``std::string`` to Python byte strings failed when
- auto-decoding was enabled.
-
-* Fatal exceptions in global module init code could lead to crashes
- if the already created module was used later on (e.g. through a
- stale reference in sys.modules or elsewhere).
-
-* ``cythonize.py`` script was not installed on MS-Windows.
-
-Other changes
--------------
-
-* Compilation no longer fails hard when unknown compilation options are
- passed. Instead, it raises a warning and ignores them (as it did silently
- before 0.21). This will be changed back to an error in a future release.
-
-
-0.21 (2014-09-10)
-=================
-
-Features added
---------------
-
-* C (cdef) functions allow inner Python functions.
-
-* Enums can now be declared as cpdef to export their values to
- the module's Python namespace. Cpdef enums in pxd files export
- their values to their own module, iff it exists.
-
-* Allow @staticmethod decorator to declare static cdef methods.
- This is especially useful for declaring "constructors" for
- cdef classes that can take non-Python arguments.
-
-* Taking a ``char*`` from a temporary Python string object is safer
- in more cases and can be done inside of non-trivial expressions,
- including arguments of a function call. A compile time error
- is raised only when such a pointer is assigned to a variable and
- would thus exceed the lifetime of the string itself.
-
-* Generators have new properties ``__name__`` and ``__qualname__``
- that provide the plain/qualified name of the generator function
- (following CPython 3.5). See http://bugs.python.org/issue21205
-
-* The ``inline`` function modifier is available as a decorator
- ``@cython.inline`` in pure mode.
-
-* When cygdb is run in a virtualenv, it enables the same virtualenv
- inside of the debugger. Patch by Marc Abramowitz.
-
-* PEP 465: dedicated infix operator for matrix multiplication (A @ B).
-
-* HTML output of annotated code uses Pygments for code highlighting
- and generally received a major overhaul by Matthias Bussonier.
-
-* IPython magic support is now available directly from Cython with
- the command "%load_ext cython". Cython code can directly be
- executed in a cell when marked with "%%cython". Code analysis
- is available with "%%cython -a". Patch by Martín Gaitán.
-
-* Simple support for declaring Python object types in Python signature
- annotations. Currently requires setting the compiler directive
- ``annotation_typing=True``.
-
-* New directive ``use_switch`` (defaults to True) to optionally disable
- the optimization of chained if statement to C switch statements.
-
-* Defines dynamic_cast et al. in ``libcpp.cast`` and C++ heap data
- structure operations in ``libcpp.algorithm``.
-
-* Shipped header declarations in ``posix.*`` were extended to cover
- more of the POSIX API. Patches by Lars Buitinck and Mark Peek.
-
-Optimizations
--------------
-
-* Simple calls to C implemented Python functions/methods are faster.
- This also speeds up many operations on builtins that Cython cannot
- otherwise optimise.
-
-* The "and"/"or" operators try to avoid unnecessary coercions of their
- arguments. They now evaluate the truth value of each argument
- independently and only coerce the final result of the whole expression
- to the target type (e.g. the type on the left side of an assignment).
- This also avoids reference counting overhead for Python values during
- evaluation and generally improves the code flow in the generated C code.
-
-* The Python expression "2 ** N" is optimised into bit shifting.
- See http://bugs.python.org/issue21420
-
-* Cascaded assignments (a = b = ...) try to minimise the number of
- type coercions.
-
-* Calls to ``slice()`` are translated to a straight C-API call.
-
-Bugs fixed
-----------
-
-* Crash when assigning memory views from ternary conditional expressions.
-
-* Nested C++ templates could lead to unseparated ">>" characters being
- generated into the C++ declarations, which older C++ compilers could
- not parse.
-
-* Sending SIGINT (Ctrl-C) during parallel cythonize() builds could
- hang the child processes.
-
-* No longer ignore local setup.cfg files for distutils in pyximport.
- Patch by Martin Teichmann.
-
-* Taking a ``char*`` from an indexed Python string generated unsafe
- reference counting code.
-
-* Set literals now create all of their items before trying to add them
- to the set, following the behaviour in CPython. This makes a
- difference in the rare case that the item creation has side effects
- and some items are not hashable (or if hashing them has side effects,
- too).
-
-* Cython no longer generates the cross product of C functions for code
- that uses memory views of fused types in function signatures (e.g.
- ``cdef func(floating[:] a, floating[:] b)``). This is considered the
- expected behaviour by most users and was previously inconsistent with
- other structured types like C arrays. Code that really wants all type
- combinations can create the same fused memoryview type under different
- names and use those in the signature to make it clear which types are
- independent.
-
-* Names that were unknown at compile time were looked up as builtins at
- runtime but not as global module names. Trying both lookups helps with
- globals() manipulation.
-
-* Fixed stl container conversion for typedef element types.
-
-* ``obj.pop(x)`` truncated large C integer values of x to ``Py_ssize_t``.
-
-* ``__init__.pyc`` is recognised as marking a package directory
- (in addition to .py, .pyx and .pxd).
-
-* Syntax highlighting in ``cython-mode.el`` for Emacs no longer
- incorrectly highlights keywords found as part of longer names.
-
-* Correctly handle ``from cython.submodule cimport name``.
-
-* Fix infinite recursion when using super with cpdef methods.
-
-* No-args ``dir()`` was not guaranteed to return a sorted list.
-
-Other changes
--------------
-
-* The header line in the generated C files no longer contains the
- timestamp but only the Cython version that wrote it. This was
- changed to make builds more reproducible.
-
-* Removed support for CPython 2.4, 2.5 and 3.1.
-
-* The licensing implications on the generated code were clarified
- to avoid legal constraints for users.
-
-
-0.20.2 (2014-06-16)
-===================
-
-Features added
---------------
-
-* Some optimisations for set/frozenset instantiation.
-
-* Support for C++ unordered_set and unordered_map.
-
-Bugs fixed
-----------
-
-* Access to attributes of optimised builtin methods (e.g.
- ``[].append.__name__``) could fail to compile.
-
-* Memory leak when extension subtypes add a memory view as attribute
- to those of the parent type without having Python object attributes
- or a user provided dealloc method.
-
-* Compiler crash on readonly properties in "binding" mode.
-
-* Auto-encoding with ``c_string_encoding=ascii`` failed in Py3.3.
-
-* Crash when subtyping freelist enabled Cython extension types with
- Python classes that use ``__slots__``.
-
-* Freelist usage is restricted to CPython to avoid problems with other
- Python implementations.
-
-* Memory leak in memory views when copying overlapping, contiguous slices.
-
-* Format checking when requesting non-contiguous buffers from
- ``cython.array`` objects was accidentally omitted in Py3.
-
-* C++ destructor calls in extension types could fail to compile in clang.
-
-* Buffer format validation failed for sequences of strings in structs.
-
-* Docstrings on extension type attributes in .pxd files were rejected.
-
-
-0.20.1 (2014-02-11)
-===================
-
-Bugs fixed
-----------
-
-* Build error under recent MacOS-X versions where ``isspace()`` could not be
- resolved by clang.
-
-* List/Tuple literals multiplied by more than one factor were only multiplied
- by the last factor instead of all.
-
-* Lookups of special methods (specifically for context managers) could fail
- in Python <= 2.6/3.1.
-
-* Local variables were erroneously appended to the signature introspection
- of Cython implemented functions with keyword-only arguments under Python 3.
-
-* In-place assignments to variables with inferred Python builtin/extension
- types could fail with type errors if the result value type was incompatible
- with the type of the previous value.
-
-* The C code generation order of cdef classes, closures, helper code,
- etc. was not deterministic, thus leading to high code churn.
-
-* Type inference could fail to deduce C enum types.
-
-* Type inference could deduce unsafe or inefficient types from integer
- assignments within a mix of inferred Python variables and integer
- variables.
-
-
-0.20 (2014-01-18)
-=================
-
-Features added
---------------
-
-* Support for CPython 3.4.
-
-* Support for calling C++ template functions.
-
-* ``yield`` is supported in ``finally`` clauses.
-
-* The C code generated for finally blocks is duplicated for each exit
- case to allow for better optimisations by the C compiler.
-
-* Cython tries to undo the Python optimisationism of assigning a bound
- method to a local variable when it can generate better code for the
- direct call.
-
-* Constant Python float values are cached.
-
-* String equality comparisons can use faster type specific code in
- more cases than before.
-
-* String/Unicode formatting using the '%' operator uses a faster
- C-API call.
-
-* ``bytearray`` has become a known type and supports coercion from and
- to C strings. Indexing, slicing and decoding is optimised. Note that
- this may have an impact on existing code due to type inference.
-
-* Using ``cdef basestring stringvar`` and function arguments typed as
- ``basestring`` is now meaningful and allows assigning exactly
- ``str`` and ``unicode`` objects, but no subtypes of these types.
-
-* Support for the ``__debug__`` builtin.
-
-* Assertions in Cython compiled modules are disabled if the running
- Python interpreter was started with the "-O" option.
-
-* Some types that Cython provides internally, such as functions and
- generators, are now shared across modules if more than one Cython
- implemented module is imported.
-
-* The type inference algorithm works more fine granular by taking the
- results of the control flow analysis into account.
-
-* A new script in ``bin/cythonize`` provides a command line frontend
- to the cythonize() compilation function (including distutils build).
-
-* The new extension type decorator ``@cython.no_gc_clear`` prevents
- objects from being cleared during cyclic garbage collection, thus
- making sure that object attributes are kept alive until deallocation.
-
-* During cyclic garbage collection, attributes of extension types that
- cannot create reference cycles due to their type (e.g. strings) are
- no longer considered for traversal or clearing. This can reduce the
- processing overhead when searching for or cleaning up reference cycles.
-
-* Package compilation (i.e. ``__init__.py`` files) now works, starting
- with Python 3.3.
-
-* The cython-mode.el script for Emacs was updated. Patch by Ivan Andrus.
-
-* An option common_utility_include_dir was added to cythonize() to save
- oft-used utility code once in a separate directory rather than as
- part of each generated file.
-
-* ``unraisable_tracebacks`` directive added to control printing of
- tracebacks of unraisable exceptions.
-
-Bugs fixed
-----------
-
-* Abstract Python classes that subtyped a Cython extension type
- failed to raise an exception on instantiation, and thus ended
- up being instantiated.
-
-* ``set.add(a_tuple)`` and ``set.discard(a_tuple)`` failed with a
- TypeError in Py2.4.
-
-* The PEP 3155 ``__qualname__`` was incorrect for nested classes and
- inner classes/functions declared as ``global``.
-
-* Several corner cases in the try-finally statement were fixed.
-
-* The metaclass of a Python class was not inherited from its parent
- class(es). It is now extracted from the list of base classes if not
- provided explicitly using the Py3 ``metaclass`` keyword argument.
- In Py2 compilation mode, a ``__metaclass__`` entry in the class
- dict will still take precedence if not using Py3 metaclass syntax,
- but only *after* creating the class dict (which may have been done
- by a metaclass of a base class, see PEP 3115). It is generally
- recommended to use the explicit Py3 syntax to define metaclasses
- for Python types at compile time.
-
-* The automatic C switch statement generation behaves more safely for
- heterogeneous value types (e.g. mixing enum and char), allowing for
- a slightly wider application and reducing corner cases. It now always
- generates a 'default' clause to avoid C compiler warnings about
- unmatched enum values.
-
-* Fixed a bug where class hierarchies declared out-of-order could result
- in broken generated code.
-
-* Fixed a bug which prevented overriding const methods of C++ classes.
-
-* Fixed a crash when converting Python objects to C++ strings fails.
-
-Other changes
--------------
-
-* In Py3 compilation mode, Python2-style metaclasses declared by a
- ``__metaclass__`` class dict entry are ignored.
-
-* In Py3.4+, the Cython generator type uses ``tp_finalize()`` for safer
- cleanup instead of ``tp_del()``.
-
-
-0.19.2 (2013-10-13)
-===================
-
-Features added
---------------
-
-Bugs fixed
-----------
-
-* Some standard declarations were fixed or updated, including the previously
- incorrect declaration of ``PyBuffer_FillInfo()`` and some missing bits in
- ``libc.math``.
-
-* Heap allocated subtypes of ``type`` used the wrong base type struct at the
- C level.
-
-* Calling the unbound method dict.keys/value/items() in dict subtypes could
- call the bound object method instead of the unbound supertype method.
-
-* "yield" wasn't supported in "return" value expressions.
-
-* Using the "bint" type in memory views lead to unexpected results.
- It is now an error.
-
-* Assignments to global/closure variables could catch them in an illegal state
- while deallocating the old value.
-
-Other changes
--------------
-
-
-0.19.1 (2013-05-11)
-===================
-
-Features added
---------------
-
-* Completely empty C-API structs for extension type slots (protocols like
- number/mapping/sequence) are no longer generated into the C code.
-
-* Docstrings that directly follow a public/readonly attribute declaration
- in a cdef class will be used as docstring of the auto-generated property.
- This fixes ticket 206.
-
-* The automatic signature documentation tries to preserve more semantics
- of default arguments and argument types. Specifically, ``bint`` arguments
- now appear as type ``bool``.
-
-* A warning is emitted when negative literal indices are found inside of
- a code section that disables ``wraparound`` handling. This helps with
- fixing invalid code that might fail in the face of future compiler
- optimisations.
-
-* Constant folding for boolean expressions (and/or) was improved.
-
-* Added a build_dir option to cythonize() which allows one to place
- the generated .c files outside the source tree.
-
-Bugs fixed
-----------
-
-* ``isinstance(X, type)`` failed to get optimised into a call to
- ``PyType_Check()``, as done for other builtin types.
-
-* A spurious ``from datetime cimport *`` was removed from the "cpython"
- declaration package. This means that the "datetime" declarations
- (added in 0.19) are no longer available directly from the "cpython"
- namespace, but only from "cpython.datetime". This is the correct
- way of doing it because the declarations refer to a standard library
- module, not the core CPython C-API itself.
-
-* The C code for extension types is now generated in topological order
- instead of source code order to avoid C compiler errors about missing
- declarations for subtypes that are defined before their parent.
-
-* The ``memoryview`` type name no longer shows up in the module dict of
- modules that use memory views. This fixes trac ticket 775.
-
-* Regression in 0.19 that rejected valid C expressions from being used
- in C array size declarations.
-
-* In C++ mode, the C99-only keyword ``restrict`` could accidentally be
- seen by the GNU C++ compiler. It is now specially handled for both
- GCC and MSVC.
-
-* Testing large (> int) C integer values for their truth value could fail
- due to integer wrap-around.
-
-Other changes
--------------
-
-
-0.19 (2013-04-19)
-=================
-
-Features added
---------------
-
-* New directives ``c_string_type`` and ``c_string_encoding`` to more easily
- and automatically convert between C strings and the different Python string
- types.
-
-* The extension type flag ``Py_TPFLAGS_HAVE_VERSION_TAG`` is enabled by default
- on extension types and can be disabled using the ``type_version_tag`` compiler
- directive.
-
-* EXPERIMENTAL support for simple Cython code level line tracing. Enabled by
- the "linetrace" compiler directive.
-
-* Cython implemented functions make their argument and return type annotations
- available through the ``__annotations__`` attribute (PEP 3107).
-
-* Access to non-cdef module globals and Python object attributes is faster.
-
-* ``Py_UNICODE*`` coerces from and to Python unicode strings. This is
- helpful when talking to Windows APIs, which use compatible wchar_t
- arrays for strings. Note that the ``Py_UNICODE`` type is otherwise
- deprecated as of CPython 3.3.
-
-* ``isinstance(obj, basestring)`` is optimised. In Python 3 it only tests
- for instances of ``str`` (i.e. Py2 ``unicode``).
-
-* The ``basestring`` builtin is mapped to ``str`` (i.e. Py2 ``unicode``) when
- compiling the generated C code under Python 3.
-
-* Closures use freelists, which can speed up their creation quite substantially.
- This is also visible for short running generator expressions, for example.
-
-* A new class decorator ``@cython.freelist(N)`` creates a static freelist of N
- instances for an extension type, thus avoiding the costly allocation step if
- possible. This can speed up object instantiation by 20-30% in suitable
- scenarios. Note that freelists are currently only supported for base types,
- not for types that inherit from others.
-
-* Fast extension type instantiation using the ``Type.__new__(Type)`` idiom has
- gained support for passing arguments. It is also a bit faster for types defined
- inside of the module.
-
-* The Python2-only dict methods ``.iter*()`` and ``.view*()`` (requires Python 2.7)
- are automatically mapped to the equivalent keys/values/items methods in Python 3
- for typed dictionaries.
-
-* Slicing unicode strings, lists and tuples is faster.
-
-* list.append() is faster on average.
-
-* ``raise Exception() from None`` suppresses the exception context in Py3.3.
-
-* Py3 compatible ``exec(tuple)`` syntax is supported in Py2 code.
-
-* Keyword arguments are supported for cdef functions.
-
-* External C++ classes can be declared nogil. Patch by John Stumpo. This fixes
- trac ticket 805.
-
-Bugs fixed
-----------
-
-* 2-value slicing of unknown objects passes the correct slice when the ``getitem``
- protocol is used instead of the ``getslice`` protocol (especially in Python 3),
- i.e. ``None`` values for missing bounds instead of ``[0,maxsize]``. It is also
- a bit faster in some cases, e.g. for constant bounds. This fixes trac ticket 636.
-
-* Cascaded assignments of None values to extension type variables failed with
- a ``TypeError`` at runtime.
-
-* The ``__defaults__`` attribute was not writable for Cython implemented
- functions.
-
-* Default values of keyword-only arguments showed up in ``__defaults__`` instead
- of ``__kwdefaults__`` (which was not implemented). Both are available for
- Cython implemented functions now, as specified in Python 3.x.
-
-* ``yield`` works inside of ``with gil`` sections. It previously lead to a crash.
- This fixes trac ticket 803.
-
-* Static methods without explicitly named positional arguments (e.g. having only
- ``*args``) crashed when being called. This fixes trac ticket 804.
-
-* ``dir()`` without arguments previously returned an unsorted list, which now
- gets sorted as expected.
-
-* ``dict.items()``, ``dict.keys()`` and ``dict.values()`` no longer return lists
- in Python 3.
-
-* Exiting from an ``except-as`` clause now deletes the exception in Python 3 mode.
-
-* The declarations of ``frexp()`` and ``ldexp()`` in ``math.pxd`` were incorrect.
-
-Other changes
--------------
-
-
-0.18 (2013-01-28)
-=================
-
-Features added
---------------
-
-* Named Unicode escapes ("\N{...}") are supported.
-
-* Python functions/classes provide the special attribute "__qualname__"
- as defined by PEP 3155.
-
-* Added a directive ``overflowcheck`` which raises an OverflowException when
- arithmetic with C ints overflow. This has a modest performance penalty, but
- is much faster than using Python ints.
-
-* Calls to nested Python functions are resolved at compile time.
-
-* Type inference works across nested functions.
-
-* ``py_bytes_string.decode(...)`` is optimised.
-
-* C ``const`` declarations are supported in the language.
-
-Bugs fixed
-----------
-
-* Automatic C++ exception mapping didn't work in nogil functions (only in
- "with nogil" blocks).
-
-Other changes
--------------
-
-
-0.17.4 (2013-01-03)
-===================
-
-Bugs fixed
-----------
-
-* Garbage collection triggered during deallocation of container classes could lead to a double-deallocation.
-
-
-0.17.3 (2012-12-14)
-===================
-
-Features added
---------------
-
-Bugs fixed
-----------
-
-* During final interpreter cleanup (with types cleanup enabled at compile time), extension types that inherit from base types over more than one level that were cimported from other modules could lead to a crash.
-
-* Weak-reference support in extension types (with a ``cdef __weakref__`` attribute) generated incorrect deallocation code.
-
-* In CPython 3.3, converting a Unicode character to the Py_UNICODE type could fail to raise an overflow for non-BMP characters that do not fit into a wchar_t on the current platform.
-
-* Negative C integer constants lost their longness suffix in the generated C code.
-
-Other changes
--------------
-
-
-0.17.2 (2012-11-20)
-===================
-
-Features added
---------------
-
-* ``cythonize()`` gained a best effort compile mode that can be used to simply ignore .py files that fail to compile.
-
-Bugs fixed
-----------
-
-* Replacing an object reference with the value of one of its cdef attributes could generate incorrect C code that accessed the object after deleting its last reference.
-
-* C-to-Python type coercions during cascaded comparisons could generate invalid C code, specifically when using the 'in' operator.
-
-* "obj[1,]" passed a single integer into the item getter instead of a tuple.
-
-* Cyclic imports at module init time did not work in Py3.
-
-* The names of C++ destructors for template classes were built incorrectly.
-
-* In pure mode, type casts in Cython syntax and the C ampersand operator are now rejected. Use the pure mode replacements instead.
-
-* In pure mode, C type names and the sizeof() function are no longer recognised as such and can be used as normal Python names.
-
-* The extended C level support for the CPython array type was declared too late to be used by user defined classes.
-
-* C++ class nesting was broken.
-
-* Better checking for required nullary constructors for stack-allocated C++ instances.
-
-* Remove module docstring in no-docstring mode.
-
-* Fix specialization for varargs function signatures.
-
-* Fix several compiler crashes.
-
-Other changes
--------------
-
-* An experimental distutils script for compiling the CPython standard library was added as Tools/cystdlib.py.
-
-
-0.17.1 (2012-09-26)
-===================
-
-Features added
---------------
-
-Bugs fixed
-----------
-
-* A reference leak was fixed in the new dict iteration code when the loop target was not a plain variable but an unpacked tuple.
-
-* Memory views did not handle the special case of a NULL buffer strides value, as allowed by PEP3118.
-
-Other changes
--------------
-
-
-0.17 (2012-09-01)
-=================
-
-Features added
---------------
-
-* Alpha quality support for compiling and running Cython generated extension modules in PyPy (through cpyext). Note that this requires at least PyPy 1.9 and in many cases also adaptations in user code, especially to avoid borrowed references when no owned reference is being held directly in C space (a reference in a Python list or dict is not enough, for example). See the documentation on porting Cython code to PyPy.
-
-* "yield from" is supported (PEP 380) and a couple of minor problems with generators were fixed.
-
-* C++ STL container classes automatically coerce from and to the equivalent Python container types on typed assignments and casts. Note that the data in the containers is copied during this conversion.
-
-* C++ iterators can now be iterated over using "for x in cpp_container" whenever cpp_container has begin() and end() methods returning objects satisfying the iterator pattern (that is, it can be incremented, dereferenced, and compared (for non-equality)).
-
-* cdef classes can now have C++ class members (provided a zero-argument constructor exists)
-
-* A new cpython.array standard cimport file allows to efficiently talk to the stdlib array.array data type in Python 2. Since CPython does not export an official C-API for this module, it receives special casing by the compiler in order to avoid setup overhead on user side. In Python 3, both buffers and memory views on the array type already worked out of the box with earlier versions of Cython due to the native support for the buffer interface in the Py3 array module.
-
-* Fast dict iteration is now enabled optimistically also for untyped variables when the common iteration methods are used.
-
-* The unicode string processing code was adapted for the upcoming CPython 3.3 (PEP 393, new Unicode buffer layout).
-
-* Buffer arguments and memory view arguments in Python functions can be declared "not None" to raise a TypeError on None input.
-
-* c(p)def functions in pure mode can specify their return type with "@cython.returns()".
-
-* Automatic dispatch for fused functions with memoryview arguments
-
-* Support newaxis indexing for memoryviews
-
-* Support decorators for fused functions
-
-Bugs fixed
-----------
-
-* Old-style Py2 imports did not work reliably in Python 3.x and were broken in Python 3.3. Regardless of this fix, it's generally best to be explicit about relative and global imports in Cython code because old-style imports have a higher overhead. To this end, "from __future__ import absolute_import" is supported in Python/Cython 2.x code now (previous versions of Cython already used it when compiling Python 3 code).
-
-* Stricter constraints on the "inline" and "final" modifiers. If your code does not compile due to this change, chances are these modifiers were previously being ignored by the compiler and can be removed without any performance regression.
-
-* Exceptions are always instantiated while raising them (as in Python), instead of risking to instantiate them in potentially unsafe situations when they need to be handled or otherwise processed.
-
-* locals() properly ignores names that do not have Python compatible types (including automatically inferred types).
-
-* Some garbage collection issues of memory views were fixed.
-
-* numpy.pxd compiles in Python 3 mode.
-
-* Several C compiler warnings were fixed.
-
-* Several bugs related to memoryviews and fused types were fixed.
-
-* Several bug-fixes and improvements related to cythonize(), including ccache-style caching.
-
-Other changes
--------------
-
-* libc.string provides a convenience declaration for const uchar in addition to const char.
-
-* User declared char* types are now recognised as such and auto-coerce to and from Python bytes strings.
-
-* callable() and next() compile to more efficient C code.
-
-* list.append() is faster on average.
-
-* Modules generated by @cython.inline() are written into the directory pointed to by the environment variable CYTHON_CACHE_DIR if set.
-
-
-0.16 (2012-04-21)
-=================
-
-Features added
---------------
-
-* Enhancements to Cython's function type (support for weak references, default arguments, code objects, dynamic attributes, classmethods, staticmethods, and more)
-
-* Fused Types - Template-like support for functions and methods CEP 522 (docs)
-
-* Typed views on memory - Support for efficient direct and indirect buffers (indexing, slicing, transposing, ...) CEP 517 (docs)
-
-* super() without arguments
-
-* Final cdef methods (which translate into direct calls on known instances)
-
-Bugs fixed
-----------
-
-* fix alignment handling for record types in buffer support
-
-Other changes
--------------
-
-* support default arguments for closures
-
-* search sys.path for pxd files
-
-* support C++ template casting
-
-* faster traceback building and faster generator termination
-
-* support inplace operators on indexed buffers
-
-* allow nested prange sections
-
-
-0.15.1 (2011-09-19)
-===================
-
-Features added
---------------
-
-Bugs fixed
-----------
-
-Other changes
--------------
-
-
-0.15 (2011-08-05)
-=================
-
-Features added
---------------
-
-* Generators (yield) - Cython has full support for generators, generator expressions and PEP 342 coroutines.
-
-* The nonlocal keyword is supported.
-
-* Re-acquiring the gil: with gil - works as expected within a nogil context.
-
-* OpenMP support: prange.
-
-* Control flow analysis prunes dead code and emits warnings and errors about uninitialised variables.
-
-* Debugger command cy set to assign values of expressions to Cython variables and cy exec counterpart $cy_eval().
-
-* Exception chaining PEP 3134.
-
-* Relative imports PEP 328.
-
-* Improved pure syntax including cython.cclass, cython.cfunc, and cython.ccall.
-
-* The with statement has its own dedicated and faster C implementation.
-
-* Support for del.
-
-* Boundschecking directives implemented for builtin Python sequence types.
-
-* Several updates and additions to the shipped standard library .pxd files.
-
-* Forward declaration of types is no longer required for circular references.
-
-Bugs fixed
-----------
-
-Other changes
--------------
-
-* Uninitialized variables are no longer initialized to None and accessing them has the same semantics as standard Python.
-
-* globals() now returns a read-only dict of the Cython module's globals, rather than the globals of the first non-Cython module in the stack
-
-* Many C++ exceptions are now special cased to give closer Python counterparts. This means that except+ functions that formerly raised generic RuntimeErrors may raise something else such as ArithmeticError.
-
-* The inlined generator expressions (introduced in Cython 0.13) were disabled in favour of full generator expression support. This breaks code that previously used them inside of cdef functions (usage in def functions continues to work) and induces a performance regression for cases that continue to work but that were previously inlined. We hope to reinstate this feature in the near future.
-
-
-0.14.1 (2011-02-04)
-===================
-
-Features added
---------------
-
-* The gdb debugging support was extended to include all major Cython features, including closures.
-
-* raise MemoryError() is now safe to use as Cython replaces it with the correct C-API call.
-
-Bugs fixed
-----------
-
-Other changes
--------------
-
-* Decorators on special methods of cdef classes now raise a compile time error rather than being ignored.
-
-* In Python 3 language level mode (-3 option), the 'str' type is now mapped to 'unicode', so that cdef str s declares a Unicode string even when running in Python 2.
-
-
-0.14 (2010-12-14)
-=================
-
-Features added
---------------
-
-* Python classes can now be nested and receive a proper closure at definition time.
-
-* Redefinition is supported for Python functions, even within the same scope.
-
-* Lambda expressions are supported in class bodies and at the module level.
-
-* Metaclasses are supported for Python classes, both in Python 2 and Python 3 syntax. The Python 3 syntax (using a keyword argument in the type declaration) is preferred and optimised at compile time.
-
-* "final" extension classes prevent inheritance in Python space. This feature is available through the new "cython.final" decorator. In the future, these classes may receive further optimisations.
-
-* "internal" extension classes do not show up in the module dictionary. This feature is available through the new "cython.internal" decorator.
-
-* Extension type inheritance from builtin types, such as "cdef class MyUnicode(unicode)", now works without further external type redeclarations (which are also strongly discouraged now and continue to issue a warning).
-
-* GDB support. http://docs.cython.org/src/userguide/debugging.html
-
-* A new build system with support for inline distutils directives, correct dependency tracking, and parallel compilation. https://github.com/cython/cython/wiki/enhancements-distutils_preprocessing
-
-* Support for dynamic compilation at runtime via the new cython.inline function and cython.compile decorator. https://github.com/cython/cython/wiki/enhancements-inline
-
-* "nogil" blocks are supported when compiling pure Python code by writing "with cython.nogil".
-
-* Iterating over arbitrary pointer types is now supported, as is an optimized version of the in operator, e.g. x in ptr[a:b].
-
-Bugs fixed
-----------
-
-* In parallel assignments, the right side was evaluated in reverse order in 0.13. This could result in errors if it had side effects (e.g. function calls).
-
-* In some cases, methods of builtin types would raise a SystemError instead of an AttributeError when called on None.
-
-Other changes
--------------
-
-* Constant tuples are now cached over the lifetime of an extension module, just like CPython does. Constant argument tuples of Python function calls are also cached.
-
-* Closures have tightened to include exactly the names used in the inner functions and classes. Previously, they held the complete locals of the defining function.
-
-* The builtin "next()" function in Python 2.6 and later is now implemented internally and therefore available in all Python versions. This makes it the preferred and portable way of manually advancing an iterator.
-
-* In addition to the previously supported inlined generator expressions in 0.13, "sorted(genexpr)" can now be used as well. Typing issues were fixed in "sum(genexpr)" that could lead to invalid C code being generated. Other known issues with inlined generator expressions were also fixed that make upgrading to 0.14 a strong recommendation for code that uses them. Note that general generators and generator expressions continue to be not supported.
-
-* Inplace arithmetic operators now respect the cdivision directive and are supported for complex types.
-
-* Typing a variable as type "complex" previously gave it the Python object type. It now uses the appropriate C/C++ double complex type. A side-effect is that assignments and typed function parameters now accept anything that Python can coerce to a complex, including integers and floats, and not only complex instances.
-
-* Large integer literals pass through the compiler in a safer way. To prevent truncation in C code, non 32-bit literals are turned into Python objects if not used in a C context. This context can either be given by a clear C literal suffix such as "UL" or "LL" (or "L" in Python 3 code), or it can be an assignment to a typed variable or a typed function argument, in which case it is up to the user to take care of a sufficiently large value space of the target.
-
-* Python functions are declared in the order they appear in the file, rather than all being created at module creation time. This is consistent with Python and needed to support, for example, conditional or repeated declarations of functions. In the face of circular imports this may cause code to break, so a new --disable-function-redefinition flag was added to revert to the old behavior. This flag will be removed in a future release, so should only be used as a stopgap until old code can be fixed.
-
-
-0.13 (2010-08-25)
-=================
-
-Features added
---------------
-
-* Closures are fully supported for Python functions. Cython supports inner functions and lambda expressions. Generators and generator expressions are not supported in this release.
-
-* Proper C++ support. Cython knows about C++ classes, templates and overloaded function signatures, so that Cython code can interact with them in a straight forward way.
-
-* Type inference is enabled by default for safe C types (e.g. double, bint, C++ classes) and known extension types. This reduces the need for explicit type declarations and can improve the performance of untyped code in some cases. There is also a verbose compile mode for testing the impact on user code.
-
-* Cython's for-in-loop can iterate over C arrays and sliced pointers. The type of the loop variable will be inferred automatically in this case.
-
-* The Py_UNICODE integer type for Unicode code points is fully supported, including for-loops and 'in' tests on unicode strings. It coerces from and to single character unicode strings. Note that untyped for-loop variables will automatically be inferred as Py_UNICODE when iterating over a unicode string. In most cases, this will be much more efficient than yielding sliced string objects, but can also have a negative performance impact when the variable is used in a Python context multiple times, so that it needs to coerce to a unicode string object more than once. If this happens, typing the loop variable as unicode or object will help.
-
-* The built-in functions any(), all(), sum(), list(), set() and dict() are inlined as plain for loops when called on generator expressions. Note that generator expressions are not generally supported apart from this feature. Also, tuple(genexpr) is not currently supported - use tuple([listcomp]) instead.
-
-* More shipped standard library declarations. The python_* and stdlib/stdio .pxd files have been deprecated in favor of clib.* and cpython[.*] and may get removed in a future release.
-
-* Pure Python mode no longer disallows non-Python keywords like 'cdef', 'include' or 'cimport'. It also no longer recognises syntax extensions like the for-from loop.
-
-* Parsing has improved for Python 3 syntax in Python code, although not all features are correctly supported. The missing Python 3 features are being worked on for the next release.
-
-* from __future__ import print_function is supported in Python 2.6 and later. Note that there is currently no emulation for earlier Python versions, so code that uses print() with this future import will require at least Python 2.6.
-
-* New compiler directive language_level (valid values: 2 or 3) with corresponding command line options -2 and -3 requests source code compatibility with Python 2.x or Python 3.x respectively. Language level 3 currently enforces unicode literals for unprefixed string literals, enables the print function (requires Python 2.6 or later) and keeps loop variables in list comprehensions from leaking.
-
-* Loop variables in set/dict comprehensions no longer leak into the surrounding scope (following Python 2.7). List comprehensions are unchanged in language level 2.
-
-* print >> stream
-
-Bugs fixed
-----------
-
-Other changes
--------------
-
-* The availability of type inference by default means that Cython will also infer the type of pointers on assignments. Previously, code like this::
-
- cdef char* s = ...
- untyped_variable = s
-
- would convert the char* to a Python bytes string and assign that. This is no longer the case and no coercion will happen in the example above. The correct way of doing this is through an explicit cast or by typing the target variable, i.e.
-
- ::
-
- cdef char* s = ...
- untyped_variable1 = <bytes>s
- untyped_variable2 = <object>s
-
- cdef object py_object = s
- cdef bytes bytes_string = s
-
-* bool is no longer a valid type name by default. The problem is that it's not clear whether bool should refer to the Python type or the C++ type, and expecting one and finding the other has already led to several hard-to-find bugs. Both types are available for importing: you can use from cpython cimport bool for the Python bool type, and from libcpp cimport bool for the C++ type. bool is still a valid object by default, so one can still write bool(x).
-
-* ``__getsegcount__`` is now correctly typed to take a ``Py_size_t*`` rather than an ``int*``.
-
-
-0.12.1 (2010-02-02)
-===================
-
-Features added
---------------
-
-* Type inference improvements.
-
- * There have been several bug fixes and improvements to the type inferencer.
-
- * Notably, there is now a "safe" mode enabled by setting the infer_types directive to None. (The None here refers to the "default" mode, which will be the default in 0.13.) This safe mode limits inference to Python object types and C doubles, which should speed up execution without affecting any semantics such as integer overflow behavior like infer_types=True might. There is also an infer_types.verbose option which allows one to see what types are inferred.
-
-* The boundscheck directive works for lists and tuples as well as buffers.
-
-* len(s) and s.decode("encoding") are efficiently supported for char* s.
-
-* Cython's INLINE macro has been renamed to CYTHON_INLINE to reduce conflict and has better support for the MSVC compiler on Windows. It is no longer clobbered if externally defined.
-
-* Revision history is now omitted from the source package, resulting in a 85% size reduction. Running make repo will download the history and turn the directory into a complete Mercurial working repository.
-
-* Cython modules don't need to be recompiled when the size of an external type grows. (A warning, rather than an error, is produced.) This should be helpful for binary distributions relying on NumPy.
-
-Bugs fixed
-----------
-
-* Several other bugs and minor improvements have been made. This release should be fully backwards compatible with 0.12.
-
-Other changes
--------------
-
-
-0.12 (2009-11-23)
-=================
-
-Features added
---------------
-
-* Type inference with the infer_types directive
-
-* Seamless C++ complex support
-
-* Fast extension type instantiation using the normal Python meme obj = MyType.__new__(MyType)
-
-* Improved support for Py3.1
-
-* Cython now runs under Python 3.x using the 2to3 tool
-
-* unittest support for doctests in Cython modules
-
-* Optimised handling of C strings (char*): for c in cstring[2:50] and cstring.decode()
-
-* Looping over c pointers: for i in intptr[:50].
-
-* pyximport improvements
-
-* cython_freeze improvements
-
-Bugs fixed
-----------
-
-* Many bug fixes
-
-Other changes
--------------
-
-* Many other optimisation, e.g. enumerate() loops, parallel swap assignments (a,b = b,a), and unicode.encode()
-
-* More complete numpy.pxd
-
-
-0.11.2 (2009-05-20)
-===================
-
-Features added
---------------
-
-* There's now native complex floating point support! C99 complex will be used if complex.h is included, otherwise explicit complex arithmetic working on all C compilers is used. [Robert Bradshaw]
-
- ::
-
- cdef double complex a = 1 + 0.3j
- cdef np.ndarray[np.complex128_t, ndim=2] arr = \
- np.zeros(10, np.complex128)
-
-* Cython can now generate a main()-method for embedding of the Python interpreter into an executable (see #289) [Robert Bradshaw]
-
-* @wraparound directive (another way to disable arr[idx] for negative idx) [Dag Sverre Seljebotn]
-
-* Correct support for NumPy record dtypes with different alignments, and "cdef packed struct" support [Dag Sverre Seljebotn]
-
-* @callspec directive, allowing custom calling convention macros [Lisandro Dalcin]
-
-Bugs fixed
-----------
-
-Other changes
--------------
-
-* Bug fixes and smaller improvements. For the full list, see [1].
+
+* Constants in ``libc.math`` are now declared as ``const`` to simplify their handling.
+
+* An additional ``check_size`` clause was added to the ``ctypedef class`` name
+ specification to allow suppressing warnings when importing modules with
+ backwards-compatible ``PyTypeObject`` size changes.
+ Patch by Matti Picus. (Github issue #2627)
+
+Bugs fixed
+----------
+
+* The exception handling in generators and coroutines under CPython 3.7 was adapted
+ to the newly introduced exception stack. Users of Cython 0.28 who want to support
+ Python 3.7 are encouraged to upgrade to 0.29 to avoid potentially incorrect error
+ reporting and tracebacks. (Github issue #1958)
+
+* Crash when importing a module under Stackless Python that was built for CPython.
+ Patch by Anselm Kruis. (Github issue #2534)
+
+* 2-value slicing of typed sequences failed if the start or stop index was None.
+ Patch by Christian Gibson. (Github issue #2508)
+
+* Multiplied string literals lost their factor when they are part of another
+ constant expression (e.g. 'x' * 10 + 'y' => 'xy').
+
+* String formatting with the '%' operator didn't call the special ``__rmod__()``
+ method if the right side is a string subclass that implements it.
+ (Python issue 28598)
+
+* The directive ``language_level=3`` did not apply to the first token in the
+ source file. (Github issue #2230)
+
+* Overriding cpdef methods did not work in Python subclasses with slots.
+ Note that this can have a performance impact on calls from Cython code.
+ (Github issue #1771)
+
+* Fix declarations of builtin or C types using strings in pure python mode.
+ (Github issue #2046)
+
+* Generator expressions and lambdas failed to compile in ``@cfunc`` functions.
+ (Github issue #459)
+
+* Global names with ``const`` types were not excluded from star-import assignments
+ which could lead to invalid C code.
+ (Github issue #2621)
+
+* Several internal function signatures were fixed that lead to warnings in gcc-8.
+ (Github issue #2363)
+
+* The numpy helper functions ``set_array_base()`` and ``get_array_base()``
+ were adapted to the current numpy C-API recommendations.
+ Patch by Matti Picus. (Github issue #2528)
+
+* Some NumPy related code was updated to avoid deprecated API usage.
+ Original patch by jbrockmendel. (Github issue #2559)
+
+* Several C++ STL declarations were extended and corrected.
+ Patch by Valentin Valls. (Github issue #2207)
+
+* C lines of the module init function were unconditionally not reported in
+ exception stack traces.
+ Patch by Jeroen Demeyer. (Github issue #2492)
+
+* When PEP-489 support is enabled, reloading the module overwrote any static
+ module state. It now raises an exception instead, given that reloading is
+ not actually supported.
+
+* Object-returning, C++ exception throwing functions were not checking that
+ the return value was non-null.
+ Original patch by Matt Wozniski (Github Issue #2603)
+
+* The source file encoding detection could get confused if the
+ ``c_string_encoding`` directive appeared within the first two lines.
+ (Github issue #2632)
+
+* Cython generated modules no longer emit a warning during import when the
+ size of the NumPy array type is larger than what was found at compile time.
+ Instead, this is assumed to be a backwards compatible change on NumPy side.
+
+Other changes
+-------------
+
+* Cython now emits a warning when no ``language_level`` (2, 3 or '3str') is set
+ explicitly, neither as a ``cythonize()`` option nor as a compiler directive.
+ This is meant to prepare the transition of the default language level from
+ currently Py2 to Py3, since that is what most new users will expect these days.
+ The future default will, however, not enforce unicode literals, because this
+ has proven a major obstacle in the support for both Python 2.x and 3.x. The
+ next major release is intended to make this change, so that it will parse all
+ code that does not request a specific language level as Python 3 code, but with
+ ``str`` literals. The language level 2 will continue to be supported for an
+ indefinite time.
+
+* The documentation was restructured, cleaned up and examples are now tested.
+ The NumPy tutorial was also rewritten to simplify the running example.
+ Contributed by Gabriel de Marmiesse. (Github issue #2245)
+
+* Cython compiles less of its own modules at build time to reduce the installed
+ package size to about half of its previous size. This makes the compiler
+ slightly slower, by about 5-7%.
+
+
+0.28.6 (2018-11-01)
+===================
+
+Bugs fixed
+----------
+
+* Extensions compiled with MinGW-64 under Windows could misinterpret integer
+ objects larger than 15 bit and return incorrect results.
+ (Github issue #2670)
+
+* Multiplied string literals lost their factor when they are part of another
+ constant expression (e.g. 'x' * 10 + 'y' => 'xy').
+
+
+0.28.5 (2018-08-03)
+===================
+
+Bugs fixed
+----------
+
+* The discouraged usage of GCC's attribute ``optimize("Os")`` was replaced by the
+ similar attribute ``cold`` to reduce the code impact of the module init functions.
+ (Github issue #2494)
+
+* A reference leak in Py2.x was fixed when comparing str to unicode for equality.
+
+
+0.28.4 (2018-07-08)
+===================
+
+Bugs fixed
+----------
+
+* Reallowing ``tp_clear()`` in a subtype of an ``@no_gc_clear`` extension type
+ generated an invalid C function call to the (non-existent) base type implementation.
+ (Github issue #2309)
+
+* Exception catching based on a non-literal (runtime) tuple could fail to match the
+ exception. (Github issue #2425)
+
+* Compile fix for CPython 3.7.0a2. (Github issue #2477)
+
+
+0.28.3 (2018-05-27)
+===================
+
+Bugs fixed
+----------
+
+* Set iteration was broken in non-CPython since 0.28.
+
+* ``UnicodeEncodeError`` in Py2 when ``%s`` formatting is optimised for
+ unicode strings. (Github issue #2276)
+
+* Work around a crash bug in g++ 4.4.x by disabling the size reduction setting
+ of the module init function in this version. (Github issue #2235)
+
+* Crash when exceptions occur early during module initialisation.
+ (Github issue #2199)
+
+
+0.28.2 (2018-04-13)
+===================
+
+Features added
+--------------
+
+* ``abs()`` is faster for Python long objects.
+
+* The C++11 methods ``front()`` and ``end()`` were added to the declaration of
+ ``libcpp.string``. Patch by Alex Huszagh. (Github issue #2123)
+
+* The C++11 methods ``reserve()`` and ``bucket_count()`` are declared for
+ ``libcpp.unordered_map``. Patch by Valentin Valls. (Github issue #2168)
+
+Bugs fixed
+----------
+
+* The copy of a read-only memoryview was considered read-only as well, whereas
+ a common reason to copy a read-only view is to make it writable. The result
+ of the copying is now a writable buffer by default.
+ (Github issue #2134)
+
+* The ``switch`` statement generation failed to apply recursively to the body of
+ converted if-statements.
+
+* ``NULL`` was sometimes rejected as exception return value when the returned
+ type is a fused pointer type.
+ Patch by Callie LeFave. (Github issue #2177)
+
+* Fixed compatibility with PyPy 5.11.
+ Patch by Matti Picus. (Github issue #2165)
+
+Other changes
+-------------
+
+* The NumPy tutorial was rewritten to use memoryviews instead of the older
+ buffer declaration syntax.
+ Contributed by Gabriel de Marmiesse. (Github issue #2162)
+
+
+0.28.1 (2018-03-18)
+===================
+
+Bugs fixed
+----------
+
+* ``PyFrozenSet_New()`` was accidentally used in PyPy where it is missing
+ from the C-API.
+
+* Assignment between some C++ templated types were incorrectly rejected
+ when the templates mix ``const`` with ``ctypedef``.
+ (Github issue #2148)
+
+* Undeclared C++ no-args constructors in subclasses could make the compilation
+ fail if the base class constructor was declared without ``nogil``.
+ (Github issue #2157)
+
+* Bytes %-formatting inferred ``basestring`` (bytes or unicode) as result type
+ in some cases where ``bytes`` would have been safe to infer.
+ (Github issue #2153)
+
+* ``None`` was accidentally disallowed as typed return value of ``dict.pop()``.
+ (Github issue #2152)
+
+
+0.28 (2018-03-13)
+=================
+
+Features added
+--------------
+
+* Cdef classes can now multiply inherit from ordinary Python classes.
+ (The primary base must still be a c class, possibly ``object``, and
+ the other bases must *not* be cdef classes.)
+
+* Type inference is now supported for Pythran compiled NumPy expressions.
+ Patch by Nils Braun. (Github issue #1954)
+
+* The ``const`` modifier can be applied to memoryview declarations to allow
+ read-only buffers as input. (Github issues #1605, #1869)
+
+* C code in the docstring of a ``cdef extern`` block is copied verbatimly
+ into the generated file.
+ Patch by Jeroen Demeyer. (Github issue #1915)
+
+* When compiling with gcc, the module init function is now tuned for small
+ code size instead of whatever compile flags were provided externally.
+ Cython now also disables some code intensive optimisations in that function
+ to further reduce the code size. (Github issue #2102)
+
+* Decorating an async coroutine with ``@cython.iterable_coroutine`` changes its
+ type at compile time to make it iterable. While this is not strictly in line
+ with PEP-492, it improves the interoperability with old-style coroutines that
+ use ``yield from`` instead of ``await``.
+
+* The IPython magic has preliminary support for JupyterLab.
+ (Github issue #1775)
+
+* The new TSS C-API in CPython 3.7 is supported and has been backported.
+ Patch by Naotoshi Seo. (Github issue #1932)
+
+* Cython knows the new ``Py_tss_t`` type defined in PEP-539 and automatically
+ initialises variables declared with that type to ``Py_tss_NEEDS_INIT``,
+ a value which cannot be used outside of static assignments.
+
+* The set methods ``.remove()`` and ``.discard()`` are optimised.
+ Patch by Antoine Pitrou. (Github issue #2042)
+
+* ``dict.pop()`` is optimised.
+ Original patch by Antoine Pitrou. (Github issue #2047)
+
+* Iteration over sets and frozensets is optimised.
+ (Github issue #2048)
+
+* Safe integer loops (< range(2^30)) are automatically optimised into C loops.
+
+* ``alist.extend([a,b,c])`` is optimised into sequential ``list.append()`` calls
+ for short literal sequences.
+
+* Calls to builtin methods that are not specifically optimised into C-API calls
+ now use a cache that avoids repeated lookups of the underlying C function.
+ (Github issue #2054)
+
+* Single argument function calls can avoid the argument tuple creation in some cases.
+
+* Some redundant extension type checks are avoided.
+
+* Formatting C enum values in f-strings is faster, as well as some other special cases.
+
+* String formatting with the '%' operator is optimised into f-strings in simple cases.
+
+* Subscripting (item access) is faster in some cases.
+
+* Some ``bytearray`` operations have been optimised similar to ``bytes``.
+
+* Some PEP-484/526 container type declarations are now considered for
+ loop optimisations.
+
+* Indexing into memoryview slices with ``view[i][j]`` is now optimised into
+ ``view[i, j]``.
+
+* Python compatible ``cython.*`` types can now be mixed with type declarations
+ in Cython syntax.
+
+* Name lookups in the module and in classes are faster.
+
+* Python attribute lookups on extension types without instance dict are faster.
+
+* Some missing signals were added to ``libc/signal.pxd``.
+ Patch by Jeroen Demeyer. (Github issue #1914)
+
+* The warning about repeated extern declarations is now visible by default.
+ (Github issue #1874)
+
+* The exception handling of the function types used by CPython's type slot
+ functions was corrected to match the de-facto standard behaviour, so that
+ code that uses them directly benefits from automatic and correct exception
+ propagation. Patch by Jeroen Demeyer. (Github issue #1980)
+
+* Defining the macro ``CYTHON_NO_PYINIT_EXPORT`` will prevent the module init
+ function from being exported as symbol, e.g. when linking modules statically
+ in an embedding setup. Patch by AraHaan. (Github issue #1944)
+
+Bugs fixed
+----------
+
+* If a module name is explicitly provided for an ``Extension()`` that is compiled
+ via ``cythonize()``, it was previously ignored and replaced by the source file
+ name. It can now be used to override the target module name, e.g. for compiling
+ prefixed accelerator modules from Python files. (Github issue #2038)
+
+* The arguments of the ``num_threads`` parameter of parallel sections
+ were not sufficiently validated and could lead to invalid C code.
+ (Github issue #1957)
+
+* Catching exceptions with a non-trivial exception pattern could call into
+ CPython with a live exception set. This triggered incorrect behaviour
+ and crashes, especially in CPython 3.7.
+
+* The signature of the special ``__richcmp__()`` method was corrected to recognise
+ the type of the first argument as ``self``. It was previously treated as plain
+ object, but CPython actually guarantees that it always has the correct type.
+ Note: this can change the semantics of user code that previously relied on
+ ``self`` being untyped.
+
+* Some Python 3 exceptions were not recognised as builtins when running Cython
+ under Python 2.
+
+* Some async helper functions were not defined in the generated C code when
+ compiling simple async code. (Github issue #2075)
+
+* Line tracing did not include generators and coroutines.
+ (Github issue #1949)
+
+* C++ declarations for ``unordered_map`` were corrected.
+ Patch by Michael Schatzow. (Github issue #1484)
+
+* Iterator declarations in C++ ``deque`` and ``vector`` were corrected.
+ Patch by Alex Huszagh. (Github issue #1870)
+
+* The const modifiers in the C++ ``string`` declarations were corrected, together
+ with the coercion behaviour of string literals into C++ strings.
+ (Github issue #2132)
+
+* Some declaration types in ``libc.limits`` were corrected.
+ Patch by Jeroen Demeyer. (Github issue #2016)
+
+* ``@cython.final`` was not accepted on Python classes with an ``@cython.cclass``
+ decorator. (Github issue #2040)
+
+* Cython no longer creates useless and incorrect ``PyInstanceMethod`` wrappers for
+ methods in Python 3. Patch by Jeroen Demeyer. (Github issue #2105)
+
+* The builtin ``bytearray`` type could not be used as base type of cdef classes.
+ (Github issue #2106)
+
+Other changes
+-------------
+
+
+0.27.3 (2017-11-03)
+===================
+
+Bugs fixed
+----------
+
+* String forward references to extension types like ``@cython.locals(x="ExtType")``
+ failed to find the named type. (Github issue #1962)
+
+* NumPy slicing generated incorrect results when compiled with Pythran.
+ Original patch by Serge Guelton (Github issue #1946).
+
+* Fix "undefined reference" linker error for generators on Windows in Py3.3-3.5.
+ (Github issue #1968)
+
+* Adapt to recent C-API change of ``PyThreadState`` in CPython 3.7.
+
+* Fix signature of ``PyWeakref_GetObject()`` API declaration.
+ Patch by Jeroen Demeyer (Github issue #1975).
+
+
+0.27.2 (2017-10-22)
+===================
+
+Bugs fixed
+----------
+
+* Comprehensions could incorrectly be optimised away when they appeared in boolean
+ test contexts. (Github issue #1920)
+
+* The special methods ``__eq__``, ``__lt__`` etc. in extension types did not type
+ their first argument as the type of the class but ``object``. (Github issue #1935)
+
+* Crash on first lookup of "cline_in_traceback" option during exception handling.
+ (Github issue #1907)
+
+* Some nested module level comprehensions failed to compile.
+ (Github issue #1906)
+
+* Compiler crash on some complex type declarations in pure mode.
+ (Github issue #1908)
+
+* ``std::unordered_map.erase()`` was declared with an incorrect ``void`` return
+ type in ``libcpp.unordered_map``. (Github issue #1484)
+
+* Invalid use of C++ ``fallthrough`` attribute before C++11 and similar issue in clang.
+ (Github issue #1930)
+
+* Compiler crash on misnamed properties. (Github issue #1905)
+
+
+0.27.1 (2017-10-01)
+===================
+
+Features added
+--------------
+
+* The Jupyter magic has a new debug option ``--verbose`` that shows details about
+ the distutils invocation. Patch by Boris Filippov (Github issue #1881).
+
+Bugs fixed
+----------
+
+* Py3 list comprehensions in class bodies resulted in invalid C code.
+ (Github issue #1889)
+
+* Modules built for later CPython 3.5.x versions failed to import in 3.5.0/3.5.1.
+ (Github issue #1880)
+
+* Deallocating fused types functions and methods kept their GC tracking enabled,
+ which could potentially lead to recursive deallocation attempts.
+
+* Crash when compiling in C++ mode with old setuptools versions.
+ (Github issue #1879)
+
+* C++ object arguments for the constructor of Cython implemented C++ are now
+ passed by reference and not by value to allow for non-copyable arguments, such
+ as ``unique_ptr``.
+
+* API-exported C++ classes with Python object members failed to compile.
+ (Github issue #1866)
+
+* Some issues with the new relaxed exception value handling were resolved.
+
+* Python classes as annotation types could prevent compilation.
+ (Github issue #1887)
+
+* Cython annotation types in Python files could lead to import failures
+ with a "cython undefined" error. Recognised types are now turned into strings.
+
+* Coverage analysis could fail to report on extension modules on some platforms.
+
+* Annotations could be parsed (and rejected) as types even with
+ ``annotation_typing=False``.
+
+Other changes
+-------------
+
+* PEP 489 support has been disabled by default to counter incompatibilities with
+ import setups that try to reload or reinitialise modules.
+
+
+0.27 (2017-09-23)
+=================
+
+Features added
+--------------
+
+* Extension module initialisation follows
+ `PEP 489 <https://www.python.org/dev/peps/pep-0489/>`_ in CPython 3.5+, which
+ resolves several differences with regard to normal Python modules. This makes
+ the global names ``__file__`` and ``__path__`` correctly available to module
+ level code and improves the support for module-level relative imports.
+ (Github issues #1715, #1753, #1035)
+
+* Asynchronous generators (`PEP 525 <https://www.python.org/dev/peps/pep-0525/>`_)
+ and asynchronous comprehensions (`PEP 530 <https://www.python.org/dev/peps/pep-0530/>`_)
+ have been implemented. Note that async generators require finalisation support
+ in order to allow for asynchronous operations during cleanup, which is only
+ available in CPython 3.6+. All other functionality has been backported as usual.
+
+* Variable annotations are now parsed according to
+ `PEP 526 <https://www.python.org/dev/peps/pep-0526/>`_. Cython types (e.g.
+ ``cython.int``) are evaluated as C type declarations and everything else as Python
+ types. This can be disabled with the directive ``annotation_typing=False``.
+ Note that most complex PEP-484 style annotations are currently ignored. This will
+ change in future releases. (Github issue #1850)
+
+* Extension types (also in pure Python mode) can implement the normal special methods
+ ``__eq__``, ``__lt__`` etc. for comparisons instead of the low-level ``__richcmp__``
+ method. (Github issue #690)
+
+* New decorator ``@cython.exceptval(x=None, check=False)`` that makes the signature
+ declarations ``except x``, ``except? x`` and ``except *`` available to pure Python
+ code. Original patch by Antonio Cuni. (Github issue #1653)
+
+* Signature annotations are now included in the signature docstring generated by
+ the ``embedsignature`` directive. Patch by Lisandro Dalcin (Github issue #1781).
+
+* The gdb support for Python code (``libpython.py``) was updated to the latest
+ version in CPython 3.7 (git rev 5fe59f8).
+
+* The compiler tries to find a usable exception return value for cdef functions
+ with ``except *`` if the returned type allows it. Note that this feature is subject
+ to safety limitations, so it is still better to provide an explicit declaration.
+
+* C functions can be assigned to function pointers with a compatible exception
+ declaration, not only with exact matches. A side-effect is that certain compatible
+ signature overrides are now allowed and some more mismatches of exception signatures
+ are now detected and rejected as errors that were not detected before.
+
+* The IPython/Jupyter magic integration has a new option ``%%cython --pgo`` for profile
+ guided optimisation. It compiles the cell with PGO settings for the C compiler,
+ executes it to generate a runtime profile, and then compiles it again using that
+ profile for C compiler optimisation. Currently only tested with gcc.
+
+* ``len(memoryview)`` can be used in nogil sections to get the size of the
+ first dimension of a memory view (``shape[0]``). (Github issue #1733)
+
+* C++ classes can now contain (properly refcounted) Python objects.
+
+* NumPy dtype subarrays are now accessible through the C-API.
+ Patch by Gerald Dalley (Github issue #245).
+
+* Resolves several issues with PyPy and uses faster async slots in PyPy3.
+ Patch by Ronan Lamy (Github issues #1871, #1878).
+
+Bugs fixed
+----------
+
+* Extension types that were cimported from other Cython modules could disagree
+ about the order of fused cdef methods in their call table. This could lead
+ to wrong methods being called and potentially also crashes. The fix required
+ changes to the ordering of fused methods in the call table, which may break
+ existing compiled modules that call fused cdef methods across module boundaries,
+ if these methods were implemented in a different order than they were declared
+ in the corresponding .pxd file. (Github issue #1873)
+
+* The exception state handling in generators and coroutines could lead to
+ exceptions in the caller being lost if an exception was raised and handled
+ inside of the coroutine when yielding. (Github issue #1731)
+
+* Loops over ``range(enum)`` were not converted into C for-loops. Note that it
+ is still recommended to use an explicit cast to a C integer type in this case.
+
+* Error positions of names (e.g. variables) were incorrectly reported after the
+ name and not at the beginning of the name.
+
+* Compile time ``DEF`` assignments were evaluated even when they occur inside of
+ falsy ``IF`` blocks. (Github issue #1796)
+
+* Disabling the line tracing from a trace function could fail.
+ Original patch by Dmitry Trofimov. (Github issue #1769)
+
+* Several issues with the Pythran integration were resolved.
+
+* abs(signed int) now returns a signed rather than unsigned int.
+ (Github issue #1837)
+
+* Reading ``frame.f_locals`` of a Cython function (e.g. from a debugger or profiler
+ could modify the module globals. (Github issue #1836)
+
+* Buffer type mismatches in the NumPy buffer support could leak a reference to the
+ buffer owner.
+
+* Using the "is_f_contig" and "is_c_contig" memoryview methods together could leave
+ one of them undeclared. (Github issue #1872)
+
+* Compilation failed if the for-in-range loop target was not a variable but a more
+ complex expression, e.g. an item assignment. (Github issue #1831)
+
+* Compile time evaluations of (partially) constant f-strings could show incorrect
+ results.
+
+* Escape sequences in raw f-strings (``fr'...'``) were resolved instead of passing
+ them through as expected.
+
+* Some ref-counting issues in buffer error handling have been resolved.
+
+Other changes
+-------------
+
+* Type declarations in signature annotations are now parsed according to
+ `PEP 484 <https://www.python.org/dev/peps/pep-0484/>`_
+ typing. Only Cython types (e.g. ``cython.int``) and Python builtin types are
+ currently considered as type declarations. Everything else is ignored, but this
+ will change in a future Cython release.
+ (Github issue #1672)
+
+* The directive ``annotation_typing`` is now ``True`` by default, which enables
+ parsing type declarations from annotations.
+
+* This release no longer supports Python 3.2.
+
+
+0.26.1 (2017-08-29)
+===================
+
+Features added
+--------------
+
+Bugs fixed
+----------
+
+* ``cython.view.array`` was missing ``.__len__()``.
+
+* Extension types with a ``.pxd`` override for their ``__releasebuffer__`` slot
+ (e.g. as provided by Cython for the Python ``array.array`` type) could leak
+ a reference to the buffer owner on release, thus not freeing the memory.
+ (Github issue #1638)
+
+* Auto-decoding failed in 0.26 for strings inside of C++ containers.
+ (Github issue #1790)
+
+* Compile error when inheriting from C++ container types.
+ (Github issue #1788)
+
+* Invalid C code in generators (declaration after code).
+ (Github issue #1801)
+
+* Arithmetic operations on ``const`` integer variables could generate invalid code.
+ (Github issue #1798)
+
+* Local variables with names of special Python methods failed to compile inside of
+ closures. (Github issue #1797)
+
+* Problem with indirect Emacs buffers in cython-mode.
+ Patch by Martin Albrecht (Github issue #1743).
+
+* Extension types named ``result`` or ``PickleError`` generated invalid unpickling code.
+ Patch by Jason Madden (Github issue #1786).
+
+* Bazel integration failed to compile ``.py`` files.
+ Patch by Guro Bokum (Github issue #1784).
+
+* Some include directories and dependencies were referenced with their absolute paths
+ in the generated files despite lying within the project directory.
+
+* Failure to compile in Py3.7 due to a modified signature of ``_PyCFunctionFast()``
+
+
+0.26 (2017-07-19)
+=================
+
+Features added
+--------------
+
+* Pythran can be used as a backend for evaluating NumPy array expressions.
+ Patch by Adrien Guinet (Github issue #1607).
+
+* cdef classes now support pickling by default when possible.
+ This can be disabled with the ``auto_pickle`` directive.
+
+* Speed up comparisons of strings if their hash value is available.
+ Patch by Claudio Freire (Github issue #1571).
+
+* Support pyximport from zip files.
+ Patch by Sergei Lebedev (Github issue #1485).
+
+* IPython magic now respects the ``__all__`` variable and ignores
+ names with leading-underscore (like ``import *`` does).
+ Patch by Syrtis Major (Github issue #1625).
+
+* ``abs()`` is optimised for C complex numbers.
+ Patch by da-woods (Github issue #1648).
+
+* The display of C lines in Cython tracebacks can now be enabled at runtime
+ via ``import cython_runtime; cython_runtime.cline_in_traceback=True``.
+ The default has been changed to False.
+
+* The overhead of calling fused types generic functions was reduced.
+
+* "cdef extern" include files are now also searched relative to the current file.
+ Patch by Jeroen Demeyer (Github issue #1654).
+
+* Optional optimization for re-aquiring the GIL, controlled by the
+ `fast_gil` directive.
+
+Bugs fixed
+----------
+
+* Item lookup/assignment with a unicode character as index that is typed
+ (explicitly or implicitly) as ``Py_UCS4`` or ``Py_UNICODE`` used the
+ integer value instead of the Unicode string value. Code that relied on
+ the previous behaviour now triggers a warning that can be disabled by
+ applying an explicit cast. (Github issue #1602)
+
+* f-string processing was adapted to changes in PEP 498 and CPython 3.6.
+
+* Invalid C code when decoding from UTF-16(LE/BE) byte strings.
+ (Github issue #1696)
+
+* Unicode escapes in 'ur' raw-unicode strings were not resolved in Py2 code.
+ Original patch by Aaron Gallagher (Github issue #1594).
+
+* File paths of code objects are now relative.
+ Original patch by Jelmer Vernooij (Github issue #1565).
+
+* Decorators of cdef class methods could be executed twice.
+ Patch by Jeroen Demeyer (Github issue #1724).
+
+* Dict iteration using the Py2 ``iter*`` methods failed in PyPy3.
+ Patch by Armin Rigo (Github issue #1631).
+
+* Several warnings in the generated code are now suppressed.
+
+Other changes
+-------------
+
+* The ``unraisable_tracebacks`` option now defaults to ``True``.
+
+* Coercion of C++ containers to Python is no longer automatic on attribute
+ access (Github issue #1521).
+
+* Access to Python attributes of cimported modules without the corresponding
+ import is now a compile-time (rather than runtime) error.
+
+* Do not use special dll linkage for "cdef public" functions.
+ Patch by Jeroen Demeyer (Github issue #1687).
+
+* cdef/cpdef methods must match their declarations. See Github Issue #1732.
+ This is now a warning and will be an error in future releases.
+
+
+0.25.2 (2016-12-08)
+===================
+
+Bugs fixed
+----------
+
+* Fixes several issues with C++ template deduction.
+
+* Fixes a issue with bound method type inference (Github issue #551).
+
+* Fixes a bug with cascaded tuple assignment (Github issue #1523).
+
+* Fixed or silenced many Clang warnings.
+
+* Fixes bug with powers of pure real complex numbers (Github issue #1538).
+
+
+0.25.1 (2016-10-26)
+===================
+
+Bugs fixed
+----------
+
+* Fixes a bug with ``isinstance(o, Exception)`` (Github issue #1496).
+
+* Fixes bug with ``cython.view.array`` missing utility code in some cases
+ (Github issue #1502).
+
+Other changes
+-------------
+
+* The distutils extension ``Cython.Distutils.build_ext`` has been reverted,
+ temporarily, to be ``old_build_ext`` to give projects time to migrate.
+ The new build_ext is available as ``new_build_ext``.
+
+
+0.25 (2016-10-25)
+=================
+
+Features added
+--------------
+
+* def/cpdef methods of cdef classes benefit from Cython's internal function
+ implementation, which enables introspection and line profiling for them.
+ Implementation sponsored by Turbostream (www.turbostream-cfd.com).
+
+* Calls to Python functions are faster, following the recent "FastCall"
+ optimisations that Victor Stinner implemented for CPython 3.6.
+ See https://bugs.python.org/issue27128 and related issues.
+
+* The new METH_FASTCALL calling convention for PyCFunctions is supported
+ in CPython 3.6. See https://bugs.python.org/issue27810
+
+* Initial support for using Cython modules in Pyston.
+ Patch by Boxiang Sun.
+
+* Dynamic Python attributes are allowed on cdef classes if an attribute
+ ``cdef dict __dict__`` is declared in the class. Patch by empyrical.
+
+* Cython implemented C++ classes can make direct calls to base class methods.
+ Patch by empyrical.
+
+* C++ classes can now have typedef members. STL containers updated with
+ value_type.
+
+* New directive ``cython.no_gc`` to fully disable GC for a cdef class.
+ Patch by Claudio Freire.
+
+* Buffer variables are no longer excluded from ``locals()``.
+ Patch by da-woods.
+
+* Building f-strings is faster, especially when formatting C integers.
+
+* for-loop iteration over "std::string".
+
+* ``libc/math.pxd`` provides ``e`` and ``pi`` as alias constants to simplify
+ usage as a drop-in replacement for Python's math module.
+
+* Speed up cython.inline().
+
+* Binary lshift operations with small constant Python integers are faster.
+
+* Some integer operations on Python long objects are faster in Python 2.7.
+
+* Support for the C++ ``typeid`` operator.
+
+* Support for bazel using a the pyx_library rule in //Tools:rules.bzl.
+
+Significant Bugs fixed
+----------------------
+
+* Division of complex numbers avoids overflow by using Smith's method.
+
+* Some function signatures in ``libc.math`` and ``numpy.pxd`` were incorrect.
+ Patch by Michael Seifert.
+
+Other changes
+-------------
+
+* The "%%cython" IPython/jupyter magic now defaults to the language level of
+ the current jupyter kernel. The language level can be set explicitly with
+ "%%cython -2" or "%%cython -3".
+
+* The distutils extension ``Cython.Distutils.build_ext`` has now been updated
+ to use cythonize which properly handles dependencies. The old extension can
+ still be found in ``Cython.Distutils.old_build_ext`` and is now deprecated.
+
+* ``directive_defaults`` is no longer available in ``Cython.Compiler.Options``,
+ use ``get_directive_defaults()`` instead.
+
+
+0.24.1 (2016-07-15)
+===================
+
+Bugs fixed
+----------
+
+* IPython cell magic was lacking a good way to enable Python 3 code semantics.
+ It can now be used as "%%cython -3".
+
+* Follow a recent change in `PEP 492 <https://www.python.org/dev/peps/pep-0492/>`_
+ and CPython 3.5.2 that now requires the ``__aiter__()`` method of asynchronous
+ iterators to be a simple ``def`` method instead of an ``async def`` method.
+
+* Coroutines and generators were lacking the ``__module__`` special attribute.
+
+* C++ ``std::complex`` values failed to auto-convert from and to Python complex
+ objects.
+
+* Namespaced C++ types could not be used as memory view types due to lack of
+ name mangling. Patch by Ivan Smirnov.
+
+* Assignments between identical C++ types that were declared with differently
+ typedefed template types could fail.
+
+* Rebuilds could fail to evaluate dependency timestamps in C++ mode.
+ Patch by Ian Henriksen.
+
+* Macros defined in the ``distutils`` compiler option do not require values
+ anymore. Patch by Ian Henriksen.
+
+* Minor fixes for MSVC, Cygwin and PyPy.
+
+
+0.24 (2016-04-04)
+=================
+
+Features added
+--------------
+
+* `PEP 498 <https://www.python.org/dev/peps/pep-0498/>`_:
+ Literal String Formatting (f-strings).
+ Original patch by Jelle Zijlstra.
+
+* `PEP 515 <https://www.python.org/dev/peps/pep-0515/>`_:
+ Underscores as visual separators in number literals.
+
+* Parser was adapted to some minor syntax changes in Py3.6, e.g.
+ https://bugs.python.org/issue9232
+
+* The embedded C code comments that show the original source code
+ can be discarded with the new directive ``emit_code_comments=False``.
+
+* Cpdef enums are now first-class iterable, callable types in Python.
+
+* Ctuples can now be declared in pure Python code.
+
+* Posix declarations for DLL loading and stdio extensions were added.
+ Patch by Lars Buitinck.
+
+* The Py2-only builtins ``unicode()``, ``xrange()``, ``reduce()`` and
+ ``long`` are now also available in compile time ``DEF`` expressions
+ when compiling with Py3.
+
+* Exception type tests have slightly lower overhead.
+ This fixes ticket 868.
+
+* @property syntax fully supported in cdef classes, old syntax deprecated.
+
+* C++ classes can now be declared with default template parameters.
+
+Bugs fixed
+----------
+
+* C++ exceptions raised by overloaded C++ operators were not always
+ handled. Patch by Ian Henriksen.
+
+* C string literals were previously always stored as non-const global
+ variables in the module. They are now stored as global constants
+ when possible, and otherwise as non-const C string literals in the
+ generated code that uses them. This improves compatibility with
+ strict C compiler options and prevents non-const strings literals
+ with the same content from being incorrectly merged.
+
+* Compile time evaluated ``str`` expressions (``DEF``) now behave in a
+ more useful way by turning into Unicode strings when compiling under
+ Python 3. This allows using them as intermediate values in expressions.
+ Previously, they always evaluated to bytes objects.
+
+* ``isinf()`` declarations in ``libc/math.pxd`` and ``numpy/math.pxd`` now
+ reflect the actual tristate ``int`` return value instead of using ``bint``.
+
+* Literal assignments to ctuples avoid Python tuple round-trips in some
+ more corner cases.
+
+* Iteration over ``dict(...).items()`` failed to get optimised when dict
+ arguments included keyword arguments.
+
+* cProfile now correctly profiles cpdef functions and methods.
+
+
+0.23.5 (2016-03-26)
+===================
+
+* Compile errors and warnings in integer type conversion code. This fixes
+ ticket 877. Patches by Christian Neukirchen, Nikolaus Rath, Ian Henriksen.
+
+* Reference leak when "*args" argument was reassigned in closures.
+
+* Truth-testing Unicode strings could waste time and memory in Py3.3+.
+
+* Return values of async functions could be ignored and replaced by ``None``.
+
+* Compiler crash in CPython 3.6.
+
+* Fix prange() to behave identically to range(). The end condition was
+ miscalculated when the range was not exactly divisible by the step.
+
+* Optimised ``all(genexpr)``/``any(genexpr)`` calls could warn about unused
+ code. This fixes ticket 876.
+
+
+0.23.4 (2015-10-10)
+===================
+
+Bugs fixed
+----------
+
+* Memory leak when calling Python functions in PyPy.
+
+* Compilation problem with MSVC in C99-ish mode.
+
+* Warning about unused values in a helper macro.
+
+
+0.23.3 (2015-09-29)
+===================
+
+Bugs fixed
+----------
+
+* Invalid C code for some builtin methods. This fixes ticket 856 again.
+
+* Incorrect C code in helper functions for PyLong conversion and string
+ decoding. This fixes ticket 863, ticket 864 and ticket 865.
+ Original patch by Nikolaus Rath.
+
+* Large folded or inserted integer constants could use too small C
+ integer types and thus trigger a value wrap-around.
+
+Other changes
+-------------
+
+* The coroutine and generator types of Cython now also register directly
+ with the ``Coroutine`` and ``Generator`` ABCs in the ``backports_abc``
+ module if it can be imported. This fixes ticket 870.
+
+
+0.23.2 (2015-09-11)
+===================
+
+Bugs fixed
+----------
+
+* Compiler crash when analysing some optimised expressions.
+
+* Coverage plugin was adapted to coverage.py 4.0 beta 2.
+
+* C++ destructor calls could fail when '&' operator is overwritten.
+
+* Incorrect C literal generation for large integers in compile-time
+ evaluated DEF expressions and constant folded expressions.
+
+* Byte string constants could end up as Unicode strings when originating
+ from compile-time evaluated DEF expressions.
+
+* Invalid C code when caching known builtin methods.
+ This fixes ticket 860.
+
+* ``ino_t`` in ``posix.types`` was not declared as ``unsigned``.
+
+* Declarations in ``libcpp/memory.pxd`` were missing ``operator!()``.
+ Patch by Leo Razoumov.
+
+* Static cdef methods can now be declared in .pxd files.
+
+
+0.23.1 (2015-08-22)
+===================
+
+Bugs fixed
+----------
+
+* Invalid C code for generators. This fixes ticket 858.
+
+* Invalid C code for some builtin methods. This fixes ticket 856.
+
+* Invalid C code for unused local buffer variables.
+ This fixes ticket 154.
+
+* Test failures on 32bit systems. This fixes ticket 857.
+
+* Code that uses ``from xyz import *`` and global C struct/union/array
+ variables could fail to compile due to missing helper functions.
+ This fixes ticket 851.
+
+* Misnamed PEP 492 coroutine property ``cr_yieldfrom`` renamed to
+ ``cr_await`` to match CPython.
+
+* Missing deallocation code for C++ object attributes in certain
+ extension class hierarchies.
+
+* Crash when async coroutine was not awaited.
+
+* Compiler crash on ``yield`` in signature annotations and default
+ argument values. Both are forbidden now.
+
+* Compiler crash on certain constructs in ``finally`` clauses.
+
+* Cython failed to build when CPython's pgen is installed.
+
+
+0.23 (2015-08-08)
+=================
+
+Features added
+--------------
+
+* `PEP 492 <https://www.python.org/dev/peps/pep-0492/>`_
+ (async/await) was implemented.
+
+* `PEP 448 <https://www.python.org/dev/peps/pep-0448/>`_
+ (Additional Unpacking Generalizations) was implemented.
+
+* Support for coverage.py 4.0+ can be enabled by adding the plugin
+ "Cython.Coverage" to the ".coveragerc" config file.
+
+* Annotated HTML source pages can integrate (XML) coverage reports.
+
+* Tracing is supported in ``nogil`` functions/sections and module init code.
+
+* When generators are used in a Cython module and the module imports the
+ modules "inspect" and/or "asyncio", Cython enables interoperability by
+ patching these modules during the import to recognise Cython's internal
+ generator and coroutine types. This can be disabled by C compiling the
+ module with "-D CYTHON_PATCH_ASYNCIO=0" or "-D CYTHON_PATCH_INSPECT=0"
+
+* When generators or coroutines are used in a Cython module, their types
+ are registered with the ``Generator`` and ``Coroutine`` ABCs in the
+ ``collections`` or ``collections.abc`` stdlib module at import time to
+ enable interoperability with code that needs to detect and process Python
+ generators/coroutines. These ABCs were added in CPython 3.5 and are
+ available for older Python versions through the ``backports_abc`` module
+ on PyPI. See https://bugs.python.org/issue24018
+
+* Adding/subtracting/dividing/modulus and equality comparisons with
+ constant Python floats and small integers are faster.
+
+* Binary and/or/xor/rshift operations with small constant Python integers
+ are faster.
+
+* When called on generator expressions, the builtins ``all()``, ``any()``,
+ ``dict()``, ``list()``, ``set()``, ``sorted()`` and ``unicode.join()``
+ avoid the generator iteration overhead by inlining a part of their
+ functionality into the for-loop.
+
+* Keyword argument dicts are no longer copied on function entry when they
+ are not being used or only passed through to other function calls (e.g.
+ in wrapper functions).
+
+* The ``PyTypeObject`` declaration in ``cpython.object`` was extended.
+
+* The builtin ``type`` type is now declared as PyTypeObject in source,
+ allowing for extern functions taking type parameters to have the correct
+ C signatures. Note that this might break code that uses ``type`` just
+ for passing around Python types in typed variables. Removing the type
+ declaration provides a backwards compatible fix.
+
+* ``wraparound()`` and ``boundscheck()`` are available as no-ops in pure
+ Python mode.
+
+* Const iterators were added to the provided C++ STL declarations.
+
+* Smart pointers were added to the provided C++ STL declarations.
+ Patch by Daniel Filonik.
+
+* ``NULL`` is allowed as default argument when embedding signatures.
+ This fixes ticket 843.
+
+* When compiling with ``--embed``, the internal module name is changed to
+ ``__main__`` to allow arbitrary program names, including those that would
+ be invalid for modules. Note that this prevents reuse of the generated
+ C code as an importable module.
+
+* External C++ classes that overload the assignment operator can be used.
+ Patch by Ian Henriksen.
+
+* Support operator bool() for C++ classes so they can be used in if statements.
+
+Bugs fixed
+----------
+
+* Calling "yield from" from Python on a Cython generator that returned a
+ value triggered a crash in CPython. This is now being worked around.
+ See https://bugs.python.org/issue23996
+
+* Language level 3 did not enable true division (a.k.a. float division)
+ for integer operands.
+
+* Functions with fused argument types that included a generic 'object'
+ fallback could end up using that fallback also for other explicitly
+ listed object types.
+
+* Relative cimports could accidentally fall back to trying an absolute
+ cimport on failure.
+
+* The result of calling a C struct constructor no longer requires an
+ intermediate assignment when coercing to a Python dict.
+
+* C++ exception declarations with mapping functions could fail to compile
+ when pre-declared in .pxd files.
+
+* ``cpdef void`` methods are now permitted.
+
+* ``abs(cint)`` could fail to compile in MSVC and used sub-optimal code
+ in C++. Patch by David Vierra, original patch by Michael Enßlin.
+
+* Buffer index calculations using index variables with small C integer
+ types could overflow for large buffer sizes.
+ Original patch by David Vierra.
+
+* C unions use a saner way to coerce from and to Python dicts.
+
+* When compiling a module ``foo.pyx``, the directories in ``sys.path``
+ are no longer searched when looking for ``foo.pxd``.
+ Patch by Jeroen Demeyer.
+
+* Memory leaks in the embedding main function were fixed.
+ Original patch by Michael Enßlin.
+
+* Some complex Python expressions could fail to compile inside of finally
+ clauses.
+
+* Unprefixed 'str' literals were not supported as C varargs arguments.
+
+* Fixed type errors in conversion enum types to/from Python. Note that
+ this imposes stricter correctness requirements on enum declarations.
+
+
+Other changes
+-------------
+
+* Changed mangling scheme in header files generated by ``cdef api``
+ declarations.
+
+* Installation under CPython 3.3+ no longer requires a pass of the
+ 2to3 tool. This also makes it possible to run Cython in Python
+ 3.3+ from a source checkout without installing it first.
+ Patch by Petr Viktorin.
+
+* ``jedi-typer.py`` (in ``Tools/``) was extended and renamed to
+ ``jedityper.py`` (to make it importable) and now works with and
+ requires Jedi 0.9. Patch by Tzer-jen Wei.
+
+
+0.22.1 (2015-06-20)
+===================
+
+Bugs fixed
+----------
+
+* Crash when returning values on generator termination.
+
+* In some cases, exceptions raised during internal isinstance() checks were
+ not propagated.
+
+* Runtime reported file paths of source files (e.g for profiling and tracing)
+ are now relative to the build root directory instead of the main source file.
+
+* Tracing exception handling code could enter the trace function with an active
+ exception set.
+
+* The internal generator function type was not shared across modules.
+
+* Comparisons of (inferred) ctuples failed to compile.
+
+* Closures inside of cdef functions returning ``void`` failed to compile.
+
+* Using ``const`` C++ references in intermediate parts of longer expressions
+ could fail to compile.
+
+* C++ exception declarations with mapping functions could fail to compile when
+ pre-declared in .pxd files.
+
+* C++ compilation could fail with an ambiguity error in recent MacOS-X Xcode
+ versions.
+
+* C compilation could fail in pypy3.
+
+* Fixed a memory leak in the compiler when compiling multiple modules.
+
+* When compiling multiple modules, external library dependencies could leak
+ into later compiler runs. Fix by Jeroen Demeyer. This fixes ticket 845.
+
+
+0.22 (2015-02-11)
+=================
+
+Features added
+--------------
+
+* C functions can coerce to Python functions, which allows passing them
+ around as callable objects.
+
+* C arrays can be assigned by value and auto-coerce from Python iterables
+ and to Python lists (and tuples).
+
+* Extern C functions can now be declared as cpdef to export them to
+ the module's Python namespace. Extern C functions in pxd files export
+ their values to their own module, iff it exists.
+
+* Anonymous C tuple types can be declared as (ctype1, ctype2, ...).
+
+* `PEP 479 <https://www.python.org/dev/peps/pep-0479/>`_:
+ turn accidental StopIteration exceptions that exit generators
+ into a RuntimeError, activated with future import "generator_stop".
+
+* Looping over ``reversed(range())`` is optimised in the same way as
+ ``range()``. Patch by Favian Contreras.
+
+Bugs fixed
+----------
+
+* Mismatching 'except' declarations on signatures in .pxd and .pyx files failed
+ to produce a compile error.
+
+* Failure to find any files for the path pattern(s) passed into ``cythonize()``
+ is now an error to more easily detect accidental typos.
+
+* The ``logaddexp`` family of functions in ``numpy.math`` now has correct
+ declarations.
+
+* In Py2.6/7 and Py3.2, simple Cython memory views could accidentally be
+ interpreted as non-contiguous by CPython, which could trigger a CPython
+ bug when copying data from them, thus leading to data corruption.
+ See CPython issues 12834 and 23349.
+
+Other changes
+-------------
+
+* Preliminary support for defining the Cython language with a formal grammar.
+ To try parsing your files against this grammar, use the --formal_grammar directive.
+ Experimental.
+
+* ``_`` is no longer considered a cacheable builtin as it could interfere with
+ gettext.
+
+* Cythonize-computed metadata now cached in the generated C files.
+
+* Several corrections and extensions in numpy, cpython, and libcpp pxd files.
+
+
+0.21.2 (2014-12-27)
+===================
+
+Bugs fixed
+----------
+
+* Crash when assigning a C value to both a Python and C target at the same time.
+
+* Automatic coercion from C++ strings to ``str`` generated incomplete code that
+ failed to compile.
+
+* Declaring a constructor in a C++ child class erroneously required a default
+ constructor declaration in the super class.
+
+* ``resize_smart()`` in ``cpython.array`` was broken.
+
+* Functions in ``libcpp.cast`` are now declared as ``nogil``.
+
+* Some missing C-API declarations were added.
+
+* Py3 main code in embedding program code was lacking casts.
+
+* Exception related to distutils "Distribution" class type in pyximport under
+ latest CPython 2.7 and 3.4 releases when setuptools is being imported later.
+
+
+0.21.1 (2014-10-18)
+===================
+
+Features added
+--------------
+
+* New ``cythonize`` option ``-a`` to generate the annotated HTML source view.
+
+* Missing C-API declarations in ``cpython.unicode`` were added.
+
+* Passing ``language='c++'`` into cythonize() globally enables C++ mode for
+ all modules that were not passed as Extension objects (i.e. only source
+ files and file patterns).
+
+* ``Py_hash_t`` is a known type (used in CPython for hash values).
+
+* ``PySlice_*()`` C-API functions are available from the ``cpython.slice``
+ module.
+
+* Allow arrays of C++ classes.
+
+Bugs fixed
+----------
+
+* Reference leak for non-simple Python expressions in boolean and/or expressions.
+
+* To fix a name collision and to reflect availability on host platforms,
+ standard C declarations [ clock(), time(), struct tm and tm* functions ]
+ were moved from posix/time.pxd to a new libc/time.pxd. Patch by Charles
+ Blake.
+
+* Rerunning unmodified modules in IPython's cython support failed.
+ Patch by Matthias Bussonier.
+
+* Casting C++ ``std::string`` to Python byte strings failed when
+ auto-decoding was enabled.
+
+* Fatal exceptions in global module init code could lead to crashes
+ if the already created module was used later on (e.g. through a
+ stale reference in sys.modules or elsewhere).
+
+* ``cythonize.py`` script was not installed on MS-Windows.
+
+Other changes
+-------------
+
+* Compilation no longer fails hard when unknown compilation options are
+ passed. Instead, it raises a warning and ignores them (as it did silently
+ before 0.21). This will be changed back to an error in a future release.
+
+
+0.21 (2014-09-10)
+=================
+
+Features added
+--------------
+
+* C (cdef) functions allow inner Python functions.
+
+* Enums can now be declared as cpdef to export their values to
+ the module's Python namespace. Cpdef enums in pxd files export
+ their values to their own module, iff it exists.
+
+* Allow @staticmethod decorator to declare static cdef methods.
+ This is especially useful for declaring "constructors" for
+ cdef classes that can take non-Python arguments.
+
+* Taking a ``char*`` from a temporary Python string object is safer
+ in more cases and can be done inside of non-trivial expressions,
+ including arguments of a function call. A compile time error
+ is raised only when such a pointer is assigned to a variable and
+ would thus exceed the lifetime of the string itself.
+
+* Generators have new properties ``__name__`` and ``__qualname__``
+ that provide the plain/qualified name of the generator function
+ (following CPython 3.5). See http://bugs.python.org/issue21205
+
+* The ``inline`` function modifier is available as a decorator
+ ``@cython.inline`` in pure mode.
+
+* When cygdb is run in a virtualenv, it enables the same virtualenv
+ inside of the debugger. Patch by Marc Abramowitz.
+
+* PEP 465: dedicated infix operator for matrix multiplication (A @ B).
+
+* HTML output of annotated code uses Pygments for code highlighting
+ and generally received a major overhaul by Matthias Bussonier.
+
+* IPython magic support is now available directly from Cython with
+ the command "%load_ext cython". Cython code can directly be
+ executed in a cell when marked with "%%cython". Code analysis
+ is available with "%%cython -a". Patch by Martín Gaitán.
+
+* Simple support for declaring Python object types in Python signature
+ annotations. Currently requires setting the compiler directive
+ ``annotation_typing=True``.
+
+* New directive ``use_switch`` (defaults to True) to optionally disable
+ the optimization of chained if statement to C switch statements.
+
+* Defines dynamic_cast et al. in ``libcpp.cast`` and C++ heap data
+ structure operations in ``libcpp.algorithm``.
+
+* Shipped header declarations in ``posix.*`` were extended to cover
+ more of the POSIX API. Patches by Lars Buitinck and Mark Peek.
+
+Optimizations
+-------------
+
+* Simple calls to C implemented Python functions/methods are faster.
+ This also speeds up many operations on builtins that Cython cannot
+ otherwise optimise.
+
+* The "and"/"or" operators try to avoid unnecessary coercions of their
+ arguments. They now evaluate the truth value of each argument
+ independently and only coerce the final result of the whole expression
+ to the target type (e.g. the type on the left side of an assignment).
+ This also avoids reference counting overhead for Python values during
+ evaluation and generally improves the code flow in the generated C code.
+
+* The Python expression "2 ** N" is optimised into bit shifting.
+ See http://bugs.python.org/issue21420
+
+* Cascaded assignments (a = b = ...) try to minimise the number of
+ type coercions.
+
+* Calls to ``slice()`` are translated to a straight C-API call.
+
+Bugs fixed
+----------
+
+* Crash when assigning memory views from ternary conditional expressions.
+
+* Nested C++ templates could lead to unseparated ">>" characters being
+ generated into the C++ declarations, which older C++ compilers could
+ not parse.
+
+* Sending SIGINT (Ctrl-C) during parallel cythonize() builds could
+ hang the child processes.
+
+* No longer ignore local setup.cfg files for distutils in pyximport.
+ Patch by Martin Teichmann.
+
+* Taking a ``char*`` from an indexed Python string generated unsafe
+ reference counting code.
+
+* Set literals now create all of their items before trying to add them
+ to the set, following the behaviour in CPython. This makes a
+ difference in the rare case that the item creation has side effects
+ and some items are not hashable (or if hashing them has side effects,
+ too).
+
+* Cython no longer generates the cross product of C functions for code
+ that uses memory views of fused types in function signatures (e.g.
+ ``cdef func(floating[:] a, floating[:] b)``). This is considered the
+ expected behaviour by most users and was previously inconsistent with
+ other structured types like C arrays. Code that really wants all type
+ combinations can create the same fused memoryview type under different
+ names and use those in the signature to make it clear which types are
+ independent.
+
+* Names that were unknown at compile time were looked up as builtins at
+ runtime but not as global module names. Trying both lookups helps with
+ globals() manipulation.
+
+* Fixed stl container conversion for typedef element types.
+
+* ``obj.pop(x)`` truncated large C integer values of x to ``Py_ssize_t``.
+
+* ``__init__.pyc`` is recognised as marking a package directory
+ (in addition to .py, .pyx and .pxd).
+
+* Syntax highlighting in ``cython-mode.el`` for Emacs no longer
+ incorrectly highlights keywords found as part of longer names.
+
+* Correctly handle ``from cython.submodule cimport name``.
+
+* Fix infinite recursion when using super with cpdef methods.
+
+* No-args ``dir()`` was not guaranteed to return a sorted list.
+
+Other changes
+-------------
+
+* The header line in the generated C files no longer contains the
+ timestamp but only the Cython version that wrote it. This was
+ changed to make builds more reproducible.
+
+* Removed support for CPython 2.4, 2.5 and 3.1.
+
+* The licensing implications on the generated code were clarified
+ to avoid legal constraints for users.
+
+
+0.20.2 (2014-06-16)
+===================
+
+Features added
+--------------
+
+* Some optimisations for set/frozenset instantiation.
+
+* Support for C++ unordered_set and unordered_map.
+
+Bugs fixed
+----------
+
+* Access to attributes of optimised builtin methods (e.g.
+ ``[].append.__name__``) could fail to compile.
+
+* Memory leak when extension subtypes add a memory view as attribute
+ to those of the parent type without having Python object attributes
+ or a user provided dealloc method.
+
+* Compiler crash on readonly properties in "binding" mode.
+
+* Auto-encoding with ``c_string_encoding=ascii`` failed in Py3.3.
+
+* Crash when subtyping freelist enabled Cython extension types with
+ Python classes that use ``__slots__``.
+
+* Freelist usage is restricted to CPython to avoid problems with other
+ Python implementations.
+
+* Memory leak in memory views when copying overlapping, contiguous slices.
+
+* Format checking when requesting non-contiguous buffers from
+ ``cython.array`` objects was accidentally omitted in Py3.
+
+* C++ destructor calls in extension types could fail to compile in clang.
+
+* Buffer format validation failed for sequences of strings in structs.
+
+* Docstrings on extension type attributes in .pxd files were rejected.
+
+
+0.20.1 (2014-02-11)
+===================
+
+Bugs fixed
+----------
+
+* Build error under recent MacOS-X versions where ``isspace()`` could not be
+ resolved by clang.
+
+* List/Tuple literals multiplied by more than one factor were only multiplied
+ by the last factor instead of all.
+
+* Lookups of special methods (specifically for context managers) could fail
+ in Python <= 2.6/3.1.
+
+* Local variables were erroneously appended to the signature introspection
+ of Cython implemented functions with keyword-only arguments under Python 3.
+
+* In-place assignments to variables with inferred Python builtin/extension
+ types could fail with type errors if the result value type was incompatible
+ with the type of the previous value.
+
+* The C code generation order of cdef classes, closures, helper code,
+ etc. was not deterministic, thus leading to high code churn.
+
+* Type inference could fail to deduce C enum types.
+
+* Type inference could deduce unsafe or inefficient types from integer
+ assignments within a mix of inferred Python variables and integer
+ variables.
+
+
+0.20 (2014-01-18)
+=================
+
+Features added
+--------------
+
+* Support for CPython 3.4.
+
+* Support for calling C++ template functions.
+
+* ``yield`` is supported in ``finally`` clauses.
+
+* The C code generated for finally blocks is duplicated for each exit
+ case to allow for better optimisations by the C compiler.
+
+* Cython tries to undo the Python optimisationism of assigning a bound
+ method to a local variable when it can generate better code for the
+ direct call.
+
+* Constant Python float values are cached.
+
+* String equality comparisons can use faster type specific code in
+ more cases than before.
+
+* String/Unicode formatting using the '%' operator uses a faster
+ C-API call.
+
+* ``bytearray`` has become a known type and supports coercion from and
+ to C strings. Indexing, slicing and decoding is optimised. Note that
+ this may have an impact on existing code due to type inference.
+
+* Using ``cdef basestring stringvar`` and function arguments typed as
+ ``basestring`` is now meaningful and allows assigning exactly
+ ``str`` and ``unicode`` objects, but no subtypes of these types.
+
+* Support for the ``__debug__`` builtin.
+
+* Assertions in Cython compiled modules are disabled if the running
+ Python interpreter was started with the "-O" option.
+
+* Some types that Cython provides internally, such as functions and
+ generators, are now shared across modules if more than one Cython
+ implemented module is imported.
+
+* The type inference algorithm works more fine granular by taking the
+ results of the control flow analysis into account.
+
+* A new script in ``bin/cythonize`` provides a command line frontend
+ to the cythonize() compilation function (including distutils build).
+
+* The new extension type decorator ``@cython.no_gc_clear`` prevents
+ objects from being cleared during cyclic garbage collection, thus
+ making sure that object attributes are kept alive until deallocation.
+
+* During cyclic garbage collection, attributes of extension types that
+ cannot create reference cycles due to their type (e.g. strings) are
+ no longer considered for traversal or clearing. This can reduce the
+ processing overhead when searching for or cleaning up reference cycles.
+
+* Package compilation (i.e. ``__init__.py`` files) now works, starting
+ with Python 3.3.
+
+* The cython-mode.el script for Emacs was updated. Patch by Ivan Andrus.
+
+* An option common_utility_include_dir was added to cythonize() to save
+ oft-used utility code once in a separate directory rather than as
+ part of each generated file.
+
+* ``unraisable_tracebacks`` directive added to control printing of
+ tracebacks of unraisable exceptions.
+
+Bugs fixed
+----------
+
+* Abstract Python classes that subtyped a Cython extension type
+ failed to raise an exception on instantiation, and thus ended
+ up being instantiated.
+
+* ``set.add(a_tuple)`` and ``set.discard(a_tuple)`` failed with a
+ TypeError in Py2.4.
+
+* The PEP 3155 ``__qualname__`` was incorrect for nested classes and
+ inner classes/functions declared as ``global``.
+
+* Several corner cases in the try-finally statement were fixed.
+
+* The metaclass of a Python class was not inherited from its parent
+ class(es). It is now extracted from the list of base classes if not
+ provided explicitly using the Py3 ``metaclass`` keyword argument.
+ In Py2 compilation mode, a ``__metaclass__`` entry in the class
+ dict will still take precedence if not using Py3 metaclass syntax,
+ but only *after* creating the class dict (which may have been done
+ by a metaclass of a base class, see PEP 3115). It is generally
+ recommended to use the explicit Py3 syntax to define metaclasses
+ for Python types at compile time.
+
+* The automatic C switch statement generation behaves more safely for
+ heterogeneous value types (e.g. mixing enum and char), allowing for
+ a slightly wider application and reducing corner cases. It now always
+ generates a 'default' clause to avoid C compiler warnings about
+ unmatched enum values.
+
+* Fixed a bug where class hierarchies declared out-of-order could result
+ in broken generated code.
+
+* Fixed a bug which prevented overriding const methods of C++ classes.
+
+* Fixed a crash when converting Python objects to C++ strings fails.
+
+Other changes
+-------------
+
+* In Py3 compilation mode, Python2-style metaclasses declared by a
+ ``__metaclass__`` class dict entry are ignored.
+
+* In Py3.4+, the Cython generator type uses ``tp_finalize()`` for safer
+ cleanup instead of ``tp_del()``.
+
+
+0.19.2 (2013-10-13)
+===================
+
+Features added
+--------------
+
+Bugs fixed
+----------
+
+* Some standard declarations were fixed or updated, including the previously
+ incorrect declaration of ``PyBuffer_FillInfo()`` and some missing bits in
+ ``libc.math``.
+
+* Heap allocated subtypes of ``type`` used the wrong base type struct at the
+ C level.
+
+* Calling the unbound method dict.keys/value/items() in dict subtypes could
+ call the bound object method instead of the unbound supertype method.
+
+* "yield" wasn't supported in "return" value expressions.
+
+* Using the "bint" type in memory views lead to unexpected results.
+ It is now an error.
+
+* Assignments to global/closure variables could catch them in an illegal state
+ while deallocating the old value.
+
+Other changes
+-------------
+
+
+0.19.1 (2013-05-11)
+===================
+
+Features added
+--------------
+
+* Completely empty C-API structs for extension type slots (protocols like
+ number/mapping/sequence) are no longer generated into the C code.
+
+* Docstrings that directly follow a public/readonly attribute declaration
+ in a cdef class will be used as docstring of the auto-generated property.
+ This fixes ticket 206.
+
+* The automatic signature documentation tries to preserve more semantics
+ of default arguments and argument types. Specifically, ``bint`` arguments
+ now appear as type ``bool``.
+
+* A warning is emitted when negative literal indices are found inside of
+ a code section that disables ``wraparound`` handling. This helps with
+ fixing invalid code that might fail in the face of future compiler
+ optimisations.
+
+* Constant folding for boolean expressions (and/or) was improved.
+
+* Added a build_dir option to cythonize() which allows one to place
+ the generated .c files outside the source tree.
+
+Bugs fixed
+----------
+
+* ``isinstance(X, type)`` failed to get optimised into a call to
+ ``PyType_Check()``, as done for other builtin types.
+
+* A spurious ``from datetime cimport *`` was removed from the "cpython"
+ declaration package. This means that the "datetime" declarations
+ (added in 0.19) are no longer available directly from the "cpython"
+ namespace, but only from "cpython.datetime". This is the correct
+ way of doing it because the declarations refer to a standard library
+ module, not the core CPython C-API itself.
+
+* The C code for extension types is now generated in topological order
+ instead of source code order to avoid C compiler errors about missing
+ declarations for subtypes that are defined before their parent.
+
+* The ``memoryview`` type name no longer shows up in the module dict of
+ modules that use memory views. This fixes trac ticket 775.
+
+* Regression in 0.19 that rejected valid C expressions from being used
+ in C array size declarations.
+
+* In C++ mode, the C99-only keyword ``restrict`` could accidentally be
+ seen by the GNU C++ compiler. It is now specially handled for both
+ GCC and MSVC.
+
+* Testing large (> int) C integer values for their truth value could fail
+ due to integer wrap-around.
+
+Other changes
+-------------
+
+
+0.19 (2013-04-19)
+=================
+
+Features added
+--------------
+
+* New directives ``c_string_type`` and ``c_string_encoding`` to more easily
+ and automatically convert between C strings and the different Python string
+ types.
+
+* The extension type flag ``Py_TPFLAGS_HAVE_VERSION_TAG`` is enabled by default
+ on extension types and can be disabled using the ``type_version_tag`` compiler
+ directive.
+
+* EXPERIMENTAL support for simple Cython code level line tracing. Enabled by
+ the "linetrace" compiler directive.
+
+* Cython implemented functions make their argument and return type annotations
+ available through the ``__annotations__`` attribute (PEP 3107).
+
+* Access to non-cdef module globals and Python object attributes is faster.
+
+* ``Py_UNICODE*`` coerces from and to Python unicode strings. This is
+ helpful when talking to Windows APIs, which use compatible wchar_t
+ arrays for strings. Note that the ``Py_UNICODE`` type is otherwise
+ deprecated as of CPython 3.3.
+
+* ``isinstance(obj, basestring)`` is optimised. In Python 3 it only tests
+ for instances of ``str`` (i.e. Py2 ``unicode``).
+
+* The ``basestring`` builtin is mapped to ``str`` (i.e. Py2 ``unicode``) when
+ compiling the generated C code under Python 3.
+
+* Closures use freelists, which can speed up their creation quite substantially.
+ This is also visible for short running generator expressions, for example.
+
+* A new class decorator ``@cython.freelist(N)`` creates a static freelist of N
+ instances for an extension type, thus avoiding the costly allocation step if
+ possible. This can speed up object instantiation by 20-30% in suitable
+ scenarios. Note that freelists are currently only supported for base types,
+ not for types that inherit from others.
+
+* Fast extension type instantiation using the ``Type.__new__(Type)`` idiom has
+ gained support for passing arguments. It is also a bit faster for types defined
+ inside of the module.
+
+* The Python2-only dict methods ``.iter*()`` and ``.view*()`` (requires Python 2.7)
+ are automatically mapped to the equivalent keys/values/items methods in Python 3
+ for typed dictionaries.
+
+* Slicing unicode strings, lists and tuples is faster.
+
+* list.append() is faster on average.
+
+* ``raise Exception() from None`` suppresses the exception context in Py3.3.
+
+* Py3 compatible ``exec(tuple)`` syntax is supported in Py2 code.
+
+* Keyword arguments are supported for cdef functions.
+
+* External C++ classes can be declared nogil. Patch by John Stumpo. This fixes
+ trac ticket 805.
+
+Bugs fixed
+----------
+
+* 2-value slicing of unknown objects passes the correct slice when the ``getitem``
+ protocol is used instead of the ``getslice`` protocol (especially in Python 3),
+ i.e. ``None`` values for missing bounds instead of ``[0,maxsize]``. It is also
+ a bit faster in some cases, e.g. for constant bounds. This fixes trac ticket 636.
+
+* Cascaded assignments of None values to extension type variables failed with
+ a ``TypeError`` at runtime.
+
+* The ``__defaults__`` attribute was not writable for Cython implemented
+ functions.
+
+* Default values of keyword-only arguments showed up in ``__defaults__`` instead
+ of ``__kwdefaults__`` (which was not implemented). Both are available for
+ Cython implemented functions now, as specified in Python 3.x.
+
+* ``yield`` works inside of ``with gil`` sections. It previously lead to a crash.
+ This fixes trac ticket 803.
+
+* Static methods without explicitly named positional arguments (e.g. having only
+ ``*args``) crashed when being called. This fixes trac ticket 804.
+
+* ``dir()`` without arguments previously returned an unsorted list, which now
+ gets sorted as expected.
+
+* ``dict.items()``, ``dict.keys()`` and ``dict.values()`` no longer return lists
+ in Python 3.
+
+* Exiting from an ``except-as`` clause now deletes the exception in Python 3 mode.
+
+* The declarations of ``frexp()`` and ``ldexp()`` in ``math.pxd`` were incorrect.
+
+Other changes
+-------------
+
+
+0.18 (2013-01-28)
+=================
+
+Features added
+--------------
+
+* Named Unicode escapes ("\N{...}") are supported.
+
+* Python functions/classes provide the special attribute "__qualname__"
+ as defined by PEP 3155.
+
+* Added a directive ``overflowcheck`` which raises an OverflowException when
+ arithmetic with C ints overflow. This has a modest performance penalty, but
+ is much faster than using Python ints.
+
+* Calls to nested Python functions are resolved at compile time.
+
+* Type inference works across nested functions.
+
+* ``py_bytes_string.decode(...)`` is optimised.
+
+* C ``const`` declarations are supported in the language.
+
+Bugs fixed
+----------
+
+* Automatic C++ exception mapping didn't work in nogil functions (only in
+ "with nogil" blocks).
+
+Other changes
+-------------
+
+
+0.17.4 (2013-01-03)
+===================
+
+Bugs fixed
+----------
+
+* Garbage collection triggered during deallocation of container classes could lead to a double-deallocation.
+
+
+0.17.3 (2012-12-14)
+===================
+
+Features added
+--------------
+
+Bugs fixed
+----------
+
+* During final interpreter cleanup (with types cleanup enabled at compile time), extension types that inherit from base types over more than one level that were cimported from other modules could lead to a crash.
+
+* Weak-reference support in extension types (with a ``cdef __weakref__`` attribute) generated incorrect deallocation code.
+
+* In CPython 3.3, converting a Unicode character to the Py_UNICODE type could fail to raise an overflow for non-BMP characters that do not fit into a wchar_t on the current platform.
+
+* Negative C integer constants lost their longness suffix in the generated C code.
+
+Other changes
+-------------
+
+
+0.17.2 (2012-11-20)
+===================
+
+Features added
+--------------
+
+* ``cythonize()`` gained a best effort compile mode that can be used to simply ignore .py files that fail to compile.
+
+Bugs fixed
+----------
+
+* Replacing an object reference with the value of one of its cdef attributes could generate incorrect C code that accessed the object after deleting its last reference.
+
+* C-to-Python type coercions during cascaded comparisons could generate invalid C code, specifically when using the 'in' operator.
+
+* "obj[1,]" passed a single integer into the item getter instead of a tuple.
+
+* Cyclic imports at module init time did not work in Py3.
+
+* The names of C++ destructors for template classes were built incorrectly.
+
+* In pure mode, type casts in Cython syntax and the C ampersand operator are now rejected. Use the pure mode replacements instead.
+
+* In pure mode, C type names and the sizeof() function are no longer recognised as such and can be used as normal Python names.
+
+* The extended C level support for the CPython array type was declared too late to be used by user defined classes.
+
+* C++ class nesting was broken.
+
+* Better checking for required nullary constructors for stack-allocated C++ instances.
+
+* Remove module docstring in no-docstring mode.
+
+* Fix specialization for varargs function signatures.
+
+* Fix several compiler crashes.
+
+Other changes
+-------------
+
+* An experimental distutils script for compiling the CPython standard library was added as Tools/cystdlib.py.
+
+
+0.17.1 (2012-09-26)
+===================
+
+Features added
+--------------
+
+Bugs fixed
+----------
+
+* A reference leak was fixed in the new dict iteration code when the loop target was not a plain variable but an unpacked tuple.
+
+* Memory views did not handle the special case of a NULL buffer strides value, as allowed by PEP3118.
+
+Other changes
+-------------
+
+
+0.17 (2012-09-01)
+=================
+
+Features added
+--------------
+
+* Alpha quality support for compiling and running Cython generated extension modules in PyPy (through cpyext). Note that this requires at least PyPy 1.9 and in many cases also adaptations in user code, especially to avoid borrowed references when no owned reference is being held directly in C space (a reference in a Python list or dict is not enough, for example). See the documentation on porting Cython code to PyPy.
+
+* "yield from" is supported (PEP 380) and a couple of minor problems with generators were fixed.
+
+* C++ STL container classes automatically coerce from and to the equivalent Python container types on typed assignments and casts. Note that the data in the containers is copied during this conversion.
+
+* C++ iterators can now be iterated over using "for x in cpp_container" whenever cpp_container has begin() and end() methods returning objects satisfying the iterator pattern (that is, it can be incremented, dereferenced, and compared (for non-equality)).
+
+* cdef classes can now have C++ class members (provided a zero-argument constructor exists)
+
+* A new cpython.array standard cimport file allows to efficiently talk to the stdlib array.array data type in Python 2. Since CPython does not export an official C-API for this module, it receives special casing by the compiler in order to avoid setup overhead on user side. In Python 3, both buffers and memory views on the array type already worked out of the box with earlier versions of Cython due to the native support for the buffer interface in the Py3 array module.
+
+* Fast dict iteration is now enabled optimistically also for untyped variables when the common iteration methods are used.
+
+* The unicode string processing code was adapted for the upcoming CPython 3.3 (PEP 393, new Unicode buffer layout).
+
+* Buffer arguments and memory view arguments in Python functions can be declared "not None" to raise a TypeError on None input.
+
+* c(p)def functions in pure mode can specify their return type with "@cython.returns()".
+
+* Automatic dispatch for fused functions with memoryview arguments
+
+* Support newaxis indexing for memoryviews
+
+* Support decorators for fused functions
+
+Bugs fixed
+----------
+
+* Old-style Py2 imports did not work reliably in Python 3.x and were broken in Python 3.3. Regardless of this fix, it's generally best to be explicit about relative and global imports in Cython code because old-style imports have a higher overhead. To this end, "from __future__ import absolute_import" is supported in Python/Cython 2.x code now (previous versions of Cython already used it when compiling Python 3 code).
+
+* Stricter constraints on the "inline" and "final" modifiers. If your code does not compile due to this change, chances are these modifiers were previously being ignored by the compiler and can be removed without any performance regression.
+
+* Exceptions are always instantiated while raising them (as in Python), instead of risking to instantiate them in potentially unsafe situations when they need to be handled or otherwise processed.
+
+* locals() properly ignores names that do not have Python compatible types (including automatically inferred types).
+
+* Some garbage collection issues of memory views were fixed.
+
+* numpy.pxd compiles in Python 3 mode.
+
+* Several C compiler warnings were fixed.
+
+* Several bugs related to memoryviews and fused types were fixed.
+
+* Several bug-fixes and improvements related to cythonize(), including ccache-style caching.
+
+Other changes
+-------------
+
+* libc.string provides a convenience declaration for const uchar in addition to const char.
+
+* User declared char* types are now recognised as such and auto-coerce to and from Python bytes strings.
+
+* callable() and next() compile to more efficient C code.
+
+* list.append() is faster on average.
+
+* Modules generated by @cython.inline() are written into the directory pointed to by the environment variable CYTHON_CACHE_DIR if set.
+
+
+0.16 (2012-04-21)
+=================
+
+Features added
+--------------
+
+* Enhancements to Cython's function type (support for weak references, default arguments, code objects, dynamic attributes, classmethods, staticmethods, and more)
+
+* Fused Types - Template-like support for functions and methods CEP 522 (docs)
+
+* Typed views on memory - Support for efficient direct and indirect buffers (indexing, slicing, transposing, ...) CEP 517 (docs)
+
+* super() without arguments
+
+* Final cdef methods (which translate into direct calls on known instances)
+
+Bugs fixed
+----------
+
+* fix alignment handling for record types in buffer support
+
+Other changes
+-------------
+
+* support default arguments for closures
+
+* search sys.path for pxd files
+
+* support C++ template casting
+
+* faster traceback building and faster generator termination
+
+* support inplace operators on indexed buffers
+
+* allow nested prange sections
+
+
+0.15.1 (2011-09-19)
+===================
+
+Features added
+--------------
+
+Bugs fixed
+----------
+
+Other changes
+-------------
+
+
+0.15 (2011-08-05)
+=================
+
+Features added
+--------------
+
+* Generators (yield) - Cython has full support for generators, generator expressions and PEP 342 coroutines.
+
+* The nonlocal keyword is supported.
+
+* Re-acquiring the gil: with gil - works as expected within a nogil context.
+
+* OpenMP support: prange.
+
+* Control flow analysis prunes dead code and emits warnings and errors about uninitialised variables.
+
+* Debugger command cy set to assign values of expressions to Cython variables and cy exec counterpart $cy_eval().
+
+* Exception chaining PEP 3134.
+
+* Relative imports PEP 328.
+
+* Improved pure syntax including cython.cclass, cython.cfunc, and cython.ccall.
+
+* The with statement has its own dedicated and faster C implementation.
+
+* Support for del.
+
+* Boundschecking directives implemented for builtin Python sequence types.
+
+* Several updates and additions to the shipped standard library .pxd files.
+
+* Forward declaration of types is no longer required for circular references.
+
+Bugs fixed
+----------
+
+Other changes
+-------------
+
+* Uninitialized variables are no longer initialized to None and accessing them has the same semantics as standard Python.
+
+* globals() now returns a read-only dict of the Cython module's globals, rather than the globals of the first non-Cython module in the stack
+
+* Many C++ exceptions are now special cased to give closer Python counterparts. This means that except+ functions that formerly raised generic RuntimeErrors may raise something else such as ArithmeticError.
+
+* The inlined generator expressions (introduced in Cython 0.13) were disabled in favour of full generator expression support. This breaks code that previously used them inside of cdef functions (usage in def functions continues to work) and induces a performance regression for cases that continue to work but that were previously inlined. We hope to reinstate this feature in the near future.
+
+
+0.14.1 (2011-02-04)
+===================
+
+Features added
+--------------
+
+* The gdb debugging support was extended to include all major Cython features, including closures.
+
+* raise MemoryError() is now safe to use as Cython replaces it with the correct C-API call.
+
+Bugs fixed
+----------
+
+Other changes
+-------------
+
+* Decorators on special methods of cdef classes now raise a compile time error rather than being ignored.
+
+* In Python 3 language level mode (-3 option), the 'str' type is now mapped to 'unicode', so that cdef str s declares a Unicode string even when running in Python 2.
+
+
+0.14 (2010-12-14)
+=================
+
+Features added
+--------------
+
+* Python classes can now be nested and receive a proper closure at definition time.
+
+* Redefinition is supported for Python functions, even within the same scope.
+
+* Lambda expressions are supported in class bodies and at the module level.
+
+* Metaclasses are supported for Python classes, both in Python 2 and Python 3 syntax. The Python 3 syntax (using a keyword argument in the type declaration) is preferred and optimised at compile time.
+
+* "final" extension classes prevent inheritance in Python space. This feature is available through the new "cython.final" decorator. In the future, these classes may receive further optimisations.
+
+* "internal" extension classes do not show up in the module dictionary. This feature is available through the new "cython.internal" decorator.
+
+* Extension type inheritance from builtin types, such as "cdef class MyUnicode(unicode)", now works without further external type redeclarations (which are also strongly discouraged now and continue to issue a warning).
+
+* GDB support. http://docs.cython.org/src/userguide/debugging.html
+
+* A new build system with support for inline distutils directives, correct dependency tracking, and parallel compilation. https://github.com/cython/cython/wiki/enhancements-distutils_preprocessing
+
+* Support for dynamic compilation at runtime via the new cython.inline function and cython.compile decorator. https://github.com/cython/cython/wiki/enhancements-inline
+
+* "nogil" blocks are supported when compiling pure Python code by writing "with cython.nogil".
+
+* Iterating over arbitrary pointer types is now supported, as is an optimized version of the in operator, e.g. x in ptr[a:b].
+
+Bugs fixed
+----------
+
+* In parallel assignments, the right side was evaluated in reverse order in 0.13. This could result in errors if it had side effects (e.g. function calls).
+
+* In some cases, methods of builtin types would raise a SystemError instead of an AttributeError when called on None.
+
+Other changes
+-------------
+
+* Constant tuples are now cached over the lifetime of an extension module, just like CPython does. Constant argument tuples of Python function calls are also cached.
+
+* Closures have tightened to include exactly the names used in the inner functions and classes. Previously, they held the complete locals of the defining function.
+
+* The builtin "next()" function in Python 2.6 and later is now implemented internally and therefore available in all Python versions. This makes it the preferred and portable way of manually advancing an iterator.
+
+* In addition to the previously supported inlined generator expressions in 0.13, "sorted(genexpr)" can now be used as well. Typing issues were fixed in "sum(genexpr)" that could lead to invalid C code being generated. Other known issues with inlined generator expressions were also fixed that make upgrading to 0.14 a strong recommendation for code that uses them. Note that general generators and generator expressions continue to be not supported.
+
+* Inplace arithmetic operators now respect the cdivision directive and are supported for complex types.
+
+* Typing a variable as type "complex" previously gave it the Python object type. It now uses the appropriate C/C++ double complex type. A side-effect is that assignments and typed function parameters now accept anything that Python can coerce to a complex, including integers and floats, and not only complex instances.
+
+* Large integer literals pass through the compiler in a safer way. To prevent truncation in C code, non 32-bit literals are turned into Python objects if not used in a C context. This context can either be given by a clear C literal suffix such as "UL" or "LL" (or "L" in Python 3 code), or it can be an assignment to a typed variable or a typed function argument, in which case it is up to the user to take care of a sufficiently large value space of the target.
+
+* Python functions are declared in the order they appear in the file, rather than all being created at module creation time. This is consistent with Python and needed to support, for example, conditional or repeated declarations of functions. In the face of circular imports this may cause code to break, so a new --disable-function-redefinition flag was added to revert to the old behavior. This flag will be removed in a future release, so should only be used as a stopgap until old code can be fixed.
+
+
+0.13 (2010-08-25)
+=================
+
+Features added
+--------------
+
+* Closures are fully supported for Python functions. Cython supports inner functions and lambda expressions. Generators and generator expressions are not supported in this release.
+
+* Proper C++ support. Cython knows about C++ classes, templates and overloaded function signatures, so that Cython code can interact with them in a straight forward way.
+
+* Type inference is enabled by default for safe C types (e.g. double, bint, C++ classes) and known extension types. This reduces the need for explicit type declarations and can improve the performance of untyped code in some cases. There is also a verbose compile mode for testing the impact on user code.
+
+* Cython's for-in-loop can iterate over C arrays and sliced pointers. The type of the loop variable will be inferred automatically in this case.
+
+* The Py_UNICODE integer type for Unicode code points is fully supported, including for-loops and 'in' tests on unicode strings. It coerces from and to single character unicode strings. Note that untyped for-loop variables will automatically be inferred as Py_UNICODE when iterating over a unicode string. In most cases, this will be much more efficient than yielding sliced string objects, but can also have a negative performance impact when the variable is used in a Python context multiple times, so that it needs to coerce to a unicode string object more than once. If this happens, typing the loop variable as unicode or object will help.
+
+* The built-in functions any(), all(), sum(), list(), set() and dict() are inlined as plain for loops when called on generator expressions. Note that generator expressions are not generally supported apart from this feature. Also, tuple(genexpr) is not currently supported - use tuple([listcomp]) instead.
+
+* More shipped standard library declarations. The python_* and stdlib/stdio .pxd files have been deprecated in favor of clib.* and cpython[.*] and may get removed in a future release.
+
+* Pure Python mode no longer disallows non-Python keywords like 'cdef', 'include' or 'cimport'. It also no longer recognises syntax extensions like the for-from loop.
+
+* Parsing has improved for Python 3 syntax in Python code, although not all features are correctly supported. The missing Python 3 features are being worked on for the next release.
+
+* from __future__ import print_function is supported in Python 2.6 and later. Note that there is currently no emulation for earlier Python versions, so code that uses print() with this future import will require at least Python 2.6.
+
+* New compiler directive language_level (valid values: 2 or 3) with corresponding command line options -2 and -3 requests source code compatibility with Python 2.x or Python 3.x respectively. Language level 3 currently enforces unicode literals for unprefixed string literals, enables the print function (requires Python 2.6 or later) and keeps loop variables in list comprehensions from leaking.
+
+* Loop variables in set/dict comprehensions no longer leak into the surrounding scope (following Python 2.7). List comprehensions are unchanged in language level 2.
+
+* print >> stream
+
+Bugs fixed
+----------
+
+Other changes
+-------------
+
+* The availability of type inference by default means that Cython will also infer the type of pointers on assignments. Previously, code like this::
+
+ cdef char* s = ...
+ untyped_variable = s
+
+ would convert the char* to a Python bytes string and assign that. This is no longer the case and no coercion will happen in the example above. The correct way of doing this is through an explicit cast or by typing the target variable, i.e.
+
+ ::
+
+ cdef char* s = ...
+ untyped_variable1 = <bytes>s
+ untyped_variable2 = <object>s
+
+ cdef object py_object = s
+ cdef bytes bytes_string = s
+
+* bool is no longer a valid type name by default. The problem is that it's not clear whether bool should refer to the Python type or the C++ type, and expecting one and finding the other has already led to several hard-to-find bugs. Both types are available for importing: you can use from cpython cimport bool for the Python bool type, and from libcpp cimport bool for the C++ type. bool is still a valid object by default, so one can still write bool(x).
+
+* ``__getsegcount__`` is now correctly typed to take a ``Py_size_t*`` rather than an ``int*``.
+
+
+0.12.1 (2010-02-02)
+===================
+
+Features added
+--------------
+
+* Type inference improvements.
+
+ * There have been several bug fixes and improvements to the type inferencer.
+
+ * Notably, there is now a "safe" mode enabled by setting the infer_types directive to None. (The None here refers to the "default" mode, which will be the default in 0.13.) This safe mode limits inference to Python object types and C doubles, which should speed up execution without affecting any semantics such as integer overflow behavior like infer_types=True might. There is also an infer_types.verbose option which allows one to see what types are inferred.
+
+* The boundscheck directive works for lists and tuples as well as buffers.
+
+* len(s) and s.decode("encoding") are efficiently supported for char* s.
+
+* Cython's INLINE macro has been renamed to CYTHON_INLINE to reduce conflict and has better support for the MSVC compiler on Windows. It is no longer clobbered if externally defined.
+
+* Revision history is now omitted from the source package, resulting in a 85% size reduction. Running make repo will download the history and turn the directory into a complete Mercurial working repository.
+
+* Cython modules don't need to be recompiled when the size of an external type grows. (A warning, rather than an error, is produced.) This should be helpful for binary distributions relying on NumPy.
+
+Bugs fixed
+----------
+
+* Several other bugs and minor improvements have been made. This release should be fully backwards compatible with 0.12.
+
+Other changes
+-------------
+
+
+0.12 (2009-11-23)
+=================
+
+Features added
+--------------
+
+* Type inference with the infer_types directive
+
+* Seamless C++ complex support
+
+* Fast extension type instantiation using the normal Python meme obj = MyType.__new__(MyType)
+
+* Improved support for Py3.1
+
+* Cython now runs under Python 3.x using the 2to3 tool
+
+* unittest support for doctests in Cython modules
+
+* Optimised handling of C strings (char*): for c in cstring[2:50] and cstring.decode()
+
+* Looping over c pointers: for i in intptr[:50].
+
+* pyximport improvements
+
+* cython_freeze improvements
+
+Bugs fixed
+----------
+
+* Many bug fixes
+
+Other changes
+-------------
+
+* Many other optimisation, e.g. enumerate() loops, parallel swap assignments (a,b = b,a), and unicode.encode()
+
+* More complete numpy.pxd
+
+
+0.11.2 (2009-05-20)
+===================
+
+Features added
+--------------
+
+* There's now native complex floating point support! C99 complex will be used if complex.h is included, otherwise explicit complex arithmetic working on all C compilers is used. [Robert Bradshaw]
+
+ ::
+
+ cdef double complex a = 1 + 0.3j
+ cdef np.ndarray[np.complex128_t, ndim=2] arr = \
+ np.zeros(10, np.complex128)
+
+* Cython can now generate a main()-method for embedding of the Python interpreter into an executable (see #289) [Robert Bradshaw]
+
+* @wraparound directive (another way to disable arr[idx] for negative idx) [Dag Sverre Seljebotn]
+
+* Correct support for NumPy record dtypes with different alignments, and "cdef packed struct" support [Dag Sverre Seljebotn]
+
+* @callspec directive, allowing custom calling convention macros [Lisandro Dalcin]
+
+Bugs fixed
+----------
+
+Other changes
+-------------
+
+* Bug fixes and smaller improvements. For the full list, see [1].
diff --git a/contrib/tools/cython/Cython/Build/Cythonize.py b/contrib/tools/cython/Cython/Build/Cythonize.py
index c85b6eabab..caa3cebc0e 100644
--- a/contrib/tools/cython/Cython/Build/Cythonize.py
+++ b/contrib/tools/cython/Cython/Build/Cythonize.py
@@ -21,27 +21,27 @@ except ImportError:
class _FakePool(object):
def map_async(self, func, args):
- try:
- from itertools import imap
- except ImportError:
- imap=map
+ try:
+ from itertools import imap
+ except ImportError:
+ imap=map
for _ in imap(func, args):
pass
- def close(self):
- pass
-
- def terminate(self):
- pass
-
- def join(self):
- pass
+ def close(self):
+ pass
+ def terminate(self):
+ pass
+ def join(self):
+ pass
+
+
def parse_directives(option, name, value, parser):
dest = option.dest
old_directives = dict(getattr(parser.values, dest,
- Options.get_directive_defaults()))
+ Options.get_directive_defaults()))
directives = Options.parse_directive_list(
value, relaxed_bool=True, current_settings=old_directives)
setattr(parser.values, dest, directives)
@@ -60,13 +60,13 @@ def parse_options(option, name, value, parser):
setattr(parser.values, dest, options)
-def parse_compile_time_env(option, name, value, parser):
- dest = option.dest
- old_env = dict(getattr(parser.values, dest, {}))
- new_env = Options.parse_compile_time_env(value, current_settings=old_env)
- setattr(parser.values, dest, new_env)
-
-
+def parse_compile_time_env(option, name, value, parser):
+ dest = option.dest
+ old_env = dict(getattr(parser.values, dest, {}))
+ new_env = Options.parse_compile_time_env(value, current_settings=old_env)
+ setattr(parser.values, dest, new_env)
+
+
def find_package_base(path):
base_dir, package_path = os.path.split(path)
while os.path.isfile(os.path.join(base_dir, '__init__.py')):
@@ -77,9 +77,9 @@ def find_package_base(path):
def cython_compile(path_pattern, options):
pool = None
- all_paths = map(os.path.abspath, extended_iglob(path_pattern))
+ all_paths = map(os.path.abspath, extended_iglob(path_pattern))
try:
- for path in all_paths:
+ for path in all_paths:
if options.build_inplace:
base_dir = path
while not os.path.isdir(base_dir) or is_package_dir(base_dir):
@@ -89,7 +89,7 @@ def cython_compile(path_pattern, options):
if os.path.isdir(path):
# recursively compiling a package
- paths = [os.path.join(path, '**', '*.{py,pyx}')]
+ paths = [os.path.join(path, '**', '*.{py,pyx}')]
else:
# assume it's a file(-like thing)
paths = [path]
@@ -100,7 +100,7 @@ def cython_compile(path_pattern, options):
exclude_failures=options.keep_going,
exclude=options.excludes,
compiler_directives=options.directives,
- compile_time_env=options.compile_time_env,
+ compile_time_env=options.compile_time_env,
force=options.force,
quiet=options.quiet,
depfile=options.depfile,
@@ -153,26 +153,26 @@ def parse_args(args):
from optparse import OptionParser
parser = OptionParser(usage='%prog [options] [sources and packages]+')
- parser.add_option('-X', '--directive', metavar='NAME=VALUE,...',
- dest='directives', default={}, type="str",
- action='callback', callback=parse_directives,
+ parser.add_option('-X', '--directive', metavar='NAME=VALUE,...',
+ dest='directives', default={}, type="str",
+ action='callback', callback=parse_directives,
help='set a compiler directive')
- parser.add_option('-E', '--compile-time-env', metavar='NAME=VALUE,...',
- dest='compile_time_env', default={}, type="str",
- action='callback', callback=parse_compile_time_env,
- help='set a compile time environment variable')
- parser.add_option('-s', '--option', metavar='NAME=VALUE',
- dest='options', default={}, type="str",
- action='callback', callback=parse_options,
+ parser.add_option('-E', '--compile-time-env', metavar='NAME=VALUE,...',
+ dest='compile_time_env', default={}, type="str",
+ action='callback', callback=parse_compile_time_env,
+ help='set a compile time environment variable')
+ parser.add_option('-s', '--option', metavar='NAME=VALUE',
+ dest='options', default={}, type="str",
+ action='callback', callback=parse_options,
help='set a cythonize option')
- parser.add_option('-2', dest='language_level', action='store_const', const=2, default=None,
- help='use Python 2 syntax mode by default')
- parser.add_option('-3', dest='language_level', action='store_const', const=3,
- help='use Python 3 syntax mode by default')
- parser.add_option('--3str', dest='language_level', action='store_const', const='3str',
+ parser.add_option('-2', dest='language_level', action='store_const', const=2, default=None,
+ help='use Python 2 syntax mode by default')
+ parser.add_option('-3', dest='language_level', action='store_const', const=3,
help='use Python 3 syntax mode by default')
- parser.add_option('-a', '--annotate', dest='annotate', action='store_true',
- help='generate annotated HTML page for source files')
+ parser.add_option('--3str', dest='language_level', action='store_const', const='3str',
+ help='use Python 3 syntax mode by default')
+ parser.add_option('-a', '--annotate', dest='annotate', action='store_true',
+ help='generate annotated HTML page for source files')
parser.add_option('-x', '--exclude', metavar='PATTERN', dest='excludes',
action='append', default=[],
@@ -204,9 +204,9 @@ def parse_args(args):
options.build = True
if multiprocessing is None:
options.parallel = 0
- if options.language_level:
- assert options.language_level in (2, 3, '3str')
- options.options['language_level'] = options.language_level
+ if options.language_level:
+ assert options.language_level in (2, 3, '3str')
+ options.options['language_level'] = options.language_level
return options, args
@@ -218,9 +218,9 @@ def main(args=None):
Options.error_on_unknown_names = False
Options.error_on_uninitialized = False
- if options.annotate:
- Options.annotate = True
-
+ if options.annotate:
+ Options.annotate = True
+
for path in paths:
cython_compile(path, options)
diff --git a/contrib/tools/cython/Cython/Build/Dependencies.py b/contrib/tools/cython/Cython/Build/Dependencies.py
index 7eb55e2607..ac5a3a10c0 100644
--- a/contrib/tools/cython/Cython/Build/Dependencies.py
+++ b/contrib/tools/cython/Cython/Build/Dependencies.py
@@ -1,22 +1,22 @@
-from __future__ import absolute_import, print_function
+from __future__ import absolute_import, print_function
import cython
from .. import __version__
-import collections
-import contextlib
-import hashlib
+import collections
+import contextlib
+import hashlib
import os
import shutil
import subprocess
import re, sys, time
-import warnings
+import warnings
from glob import iglob
from io import open as io_open
from os.path import relpath as _relpath
from distutils.extension import Extension
from distutils.util import strtobool
-import zipfile
+import zipfile
try:
from collections.abc import Iterable
@@ -32,24 +32,24 @@ except ImportError:
gzip_ext = ''
try:
- import zlib
- zipfile_compression_mode = zipfile.ZIP_DEFLATED
-except ImportError:
- zipfile_compression_mode = zipfile.ZIP_STORED
-
-try:
+ import zlib
+ zipfile_compression_mode = zipfile.ZIP_DEFLATED
+except ImportError:
+ zipfile_compression_mode = zipfile.ZIP_STORED
+
+try:
import pythran
except:
- pythran = None
+ pythran = None
from .. import Utils
-from ..Utils import (cached_function, cached_method, path_exists,
- safe_makedirs, copy_file_to_dir_if_newer, is_package_dir, replace_suffix)
+from ..Utils import (cached_function, cached_method, path_exists,
+ safe_makedirs, copy_file_to_dir_if_newer, is_package_dir, replace_suffix)
from ..Compiler.Main import Context, CompilationOptions, default_options
join_path = cached_function(os.path.join)
-copy_once_if_newer = cached_function(copy_file_to_dir_if_newer)
-safe_makedirs_once = cached_function(safe_makedirs)
+copy_once_if_newer = cached_function(copy_file_to_dir_if_newer)
+safe_makedirs_once = cached_function(safe_makedirs)
if sys.version_info[0] < 3:
# stupid Py2 distutils enforces str type in list of sources
@@ -57,7 +57,7 @@ if sys.version_info[0] < 3:
if _fs_encoding is None:
_fs_encoding = sys.getdefaultencoding()
def encode_filename_in_py2(filename):
- if not isinstance(filename, bytes):
+ if not isinstance(filename, bytes):
return filename.encode(_fs_encoding)
return filename
else:
@@ -65,7 +65,7 @@ else:
return filename
basestring = str
-
+
def _make_relative(file_paths, base=None):
if not base:
base = os.getcwd()
@@ -76,14 +76,14 @@ def _make_relative(file_paths, base=None):
def extended_iglob(pattern):
- if '{' in pattern:
- m = re.match('(.*){([^}]+)}(.*)', pattern)
- if m:
- before, switch, after = m.groups()
- for case in switch.split(','):
- for path in extended_iglob(before + case + after):
- yield path
- return
+ if '{' in pattern:
+ m = re.match('(.*){([^}]+)}(.*)', pattern)
+ if m:
+ before, switch, after = m.groups()
+ for case in switch.split(','):
+ for path in extended_iglob(before + case + after):
+ yield path
+ return
if '**/' in pattern:
seen = set()
first, rest = pattern.split('**/', 1)
@@ -104,60 +104,60 @@ def extended_iglob(pattern):
for path in iglob(pattern):
yield path
-
-def nonempty(it, error_msg="expected non-empty iterator"):
- empty = True
- for value in it:
- empty = False
- yield value
- if empty:
- raise ValueError(error_msg)
-
-
+
+def nonempty(it, error_msg="expected non-empty iterator"):
+ empty = True
+ for value in it:
+ empty = False
+ yield value
+ if empty:
+ raise ValueError(error_msg)
+
+
@cached_function
def file_hash(filename):
- path = os.path.normpath(filename)
- prefix = ('%d:%s' % (len(path), path)).encode("UTF-8")
+ path = os.path.normpath(filename)
+ prefix = ('%d:%s' % (len(path), path)).encode("UTF-8")
m = hashlib.md5(prefix)
- with open(path, 'rb') as f:
+ with open(path, 'rb') as f:
data = f.read(65000)
while data:
m.update(data)
data = f.read(65000)
return m.hexdigest()
-
-def update_pythran_extension(ext):
- if pythran is None:
- raise RuntimeError("You first need to install Pythran to use the np_pythran directive.")
- try:
- pythran_ext = pythran.config.make_extension(python=True)
- except TypeError: # older pythran version only
- pythran_ext = pythran.config.make_extension()
-
- ext.include_dirs.extend(pythran_ext['include_dirs'])
- ext.extra_compile_args.extend(pythran_ext['extra_compile_args'])
- ext.extra_link_args.extend(pythran_ext['extra_link_args'])
- ext.define_macros.extend(pythran_ext['define_macros'])
- ext.undef_macros.extend(pythran_ext['undef_macros'])
- ext.library_dirs.extend(pythran_ext['library_dirs'])
- ext.libraries.extend(pythran_ext['libraries'])
- ext.language = 'c++'
-
- # These options are not compatible with the way normal Cython extensions work
- for bad_option in ["-fwhole-program", "-fvisibility=hidden"]:
- try:
- ext.extra_compile_args.remove(bad_option)
- except ValueError:
- pass
-
-
+
+def update_pythran_extension(ext):
+ if pythran is None:
+ raise RuntimeError("You first need to install Pythran to use the np_pythran directive.")
+ try:
+ pythran_ext = pythran.config.make_extension(python=True)
+ except TypeError: # older pythran version only
+ pythran_ext = pythran.config.make_extension()
+
+ ext.include_dirs.extend(pythran_ext['include_dirs'])
+ ext.extra_compile_args.extend(pythran_ext['extra_compile_args'])
+ ext.extra_link_args.extend(pythran_ext['extra_link_args'])
+ ext.define_macros.extend(pythran_ext['define_macros'])
+ ext.undef_macros.extend(pythran_ext['undef_macros'])
+ ext.library_dirs.extend(pythran_ext['library_dirs'])
+ ext.libraries.extend(pythran_ext['libraries'])
+ ext.language = 'c++'
+
+ # These options are not compatible with the way normal Cython extensions work
+ for bad_option in ["-fwhole-program", "-fvisibility=hidden"]:
+ try:
+ ext.extra_compile_args.remove(bad_option)
+ except ValueError:
+ pass
+
+
def parse_list(s):
"""
- >>> parse_list("")
- []
- >>> parse_list("a")
- ['a']
+ >>> parse_list("")
+ []
+ >>> parse_list("a")
+ ['a']
>>> parse_list("a b c")
['a', 'b', 'c']
>>> parse_list("[a, b, c]")
@@ -167,7 +167,7 @@ def parse_list(s):
>>> parse_list('[a, ",a", "a,", ",", ]')
['a', ',a', 'a,', ',']
"""
- if len(s) >= 2 and s[0] == '[' and s[-1] == ']':
+ if len(s) >= 2 and s[0] == '[' and s[-1] == ']':
s = s[1:-1]
delimiter = ','
else:
@@ -181,7 +181,7 @@ def parse_list(s):
return literal
return [unquote(item) for item in s.split(delimiter) if item.strip()]
-
+
transitive_str = object()
transitive_list = object()
bool_or = object()
@@ -204,8 +204,8 @@ distutils_settings = {
'np_pythran': bool_or
}
-
-@cython.locals(start=cython.Py_ssize_t, end=cython.Py_ssize_t)
+
+@cython.locals(start=cython.Py_ssize_t, end=cython.Py_ssize_t)
def line_iter(source):
if isinstance(source, basestring):
start = 0
@@ -220,30 +220,30 @@ def line_iter(source):
for line in source:
yield line
-
+
class DistutilsInfo(object):
def __init__(self, source=None, exn=None):
self.values = {}
if source is not None:
for line in line_iter(source):
- line = line.lstrip()
- if not line:
- continue
- if line[0] != '#':
+ line = line.lstrip()
+ if not line:
+ continue
+ if line[0] != '#':
break
- line = line[1:].lstrip()
+ line = line[1:].lstrip()
kind = next((k for k in ("distutils:","cython:") if line.startswith(k)), None)
- if kind is not None:
+ if kind is not None:
key, _, value = [s.strip() for s in line[len(kind):].partition('=')]
type = distutils_settings.get(key, None)
if line.startswith("cython:") and type is None: continue
if type in (list, transitive_list):
value = parse_list(value)
if key == 'define_macros':
- value = [tuple(macro.split('=', 1))
- if '=' in macro else (macro, None)
- for macro in value]
+ value = [tuple(macro.split('=', 1))
+ if '=' in macro else (macro, None)
+ for macro in value]
if type is bool_or:
value = strtobool(value)
self.values[key] = value
@@ -264,13 +264,13 @@ class DistutilsInfo(object):
self.values[key] = value
elif type is transitive_list:
if key in self.values:
- # Change a *copy* of the list (Trac #845)
- all = self.values[key][:]
+ # Change a *copy* of the list (Trac #845)
+ all = self.values[key][:]
for v in value:
if v not in all:
all.append(v)
- value = all
- self.values[key] = value
+ value = all
+ self.values[key] = value
elif type is bool_or:
self.values[key] = self.values.get(key, False) | value
return self
@@ -301,14 +301,14 @@ class DistutilsInfo(object):
for key, value in self.values.items():
type = distutils_settings[key]
if type in [list, transitive_list]:
- value = getattr(extension, key) + list(value)
- setattr(extension, key, value)
-
-
-@cython.locals(start=cython.Py_ssize_t, q=cython.Py_ssize_t,
- single_q=cython.Py_ssize_t, double_q=cython.Py_ssize_t,
- hash_mark=cython.Py_ssize_t, end=cython.Py_ssize_t,
- k=cython.Py_ssize_t, counter=cython.Py_ssize_t, quote_len=cython.Py_ssize_t)
+ value = getattr(extension, key) + list(value)
+ setattr(extension, key, value)
+
+
+@cython.locals(start=cython.Py_ssize_t, q=cython.Py_ssize_t,
+ single_q=cython.Py_ssize_t, double_q=cython.Py_ssize_t,
+ hash_mark=cython.Py_ssize_t, end=cython.Py_ssize_t,
+ k=cython.Py_ssize_t, counter=cython.Py_ssize_t, quote_len=cython.Py_ssize_t)
def strip_string_literals(code, prefix='__Pyx_L'):
"""
Normalizes every string literal to be of the form '__Pyx_Lxxx',
@@ -333,8 +333,8 @@ def strip_string_literals(code, prefix='__Pyx_L'):
if double_q < q:
double_q = code.find('"', q)
q = min(single_q, double_q)
- if q == -1:
- q = max(single_q, double_q)
+ if q == -1:
+ q = max(single_q, double_q)
# We're done.
if q == -1 and hash_mark == -1:
@@ -350,8 +350,8 @@ def strip_string_literals(code, prefix='__Pyx_L'):
if k % 2 == 0:
q += 1
continue
- if code[q] == quote_type and (
- quote_len == 1 or (code_len > q + 2 and quote_type == code[q+1] == code[q+2])):
+ if code[q] == quote_type and (
+ quote_len == 1 or (code_len > q + 2 and quote_type == code[q+1] == code[q+2])):
counter += 1
label = "%s%s_" % (prefix, counter)
literals[label] = code[start+quote_len:q]
@@ -396,23 +396,23 @@ def strip_string_literals(code, prefix='__Pyx_L'):
return "".join(new_code), literals
-# We need to allow spaces to allow for conditional compilation like
-# IF ...:
-# cimport ...
-dependency_regex = re.compile(r"(?:^\s*from +([0-9a-zA-Z_.]+) +cimport)|"
- r"(?:^\s*cimport +([0-9a-zA-Z_.]+(?: *, *[0-9a-zA-Z_.]+)*))|"
- r"(?:^\s*cdef +extern +from +['\"]([^'\"]+)['\"])|"
- r"(?:^\s*include +['\"]([^'\"]+)['\"])", re.M)
-dependency_after_from_regex = re.compile(
- r"(?:^\s+\(([0-9a-zA-Z_., ]*)\)[#\n])|"
- r"(?:^\s+([0-9a-zA-Z_., ]*)[#\n])",
- re.M)
-
+# We need to allow spaces to allow for conditional compilation like
+# IF ...:
+# cimport ...
+dependency_regex = re.compile(r"(?:^\s*from +([0-9a-zA-Z_.]+) +cimport)|"
+ r"(?:^\s*cimport +([0-9a-zA-Z_.]+(?: *, *[0-9a-zA-Z_.]+)*))|"
+ r"(?:^\s*cdef +extern +from +['\"]([^'\"]+)['\"])|"
+ r"(?:^\s*include +['\"]([^'\"]+)['\"])", re.M)
+dependency_after_from_regex = re.compile(
+ r"(?:^\s+\(([0-9a-zA-Z_., ]*)\)[#\n])|"
+ r"(?:^\s+([0-9a-zA-Z_., ]*)[#\n])",
+ re.M)
+
def normalize_existing(base_path, rel_paths):
return normalize_existing0(os.path.dirname(base_path), tuple(set(rel_paths)))
-
+
@cached_function
def normalize_existing0(base_dir, rel_paths):
"""
@@ -440,7 +440,7 @@ def normalize_existing0(base_dir, rel_paths):
normalized.append(rel)
return (normalized, needed_base)
-
+
def resolve_depends(depends, include_dirs):
include_dirs = tuple(include_dirs)
resolved = []
@@ -450,7 +450,7 @@ def resolve_depends(depends, include_dirs):
resolved.append(path)
return resolved
-
+
@cached_function
def resolve_depend(depend, include_dirs):
if depend[0] == '<' and depend[-1] == '>':
@@ -461,16 +461,16 @@ def resolve_depend(depend, include_dirs):
return os.path.normpath(path)
return None
-
+
@cached_function
def package(filename):
dir = os.path.dirname(os.path.abspath(str(filename)))
- if dir != filename and is_package_dir(dir):
+ if dir != filename and is_package_dir(dir):
return package(dir) + (os.path.basename(dir),)
else:
return ()
-
+
@cached_function
def fully_qualified_name(filename):
module = os.path.splitext(os.path.basename(filename))[0]
@@ -479,10 +479,10 @@ def fully_qualified_name(filename):
@cached_function
def parse_dependencies(source_filename):
- # Actual parsing is way too slow, so we use regular expressions.
+ # Actual parsing is way too slow, so we use regular expressions.
# The only catch is that we must strip comments and string
# literals ahead of time.
- with Utils.open_source_file(source_filename, error_handling='ignore') as fh:
+ with Utils.open_source_file(source_filename, error_handling='ignore') as fh:
source = fh.read()
distutils_info = DistutilsInfo(source)
source, literals = strip_string_literals(source)
@@ -492,19 +492,19 @@ def parse_dependencies(source_filename):
cimports = []
includes = []
externs = []
- for m in dependency_regex.finditer(source):
- cimport_from, cimport_list, extern, include = m.groups()
+ for m in dependency_regex.finditer(source):
+ cimport_from, cimport_list, extern, include = m.groups()
if cimport_from:
cimports.append(cimport_from)
- m_after_from = dependency_after_from_regex.search(source, pos=m.end())
- if m_after_from:
- multiline, one_line = m_after_from.groups()
- subimports = multiline or one_line
- cimports.extend("{0}.{1}".format(cimport_from, s.strip())
- for s in subimports.split(','))
-
- elif cimport_list:
- cimports.extend(x.strip() for x in cimport_list.split(","))
+ m_after_from = dependency_after_from_regex.search(source, pos=m.end())
+ if m_after_from:
+ multiline, one_line = m_after_from.groups()
+ subimports = multiline or one_line
+ cimports.extend("{0}.{1}".format(cimport_from, s.strip())
+ for s in subimports.split(','))
+
+ elif cimport_list:
+ cimports.extend(x.strip() for x in cimport_list.split(","))
elif extern:
externs.append(literals[extern])
else:
@@ -520,8 +520,8 @@ class DependencyTree(object):
self._transitive_cache = {}
def parse_dependencies(self, source_filename):
- if path_exists(source_filename):
- source_filename = os.path.normpath(source_filename)
+ if path_exists(source_filename):
+ source_filename = os.path.normpath(source_filename)
return parse_dependencies(source_filename)
@cached_method
@@ -599,8 +599,8 @@ class DependencyTree(object):
pxd_list = [filename[:-4] + '.pxd']
else:
pxd_list = []
- # Cimports generates all possible combinations package.module
- # when imported as from package cimport module.
+ # Cimports generates all possible combinations package.module
+ # when imported as from package cimport module.
for module in self.cimports(filename):
if module[:7] == 'cython.' or module == 'cython':
continue
@@ -629,32 +629,32 @@ class DependencyTree(object):
def newest_dependency(self, filename):
return max([self.extract_timestamp(f) for f in self.all_dependencies(filename)])
- def transitive_fingerprint(self, filename, module, compilation_options):
- r"""
- Return a fingerprint of a cython file that is about to be cythonized.
-
- Fingerprints are looked up in future compilations. If the fingerprint
- is found, the cythonization can be skipped. The fingerprint must
- incorporate everything that has an influence on the generated code.
- """
+ def transitive_fingerprint(self, filename, module, compilation_options):
+ r"""
+ Return a fingerprint of a cython file that is about to be cythonized.
+
+ Fingerprints are looked up in future compilations. If the fingerprint
+ is found, the cythonization can be skipped. The fingerprint must
+ incorporate everything that has an influence on the generated code.
+ """
try:
m = hashlib.md5(__version__.encode('UTF-8'))
m.update(file_hash(filename).encode('UTF-8'))
for x in sorted(self.all_dependencies(filename)):
if os.path.splitext(x)[1] not in ('.c', '.cpp', '.h'):
m.update(file_hash(x).encode('UTF-8'))
- # Include the module attributes that change the compilation result
- # in the fingerprint. We do not iterate over module.__dict__ and
- # include almost everything here as users might extend Extension
- # with arbitrary (random) attributes that would lead to cache
- # misses.
- m.update(str((
- module.language,
- getattr(module, 'py_limited_api', False),
- getattr(module, 'np_pythran', False)
- )).encode('UTF-8'))
-
- m.update(compilation_options.get_fingerprint().encode('UTF-8'))
+ # Include the module attributes that change the compilation result
+ # in the fingerprint. We do not iterate over module.__dict__ and
+ # include almost everything here as users might extend Extension
+ # with arbitrary (random) attributes that would lead to cache
+ # misses.
+ m.update(str((
+ module.language,
+ getattr(module, 'py_limited_api', False),
+ getattr(module, 'np_pythran', False)
+ )).encode('UTF-8'))
+
+ m.update(compilation_options.get_fingerprint().encode('UTF-8'))
return m.hexdigest()
except IOError:
return None
@@ -719,9 +719,9 @@ class DependencyTree(object):
finally:
del stack[node]
-
+
_dep_tree = None
-
+
def create_dependency_tree(ctx=None, quiet=False):
global _dep_tree
if _dep_tree is None:
@@ -746,15 +746,15 @@ def default_create_extension(template, kwds):
# This may be useful for advanced users?
-def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=False, language=None,
- exclude_failures=False):
- if language is not None:
- print('Warning: passing language={0!r} to cythonize() is deprecated. '
- 'Instead, put "# distutils: language={0}" in your .pyx or .pxd file(s)'.format(language))
- if exclude is None:
- exclude = []
- if patterns is None:
- return [], {}
+def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=False, language=None,
+ exclude_failures=False):
+ if language is not None:
+ print('Warning: passing language={0!r} to cythonize() is deprecated. '
+ 'Instead, put "# distutils: language={0}" in your .pyx or .pxd file(s)'.format(language))
+ if exclude is None:
+ exclude = []
+ if patterns is None:
+ return [], {}
elif isinstance(patterns, basestring) or not isinstance(patterns, Iterable):
patterns = [patterns]
explicit_modules = set([m.name for m in patterns if isinstance(m, Extension)])
@@ -767,17 +767,17 @@ def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=
to_exclude.update(map(os.path.abspath, extended_iglob(pattern)))
module_list = []
- module_metadata = {}
-
- # workaround for setuptools
- if 'setuptools' in sys.modules:
- Extension_distutils = sys.modules['setuptools.extension']._Extension
- Extension_setuptools = sys.modules['setuptools'].Extension
- else:
- # dummy class, in case we do not have setuptools
- Extension_distutils = Extension
- class Extension_setuptools(Extension): pass
-
+ module_metadata = {}
+
+ # workaround for setuptools
+ if 'setuptools' in sys.modules:
+ Extension_distutils = sys.modules['setuptools.extension']._Extension
+ Extension_setuptools = sys.modules['setuptools'].Extension
+ else:
+ # dummy class, in case we do not have setuptools
+ Extension_distutils = Extension
+ class Extension_setuptools(Extension): pass
+
# if no create_extension() function is defined, use a simple
# default function.
create_extension = ctx.options.create_extension or default_create_extension
@@ -788,11 +788,11 @@ def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=
template = Extension(pattern, []) # Fake Extension without sources
name = '*'
base = None
- ext_language = language
- elif isinstance(pattern, (Extension_distutils, Extension_setuptools)):
- cython_sources = [s for s in pattern.sources
- if os.path.splitext(s)[1] in ('.py', '.pyx')]
- if cython_sources:
+ ext_language = language
+ elif isinstance(pattern, (Extension_distutils, Extension_setuptools)):
+ cython_sources = [s for s in pattern.sources
+ if os.path.splitext(s)[1] in ('.py', '.pyx')]
+ if cython_sources:
filepattern = cython_sources[0]
if len(cython_sources) > 1:
print("Warning: Multiple cython sources found for extension '%s': %s\n"
@@ -805,25 +805,25 @@ def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=
template = pattern
name = template.name
base = DistutilsInfo(exn=template)
- ext_language = None # do not override whatever the Extension says
+ ext_language = None # do not override whatever the Extension says
else:
- msg = str("pattern is not of type str nor subclass of Extension (%s)"
- " but of type %s and class %s" % (repr(Extension),
- type(pattern),
- pattern.__class__))
- raise TypeError(msg)
+ msg = str("pattern is not of type str nor subclass of Extension (%s)"
+ " but of type %s and class %s" % (repr(Extension),
+ type(pattern),
+ pattern.__class__))
+ raise TypeError(msg)
- for file in nonempty(sorted(extended_iglob(filepattern)), "'%s' doesn't match any files" % filepattern):
+ for file in nonempty(sorted(extended_iglob(filepattern)), "'%s' doesn't match any files" % filepattern):
if os.path.abspath(file) in to_exclude:
continue
- module_name = deps.fully_qualified_name(file)
+ module_name = deps.fully_qualified_name(file)
if '*' in name:
if module_name in explicit_modules:
continue
elif name:
module_name = name
- Utils.raise_error_if_module_name_forbidden(module_name)
+ Utils.raise_error_if_module_name_forbidden(module_name)
if module_name not in seen:
try:
@@ -848,9 +848,9 @@ def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=
sources.append(source)
kwds['sources'] = sources
- if ext_language and 'language' not in kwds:
- kwds['language'] = ext_language
-
+ if ext_language and 'language' not in kwds:
+ kwds['language'] = ext_language
+
np_pythran = kwds.pop('np_pythran', False)
# Create the new extension
@@ -864,7 +864,7 @@ def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=
# generated C file but otherwise has no purpose)
module_metadata[module_name] = metadata
- if file not in m.sources:
+ if file not in m.sources:
# Old setuptools unconditionally replaces .pyx with .c/.cpp
target_file = os.path.splitext(file)[0] + ('.cpp' if m.language == 'c++' else '.c')
try:
@@ -872,93 +872,93 @@ def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=
except ValueError:
# never seen this in the wild, but probably better to warn about this unexpected case
print("Warning: Cython source file not found in sources list, adding %s" % file)
- m.sources.insert(0, file)
+ m.sources.insert(0, file)
seen.add(name)
- return module_list, module_metadata
+ return module_list, module_metadata
# This is the user-exposed entry point.
-def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False, force=False, language=None,
+def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False, force=False, language=None,
exclude_failures=False, **options):
"""
Compile a set of source modules into C/C++ files and return a list of distutils
Extension objects for them.
- :param module_list: As module list, pass either a glob pattern, a list of glob
- patterns or a list of Extension objects. The latter
- allows you to configure the extensions separately
- through the normal distutils options.
- You can also pass Extension objects that have
- glob patterns as their sources. Then, cythonize
- will resolve the pattern and create a
- copy of the Extension for every matching file.
-
- :param exclude: When passing glob patterns as ``module_list``, you can exclude certain
- module names explicitly by passing them into the ``exclude`` option.
-
- :param nthreads: The number of concurrent builds for parallel compilation
- (requires the ``multiprocessing`` module).
-
- :param aliases: If you want to use compiler directives like ``# distutils: ...`` but
- can only know at compile time (when running the ``setup.py``) which values
- to use, you can use aliases and pass a dictionary mapping those aliases
- to Python strings when calling :func:`cythonize`. As an example, say you
- want to use the compiler
- directive ``# distutils: include_dirs = ../static_libs/include/``
- but this path isn't always fixed and you want to find it when running
- the ``setup.py``. You can then do ``# distutils: include_dirs = MY_HEADERS``,
- find the value of ``MY_HEADERS`` in the ``setup.py``, put it in a python
- variable called ``foo`` as a string, and then call
- ``cythonize(..., aliases={'MY_HEADERS': foo})``.
+ :param module_list: As module list, pass either a glob pattern, a list of glob
+ patterns or a list of Extension objects. The latter
+ allows you to configure the extensions separately
+ through the normal distutils options.
+ You can also pass Extension objects that have
+ glob patterns as their sources. Then, cythonize
+ will resolve the pattern and create a
+ copy of the Extension for every matching file.
+
+ :param exclude: When passing glob patterns as ``module_list``, you can exclude certain
+ module names explicitly by passing them into the ``exclude`` option.
+
+ :param nthreads: The number of concurrent builds for parallel compilation
+ (requires the ``multiprocessing`` module).
+
+ :param aliases: If you want to use compiler directives like ``# distutils: ...`` but
+ can only know at compile time (when running the ``setup.py``) which values
+ to use, you can use aliases and pass a dictionary mapping those aliases
+ to Python strings when calling :func:`cythonize`. As an example, say you
+ want to use the compiler
+ directive ``# distutils: include_dirs = ../static_libs/include/``
+ but this path isn't always fixed and you want to find it when running
+ the ``setup.py``. You can then do ``# distutils: include_dirs = MY_HEADERS``,
+ find the value of ``MY_HEADERS`` in the ``setup.py``, put it in a python
+ variable called ``foo`` as a string, and then call
+ ``cythonize(..., aliases={'MY_HEADERS': foo})``.
:param quiet: If True, Cython won't print error, warning, or status messages during the
compilation.
- :param force: Forces the recompilation of the Cython modules, even if the timestamps
- don't indicate that a recompilation is necessary.
-
- :param language: To globally enable C++ mode, you can pass ``language='c++'``. Otherwise, this
- will be determined at a per-file level based on compiler directives. This
- affects only modules found based on file names. Extension instances passed
- into :func:`cythonize` will not be changed. It is recommended to rather
- use the compiler directive ``# distutils: language = c++`` than this option.
-
- :param exclude_failures: For a broad 'try to compile' mode that ignores compilation
- failures and simply excludes the failed extensions,
- pass ``exclude_failures=True``. Note that this only
- really makes sense for compiling ``.py`` files which can also
- be used without compilation.
-
- :param annotate: If ``True``, will produce a HTML file for each of the ``.pyx`` or ``.py``
- files compiled. The HTML file gives an indication
- of how much Python interaction there is in
- each of the source code lines, compared to plain C code.
- It also allows you to see the C/C++ code
- generated for each line of Cython code. This report is invaluable when
- optimizing a function for speed,
- and for determining when to :ref:`release the GIL <nogil>`:
- in general, a ``nogil`` block may contain only "white" code.
- See examples in :ref:`determining_where_to_add_types` or
- :ref:`primes`.
-
- :param compiler_directives: Allow to set compiler directives in the ``setup.py`` like this:
- ``compiler_directives={'embedsignature': True}``.
- See :ref:`compiler-directives`.
+ :param force: Forces the recompilation of the Cython modules, even if the timestamps
+ don't indicate that a recompilation is necessary.
+
+ :param language: To globally enable C++ mode, you can pass ``language='c++'``. Otherwise, this
+ will be determined at a per-file level based on compiler directives. This
+ affects only modules found based on file names. Extension instances passed
+ into :func:`cythonize` will not be changed. It is recommended to rather
+ use the compiler directive ``# distutils: language = c++`` than this option.
+
+ :param exclude_failures: For a broad 'try to compile' mode that ignores compilation
+ failures and simply excludes the failed extensions,
+ pass ``exclude_failures=True``. Note that this only
+ really makes sense for compiling ``.py`` files which can also
+ be used without compilation.
+
+ :param annotate: If ``True``, will produce a HTML file for each of the ``.pyx`` or ``.py``
+ files compiled. The HTML file gives an indication
+ of how much Python interaction there is in
+ each of the source code lines, compared to plain C code.
+ It also allows you to see the C/C++ code
+ generated for each line of Cython code. This report is invaluable when
+ optimizing a function for speed,
+ and for determining when to :ref:`release the GIL <nogil>`:
+ in general, a ``nogil`` block may contain only "white" code.
+ See examples in :ref:`determining_where_to_add_types` or
+ :ref:`primes`.
+
+ :param compiler_directives: Allow to set compiler directives in the ``setup.py`` like this:
+ ``compiler_directives={'embedsignature': True}``.
+ See :ref:`compiler-directives`.
:param depfile: produce depfiles for the sources if True.
"""
- if exclude is None:
- exclude = []
+ if exclude is None:
+ exclude = []
if 'include_path' not in options:
options['include_path'] = ['.']
if 'common_utility_include_dir' in options:
- safe_makedirs(options['common_utility_include_dir'])
+ safe_makedirs(options['common_utility_include_dir'])
depfile = options.pop('depfile', None)
- if pythran is None:
- pythran_options = None
- else:
+ if pythran is None:
+ pythran_options = None
+ else:
pythran_options = CompilationOptions(**options)
pythran_options.cplus = True
pythran_options.np_pythran = True
@@ -967,13 +967,13 @@ def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False,
cpp_options = CompilationOptions(**options); cpp_options.cplus = True
ctx = c_options.create_context()
options = c_options
- module_list, module_metadata = create_extension_list(
+ module_list, module_metadata = create_extension_list(
module_list,
exclude=exclude,
ctx=ctx,
quiet=quiet,
exclude_failures=exclude_failures,
- language=language,
+ language=language,
aliases=aliases)
deps = create_dependency_tree(ctx, quiet=quiet)
build_dir = getattr(options, 'build_dir', None)
@@ -1021,11 +1021,11 @@ def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False,
# setup for out of place build directory if enabled
if build_dir:
- if os.path.isabs(c_file):
- warnings.warn("build_dir has no effect for absolute source paths")
+ if os.path.isabs(c_file):
+ warnings.warn("build_dir has no effect for absolute source paths")
c_file = os.path.join(build_dir, c_file)
dir = os.path.dirname(c_file)
- safe_makedirs_once(dir)
+ safe_makedirs_once(dir)
# write out the depfile, if requested
if depfile:
@@ -1066,8 +1066,8 @@ def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False,
print("Compiling %s because it changed." % source)
else:
print("Compiling %s because it depends on %s." % (source, dep))
- if not force and options.cache:
- fingerprint = deps.transitive_fingerprint(source, m, options)
+ if not force and options.cache:
+ fingerprint = deps.transitive_fingerprint(source, m, options)
else:
fingerprint = None
to_compile.append((
@@ -1082,19 +1082,19 @@ def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False,
copy_to_build_dir(source)
m.sources = new_sources
- if options.cache:
+ if options.cache:
if not os.path.exists(options.cache):
os.makedirs(options.cache)
to_compile.sort()
- # Drop "priority" component of "to_compile" entries and add a
- # simple progress indicator.
- N = len(to_compile)
- progress_fmt = "[{0:%d}/{1}] " % len(str(N))
- for i in range(N):
- progress = progress_fmt.format(i+1, N)
- to_compile[i] = to_compile[i][1:] + (progress,)
-
- if N <= 1:
+ # Drop "priority" component of "to_compile" entries and add a
+ # simple progress indicator.
+ N = len(to_compile)
+ progress_fmt = "[{0:%d}/{1}] " % len(str(N))
+ for i in range(N):
+ progress = progress_fmt.format(i+1, N)
+ to_compile[i] = to_compile[i][1:] + (progress,)
+
+ if N <= 1:
nthreads = 0
if nthreads:
# Requires multiprocessing (or Python >= 2.6)
@@ -1124,11 +1124,11 @@ def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False,
pool.join()
if not nthreads:
for args in to_compile:
- cythonize_one(*args)
+ cythonize_one(*args)
if exclude_failures:
failed_modules = set()
- for c_file, modules in modules_by_cfile.items():
+ for c_file, modules in modules_by_cfile.items():
if not os.path.exists(c_file):
failed_modules.update(modules)
elif os.path.getsize(c_file) < 200:
@@ -1145,7 +1145,7 @@ def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False,
print("Failed compilations: %s" % ', '.join(sorted([
module.name for module in failed_modules])))
- if options.cache:
+ if options.cache:
cleanup_cache(options.cache, getattr(options, 'cache_size', 1024 * 1024 * 100))
# cythonize() is often followed by the (non-Python-buffered)
# compiler output, flush now to avoid interleaving output.
@@ -1185,10 +1185,10 @@ if os.environ.get('XML_RESULTS'):
output.close()
return with_record
else:
- def record_results(func):
- return func
-
+ def record_results(func):
+ return func
+
# TODO: Share context? Issue: pyx processing leaks into pxd module
@record_results
def cythonize_one(pyx_file, c_file, fingerprint, quiet, options=None,
@@ -1202,38 +1202,38 @@ def cythonize_one(pyx_file, c_file, fingerprint, quiet, options=None,
safe_makedirs(options.cache)
# Cython-generated c files are highly compressible.
# (E.g. a compression ratio of about 10 for Sage).
- fingerprint_file_base = join_path(
- options.cache, "%s-%s" % (os.path.basename(c_file), fingerprint))
- gz_fingerprint_file = fingerprint_file_base + gzip_ext
- zip_fingerprint_file = fingerprint_file_base + '.zip'
- if os.path.exists(gz_fingerprint_file) or os.path.exists(zip_fingerprint_file):
+ fingerprint_file_base = join_path(
+ options.cache, "%s-%s" % (os.path.basename(c_file), fingerprint))
+ gz_fingerprint_file = fingerprint_file_base + gzip_ext
+ zip_fingerprint_file = fingerprint_file_base + '.zip'
+ if os.path.exists(gz_fingerprint_file) or os.path.exists(zip_fingerprint_file):
if not quiet:
- print("%sFound compiled %s in cache" % (progress, pyx_file))
- if os.path.exists(gz_fingerprint_file):
- os.utime(gz_fingerprint_file, None)
- with contextlib.closing(gzip_open(gz_fingerprint_file, 'rb')) as g:
- with contextlib.closing(open(c_file, 'wb')) as f:
- shutil.copyfileobj(g, f)
- else:
- os.utime(zip_fingerprint_file, None)
- dirname = os.path.dirname(c_file)
- with contextlib.closing(zipfile.ZipFile(zip_fingerprint_file)) as z:
- for artifact in z.namelist():
- z.extract(artifact, os.path.join(dirname, artifact))
+ print("%sFound compiled %s in cache" % (progress, pyx_file))
+ if os.path.exists(gz_fingerprint_file):
+ os.utime(gz_fingerprint_file, None)
+ with contextlib.closing(gzip_open(gz_fingerprint_file, 'rb')) as g:
+ with contextlib.closing(open(c_file, 'wb')) as f:
+ shutil.copyfileobj(g, f)
+ else:
+ os.utime(zip_fingerprint_file, None)
+ dirname = os.path.dirname(c_file)
+ with contextlib.closing(zipfile.ZipFile(zip_fingerprint_file)) as z:
+ for artifact in z.namelist():
+ z.extract(artifact, os.path.join(dirname, artifact))
return
if not quiet:
- print("%sCythonizing %s" % (progress, pyx_file))
+ print("%sCythonizing %s" % (progress, pyx_file))
if options is None:
options = CompilationOptions(default_options)
options.output_file = c_file
- options.embedded_metadata = embedded_metadata
+ options.embedded_metadata = embedded_metadata
any_failures = 0
try:
result = compile_single(pyx_file, options, full_module_name=full_module_name)
if result.num_errors > 0:
any_failures = 1
- except (EnvironmentError, PyrexError) as e:
+ except (EnvironmentError, PyrexError) as e:
sys.stderr.write('%s\n' % e)
any_failures = 1
# XXX
@@ -1251,27 +1251,27 @@ def cythonize_one(pyx_file, c_file, fingerprint, quiet, options=None,
elif os.path.exists(c_file):
os.remove(c_file)
elif fingerprint:
- artifacts = list(filter(None, [
- getattr(result, attr, None)
- for attr in ('c_file', 'h_file', 'api_file', 'i_file')]))
- if len(artifacts) == 1:
- fingerprint_file = gz_fingerprint_file
- with contextlib.closing(open(c_file, 'rb')) as f:
- with contextlib.closing(gzip_open(fingerprint_file + '.tmp', 'wb')) as g:
- shutil.copyfileobj(f, g)
- else:
- fingerprint_file = zip_fingerprint_file
- with contextlib.closing(zipfile.ZipFile(
- fingerprint_file + '.tmp', 'w', zipfile_compression_mode)) as zip:
- for artifact in artifacts:
- zip.write(artifact, os.path.basename(artifact))
- os.rename(fingerprint_file + '.tmp', fingerprint_file)
+ artifacts = list(filter(None, [
+ getattr(result, attr, None)
+ for attr in ('c_file', 'h_file', 'api_file', 'i_file')]))
+ if len(artifacts) == 1:
+ fingerprint_file = gz_fingerprint_file
+ with contextlib.closing(open(c_file, 'rb')) as f:
+ with contextlib.closing(gzip_open(fingerprint_file + '.tmp', 'wb')) as g:
+ shutil.copyfileobj(f, g)
+ else:
+ fingerprint_file = zip_fingerprint_file
+ with contextlib.closing(zipfile.ZipFile(
+ fingerprint_file + '.tmp', 'w', zipfile_compression_mode)) as zip:
+ for artifact in artifacts:
+ zip.write(artifact, os.path.basename(artifact))
+ os.rename(fingerprint_file + '.tmp', fingerprint_file)
def cythonize_one_helper(m):
import traceback
try:
- return cythonize_one(*m)
+ return cythonize_one(*m)
except Exception:
traceback.print_exc()
raise
diff --git a/contrib/tools/cython/Cython/Build/Distutils.py b/contrib/tools/cython/Cython/Build/Distutils.py
index 3efcc0d7b5..4008d21f52 100644
--- a/contrib/tools/cython/Cython/Build/Distutils.py
+++ b/contrib/tools/cython/Cython/Build/Distutils.py
@@ -1 +1 @@
-from Cython.Distutils.build_ext import build_ext
+from Cython.Distutils.build_ext import build_ext
diff --git a/contrib/tools/cython/Cython/Build/Inline.py b/contrib/tools/cython/Cython/Build/Inline.py
index db6d2640a5..cd48e49a70 100644
--- a/contrib/tools/cython/Cython/Build/Inline.py
+++ b/contrib/tools/cython/Cython/Build/Inline.py
@@ -15,19 +15,19 @@ from ..Compiler.Main import Context, default_options
from ..Compiler.Visitor import CythonTransform, EnvTransform
from ..Compiler.ParseTreeTransforms import SkipDeclarations
from ..Compiler.TreeFragment import parse_from_strings
-from ..Compiler.StringEncoding import _unicode
+from ..Compiler.StringEncoding import _unicode
from .Dependencies import strip_string_literals, cythonize, cached_function
from ..Compiler import Pipeline
from ..Utils import get_cython_cache_dir
import cython as cython_module
-
+
IS_PY3 = sys.version_info >= (3,)
# A utility function to convert user-supplied ASCII strings to unicode.
if not IS_PY3:
def to_unicode(s):
- if isinstance(s, bytes):
+ if isinstance(s, bytes):
return s.decode('ascii')
else:
return s
@@ -59,7 +59,7 @@ class UnboundSymbols(EnvTransform, SkipDeclarations):
super(UnboundSymbols, self).__call__(node)
return self.unbound
-
+
@cached_function
def unbound_symbols(code, context=None):
code = to_unicode(code)
@@ -77,9 +77,9 @@ def unbound_symbols(code, context=None):
import builtins
except ImportError:
import __builtin__ as builtins
- return tuple(UnboundSymbols()(tree) - set(dir(builtins)))
-
+ return tuple(UnboundSymbols()(tree) - set(dir(builtins)))
+
def unsafe_type(arg, context=None):
py_type = type(arg)
if py_type is int:
@@ -87,10 +87,10 @@ def unsafe_type(arg, context=None):
else:
return safe_type(arg, context)
-
+
def safe_type(arg, context=None):
py_type = type(arg)
- if py_type in (list, tuple, dict, str):
+ if py_type in (list, tuple, dict, str):
return py_type.__name__
elif py_type is complex:
return 'double complex'
@@ -101,7 +101,7 @@ def safe_type(arg, context=None):
elif 'numpy' in sys.modules and isinstance(arg, sys.modules['numpy'].ndarray):
return 'numpy.ndarray[numpy.%s_t, ndim=%s]' % (arg.dtype.name, arg.ndim)
else:
- for base_type in py_type.__mro__:
+ for base_type in py_type.__mro__:
if base_type.__module__ in ('__builtin__', 'builtins'):
return 'object'
module = context.find_module(base_type.__module__, need_pxd=False)
@@ -111,7 +111,7 @@ def safe_type(arg, context=None):
return '%s.%s' % (base_type.__module__, base_type.__name__)
return 'object'
-
+
def _get_build_extension():
dist = Distribution()
# Ensure the build respects distutils configuration by parsing
@@ -122,66 +122,66 @@ def _get_build_extension():
build_extension.finalize_options()
return build_extension
-
+
@cached_function
def _create_context(cython_include_dirs):
return Context(list(cython_include_dirs), default_options)
-
-_cython_inline_cache = {}
-_cython_inline_default_context = _create_context(('.',))
-
-
-def _populate_unbound(kwds, unbound_symbols, locals=None, globals=None):
- for symbol in unbound_symbols:
- if symbol not in kwds:
- if locals is None or globals is None:
- calling_frame = inspect.currentframe().f_back.f_back.f_back
- if locals is None:
- locals = calling_frame.f_locals
- if globals is None:
- globals = calling_frame.f_globals
- if symbol in locals:
- kwds[symbol] = locals[symbol]
- elif symbol in globals:
- kwds[symbol] = globals[symbol]
- else:
- print("Couldn't find %r" % symbol)
-
+
+_cython_inline_cache = {}
+_cython_inline_default_context = _create_context(('.',))
+
+
+def _populate_unbound(kwds, unbound_symbols, locals=None, globals=None):
+ for symbol in unbound_symbols:
+ if symbol not in kwds:
+ if locals is None or globals is None:
+ calling_frame = inspect.currentframe().f_back.f_back.f_back
+ if locals is None:
+ locals = calling_frame.f_locals
+ if globals is None:
+ globals = calling_frame.f_globals
+ if symbol in locals:
+ kwds[symbol] = locals[symbol]
+ elif symbol in globals:
+ kwds[symbol] = globals[symbol]
+ else:
+ print("Couldn't find %r" % symbol)
+
def _inline_key(orig_code, arg_sigs, language_level):
key = orig_code, arg_sigs, sys.version_info, sys.executable, language_level, Cython.__version__
return hashlib.sha1(_unicode(key).encode('utf-8')).hexdigest()
-def cython_inline(code, get_type=unsafe_type,
- lib_dir=os.path.join(get_cython_cache_dir(), 'inline'),
- cython_include_dirs=None, cython_compiler_directives=None,
- force=False, quiet=False, locals=None, globals=None, language_level=None, **kwds):
-
+def cython_inline(code, get_type=unsafe_type,
+ lib_dir=os.path.join(get_cython_cache_dir(), 'inline'),
+ cython_include_dirs=None, cython_compiler_directives=None,
+ force=False, quiet=False, locals=None, globals=None, language_level=None, **kwds):
+
if get_type is None:
get_type = lambda x: 'object'
- ctx = _create_context(tuple(cython_include_dirs)) if cython_include_dirs else _cython_inline_default_context
-
+ ctx = _create_context(tuple(cython_include_dirs)) if cython_include_dirs else _cython_inline_default_context
+
cython_compiler_directives = dict(cython_compiler_directives) if cython_compiler_directives else {}
if language_level is None and 'language_level' not in cython_compiler_directives:
language_level = '3str'
if language_level is not None:
cython_compiler_directives['language_level'] = language_level
- # Fast path if this has been called in this session.
- _unbound_symbols = _cython_inline_cache.get(code)
- if _unbound_symbols is not None:
- _populate_unbound(kwds, _unbound_symbols, locals, globals)
- args = sorted(kwds.items())
- arg_sigs = tuple([(get_type(value, ctx), arg) for arg, value in args])
+ # Fast path if this has been called in this session.
+ _unbound_symbols = _cython_inline_cache.get(code)
+ if _unbound_symbols is not None:
+ _populate_unbound(kwds, _unbound_symbols, locals, globals)
+ args = sorted(kwds.items())
+ arg_sigs = tuple([(get_type(value, ctx), arg) for arg, value in args])
key_hash = _inline_key(code, arg_sigs, language_level)
invoke = _cython_inline_cache.get((code, arg_sigs, key_hash))
- if invoke is not None:
- arg_list = [arg[1] for arg in args]
- return invoke(*arg_list)
-
- orig_code = code
+ if invoke is not None:
+ arg_list = [arg[1] for arg in args]
+ return invoke(*arg_list)
+
+ orig_code = code
code = to_unicode(code)
code, literals = strip_string_literals(code)
code = strip_common_indent(code)
@@ -190,19 +190,19 @@ def cython_inline(code, get_type=unsafe_type,
if globals is None:
globals = inspect.currentframe().f_back.f_back.f_globals
try:
- _cython_inline_cache[orig_code] = _unbound_symbols = unbound_symbols(code)
- _populate_unbound(kwds, _unbound_symbols, locals, globals)
+ _cython_inline_cache[orig_code] = _unbound_symbols = unbound_symbols(code)
+ _populate_unbound(kwds, _unbound_symbols, locals, globals)
except AssertionError:
if not quiet:
# Parsing from strings not fully supported (e.g. cimports).
print("Could not parse code as a string (to extract unbound symbols).")
-
+
cimports = []
- for name, arg in list(kwds.items()):
+ for name, arg in list(kwds.items()):
if arg is cython_module:
cimports.append('\ncimport cython as %s' % name)
del kwds[name]
- arg_names = sorted(kwds)
+ arg_names = sorted(kwds)
arg_sigs = tuple([(get_type(kwds[arg], ctx), arg) for arg in arg_names])
key_hash = _inline_key(orig_code, arg_sigs, language_level)
module_name = "_cython_inline_" + key_hash
@@ -261,11 +261,11 @@ def __invoke(%(params)s):
extra_compile_args = cflags)
if build_extension is None:
build_extension = _get_build_extension()
- build_extension.extensions = cythonize(
- [extension],
- include_path=cython_include_dirs or ['.'],
- compiler_directives=cython_compiler_directives,
- quiet=quiet)
+ build_extension.extensions = cythonize(
+ [extension],
+ include_path=cython_include_dirs or ['.'],
+ compiler_directives=cython_compiler_directives,
+ quiet=quiet)
build_extension.build_temp = os.path.dirname(pyx_file)
build_extension.build_lib = lib_dir
build_extension.run()
@@ -281,29 +281,29 @@ def __invoke(%(params)s):
# overridden with actual value upon the first cython_inline invocation
cython_inline.so_ext = None
-_find_non_space = re.compile('[^ ]').search
-
-
+_find_non_space = re.compile('[^ ]').search
+
+
def strip_common_indent(code):
min_indent = None
- lines = code.splitlines()
+ lines = code.splitlines()
for line in lines:
- match = _find_non_space(line)
+ match = _find_non_space(line)
if not match:
- continue # blank
+ continue # blank
indent = match.start()
if line[indent] == '#':
- continue # comment
- if min_indent is None or min_indent > indent:
+ continue # comment
+ if min_indent is None or min_indent > indent:
min_indent = indent
for ix, line in enumerate(lines):
- match = _find_non_space(line)
- if not match or not line or line[indent:indent+1] == '#':
+ match = _find_non_space(line)
+ if not match or not line or line[indent:indent+1] == '#':
continue
- lines[ix] = line[min_indent:]
+ lines[ix] = line[min_indent:]
return '\n'.join(lines)
-
+
module_statement = re.compile(r'^((cdef +(extern|class))|cimport|(from .+ cimport)|(from .+ import +[*]))')
def extract_func_code(code):
module = []
@@ -331,7 +331,7 @@ except ImportError:
all[varargs] = arg_values[len(args):]
for name, value in zip(args, arg_values):
all[name] = value
- for name, value in list(kwd_values.items()):
+ for name, value in list(kwd_values.items()):
if name in args:
if name in all:
raise TypeError("Duplicate argument %s" % name)
@@ -339,7 +339,7 @@ except ImportError:
if kwds is not None:
all[kwds] = kwd_values
elif kwd_values:
- raise TypeError("Unexpected keyword arguments: %s" % list(kwd_values))
+ raise TypeError("Unexpected keyword arguments: %s" % list(kwd_values))
if defaults is None:
defaults = ()
first_default = len(args) - len(defaults)
@@ -351,7 +351,7 @@ except ImportError:
raise TypeError("Missing argument: %s" % name)
return all
-
+
def get_body(source):
ix = source.index(':')
if source[:5] == 'lambda':
@@ -359,7 +359,7 @@ def get_body(source):
else:
return source[ix+1:]
-
+
# Lots to be done here... It would be especially cool if compiled functions
# could invoke each other quickly.
class RuntimeCompiledFunction(object):
@@ -370,7 +370,7 @@ class RuntimeCompiledFunction(object):
def __call__(self, *args, **kwds):
all = getcallargs(self._f, *args, **kwds)
- if IS_PY3:
- return cython_inline(self._body, locals=self._f.__globals__, globals=self._f.__globals__, **all)
- else:
- return cython_inline(self._body, locals=self._f.func_globals, globals=self._f.func_globals, **all)
+ if IS_PY3:
+ return cython_inline(self._body, locals=self._f.__globals__, globals=self._f.__globals__, **all)
+ else:
+ return cython_inline(self._body, locals=self._f.func_globals, globals=self._f.func_globals, **all)
diff --git a/contrib/tools/cython/Cython/Build/IpythonMagic.py b/contrib/tools/cython/Cython/Build/IpythonMagic.py
index 7abb97ec70..80bba08bfc 100644
--- a/contrib/tools/cython/Cython/Build/IpythonMagic.py
+++ b/contrib/tools/cython/Cython/Build/IpythonMagic.py
@@ -14,7 +14,7 @@ Magic command interface for interactive work with Cython
Usage
=====
-To enable the magics below, execute ``%load_ext cython``.
+To enable the magics below, execute ``%load_ext cython``.
``%%cython``
@@ -41,7 +41,7 @@ Parts of this code were taken from Cython.inline.
#
# Distributed under the terms of the Modified BSD License.
#
-# The full license is in the file ipython-COPYING.rst, distributed with this software.
+# The full license is in the file ipython-COPYING.rst, distributed with this software.
#-----------------------------------------------------------------------------
from __future__ import absolute_import, print_function
@@ -75,11 +75,11 @@ from distutils.command.build_ext import build_ext
from IPython.core import display
from IPython.core import magic_arguments
from IPython.core.magic import Magics, magics_class, cell_magic
-try:
- from IPython.paths import get_ipython_cache_dir
-except ImportError:
- # older IPython version
- from IPython.utils.path import get_ipython_cache_dir
+try:
+ from IPython.paths import get_ipython_cache_dir
+except ImportError:
+ # older IPython version
+ from IPython.utils.path import get_ipython_cache_dir
from IPython.utils.text import dedent
from ..Shadow import __version__ as cython_version
@@ -175,15 +175,15 @@ class CythonMagics(Magics):
f.write(cell)
if 'pyximport' not in sys.modules or not self._pyximport_installed:
import pyximport
- pyximport.install()
+ pyximport.install()
self._pyximport_installed = True
if module_name in self._reloads:
module = self._reloads[module_name]
- # Note: reloading extension modules is not actually supported
- # (requires PEP-489 reinitialisation support).
- # Don't know why this should ever have worked as it reads here.
- # All we really need to do is to update the globals below.
- #reload(module)
+ # Note: reloading extension modules is not actually supported
+ # (requires PEP-489 reinitialisation support).
+ # Don't know why this should ever have worked as it reads here.
+ # All we really need to do is to update the globals below.
+ #reload(module)
else:
__import__(module_name)
module = sys.modules[module_name]
@@ -200,14 +200,14 @@ class CythonMagics(Magics):
help="Output a C++ rather than C file."
)
@magic_arguments.argument(
- '-3', dest='language_level', action='store_const', const=3, default=None,
- help="Select Python 3 syntax."
- )
- @magic_arguments.argument(
- '-2', dest='language_level', action='store_const', const=2, default=None,
- help="Select Python 2 syntax."
- )
- @magic_arguments.argument(
+ '-3', dest='language_level', action='store_const', const=3, default=None,
+ help="Select Python 3 syntax."
+ )
+ @magic_arguments.argument(
+ '-2', dest='language_level', action='store_const', const=2, default=None,
+ help="Select Python 2 syntax."
+ )
+ @magic_arguments.argument(
'-f', '--force', action='store_true', default=False,
help="Force the compilation of a new module, even if the source has been "
"previously compiled."
@@ -233,7 +233,7 @@ class CythonMagics(Magics):
)
@magic_arguments.argument(
'-L', dest='library_dirs', metavar='dir', action='append', default=[],
- help="Add a path to the list of library directories (can be specified "
+ help="Add a path to the list of library directories (can be specified "
"multiple times)."
)
@magic_arguments.argument(
diff --git a/contrib/tools/cython/Cython/Build/Tests/TestCyCache.py b/contrib/tools/cython/Cython/Build/Tests/TestCyCache.py
index a3224b4175..a0ed3f389a 100644
--- a/contrib/tools/cython/Cython/Build/Tests/TestCyCache.py
+++ b/contrib/tools/cython/Cython/Build/Tests/TestCyCache.py
@@ -1,106 +1,106 @@
-import difflib
-import glob
-import gzip
-import os
-import tempfile
-
-import Cython.Build.Dependencies
-import Cython.Utils
-from Cython.TestUtils import CythonTest
-
-
-class TestCyCache(CythonTest):
-
- def setUp(self):
- CythonTest.setUp(self)
- self.temp_dir = tempfile.mkdtemp(
- prefix='cycache-test',
- dir='TEST_TMP' if os.path.isdir('TEST_TMP') else None)
- self.src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
- self.cache_dir = tempfile.mkdtemp(prefix='cache', dir=self.temp_dir)
-
- def cache_files(self, file_glob):
- return glob.glob(os.path.join(self.cache_dir, file_glob))
-
- def fresh_cythonize(self, *args, **kwargs):
- Cython.Utils.clear_function_caches()
- Cython.Build.Dependencies._dep_tree = None # discard method caches
- Cython.Build.Dependencies.cythonize(*args, **kwargs)
-
- def test_cycache_switch(self):
- content1 = 'value = 1\n'
- content2 = 'value = 2\n'
- a_pyx = os.path.join(self.src_dir, 'a.pyx')
- a_c = a_pyx[:-4] + '.c'
-
- open(a_pyx, 'w').write(content1)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- self.assertEqual(1, len(self.cache_files('a.c*')))
- a_contents1 = open(a_c).read()
- os.unlink(a_c)
-
- open(a_pyx, 'w').write(content2)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- a_contents2 = open(a_c).read()
- os.unlink(a_c)
-
- self.assertNotEqual(a_contents1, a_contents2, 'C file not changed!')
- self.assertEqual(2, len(self.cache_files('a.c*')))
-
- open(a_pyx, 'w').write(content1)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- self.assertEqual(2, len(self.cache_files('a.c*')))
- a_contents = open(a_c).read()
- self.assertEqual(
- a_contents, a_contents1,
- msg='\n'.join(list(difflib.unified_diff(
- a_contents.split('\n'), a_contents1.split('\n')))[:10]))
-
- def test_cycache_uses_cache(self):
- a_pyx = os.path.join(self.src_dir, 'a.pyx')
- a_c = a_pyx[:-4] + '.c'
- open(a_pyx, 'w').write('pass')
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- a_cache = os.path.join(self.cache_dir, os.listdir(self.cache_dir)[0])
- gzip.GzipFile(a_cache, 'wb').write('fake stuff'.encode('ascii'))
- os.unlink(a_c)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- a_contents = open(a_c).read()
- self.assertEqual(a_contents, 'fake stuff',
- 'Unexpected contents: %s...' % a_contents[:100])
-
- def test_multi_file_output(self):
- a_pyx = os.path.join(self.src_dir, 'a.pyx')
- a_c = a_pyx[:-4] + '.c'
- a_h = a_pyx[:-4] + '.h'
- a_api_h = a_pyx[:-4] + '_api.h'
- open(a_pyx, 'w').write('cdef public api int foo(int x): return x\n')
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- expected = [a_c, a_h, a_api_h]
- for output in expected:
- self.assertTrue(os.path.exists(output), output)
- os.unlink(output)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- for output in expected:
- self.assertTrue(os.path.exists(output), output)
-
- def test_options_invalidation(self):
- hash_pyx = os.path.join(self.src_dir, 'options.pyx')
- hash_c = hash_pyx[:-len('.pyx')] + '.c'
-
- open(hash_pyx, 'w').write('pass')
- self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False)
- self.assertEqual(1, len(self.cache_files('options.c*')))
-
- os.unlink(hash_c)
- self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=True)
- self.assertEqual(2, len(self.cache_files('options.c*')))
-
- os.unlink(hash_c)
- self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=False)
- self.assertEqual(2, len(self.cache_files('options.c*')))
-
- os.unlink(hash_c)
- self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=True)
- self.assertEqual(2, len(self.cache_files('options.c*')))
+import difflib
+import glob
+import gzip
+import os
+import tempfile
+
+import Cython.Build.Dependencies
+import Cython.Utils
+from Cython.TestUtils import CythonTest
+
+
+class TestCyCache(CythonTest):
+
+ def setUp(self):
+ CythonTest.setUp(self)
+ self.temp_dir = tempfile.mkdtemp(
+ prefix='cycache-test',
+ dir='TEST_TMP' if os.path.isdir('TEST_TMP') else None)
+ self.src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
+ self.cache_dir = tempfile.mkdtemp(prefix='cache', dir=self.temp_dir)
+
+ def cache_files(self, file_glob):
+ return glob.glob(os.path.join(self.cache_dir, file_glob))
+
+ def fresh_cythonize(self, *args, **kwargs):
+ Cython.Utils.clear_function_caches()
+ Cython.Build.Dependencies._dep_tree = None # discard method caches
+ Cython.Build.Dependencies.cythonize(*args, **kwargs)
+
+ def test_cycache_switch(self):
+ content1 = 'value = 1\n'
+ content2 = 'value = 2\n'
+ a_pyx = os.path.join(self.src_dir, 'a.pyx')
+ a_c = a_pyx[:-4] + '.c'
+
+ open(a_pyx, 'w').write(content1)
+ self.fresh_cythonize(a_pyx, cache=self.cache_dir)
+ self.fresh_cythonize(a_pyx, cache=self.cache_dir)
+ self.assertEqual(1, len(self.cache_files('a.c*')))
+ a_contents1 = open(a_c).read()
+ os.unlink(a_c)
+
+ open(a_pyx, 'w').write(content2)
+ self.fresh_cythonize(a_pyx, cache=self.cache_dir)
+ a_contents2 = open(a_c).read()
+ os.unlink(a_c)
+
+ self.assertNotEqual(a_contents1, a_contents2, 'C file not changed!')
+ self.assertEqual(2, len(self.cache_files('a.c*')))
+
+ open(a_pyx, 'w').write(content1)
+ self.fresh_cythonize(a_pyx, cache=self.cache_dir)
+ self.assertEqual(2, len(self.cache_files('a.c*')))
+ a_contents = open(a_c).read()
+ self.assertEqual(
+ a_contents, a_contents1,
+ msg='\n'.join(list(difflib.unified_diff(
+ a_contents.split('\n'), a_contents1.split('\n')))[:10]))
+
+ def test_cycache_uses_cache(self):
+ a_pyx = os.path.join(self.src_dir, 'a.pyx')
+ a_c = a_pyx[:-4] + '.c'
+ open(a_pyx, 'w').write('pass')
+ self.fresh_cythonize(a_pyx, cache=self.cache_dir)
+ a_cache = os.path.join(self.cache_dir, os.listdir(self.cache_dir)[0])
+ gzip.GzipFile(a_cache, 'wb').write('fake stuff'.encode('ascii'))
+ os.unlink(a_c)
+ self.fresh_cythonize(a_pyx, cache=self.cache_dir)
+ a_contents = open(a_c).read()
+ self.assertEqual(a_contents, 'fake stuff',
+ 'Unexpected contents: %s...' % a_contents[:100])
+
+ def test_multi_file_output(self):
+ a_pyx = os.path.join(self.src_dir, 'a.pyx')
+ a_c = a_pyx[:-4] + '.c'
+ a_h = a_pyx[:-4] + '.h'
+ a_api_h = a_pyx[:-4] + '_api.h'
+ open(a_pyx, 'w').write('cdef public api int foo(int x): return x\n')
+ self.fresh_cythonize(a_pyx, cache=self.cache_dir)
+ expected = [a_c, a_h, a_api_h]
+ for output in expected:
+ self.assertTrue(os.path.exists(output), output)
+ os.unlink(output)
+ self.fresh_cythonize(a_pyx, cache=self.cache_dir)
+ for output in expected:
+ self.assertTrue(os.path.exists(output), output)
+
+ def test_options_invalidation(self):
+ hash_pyx = os.path.join(self.src_dir, 'options.pyx')
+ hash_c = hash_pyx[:-len('.pyx')] + '.c'
+
+ open(hash_pyx, 'w').write('pass')
+ self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False)
+ self.assertEqual(1, len(self.cache_files('options.c*')))
+
+ os.unlink(hash_c)
+ self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=True)
+ self.assertEqual(2, len(self.cache_files('options.c*')))
+
+ os.unlink(hash_c)
+ self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=False)
+ self.assertEqual(2, len(self.cache_files('options.c*')))
+
+ os.unlink(hash_c)
+ self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=True)
+ self.assertEqual(2, len(self.cache_files('options.c*')))
diff --git a/contrib/tools/cython/Cython/Build/Tests/TestInline.py b/contrib/tools/cython/Cython/Build/Tests/TestInline.py
index d209488083..30fab094b5 100644
--- a/contrib/tools/cython/Cython/Build/Tests/TestInline.py
+++ b/contrib/tools/cython/Cython/Build/Tests/TestInline.py
@@ -17,8 +17,8 @@ class TestInline(CythonTest):
def setUp(self):
CythonTest.setUp(self)
self.test_kwds = dict(test_kwds)
- if os.path.isdir('TEST_TMP'):
- lib_dir = os.path.join('TEST_TMP','inline')
+ if os.path.isdir('TEST_TMP'):
+ lib_dir = os.path.join('TEST_TMP','inline')
else:
lib_dir = tempfile.mkdtemp(prefix='cython_inline_')
self.test_kwds['lib_dir'] = lib_dir
@@ -45,35 +45,35 @@ class TestInline(CythonTest):
a = 1
cdef double b = 2
cdef c = []
- """, **self.test_kwds), dict(a=1, b=2.0, c=[]))
+ """, **self.test_kwds), dict(a=1, b=2.0, c=[]))
def test_def_node(self):
- foo = inline("def foo(x): return x * x", **self.test_kwds)['foo']
+ foo = inline("def foo(x): return x * x", **self.test_kwds)['foo']
self.assertEqual(foo(7), 49)
- def test_class_ref(self):
- class Type(object):
- pass
- tp = inline("Type")['Type']
- self.assertEqual(tp, Type)
-
+ def test_class_ref(self):
+ class Type(object):
+ pass
+ tp = inline("Type")['Type']
+ self.assertEqual(tp, Type)
+
def test_pure(self):
import cython as cy
b = inline("""
b = cy.declare(float, a)
c = cy.declare(cy.pointer(cy.float), &b)
return b
- """, a=3, **self.test_kwds)
+ """, a=3, **self.test_kwds)
self.assertEqual(type(b), float)
- def test_compiler_directives(self):
- self.assertEqual(
- inline('return sum(x)',
- x=[1, 2, 3],
- cython_compiler_directives={'boundscheck': False}),
- 6
- )
-
+ def test_compiler_directives(self):
+ self.assertEqual(
+ inline('return sum(x)',
+ x=[1, 2, 3],
+ cython_compiler_directives={'boundscheck': False}),
+ 6
+ )
+
def test_lang_version(self):
# GH-3419. Caching for inline code didn't always respect compiler directives.
inline_divcode = "def f(int a, int b): return a/b"
diff --git a/contrib/tools/cython/Cython/Build/Tests/TestIpythonMagic.py b/contrib/tools/cython/Cython/Build/Tests/TestIpythonMagic.py
index 24213091b2..9d2e1531a5 100644
--- a/contrib/tools/cython/Cython/Build/Tests/TestIpythonMagic.py
+++ b/contrib/tools/cython/Cython/Build/Tests/TestIpythonMagic.py
@@ -29,24 +29,24 @@ except ImportError:
pass
code = u"""\
-def f(x):
+def f(x):
return 2*x
"""
cython3_code = u"""\
-def f(int x):
- return 2 / x
+def f(int x):
+ return 2 / x
-def call(x):
- return f(*(x,))
+def call(x):
+ return f(*(x,))
"""
-
+
pgo_cython3_code = cython3_code + u"""\
def main():
for _ in range(100): call(5)
main()
"""
-
+
if sys.platform == 'win32':
# not using IPython's decorators here because they depend on "nose"
@@ -114,34 +114,34 @@ class TestIPythonMagic(CythonTest):
ip.ex('import mymodule; g = mymodule.f(10)')
self.assertEqual(ip.user_ns['g'], 20.0)
- def test_cython_language_level(self):
- # The Cython cell defines the functions f() and call().
+ def test_cython_language_level(self):
+ # The Cython cell defines the functions f() and call().
ip = self._ip
- ip.run_cell_magic('cython', '', cython3_code)
- ip.ex('g = f(10); h = call(10)')
- if sys.version_info[0] < 3:
- self.assertEqual(ip.user_ns['g'], 2 // 10)
- self.assertEqual(ip.user_ns['h'], 2 // 10)
- else:
- self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
- self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
-
- def test_cython3(self):
- # The Cython cell defines the functions f() and call().
+ ip.run_cell_magic('cython', '', cython3_code)
+ ip.ex('g = f(10); h = call(10)')
+ if sys.version_info[0] < 3:
+ self.assertEqual(ip.user_ns['g'], 2 // 10)
+ self.assertEqual(ip.user_ns['h'], 2 // 10)
+ else:
+ self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
+ self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
+
+ def test_cython3(self):
+ # The Cython cell defines the functions f() and call().
ip = self._ip
- ip.run_cell_magic('cython', '-3', cython3_code)
- ip.ex('g = f(10); h = call(10)')
- self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
- self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
-
- def test_cython2(self):
- # The Cython cell defines the functions f() and call().
+ ip.run_cell_magic('cython', '-3', cython3_code)
+ ip.ex('g = f(10); h = call(10)')
+ self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
+ self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
+
+ def test_cython2(self):
+ # The Cython cell defines the functions f() and call().
ip = self._ip
- ip.run_cell_magic('cython', '-2', cython3_code)
- ip.ex('g = f(10); h = call(10)')
- self.assertEqual(ip.user_ns['g'], 2 // 10)
- self.assertEqual(ip.user_ns['h'], 2 // 10)
-
+ ip.run_cell_magic('cython', '-2', cython3_code)
+ ip.ex('g = f(10); h = call(10)')
+ self.assertEqual(ip.user_ns['g'], 2 // 10)
+ self.assertEqual(ip.user_ns['h'], 2 // 10)
+
@skip_win32('Skip on Windows')
def test_cython3_pgo(self):
# The Cython cell defines the functions f() and call().
diff --git a/contrib/tools/cython/Cython/Build/Tests/TestStripLiterals.py b/contrib/tools/cython/Cython/Build/Tests/TestStripLiterals.py
index a7572a5083..494a4e03b1 100644
--- a/contrib/tools/cython/Cython/Build/Tests/TestStripLiterals.py
+++ b/contrib/tools/cython/Cython/Build/Tests/TestStripLiterals.py
@@ -6,10 +6,10 @@ class TestStripLiterals(CythonTest):
def t(self, before, expected):
actual, literals = strip_string_literals(before, prefix="_L")
- self.assertEqual(expected, actual)
+ self.assertEqual(expected, actual)
for key, value in literals.items():
actual = actual.replace(key, value)
- self.assertEqual(before, actual)
+ self.assertEqual(before, actual)
def test_empty(self):
self.t("", "")
diff --git a/contrib/tools/cython/Cython/Build/__init__.py b/contrib/tools/cython/Cython/Build/__init__.py
index d6f3986597..38bc609706 100644
--- a/contrib/tools/cython/Cython/Build/__init__.py
+++ b/contrib/tools/cython/Cython/Build/__init__.py
@@ -1,2 +1,2 @@
from .Dependencies import cythonize
-from .Distutils import build_ext
+from .Distutils import build_ext
diff --git a/contrib/tools/cython/Cython/CodeWriter.py b/contrib/tools/cython/Cython/CodeWriter.py
index 2e4646a654..38caa36449 100644
--- a/contrib/tools/cython/Cython/CodeWriter.py
+++ b/contrib/tools/cython/Cython/CodeWriter.py
@@ -6,12 +6,12 @@ The output is in a strict format, no whitespace or comments from the input
is preserved (and it could not be as it is not present in the code tree).
"""
-from __future__ import absolute_import, print_function
-
-from .Compiler.Visitor import TreeVisitor
-from .Compiler.ExprNodes import *
-
+from __future__ import absolute_import, print_function
+from .Compiler.Visitor import TreeVisitor
+from .Compiler.ExprNodes import *
+
+
class LinesResult(object):
def __init__(self):
self.lines = []
@@ -32,7 +32,7 @@ class DeclarationWriter(TreeVisitor):
indent_string = u" "
- def __init__(self, result=None):
+ def __init__(self, result=None):
super(DeclarationWriter, self).__init__()
if result is None:
result = LinesResult()
@@ -51,7 +51,7 @@ class DeclarationWriter(TreeVisitor):
def dedent(self):
self.numindents -= 1
- def startline(self, s=u""):
+ def startline(self, s=u""):
self.result.put(self.indent_string * self.numindents + s)
def put(self, s):
@@ -60,7 +60,7 @@ class DeclarationWriter(TreeVisitor):
def putline(self, s):
self.result.putline(self.indent_string * self.numindents + s)
- def endline(self, s=u""):
+ def endline(self, s=u""):
self.result.putline(s)
def line(self, s):
@@ -500,7 +500,7 @@ class CodeWriter(DeclarationWriter):
class PxdWriter(DeclarationWriter):
def __call__(self, node):
- print(u'\n'.join(self.write(node).lines))
+ print(u'\n'.join(self.write(node).lines))
return node
def visit_CFuncDefNode(self, node):
diff --git a/contrib/tools/cython/Cython/Compiler/Annotate.py b/contrib/tools/cython/Cython/Compiler/Annotate.py
index 2ea38c00c7..c8a1d9be77 100644
--- a/contrib/tools/cython/Cython/Compiler/Annotate.py
+++ b/contrib/tools/cython/Cython/Compiler/Annotate.py
@@ -3,21 +3,21 @@
from __future__ import absolute_import
import os
-import os.path
+import os.path
import re
import codecs
import textwrap
-from datetime import datetime
-from functools import partial
-from collections import defaultdict
+from datetime import datetime
+from functools import partial
+from collections import defaultdict
try:
from xml.sax.saxutils import escape as html_escape
except ImportError:
pass
-try:
- from StringIO import StringIO
-except ImportError:
- from io import StringIO # does not support writing 'str' in Py2
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO # does not support writing 'str' in Py2
from . import Version
from .Code import CCodeWriter
@@ -27,23 +27,23 @@ from .. import Utils
class AnnotationCCodeWriter(CCodeWriter):
def __init__(self, create_from=None, buffer=None, copy_formatting=True):
- CCodeWriter.__init__(self, create_from, buffer, copy_formatting=copy_formatting)
+ CCodeWriter.__init__(self, create_from, buffer, copy_formatting=copy_formatting)
if create_from is None:
self.annotation_buffer = StringIO()
- self.last_annotated_pos = None
- # annotations[filename][line] -> [(column, AnnotationItem)*]
- self.annotations = defaultdict(partial(defaultdict, list))
- # code[filename][line] -> str
- self.code = defaultdict(partial(defaultdict, str))
- # scopes[filename][line] -> set(scopes)
- self.scopes = defaultdict(partial(defaultdict, set))
+ self.last_annotated_pos = None
+ # annotations[filename][line] -> [(column, AnnotationItem)*]
+ self.annotations = defaultdict(partial(defaultdict, list))
+ # code[filename][line] -> str
+ self.code = defaultdict(partial(defaultdict, str))
+ # scopes[filename][line] -> set(scopes)
+ self.scopes = defaultdict(partial(defaultdict, set))
else:
# When creating an insertion point, keep references to the same database
self.annotation_buffer = create_from.annotation_buffer
self.annotations = create_from.annotations
self.code = create_from.code
- self.scopes = create_from.scopes
- self.last_annotated_pos = create_from.last_annotated_pos
+ self.scopes = create_from.scopes
+ self.last_annotated_pos = create_from.last_annotated_pos
def create_new(self, create_from, buffer, copy_formatting):
return AnnotationCCodeWriter(create_from, buffer, copy_formatting)
@@ -52,54 +52,54 @@ class AnnotationCCodeWriter(CCodeWriter):
CCodeWriter.write(self, s)
self.annotation_buffer.write(s)
- def mark_pos(self, pos, trace=True):
+ def mark_pos(self, pos, trace=True):
if pos is not None:
- CCodeWriter.mark_pos(self, pos, trace)
- if self.funcstate and self.funcstate.scope:
- # lambdas and genexprs can result in multiple scopes per line => keep them in a set
- self.scopes[pos[0].filename][pos[1]].add(self.funcstate.scope)
- if self.last_annotated_pos:
- source_desc, line, _ = self.last_annotated_pos
- pos_code = self.code[source_desc.filename]
- pos_code[line] += self.annotation_buffer.getvalue()
+ CCodeWriter.mark_pos(self, pos, trace)
+ if self.funcstate and self.funcstate.scope:
+ # lambdas and genexprs can result in multiple scopes per line => keep them in a set
+ self.scopes[pos[0].filename][pos[1]].add(self.funcstate.scope)
+ if self.last_annotated_pos:
+ source_desc, line, _ = self.last_annotated_pos
+ pos_code = self.code[source_desc.filename]
+ pos_code[line] += self.annotation_buffer.getvalue()
self.annotation_buffer = StringIO()
- self.last_annotated_pos = pos
+ self.last_annotated_pos = pos
def annotate(self, pos, item):
- self.annotations[pos[0].filename][pos[1]].append((pos[2], item))
+ self.annotations[pos[0].filename][pos[1]].append((pos[2], item))
def _css(self):
"""css template will later allow to choose a colormap"""
css = [self._css_template]
for i in range(255):
color = u"FFFF%02x" % int(255/(1+i/10.0))
- css.append('.cython.score-%d {background-color: #%s;}' % (i, color))
+ css.append('.cython.score-%d {background-color: #%s;}' % (i, color))
try:
from pygments.formatters import HtmlFormatter
except ImportError:
pass
- else:
- css.append(HtmlFormatter().get_style_defs('.cython'))
- return '\n'.join(css)
+ else:
+ css.append(HtmlFormatter().get_style_defs('.cython'))
+ return '\n'.join(css)
_css_template = textwrap.dedent("""
body.cython { font-family: courier; font-size: 12; }
.cython.tag { }
.cython.line { margin: 0em }
- .cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }
-
- .cython.line .run { background-color: #B0FFB0; }
- .cython.line .mis { background-color: #FFB0B0; }
- .cython.code.run { border-left: 8px solid #B0FFB0; }
- .cython.code.mis { border-left: 8px solid #FFB0B0; }
+ .cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }
+ .cython.line .run { background-color: #B0FFB0; }
+ .cython.line .mis { background-color: #FFB0B0; }
+ .cython.code.run { border-left: 8px solid #B0FFB0; }
+ .cython.code.mis { border-left: 8px solid #FFB0B0; }
+
.cython.code .py_c_api { color: red; }
.cython.code .py_macro_api { color: #FF7000; }
.cython.code .pyx_c_api { color: #FF3000; }
.cython.code .pyx_macro_api { color: #FF7000; }
.cython.code .refnanny { color: #FFA000; }
- .cython.code .trace { color: #FFA000; }
+ .cython.code .trace { color: #FFA000; }
.cython.code .error_goto { color: #FFA000; }
.cython.code .coerce { color: #008000; border: 1px dotted #008000 }
@@ -117,22 +117,22 @@ class AnnotationCCodeWriter(CCodeWriter):
).replace(' ', '') # poor dev's JS minification
)
- def save_annotation(self, source_filename, target_filename, coverage_xml=None):
+ def save_annotation(self, source_filename, target_filename, coverage_xml=None):
with Utils.open_source_file(source_filename) as f:
code = f.read()
generated_code = self.code.get(source_filename, {})
c_file = Utils.decode_filename(os.path.basename(target_filename))
html_filename = os.path.splitext(target_filename)[0] + ".html"
-
+
with codecs.open(html_filename, "w", encoding="UTF-8") as out_buffer:
- out_buffer.write(self._save_annotation(code, generated_code, c_file, source_filename, coverage_xml))
-
- def _save_annotation_header(self, c_file, source_filename, coverage_timestamp=None):
- coverage_info = ''
- if coverage_timestamp:
- coverage_info = u' with coverage data from {timestamp}'.format(
- timestamp=datetime.fromtimestamp(int(coverage_timestamp) // 1000))
-
+ out_buffer.write(self._save_annotation(code, generated_code, c_file, source_filename, coverage_xml))
+
+ def _save_annotation_header(self, c_file, source_filename, coverage_timestamp=None):
+ coverage_info = ''
+ if coverage_timestamp:
+ coverage_info = u' with coverage data from {timestamp}'.format(
+ timestamp=datetime.fromtimestamp(int(coverage_timestamp) // 1000))
+
outlist = [
textwrap.dedent(u'''\
<!DOCTYPE html>
@@ -140,20 +140,20 @@ class AnnotationCCodeWriter(CCodeWriter):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Cython: {filename}</title>
+ <title>Cython: {filename}</title>
<style type="text/css">
{css}
</style>
</head>
<body class="cython">
- <p><span style="border-bottom: solid 1px grey;">Generated by Cython {watermark}</span>{more_info}</p>
- <p>
- <span style="background-color: #FFFF00">Yellow lines</span> hint at Python interaction.<br />
- Click on a line that starts with a "<code>+</code>" to see the C code that Cython generated for it.
- </p>
+ <p><span style="border-bottom: solid 1px grey;">Generated by Cython {watermark}</span>{more_info}</p>
+ <p>
+ <span style="background-color: #FFFF00">Yellow lines</span> hint at Python interaction.<br />
+ Click on a line that starts with a "<code>+</code>" to see the C code that Cython generated for it.
+ </p>
''').format(css=self._css(), watermark=Version.watermark,
- filename=os.path.basename(source_filename) if source_filename else '',
- more_info=coverage_info)
+ filename=os.path.basename(source_filename) if source_filename else '',
+ more_info=coverage_info)
]
if c_file:
outlist.append(u'<p>Raw output: <a href="%s">%s</a></p>\n' % (c_file, c_file))
@@ -162,45 +162,45 @@ class AnnotationCCodeWriter(CCodeWriter):
def _save_annotation_footer(self):
return (u'</body></html>\n',)
- def _save_annotation(self, code, generated_code, c_file=None, source_filename=None, coverage_xml=None):
+ def _save_annotation(self, code, generated_code, c_file=None, source_filename=None, coverage_xml=None):
"""
lines : original cython source code split by lines
generated_code : generated c code keyed by line number in original file
target filename : name of the file in which to store the generated html
c_file : filename in which the c_code has been written
"""
- if coverage_xml is not None and source_filename:
- coverage_timestamp = coverage_xml.get('timestamp', '').strip()
- covered_lines = self._get_line_coverage(coverage_xml, source_filename)
- else:
- coverage_timestamp = covered_lines = None
- annotation_items = dict(self.annotations[source_filename])
- scopes = dict(self.scopes[source_filename])
-
+ if coverage_xml is not None and source_filename:
+ coverage_timestamp = coverage_xml.get('timestamp', '').strip()
+ covered_lines = self._get_line_coverage(coverage_xml, source_filename)
+ else:
+ coverage_timestamp = covered_lines = None
+ annotation_items = dict(self.annotations[source_filename])
+ scopes = dict(self.scopes[source_filename])
+
outlist = []
- outlist.extend(self._save_annotation_header(c_file, source_filename, coverage_timestamp))
- outlist.extend(self._save_annotation_body(code, generated_code, annotation_items, scopes, covered_lines))
+ outlist.extend(self._save_annotation_header(c_file, source_filename, coverage_timestamp))
+ outlist.extend(self._save_annotation_body(code, generated_code, annotation_items, scopes, covered_lines))
outlist.extend(self._save_annotation_footer())
return ''.join(outlist)
- def _get_line_coverage(self, coverage_xml, source_filename):
- coverage_data = None
- for entry in coverage_xml.iterfind('.//class'):
- if not entry.get('filename'):
- continue
- if (entry.get('filename') == source_filename or
- os.path.abspath(entry.get('filename')) == source_filename):
- coverage_data = entry
- break
- elif source_filename.endswith(entry.get('filename')):
- coverage_data = entry # but we might still find a better match...
- if coverage_data is None:
- return None
- return dict(
- (int(line.get('number')), int(line.get('hits')))
- for line in coverage_data.iterfind('lines/line')
- )
-
+ def _get_line_coverage(self, coverage_xml, source_filename):
+ coverage_data = None
+ for entry in coverage_xml.iterfind('.//class'):
+ if not entry.get('filename'):
+ continue
+ if (entry.get('filename') == source_filename or
+ os.path.abspath(entry.get('filename')) == source_filename):
+ coverage_data = entry
+ break
+ elif source_filename.endswith(entry.get('filename')):
+ coverage_data = entry # but we might still find a better match...
+ if coverage_data is None:
+ return None
+ return dict(
+ (int(line.get('number')), int(line.get('hits')))
+ for line in coverage_data.iterfind('lines/line')
+ )
+
def _htmlify_code(self, code):
try:
from pygments import highlight
@@ -215,12 +215,12 @@ class AnnotationCCodeWriter(CCodeWriter):
HtmlFormatter(nowrap=True))
return html_code
- def _save_annotation_body(self, cython_code, generated_code, annotation_items, scopes, covered_lines=None):
+ def _save_annotation_body(self, cython_code, generated_code, annotation_items, scopes, covered_lines=None):
outlist = [u'<div class="cython">']
pos_comment_marker = u'/* \N{HORIZONTAL ELLIPSIS} */\n'
new_calls_map = dict(
(name, 0) for name in
- 'refnanny trace py_macro_api py_c_api pyx_macro_api pyx_c_api error_goto'.split()
+ 'refnanny trace py_macro_api py_c_api pyx_macro_api pyx_c_api error_goto'.split()
).copy
self.mark_pos(None)
@@ -228,13 +228,13 @@ class AnnotationCCodeWriter(CCodeWriter):
def annotate(match):
group_name = match.lastgroup
calls[group_name] += 1
- return u"<span class='%s'>%s</span>" % (
+ return u"<span class='%s'>%s</span>" % (
group_name, match.group(group_name))
lines = self._htmlify_code(cython_code).splitlines()
lineno_width = len(str(len(lines)))
- if not covered_lines:
- covered_lines = None
+ if not covered_lines:
+ covered_lines = None
for k, line in enumerate(lines, 1):
try:
@@ -259,48 +259,48 @@ class AnnotationCCodeWriter(CCodeWriter):
onclick = ''
expandsymbol = '&#xA0;'
- covered = ''
- if covered_lines is not None and k in covered_lines:
- hits = covered_lines[k]
- if hits is not None:
- covered = 'run' if hits else 'mis'
-
+ covered = ''
+ if covered_lines is not None and k in covered_lines:
+ hits = covered_lines[k]
+ if hits is not None:
+ covered = 'run' if hits else 'mis'
+
outlist.append(
- u'<pre class="cython line score-{score}"{onclick}>'
+ u'<pre class="cython line score-{score}"{onclick}>'
# generate line number with expand symbol in front,
# and the right number of digit
- u'{expandsymbol}<span class="{covered}">{line:0{lineno_width}d}</span>: {code}</pre>\n'.format(
+ u'{expandsymbol}<span class="{covered}">{line:0{lineno_width}d}</span>: {code}</pre>\n'.format(
score=score,
expandsymbol=expandsymbol,
- covered=covered,
+ covered=covered,
lineno_width=lineno_width,
line=k,
code=line.rstrip(),
onclick=onclick,
))
if c_code:
- outlist.append(u"<pre class='cython code score-{score} {covered}'>{code}</pre>".format(
- score=score, covered=covered, code=c_code))
+ outlist.append(u"<pre class='cython code score-{score} {covered}'>{code}</pre>".format(
+ score=score, covered=covered, code=c_code))
outlist.append(u"</div>")
return outlist
-_parse_code = re.compile((
- br'(?P<refnanny>__Pyx_X?(?:GOT|GIVE)REF|__Pyx_RefNanny[A-Za-z]+)|'
- br'(?P<trace>__Pyx_Trace[A-Za-z]+)|'
- br'(?:'
- br'(?P<pyx_macro_api>__Pyx_[A-Z][A-Z_]+)|'
- br'(?P<pyx_c_api>(?:__Pyx_[A-Z][a-z_][A-Za-z_]*)|__pyx_convert_[A-Za-z_]*)|'
- br'(?P<py_macro_api>Py[A-Z][a-z]+_[A-Z][A-Z_]+)|'
- br'(?P<py_c_api>Py[A-Z][a-z]+_[A-Z][a-z][A-Za-z_]*)'
- br')(?=\()|' # look-ahead to exclude subsequent '(' from replacement
+_parse_code = re.compile((
+ br'(?P<refnanny>__Pyx_X?(?:GOT|GIVE)REF|__Pyx_RefNanny[A-Za-z]+)|'
+ br'(?P<trace>__Pyx_Trace[A-Za-z]+)|'
+ br'(?:'
+ br'(?P<pyx_macro_api>__Pyx_[A-Z][A-Z_]+)|'
+ br'(?P<pyx_c_api>(?:__Pyx_[A-Z][a-z_][A-Za-z_]*)|__pyx_convert_[A-Za-z_]*)|'
+ br'(?P<py_macro_api>Py[A-Z][a-z]+_[A-Z][A-Z_]+)|'
+ br'(?P<py_c_api>Py[A-Z][a-z]+_[A-Z][a-z][A-Za-z_]*)'
+ br')(?=\()|' # look-ahead to exclude subsequent '(' from replacement
br'(?P<error_goto>(?:(?<=;) *if [^;]* +)?__PYX_ERR\([^)]+\))'
-).decode('ascii')).sub
+).decode('ascii')).sub
_replace_pos_comment = re.compile(
# this matches what Cython generates as code line marker comment
- br'^\s*/\*(?:(?:[^*]|\*[^/])*\n)+\s*\*/\s*\n'.decode('ascii'),
+ br'^\s*/\*(?:(?:[^*]|\*[^/])*\n)+\s*\*/\s*\n'.decode('ascii'),
re.M
).sub
diff --git a/contrib/tools/cython/Cython/Compiler/AutoDocTransforms.py b/contrib/tools/cython/Cython/Compiler/AutoDocTransforms.py
index d3c0a1d0da..321bac6fba 100644
--- a/contrib/tools/cython/Cython/Compiler/AutoDocTransforms.py
+++ b/contrib/tools/cython/Cython/Compiler/AutoDocTransforms.py
@@ -167,7 +167,7 @@ class EmbedSignature(CythonTransform):
old_doc = node.py_func.entry.doc
else:
old_doc = None
- new_doc = self._embed_signature(signature, old_doc)
+ new_doc = self._embed_signature(signature, old_doc)
doc_holder.doc = EncodedString(new_doc)
if not is_constructor and getattr(node, 'py_func', None) is not None:
node.py_func.entry.doc = EncodedString(new_doc)
diff --git a/contrib/tools/cython/Cython/Compiler/Buffer.py b/contrib/tools/cython/Cython/Compiler/Buffer.py
index c62a24f568..7c9a13fcea 100644
--- a/contrib/tools/cython/Cython/Compiler/Buffer.py
+++ b/contrib/tools/cython/Cython/Compiler/Buffer.py
@@ -47,22 +47,22 @@ class IntroduceBufferAuxiliaryVars(CythonTransform):
# For all buffers, insert extra variables in the scope.
# The variables are also accessible from the buffer_info
# on the buffer entry
- scope_items = scope.entries.items()
- bufvars = [entry for name, entry in scope_items if entry.type.is_buffer]
+ scope_items = scope.entries.items()
+ bufvars = [entry for name, entry in scope_items if entry.type.is_buffer]
if len(bufvars) > 0:
bufvars.sort(key=lambda entry: entry.name)
self.buffers_exists = True
- memviewslicevars = [entry for name, entry in scope_items if entry.type.is_memoryviewslice]
+ memviewslicevars = [entry for name, entry in scope_items if entry.type.is_memoryviewslice]
if len(memviewslicevars) > 0:
self.buffers_exists = True
- for (name, entry) in scope_items:
+ for (name, entry) in scope_items:
if name == 'memoryview' and isinstance(entry.utility_code_definition, CythonUtilityCode):
self.using_memoryview = True
break
- del scope_items
+ del scope_items
if isinstance(node, ModuleNode) and len(bufvars) > 0:
# for now...note that pos is wrong
@@ -138,14 +138,14 @@ def analyse_buffer_options(globalpos, env, posargs, dictargs, defaults=None, nee
if defaults is None:
defaults = buffer_defaults
- posargs, dictargs = Interpreter.interpret_compiletime_options(
- posargs, dictargs, type_env=env, type_args=(0, 'dtype'))
+ posargs, dictargs = Interpreter.interpret_compiletime_options(
+ posargs, dictargs, type_env=env, type_args=(0, 'dtype'))
if len(posargs) > buffer_positional_options_count:
raise CompileError(posargs[-1][1], ERR_BUF_TOO_MANY)
options = {}
- for name, (value, pos) in dictargs.items():
+ for name, (value, pos) in dictargs.items():
if not name in buffer_options:
raise CompileError(pos, ERR_BUF_OPTION_UNKNOWN % name)
options[name] = value
@@ -199,14 +199,14 @@ class BufferEntry(object):
self.type = entry.type
self.cname = entry.buffer_aux.buflocal_nd_var.cname
self.buf_ptr = "%s.rcbuffer->pybuffer.buf" % self.cname
- self.buf_ptr_type = entry.type.buffer_ptr_type
- self.init_attributes()
-
- def init_attributes(self):
- self.shape = self.get_buf_shapevars()
- self.strides = self.get_buf_stridevars()
- self.suboffsets = self.get_buf_suboffsetvars()
-
+ self.buf_ptr_type = entry.type.buffer_ptr_type
+ self.init_attributes()
+
+ def init_attributes(self):
+ self.shape = self.get_buf_shapevars()
+ self.strides = self.get_buf_stridevars()
+ self.suboffsets = self.get_buf_suboffsetvars()
+
def get_buf_suboffsetvars(self):
return self._for_all_ndim("%s.diminfo[%d].suboffsets")
@@ -258,7 +258,7 @@ class BufferEntry(object):
defcode = code.globalstate['utility_code_def']
funcgen(protocode, defcode, name=funcname, nd=nd)
- buf_ptr_type_code = self.buf_ptr_type.empty_declaration_code()
+ buf_ptr_type_code = self.buf_ptr_type.empty_declaration_code()
ptrcode = "%s(%s, %s, %s)" % (funcname, buf_ptr_type_code, self.buf_ptr,
", ".join(params))
return ptrcode
@@ -421,7 +421,7 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buf_entry,
code.putln("}") # Release stack
-
+
def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives,
pos, code, negative_indices, in_nogil_context):
"""
@@ -442,21 +442,21 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives,
if directives['boundscheck']:
# Check bounds and fix negative indices.
# We allocate a temporary which is initialized to -1, meaning OK (!).
- # If an error occurs, the temp is set to the index dimension the
- # error is occurring at.
- failed_dim_temp = code.funcstate.allocate_temp(PyrexTypes.c_int_type, manage_ref=False)
- code.putln("%s = -1;" % failed_dim_temp)
- for dim, (signed, cname, shape) in enumerate(zip(index_signeds, index_cnames, entry.get_buf_shapevars())):
+ # If an error occurs, the temp is set to the index dimension the
+ # error is occurring at.
+ failed_dim_temp = code.funcstate.allocate_temp(PyrexTypes.c_int_type, manage_ref=False)
+ code.putln("%s = -1;" % failed_dim_temp)
+ for dim, (signed, cname, shape) in enumerate(zip(index_signeds, index_cnames, entry.get_buf_shapevars())):
if signed != 0:
# not unsigned, deal with negative index
code.putln("if (%s < 0) {" % cname)
if negative_indices:
code.putln("%s += %s;" % (cname, shape))
code.putln("if (%s) %s = %d;" % (
- code.unlikely("%s < 0" % cname),
- failed_dim_temp, dim))
+ code.unlikely("%s < 0" % cname),
+ failed_dim_temp, dim))
else:
- code.putln("%s = %d;" % (failed_dim_temp, dim))
+ code.putln("%s = %d;" % (failed_dim_temp, dim))
code.put("} else ")
# check bounds in positive direction
if signed != 0:
@@ -465,7 +465,7 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives,
cast = "(size_t)"
code.putln("if (%s) %s = %d;" % (
code.unlikely("%s >= %s%s" % (cname, cast, shape)),
- failed_dim_temp, dim))
+ failed_dim_temp, dim))
if in_nogil_context:
code.globalstate.use_utility_code(raise_indexerror_nogil)
@@ -474,14 +474,14 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives,
code.globalstate.use_utility_code(raise_indexerror_code)
func = '__Pyx_RaiseBufferIndexError'
- code.putln("if (%s) {" % code.unlikely("%s != -1" % failed_dim_temp))
- code.putln('%s(%s);' % (func, failed_dim_temp))
+ code.putln("if (%s) {" % code.unlikely("%s != -1" % failed_dim_temp))
+ code.putln('%s(%s);' % (func, failed_dim_temp))
code.putln(code.error_goto(pos))
code.putln('}')
- code.funcstate.release_temp(failed_dim_temp)
+ code.funcstate.release_temp(failed_dim_temp)
elif negative_indices:
# Only fix negative indices.
- for signed, cname, shape in zip(index_signeds, index_cnames, entry.get_buf_shapevars()):
+ for signed, cname, shape in zip(index_signeds, index_cnames, entry.get_buf_shapevars()):
if signed != 0:
code.putln("if (%s < 0) %s += %s;" % (cname, cname, shape))
@@ -571,14 +571,14 @@ class GetAndReleaseBufferUtilityCode(object):
def __hash__(self):
return 24342342
- def get_tree(self, **kwargs): pass
+ def get_tree(self, **kwargs): pass
def put_code(self, output):
code = output['utility_code_def']
proto_code = output['utility_code_proto']
env = output.module_node.scope
cython_scope = env.context.cython_scope
-
+
# Search all types for __getbuffer__ overloads
types = []
visited_scopes = set()
@@ -628,7 +628,7 @@ def mangle_dtype_name(dtype):
prefix = "nn_"
else:
prefix = ""
- return prefix + dtype.specialization_name()
+ return prefix + dtype.specialization_name()
def get_type_information_cname(code, dtype, maxdepth=None):
"""
@@ -664,7 +664,7 @@ def get_type_information_cname(code, dtype, maxdepth=None):
complex_possible = dtype.is_struct_or_union and dtype.can_be_complex()
- declcode = dtype.empty_declaration_code()
+ declcode = dtype.empty_declaration_code()
if dtype.is_simple_buffer_dtype():
structinfo_name = "NULL"
elif dtype.is_struct:
@@ -679,7 +679,7 @@ def get_type_information_cname(code, dtype, maxdepth=None):
typecode.putln("static __Pyx_StructField %s[] = {" % structinfo_name, safe=True)
for f, typeinfo in zip(fields, types):
typecode.putln(' {&%s, "%s", offsetof(%s, %s)},' %
- (typeinfo, f.name, dtype.empty_declaration_code(), f.cname), safe=True)
+ (typeinfo, f.name, dtype.empty_declaration_code(), f.cname), safe=True)
typecode.putln(' {NULL, NULL, 0}', safe=True)
typecode.putln("};", safe=True)
else:
diff --git a/contrib/tools/cython/Cython/Compiler/Builtin.py b/contrib/tools/cython/Cython/Compiler/Builtin.py
index 5fa717507d..32cb3e0e91 100644
--- a/contrib/tools/cython/Cython/Compiler/Builtin.py
+++ b/contrib/tools/cython/Cython/Compiler/Builtin.py
@@ -124,12 +124,12 @@ builtin_function_table = [
PyrexTypes.c_double_complex_type,
PyrexTypes.c_longdouble_complex_type)
) + [
- BuiltinFunction('abs', "O", "O", "__Pyx_PyNumber_Absolute",
- utility_code=UtilityCode.load("py_abs", "Builtins.c")),
- #('all', "", "", ""),
- #('any', "", "", ""),
- #('ascii', "", "", ""),
- #('bin', "", "", ""),
+ BuiltinFunction('abs', "O", "O", "__Pyx_PyNumber_Absolute",
+ utility_code=UtilityCode.load("py_abs", "Builtins.c")),
+ #('all', "", "", ""),
+ #('any', "", "", ""),
+ #('ascii', "", "", ""),
+ #('bin', "", "", ""),
BuiltinFunction('callable', "O", "b", "__Pyx_PyCallable_Check",
utility_code = UtilityCode.load("CallableCheck", "ObjectHandling.c")),
#('chr', "", "", ""),
@@ -176,26 +176,26 @@ builtin_function_table = [
utility_code = iter_next_utility_code), # not available in Py2 => implemented here
#('oct', "", "", ""),
#('open', "ss", "O", "PyFile_FromString"), # not in Py3
-] + [
- BuiltinFunction('ord', None, None, "__Pyx_long_cast",
- func_type=PyrexTypes.CFuncType(
- PyrexTypes.c_long_type, [PyrexTypes.CFuncTypeArg("c", c_type, None)],
- is_strict_signature=True))
- for c_type in [PyrexTypes.c_py_ucs4_type, PyrexTypes.c_py_unicode_type]
-] + [
- BuiltinFunction('ord', None, None, "__Pyx_uchar_cast",
- func_type=PyrexTypes.CFuncType(
- PyrexTypes.c_uchar_type, [PyrexTypes.CFuncTypeArg("c", c_type, None)],
- is_strict_signature=True))
- for c_type in [PyrexTypes.c_char_type, PyrexTypes.c_schar_type, PyrexTypes.c_uchar_type]
-] + [
- BuiltinFunction('ord', None, None, "__Pyx_PyObject_Ord",
- utility_code=UtilityCode.load_cached("object_ord", "Builtins.c"),
- func_type=PyrexTypes.CFuncType(
- PyrexTypes.c_long_type, [
- PyrexTypes.CFuncTypeArg("c", PyrexTypes.py_object_type, None)
- ],
- exception_value="(long)(Py_UCS4)-1")),
+] + [
+ BuiltinFunction('ord', None, None, "__Pyx_long_cast",
+ func_type=PyrexTypes.CFuncType(
+ PyrexTypes.c_long_type, [PyrexTypes.CFuncTypeArg("c", c_type, None)],
+ is_strict_signature=True))
+ for c_type in [PyrexTypes.c_py_ucs4_type, PyrexTypes.c_py_unicode_type]
+] + [
+ BuiltinFunction('ord', None, None, "__Pyx_uchar_cast",
+ func_type=PyrexTypes.CFuncType(
+ PyrexTypes.c_uchar_type, [PyrexTypes.CFuncTypeArg("c", c_type, None)],
+ is_strict_signature=True))
+ for c_type in [PyrexTypes.c_char_type, PyrexTypes.c_schar_type, PyrexTypes.c_uchar_type]
+] + [
+ BuiltinFunction('ord', None, None, "__Pyx_PyObject_Ord",
+ utility_code=UtilityCode.load_cached("object_ord", "Builtins.c"),
+ func_type=PyrexTypes.CFuncType(
+ PyrexTypes.c_long_type, [
+ PyrexTypes.CFuncTypeArg("c", PyrexTypes.py_object_type, None)
+ ],
+ exception_value="(long)(Py_UCS4)-1")),
BuiltinFunction('pow', "OOO", "O", "PyNumber_Power"),
BuiltinFunction('pow', "OO", "O", "__Pyx_PyNumber_Power2",
utility_code = UtilityCode.load("pow2", "Builtins.c")),
@@ -207,7 +207,7 @@ builtin_function_table = [
#('round', "", "", ""),
BuiltinFunction('setattr', "OOO", "r", "PyObject_SetAttr"),
#('sum', "", "", ""),
- #('sorted', "", "", ""),
+ #('sorted', "", "", ""),
#('type', "O", "O", "PyObject_Type"),
#('unichr', "", "", ""),
#('unicode', "", "", ""),
@@ -219,10 +219,10 @@ builtin_function_table = [
# Put in namespace append optimization.
BuiltinFunction('__Pyx_PyObject_Append', "OO", "O", "__Pyx_PyObject_Append"),
-
- # This is conditionally looked up based on a compiler directive.
- BuiltinFunction('__Pyx_Globals', "", "O", "__Pyx_Globals",
- utility_code=globals_utility_code),
+
+ # This is conditionally looked up based on a compiler directive.
+ BuiltinFunction('__Pyx_Globals', "", "O", "__Pyx_Globals",
+ utility_code=globals_utility_code),
]
@@ -339,7 +339,7 @@ builtin_types_table = [
BuiltinMethod("add", "TO", "r", "PySet_Add"),
BuiltinMethod("pop", "T", "O", "PySet_Pop")]),
("frozenset", "PyFrozenSet_Type", []),
- ("Exception", "((PyTypeObject*)PyExc_Exception)[0]", []),
+ ("Exception", "((PyTypeObject*)PyExc_Exception)[0]", []),
("StopAsyncIteration", "((PyTypeObject*)__Pyx_PyExc_StopAsyncIteration)[0]", []),
]
@@ -396,8 +396,8 @@ def init_builtin_types():
objstruct_cname = 'PyByteArrayObject'
elif name == 'bool':
objstruct_cname = None
- elif name == 'Exception':
- objstruct_cname = "PyBaseExceptionObject"
+ elif name == 'Exception':
+ objstruct_cname = "PyBaseExceptionObject"
elif name == 'StopAsyncIteration':
objstruct_cname = "PyBaseExceptionObject"
else:
@@ -421,11 +421,11 @@ def init_builtins():
init_builtin_structs()
init_builtin_types()
init_builtin_funcs()
-
+
builtin_scope.declare_var(
'__debug__', PyrexTypes.c_const_type(PyrexTypes.c_bint_type),
pos=None, cname='(!Py_OptimizeFlag)', is_cdef=True)
-
+
global list_type, tuple_type, dict_type, set_type, frozenset_type
global bytes_type, str_type, unicode_type, basestring_type, slice_type
global float_type, bool_type, type_type, complex_type, bytearray_type
diff --git a/contrib/tools/cython/Cython/Compiler/CmdLine.py b/contrib/tools/cython/Cython/Compiler/CmdLine.py
index a20ab38dc2..6ddc14d76f 100644
--- a/contrib/tools/cython/Cython/Compiler/CmdLine.py
+++ b/contrib/tools/cython/Cython/Compiler/CmdLine.py
@@ -34,14 +34,14 @@ Options:
-D, --no-docstrings Strip docstrings from the compiled module.
-a, --annotate Produce a colorized HTML version of the source.
- --annotate-coverage <cov.xml> Annotate and include coverage information from cov.xml.
+ --annotate-coverage <cov.xml> Annotate and include coverage information from cov.xml.
--line-directives Produce #line directives pointing to the .pyx source
--cplus Output a C++ rather than C file.
--embed[=<method_name>] Generate a main() function that embeds the Python interpreter.
-2 Compile based on Python-2 syntax and code semantics.
-3 Compile based on Python-3 syntax and code semantics.
- --3str Compile based on Python-3 syntax and code semantics without
- assuming unicode by default for string literals under Python 2.
+ --3str Compile based on Python-3 syntax and code semantics without
+ assuming unicode by default for string literals under Python 2.
--lenient Change some compile time errors to runtime errors to
improve Python compatibility
--capi-reexport-cincludes Add cincluded headers to any auto-generated header files.
@@ -49,11 +49,11 @@ Options:
--warning-errors, -Werror Make all warnings into errors
--warning-extra, -Wextra Enable extra warnings
-X, --directive <name>=<value>[,<name=value,...] Overrides a compiler directive
- -E, --compile-time-env name=value[,<name=value,...] Provides compile time env like DEF would do.
+ -E, --compile-time-env name=value[,<name=value,...] Provides compile time env like DEF would do.
"""
-# The following experimental options are supported only on MacOSX:
+# The following experimental options are supported only on MacOSX:
# -C, --compile Compile generated .c file to .o file
# --link Link .o file to produce extension module (implies -C)
# -+, --cplus Use C++ compiler for compiling and linking
@@ -67,26 +67,26 @@ def bad_usage():
def parse_command_line(args):
from .Main import CompilationOptions, default_options
- pending_arg = []
-
+ pending_arg = []
+
def pop_arg():
- if not args or pending_arg:
- bad_usage()
- if '=' in args[0] and args[0].startswith('--'): # allow "--long-option=xyz"
- name, value = args.pop(0).split('=', 1)
- pending_arg.append(value)
- return name
- return args.pop(0)
-
- def pop_value(default=None):
- if pending_arg:
- return pending_arg.pop()
- elif default is not None:
- return default
- elif not args:
+ if not args or pending_arg:
bad_usage()
- return args.pop(0)
-
+ if '=' in args[0] and args[0].startswith('--'): # allow "--long-option=xyz"
+ name, value = args.pop(0).split('=', 1)
+ pending_arg.append(value)
+ return name
+ return args.pop(0)
+
+ def pop_value(default=None):
+ if pending_arg:
+ return pending_arg.pop()
+ elif default is not None:
+ return default
+ elif not args:
+ bad_usage()
+ return args.pop(0)
+
def get_param(option):
tail = option[2:]
if tail:
@@ -106,15 +106,15 @@ def parse_command_line(args):
elif option in ("-+", "--cplus"):
options.cplus = 1
elif option == "--embed":
- Options.embed = pop_value("main")
+ Options.embed = pop_value("main")
elif option.startswith("-I"):
options.include_path.append(get_param(option))
elif option == "--include-dir":
- options.include_path.append(pop_value())
+ options.include_path.append(pop_value())
elif option in ("-w", "--working"):
- options.working_path = pop_value()
+ options.working_path = pop_value()
elif option in ("-o", "--output-file"):
- options.output_file = pop_value()
+ options.output_file = pop_value()
elif option in ("-t", "--timestamps"):
options.timestamps = 1
elif option in ("-f", "--force"):
@@ -124,16 +124,16 @@ def parse_command_line(args):
elif option in ("-p", "--embed-positions"):
Options.embed_pos_in_docstring = 1
elif option in ("-z", "--pre-import"):
- Options.pre_import = pop_value()
+ Options.pre_import = pop_value()
elif option == "--cleanup":
- Options.generate_cleanup_code = int(pop_value())
+ Options.generate_cleanup_code = int(pop_value())
elif option in ("-D", "--no-docstrings"):
Options.docstrings = False
elif option in ("-a", "--annotate"):
Options.annotate = True
- elif option == "--annotate-coverage":
- Options.annotate = True
- Options.annotate_coverage_xml = pop_value()
+ elif option == "--annotate-coverage":
+ Options.annotate = True
+ Options.annotate_coverage_xml = pop_value()
elif option == "--convert-range":
Options.convert_range = True
elif option == "--line-directives":
@@ -145,22 +145,22 @@ def parse_command_line(args):
options.output_dir = os.curdir
elif option == "--gdb-outdir":
options.gdb_debug = True
- options.output_dir = pop_value()
+ options.output_dir = pop_value()
elif option == "--lenient":
Options.error_on_unknown_names = False
Options.error_on_uninitialized = False
- elif option == '--module-name':
- options.module_name = pop_arg()
- elif option == '--init-suffix':
- options.init_suffix = pop_arg()
+ elif option == '--module-name':
+ options.module_name = pop_arg()
+ elif option == '--init-suffix':
+ options.init_suffix = pop_arg()
elif option == '--source-root':
Options.source_root = pop_arg()
elif option == '-2':
options.language_level = 2
elif option == '-3':
options.language_level = 3
- elif option == '--3str':
- options.language_level = '3str'
+ elif option == '--3str':
+ options.language_level = '3str'
elif option == "--capi-reexport-cincludes":
options.capi_reexport_cincludes = True
elif option == "--fast-fail":
@@ -177,25 +177,25 @@ def parse_command_line(args):
if option.startswith('-X') and option[2:].strip():
x_args = option[2:]
else:
- x_args = pop_value()
+ x_args = pop_value()
try:
options.compiler_directives = Options.parse_directive_list(
x_args, relaxed_bool=True,
current_settings=options.compiler_directives)
- except ValueError as e:
+ except ValueError as e:
sys.stderr.write("Error in compiler directive: %s\n" % e.args[0])
sys.exit(1)
- elif option == "--compile-time-env" or option.startswith('-E'):
- if option.startswith('-E') and option[2:].strip():
- x_args = option[2:]
- else:
- x_args = pop_value()
- try:
- options.compile_time_env = Options.parse_compile_time_env(
- x_args, current_settings=options.compile_time_env)
- except ValueError as e:
- sys.stderr.write("Error in compile-time-env: %s\n" % e.args[0])
- sys.exit(1)
+ elif option == "--compile-time-env" or option.startswith('-E'):
+ if option.startswith('-E') and option[2:].strip():
+ x_args = option[2:]
+ else:
+ x_args = pop_value()
+ try:
+ options.compile_time_env = Options.parse_compile_time_env(
+ x_args, current_settings=options.compile_time_env)
+ except ValueError as e:
+ sys.stderr.write("Error in compile-time-env: %s\n" % e.args[0])
+ sys.exit(1)
elif option.startswith('--debug'):
option = option[2:].replace('-', '_')
from . import DebugFlags
@@ -212,10 +212,10 @@ def parse_command_line(args):
sys.exit(1)
else:
sources.append(pop_arg())
-
- if pending_arg:
- bad_usage()
-
+
+ if pending_arg:
+ bad_usage()
+
if options.use_listing_file and len(sources) > 1:
sys.stderr.write(
"cython: Only one source file allowed when using -o\n")
diff --git a/contrib/tools/cython/Cython/Compiler/Code.pxd b/contrib/tools/cython/Cython/Compiler/Code.pxd
index acad0c1cf4..4c0e27f15f 100644
--- a/contrib/tools/cython/Cython/Compiler/Code.pxd
+++ b/contrib/tools/cython/Cython/Compiler/Code.pxd
@@ -2,7 +2,7 @@
from __future__ import absolute_import
cimport cython
-from ..StringIOTree cimport StringIOTree
+from ..StringIOTree cimport StringIOTree
cdef class UtilityCodeBase(object):
@@ -27,7 +27,7 @@ cdef class UtilityCode(UtilityCodeBase):
cdef class FunctionState:
cdef public set names_taken
cdef public object owner
- cdef public object scope
+ cdef public object scope
cdef public object error_label
cdef public size_t label_counter
@@ -39,11 +39,11 @@ cdef class FunctionState:
cdef public object return_from_error_cleanup_label # not used in __init__ ?
- cdef public object exc_vars
+ cdef public object exc_vars
cdef public object current_except
cdef public bint in_try_finally
cdef public bint can_trace
- cdef public bint gil_owned
+ cdef public bint gil_owned
cdef public list temps_allocated
cdef public dict temps_free
@@ -97,28 +97,28 @@ cdef class StringConst:
#def funccontext_property(name):
-cdef class CCodeWriter(object):
- cdef readonly StringIOTree buffer
- cdef readonly list pyclass_stack
- cdef readonly object globalstate
- cdef readonly object funcstate
- cdef object code_config
- cdef object last_pos
- cdef object last_marked_pos
- cdef Py_ssize_t level
- cdef public Py_ssize_t call_level # debug-only, see Nodes.py
- cdef bint bol
-
- cpdef write(self, s)
- cpdef put(self, code)
- cpdef put_safe(self, code)
- cpdef putln(self, code=*, bint safe=*)
- @cython.final
- cdef increase_indent(self)
- @cython.final
- cdef decrease_indent(self)
-
-
+cdef class CCodeWriter(object):
+ cdef readonly StringIOTree buffer
+ cdef readonly list pyclass_stack
+ cdef readonly object globalstate
+ cdef readonly object funcstate
+ cdef object code_config
+ cdef object last_pos
+ cdef object last_marked_pos
+ cdef Py_ssize_t level
+ cdef public Py_ssize_t call_level # debug-only, see Nodes.py
+ cdef bint bol
+
+ cpdef write(self, s)
+ cpdef put(self, code)
+ cpdef put_safe(self, code)
+ cpdef putln(self, code=*, bint safe=*)
+ @cython.final
+ cdef increase_indent(self)
+ @cython.final
+ cdef decrease_indent(self)
+
+
cdef class PyrexCodeWriter:
cdef public object f
cdef public Py_ssize_t level
diff --git a/contrib/tools/cython/Cython/Compiler/Code.py b/contrib/tools/cython/Cython/Compiler/Code.py
index f43c4b2b8e..97e97a12d3 100644
--- a/contrib/tools/cython/Cython/Compiler/Code.py
+++ b/contrib/tools/cython/Cython/Compiler/Code.py
@@ -1,5 +1,5 @@
# cython: language_level = 2
-# cython: auto_pickle=False
+# cython: auto_pickle=False
#
# Code output module
#
@@ -19,10 +19,10 @@ import shutil
import sys
import operator
import textwrap
-from string import Template
-from functools import partial
-from contextlib import closing
-from collections import defaultdict
+from string import Template
+from functools import partial
+from contextlib import closing
+from collections import defaultdict
try:
import hashlib
@@ -33,7 +33,7 @@ from . import Naming
from . import Options
from . import DebugFlags
from . import StringEncoding
-from . import Version
+from . import Version
from .. import Utils
from .Scanning import SourceDescriptor
from ..StringIOTree import StringIOTree
@@ -43,7 +43,7 @@ try:
except ImportError:
from builtins import str as basestring
-KEYWORDS_MUST_BE_BYTES = sys.version_info < (2, 7)
+KEYWORDS_MUST_BE_BYTES = sys.version_info < (2, 7)
non_portable_builtins_map = {
@@ -53,22 +53,22 @@ non_portable_builtins_map = {
'basestring' : ('PY_MAJOR_VERSION >= 3', 'str'),
'xrange' : ('PY_MAJOR_VERSION >= 3', 'range'),
'raw_input' : ('PY_MAJOR_VERSION >= 3', 'input'),
-}
-
-ctypedef_builtins_map = {
- # types of builtins in "ctypedef class" statements which we don't
- # import either because the names conflict with C types or because
- # the type simply is not exposed.
- 'py_int' : '&PyInt_Type',
- 'py_long' : '&PyLong_Type',
- 'py_float' : '&PyFloat_Type',
- 'wrapper_descriptor' : '&PyWrapperDescr_Type',
-}
-
+}
+
+ctypedef_builtins_map = {
+ # types of builtins in "ctypedef class" statements which we don't
+ # import either because the names conflict with C types or because
+ # the type simply is not exposed.
+ 'py_int' : '&PyInt_Type',
+ 'py_long' : '&PyLong_Type',
+ 'py_float' : '&PyFloat_Type',
+ 'wrapper_descriptor' : '&PyWrapperDescr_Type',
+}
+
basicsize_builtins_map = {
# builtins whose type has a different tp_basicsize than sizeof(...)
- 'PyTypeObject': 'PyHeapTypeObject',
-}
+ 'PyTypeObject': 'PyHeapTypeObject',
+}
uncachable_builtins = [
# Global/builtin names that cannot be cached because they may or may not
@@ -107,15 +107,15 @@ uncachable_builtins = [
'WindowsError',
## - others
'_', # e.g. used by gettext
-]
-
-special_py_methods = set([
- '__cinit__', '__dealloc__', '__richcmp__', '__next__',
- '__await__', '__aiter__', '__anext__',
- '__getreadbuffer__', '__getwritebuffer__', '__getsegcount__',
- '__getcharbuffer__', '__getbuffer__', '__releasebuffer__'
-])
-
+]
+
+special_py_methods = set([
+ '__cinit__', '__dealloc__', '__richcmp__', '__next__',
+ '__await__', '__aiter__', '__anext__',
+ '__getreadbuffer__', '__getwritebuffer__', '__getsegcount__',
+ '__getcharbuffer__', '__getbuffer__', '__releasebuffer__'
+])
+
modifier_output_mapper = {
'inline': 'CYTHON_INLINE'
}.get
@@ -246,7 +246,7 @@ class UtilityCodeBase(object):
del tags['substitute']
try:
code = Template(code).substitute(vars(Naming))
- except (KeyError, ValueError) as e:
+ except (KeyError, ValueError) as e:
raise RuntimeError("Error parsing templated utility code of type '%s' at line %d: %s" % (
type, begin_lineno, e))
@@ -281,23 +281,23 @@ class UtilityCodeBase(object):
if ext in ('.pyx', '.py', '.pxd', '.pxi'):
comment = '#'
strip_comments = partial(re.compile(r'^\s*#(?!\s*cython\s*:).*').sub, '')
- rstrip = StringEncoding._unicode.rstrip
+ rstrip = StringEncoding._unicode.rstrip
else:
comment = '/'
- strip_comments = partial(re.compile(r'^\s*//.*|/\*[^*]*\*/').sub, '')
- rstrip = partial(re.compile(r'\s+(\\?)$').sub, r'\1')
+ strip_comments = partial(re.compile(r'^\s*//.*|/\*[^*]*\*/').sub, '')
+ rstrip = partial(re.compile(r'\s+(\\?)$').sub, r'\1')
match_special = re.compile(
(r'^%(C)s{5,30}\s*(?P<name>(?:\w|\.)+)\s*%(C)s{5,30}|'
- r'^%(C)s+@(?P<tag>\w+)\s*:\s*(?P<value>(?:\w|[.:])+)') %
- {'C': comment}).match
- match_type = re.compile(r'(.+)[.](proto(?:[.]\S+)?|impl|init|cleanup)$').match
+ r'^%(C)s+@(?P<tag>\w+)\s*:\s*(?P<value>(?:\w|[.:])+)') %
+ {'C': comment}).match
+ match_type = re.compile(r'(.+)[.](proto(?:[.]\S+)?|impl|init|cleanup)$').match
- with closing(Utils.open_source_file(filename, encoding='UTF-8')) as f:
+ with closing(Utils.open_source_file(filename, encoding='UTF-8')) as f:
all_lines = f.readlines()
utilities = defaultdict(lambda: [None, None, {}])
lines = []
- tags = defaultdict(set)
+ tags = defaultdict(set)
utility = type = None
begin_lineno = 0
@@ -317,12 +317,12 @@ class UtilityCodeBase(object):
name, type = mtype.groups()
else:
type = 'impl'
- utility = utilities[name]
+ utility = utilities[name]
else:
- tags[m.group('tag')].add(m.group('value'))
- lines.append('') # keep line number correct
+ tags[m.group('tag')].add(m.group('value'))
+ lines.append('') # keep line number correct
else:
- lines.append(rstrip(strip_comments(line)))
+ lines.append(rstrip(strip_comments(line)))
if utility is None:
raise ValueError("Empty utility code file")
@@ -330,7 +330,7 @@ class UtilityCodeBase(object):
# Don't forget to add the last utility code
cls._add_utility(utility, type, lines, begin_lineno, tags)
- utilities = dict(utilities) # un-defaultdict-ify
+ utilities = dict(utilities) # un-defaultdict-ify
cls._utility_cache[path] = utilities
return utilities
@@ -356,12 +356,12 @@ class UtilityCodeBase(object):
global __loader__
loader = __loader__
archive = loader.archive
- with closing(zipfile.ZipFile(archive)) as fileobj:
- listing = [os.path.basename(name)
- for name in fileobj.namelist()
- if os.path.join(archive, name).startswith(utility_dir)]
- files = [filename for filename in listing
- if filename.startswith(prefix)]
+ with closing(zipfile.ZipFile(archive)) as fileobj:
+ listing = [os.path.basename(name)
+ for name in fileobj.namelist()
+ if os.path.join(archive, name).startswith(utility_dir)]
+ files = [filename for filename in listing
+ if filename.startswith(prefix)]
if not files:
raise ValueError("No match found for utility code " + util_code_name)
if len(files) > 1:
@@ -434,16 +434,16 @@ class UtilityCodeBase(object):
return code_string
def __str__(self):
- return "<%s(%s)>" % (type(self).__name__, self.name)
+ return "<%s(%s)>" % (type(self).__name__, self.name)
- def get_tree(self, **kwargs):
+ def get_tree(self, **kwargs):
pass
- def __deepcopy__(self, memodict=None):
- # No need to deep-copy utility code since it's essentially immutable.
- return self
-
+ def __deepcopy__(self, memodict=None):
+ # No need to deep-copy utility code since it's essentially immutable.
+ return self
+
class UtilityCode(UtilityCodeBase):
"""
Stores utility code to add during code generation.
@@ -483,8 +483,8 @@ class UtilityCode(UtilityCodeBase):
def __eq__(self, other):
if self is other:
return True
- self_type, other_type = type(self), type(other)
- if self_type is not other_type and not (isinstance(other, self_type) or isinstance(self, other_type)):
+ self_type, other_type = type(self), type(other)
+ if self_type is not other_type and not (isinstance(other, self_type) or isinstance(self, other_type)):
return False
self_proto = getattr(self, 'proto', None)
@@ -503,7 +503,7 @@ class UtilityCode(UtilityCodeBase):
# Dicts aren't hashable...
name = self.name
if pyrex_type is not None:
- data['type'] = pyrex_type.empty_declaration_code()
+ data['type'] = pyrex_type.empty_declaration_code()
data['type_name'] = pyrex_type.specialization_name()
name = "%s[%s]" % (name, data['type_name'])
key = tuple(sorted(data.items()))
@@ -516,11 +516,11 @@ class UtilityCode(UtilityCodeBase):
requires = [r.specialize(data) for r in self.requires]
s = self._cache[key] = UtilityCode(
- self.none_or_sub(self.proto, data),
- self.none_or_sub(self.impl, data),
- self.none_or_sub(self.init, data),
- self.none_or_sub(self.cleanup, data),
- requires,
+ self.none_or_sub(self.proto, data),
+ self.none_or_sub(self.impl, data),
+ self.none_or_sub(self.init, data),
+ self.none_or_sub(self.cleanup, data),
+ requires,
self.proto_block,
name,
)
@@ -532,8 +532,8 @@ class UtilityCode(UtilityCodeBase):
"""Replace 'PYIDENT("xyz")' by a constant Python identifier cname.
"""
if 'PYIDENT(' not in impl and 'PYUNICODE(' not in impl:
- return False, impl
-
+ return False, impl
+
replacements = {}
def externalise(matchobj):
key = matchobj.groups()
@@ -549,18 +549,18 @@ class UtilityCode(UtilityCodeBase):
assert 'PYIDENT(' not in impl and 'PYUNICODE(' not in impl
return True, impl
- def inject_unbound_methods(self, impl, output):
- """Replace 'UNBOUND_METHOD(type, "name")' by a constant Python identifier cname.
- """
- if 'CALL_UNBOUND_METHOD(' not in impl:
- return False, impl
-
- def externalise(matchobj):
+ def inject_unbound_methods(self, impl, output):
+ """Replace 'UNBOUND_METHOD(type, "name")' by a constant Python identifier cname.
+ """
+ if 'CALL_UNBOUND_METHOD(' not in impl:
+ return False, impl
+
+ def externalise(matchobj):
type_cname, method_name, obj_cname, args = matchobj.groups()
args = [arg.strip() for arg in args[1:].split(',')] if args else []
assert len(args) < 3, "CALL_UNBOUND_METHOD() does not support %d call arguments" % len(args)
return output.cached_unbound_method_call_code(obj_cname, type_cname, method_name, args)
-
+
impl = re.sub(
r'CALL_UNBOUND_METHOD\('
r'([a-zA-Z_]+),' # type cname
@@ -568,46 +568,46 @@ class UtilityCode(UtilityCodeBase):
r'\s*([^),]+)' # object cname
r'((?:,\s*[^),]+)*)' # args*
r'\)', externalise, impl)
- assert 'CALL_UNBOUND_METHOD(' not in impl
-
+ assert 'CALL_UNBOUND_METHOD(' not in impl
+
return True, impl
-
- def wrap_c_strings(self, impl):
- """Replace CSTRING('''xyz''') by a C compatible string
- """
- if 'CSTRING(' not in impl:
- return impl
-
- def split_string(matchobj):
- content = matchobj.group(1).replace('"', '\042')
- return ''.join(
- '"%s\\n"\n' % line if not line.endswith('\\') or line.endswith('\\\\') else '"%s"\n' % line[:-1]
- for line in content.splitlines())
-
- impl = re.sub(r'CSTRING\(\s*"""([^"]*(?:"[^"]+)*)"""\s*\)', split_string, impl)
- assert 'CSTRING(' not in impl
- return impl
-
+
+ def wrap_c_strings(self, impl):
+ """Replace CSTRING('''xyz''') by a C compatible string
+ """
+ if 'CSTRING(' not in impl:
+ return impl
+
+ def split_string(matchobj):
+ content = matchobj.group(1).replace('"', '\042')
+ return ''.join(
+ '"%s\\n"\n' % line if not line.endswith('\\') or line.endswith('\\\\') else '"%s"\n' % line[:-1]
+ for line in content.splitlines())
+
+ impl = re.sub(r'CSTRING\(\s*"""([^"]*(?:"[^"]+)*)"""\s*\)', split_string, impl)
+ assert 'CSTRING(' not in impl
+ return impl
+
def put_code(self, output):
if self.requires:
for dependency in self.requires:
output.use_utility_code(dependency)
if self.proto:
- writer = output[self.proto_block]
- writer.putln("/* %s.proto */" % self.name)
- writer.put_or_include(
- self.format_code(self.proto), '%s_proto' % self.name)
+ writer = output[self.proto_block]
+ writer.putln("/* %s.proto */" % self.name)
+ writer.put_or_include(
+ self.format_code(self.proto), '%s_proto' % self.name)
if self.impl:
- impl = self.format_code(self.wrap_c_strings(self.impl))
- is_specialised1, impl = self.inject_string_constants(impl, output)
- is_specialised2, impl = self.inject_unbound_methods(impl, output)
- writer = output['utility_code_def']
- writer.putln("/* %s */" % self.name)
- if not (is_specialised1 or is_specialised2):
+ impl = self.format_code(self.wrap_c_strings(self.impl))
+ is_specialised1, impl = self.inject_string_constants(impl, output)
+ is_specialised2, impl = self.inject_unbound_methods(impl, output)
+ writer = output['utility_code_def']
+ writer.putln("/* %s */" % self.name)
+ if not (is_specialised1 or is_specialised2):
# no module specific adaptations => can be reused
- writer.put_or_include(impl, '%s_impl' % self.name)
+ writer.put_or_include(impl, '%s_impl' % self.name)
else:
- writer.put(impl)
+ writer.put(impl)
if self.init:
writer = output['init_globals']
writer.putln("/* %s.init */" % self.name)
@@ -619,7 +619,7 @@ class UtilityCode(UtilityCodeBase):
writer.putln()
if self.cleanup and Options.generate_cleanup_code:
writer = output['cleanup_globals']
- writer.putln("/* %s.cleanup */" % self.name)
+ writer.putln("/* %s.cleanup */" % self.name)
if isinstance(self.cleanup, basestring):
writer.put_or_include(
self.format_code(self.cleanup),
@@ -641,7 +641,7 @@ def sub_tempita(s, context, file=None, name=None):
from ..Tempita import sub
return sub(s, **context)
-
+
class TempitaUtilityCode(UtilityCode):
def __init__(self, name=None, proto=None, impl=None, init=None, file=None, context=None, **kwargs):
if context is None:
@@ -652,18 +652,18 @@ class TempitaUtilityCode(UtilityCode):
super(TempitaUtilityCode, self).__init__(
proto, impl, init=init, name=name, file=file, **kwargs)
- @classmethod
- def load_cached(cls, utility_code_name, from_file=None, context=None, __cache={}):
- context_key = tuple(sorted(context.items())) if context else None
- assert hash(context_key) is not None # raise TypeError if not hashable
- key = (cls, from_file, utility_code_name, context_key)
- try:
- return __cache[key]
- except KeyError:
- pass
- code = __cache[key] = cls.load(utility_code_name, from_file, context=context)
- return code
-
+ @classmethod
+ def load_cached(cls, utility_code_name, from_file=None, context=None, __cache={}):
+ context_key = tuple(sorted(context.items())) if context else None
+ assert hash(context_key) is not None # raise TypeError if not hashable
+ key = (cls, from_file, utility_code_name, context_key)
+ try:
+ return __cache[key]
+ except KeyError:
+ pass
+ code = __cache[key] = cls.load(utility_code_name, from_file, context=context)
+ return code
+
def none_or_sub(self, s, context):
"""
Format a string in this utility code with context. If None, do nothing.
@@ -678,7 +678,7 @@ class LazyUtilityCode(UtilityCodeBase):
Utility code that calls a callback with the root code writer when
available. Useful when you only have 'env' but not 'code'.
"""
- __name__ = '<lazy>'
+ __name__ = '<lazy>'
requires = None
def __init__(self, callback):
@@ -699,13 +699,13 @@ class FunctionState(object):
# in_try_finally boolean inside try of try...finally
# exc_vars (string * 3) exception variables for reraise, or None
# can_trace boolean line tracing is supported in the current context
- # scope Scope the scope object of the current function
+ # scope Scope the scope object of the current function
# Not used for now, perhaps later
- def __init__(self, owner, names_taken=set(), scope=None):
+ def __init__(self, owner, names_taken=set(), scope=None):
self.names_taken = names_taken
self.owner = owner
- self.scope = scope
+ self.scope = scope
self.error_label = None
self.label_counter = 0
@@ -720,7 +720,7 @@ class FunctionState(object):
self.exc_vars = None
self.current_except = None
self.can_trace = False
- self.gil_owned = True
+ self.gil_owned = True
self.temps_allocated = [] # of (name, type, manage_ref, static)
self.temps_free = {} # (type, manage_ref) -> list of free vars with same type/managed status
@@ -846,10 +846,10 @@ class FunctionState(object):
A C string referring to the variable is returned.
"""
- if type.is_const and not type.is_reference:
+ if type.is_const and not type.is_reference:
type = type.const_base_type
- elif type.is_reference and not type.is_fake_reference:
- type = type.ref_base_type
+ elif type.is_reference and not type.is_fake_reference:
+ type = type.ref_base_type
elif type.is_cfunction:
from . import PyrexTypes
type = PyrexTypes.c_ptr_type(type) # A function itself isn't an l-value
@@ -860,13 +860,13 @@ class FunctionState(object):
freelist = self.temps_free.get((type, manage_ref))
if reusable and freelist is not None and freelist[0]:
- result = freelist[0].pop()
- freelist[1].remove(result)
+ result = freelist[0].pop()
+ freelist[1].remove(result)
else:
while True:
self.temp_counter += 1
result = "%s%d" % (Naming.codewriter_temp_prefix, self.temp_counter)
- if result not in self.names_taken: break
+ if result not in self.names_taken: break
self.temps_allocated.append((result, type, manage_ref, static))
if not reusable:
self.zombie_temps.add(result)
@@ -887,13 +887,13 @@ class FunctionState(object):
type, manage_ref = self.temps_used_type[name]
freelist = self.temps_free.get((type, manage_ref))
if freelist is None:
- freelist = ([], set()) # keep order in list and make lookups in set fast
+ freelist = ([], set()) # keep order in list and make lookups in set fast
self.temps_free[(type, manage_ref)] = freelist
- if name in freelist[1]:
+ if name in freelist[1]:
raise RuntimeError("Temp %s freed twice!" % name)
if name not in self.zombie_temps:
freelist[0].append(name)
- freelist[1].add(name)
+ freelist[1].add(name)
if DebugFlags.debug_temp_code_comments:
self.owner.putln("/* %s released %s*/" % (
name, " - zombie" if name in self.zombie_temps else ""))
@@ -905,7 +905,7 @@ class FunctionState(object):
used = []
for name, type, manage_ref, static in self.temps_allocated:
freelist = self.temps_free.get((type, manage_ref))
- if freelist is None or name not in freelist[1]:
+ if freelist is None or name not in freelist[1]:
used.append((name, type, manage_ref and type.is_pyobject))
return used
@@ -922,8 +922,8 @@ class FunctionState(object):
"""Return a list of (cname, type) tuples of refcount-managed Python objects.
"""
return [(cname, type)
- for cname, type, manage_ref, static in self.temps_allocated
- if manage_ref]
+ for cname, type, manage_ref, static in self.temps_allocated
+ if manage_ref]
def all_free_managed_temps(self):
"""Return a list of (cname, type) tuples of refcount-managed Python
@@ -931,11 +931,11 @@ class FunctionState(object):
try-except and try-finally blocks to clean up temps in the
error case.
"""
- return sorted([ # Enforce deterministic order.
- (cname, type)
- for (type, manage_ref), freelist in self.temps_free.items() if manage_ref
- for cname in freelist[0]
- ])
+ return sorted([ # Enforce deterministic order.
+ (cname, type)
+ for (type, manage_ref), freelist in self.temps_free.items() if manage_ref
+ for cname in freelist[0]
+ ])
def start_collecting_temps(self):
"""
@@ -979,7 +979,7 @@ class PyObjectConst(object):
cython.declare(possible_unicode_identifier=object, possible_bytes_identifier=object,
replace_identifier=object, find_alphanums=object)
-possible_unicode_identifier = re.compile(br"(?![0-9])\w+$".decode('ascii'), re.U).match
+possible_unicode_identifier = re.compile(br"(?![0-9])\w+$".decode('ascii'), re.U).match
possible_bytes_identifier = re.compile(r"(?![0-9])\w+$".encode('ASCII')).match
replace_identifier = re.compile(r'[^a-zA-Z0-9_]+').sub
find_alphanums = re.compile('([a-zA-Z0-9]+)').findall
@@ -1000,7 +1000,7 @@ class StringConst(object):
def add_py_version(self, version):
if not version:
- self.py_versions = [2, 3]
+ self.py_versions = [2, 3]
elif version not in self.py_versions:
self.py_versions.append(version)
@@ -1036,9 +1036,9 @@ class StringConst(object):
if identifier:
intern = True
elif identifier is None:
- if isinstance(text, bytes):
- intern = bool(possible_bytes_identifier(text))
- else:
+ if isinstance(text, bytes):
+ intern = bool(possible_bytes_identifier(text))
+ else:
intern = bool(possible_unicode_identifier(text))
else:
intern = False
@@ -1129,7 +1129,7 @@ class GlobalState(object):
'typeinfo',
'before_global_var',
'global_var',
- 'string_decls',
+ 'string_decls',
'decls',
'late_includes',
'all_the_rest',
@@ -1146,14 +1146,14 @@ class GlobalState(object):
]
- def __init__(self, writer, module_node, code_config, common_utility_include_dir=None):
+ def __init__(self, writer, module_node, code_config, common_utility_include_dir=None):
self.filename_table = {}
self.filename_list = []
self.input_file_contents = {}
self.utility_codes = set()
self.declared_cnames = {}
self.in_utility_code_generation = False
- self.code_config = code_config
+ self.code_config = code_config
self.common_utility_include_dir = common_utility_include_dir
self.parts = {}
self.module_node = module_node # because some utility code generation needs it
@@ -1161,14 +1161,14 @@ class GlobalState(object):
self.const_cnames_used = {}
self.string_const_index = {}
- self.dedup_const_index = {}
+ self.dedup_const_index = {}
self.pyunicode_ptr_const_index = {}
self.num_const_index = {}
self.py_constants = []
- self.cached_cmethods = {}
- self.initialised_constants = set()
+ self.cached_cmethods = {}
+ self.initialised_constants = set()
- writer.set_global_state(self)
+ writer.set_global_state(self)
self.rootwriter = writer
def initialize_main_c_code(self):
@@ -1181,19 +1181,19 @@ class GlobalState(object):
else:
w = self.parts['cached_builtins']
w.enter_cfunc_scope()
- w.putln("static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {")
+ w.putln("static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {")
w = self.parts['cached_constants']
w.enter_cfunc_scope()
w.putln("")
- w.putln("static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {")
+ w.putln("static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {")
w.put_declare_refcount_context()
w.put_setup_refcount_context("__Pyx_InitCachedConstants")
w = self.parts['init_globals']
w.enter_cfunc_scope()
w.putln("")
- w.putln("static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {")
+ w.putln("static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {")
if not Options.generate_cleanup_code:
del self.parts['cleanup_globals']
@@ -1201,17 +1201,17 @@ class GlobalState(object):
w = self.parts['cleanup_globals']
w.enter_cfunc_scope()
w.putln("")
- w.putln("static CYTHON_SMALL_CODE void __Pyx_CleanupGlobals(void) {")
-
- code = self.parts['utility_code_proto']
- code.putln("")
- code.putln("/* --- Runtime support code (head) --- */")
+ w.putln("static CYTHON_SMALL_CODE void __Pyx_CleanupGlobals(void) {")
+ code = self.parts['utility_code_proto']
+ code.putln("")
+ code.putln("/* --- Runtime support code (head) --- */")
+
code = self.parts['utility_code_def']
- if self.code_config.emit_linenums:
+ if self.code_config.emit_linenums:
code.write('\n#line 1 "cython_utility"\n')
code.putln("")
- code.putln("/* --- Runtime support code --- */")
+ code.putln("/* --- Runtime support code --- */")
def finalize_main_c_code(self):
self.close_global_decls()
@@ -1220,8 +1220,8 @@ class GlobalState(object):
# utility_code_def
#
code = self.parts['utility_code_def']
- util = TempitaUtilityCode.load_cached("TypeConversions", "TypeConversion.c")
- code.put(util.format_code(util.impl))
+ util = TempitaUtilityCode.load_cached("TypeConversions", "TypeConversion.c")
+ code.put(util.format_code(util.impl))
code.putln("")
def __getitem__(self, key):
@@ -1276,12 +1276,12 @@ class GlobalState(object):
# constant handling at code generation time
- def get_cached_constants_writer(self, target=None):
- if target is not None:
- if target in self.initialised_constants:
- # Return None on second/later calls to prevent duplicate creation code.
- return None
- self.initialised_constants.add(target)
+ def get_cached_constants_writer(self, target=None):
+ if target is not None:
+ if target in self.initialised_constants:
+ # Return None on second/later calls to prevent duplicate creation code.
+ return None
+ self.initialised_constants.add(target)
return self.parts['cached_constants']
def get_int_const(self, str_value, longness=False):
@@ -1299,19 +1299,19 @@ class GlobalState(object):
c = self.new_num_const(str_value, 'float', value_code)
return c
- def get_py_const(self, type, prefix='', cleanup_level=None, dedup_key=None):
- if dedup_key is not None:
- const = self.dedup_const_index.get(dedup_key)
- if const is not None:
- return const
+ def get_py_const(self, type, prefix='', cleanup_level=None, dedup_key=None):
+ if dedup_key is not None:
+ const = self.dedup_const_index.get(dedup_key)
+ if const is not None:
+ return const
# create a new Python object constant
const = self.new_py_const(type, prefix)
if cleanup_level is not None \
and cleanup_level <= Options.generate_cleanup_code:
cleanup_writer = self.parts['cleanup_globals']
cleanup_writer.putln('Py_CLEAR(%s);' % const.cname)
- if dedup_key is not None:
- self.dedup_const_index[dedup_key] = const
+ if dedup_key is not None:
+ self.dedup_const_index[dedup_key] = const
return const
def get_string_const(self, text, py_version=None):
@@ -1401,13 +1401,13 @@ class GlobalState(object):
def get_cached_unbound_method(self, type_cname, method_name):
key = (type_cname, method_name)
- try:
- cname = self.cached_cmethods[key]
- except KeyError:
- cname = self.cached_cmethods[key] = self.new_const_cname(
- 'umethod', '%s_%s' % (type_cname, method_name))
- return cname
-
+ try:
+ cname = self.cached_cmethods[key]
+ except KeyError:
+ cname = self.cached_cmethods[key] = self.new_const_cname(
+ 'umethod', '%s_%s' % (type_cname, method_name))
+ return cname
+
def cached_unbound_method_call_code(self, obj_cname, type_cname, method_name, arg_cnames):
# admittedly, not the best place to put this method, but it is reused by UtilityCode and ExprNodes ...
utility_code_name = "CallUnboundCMethod%d" % len(arg_cnames)
@@ -1451,54 +1451,54 @@ class GlobalState(object):
w.error_goto(pos)))
def generate_const_declarations(self):
- self.generate_cached_methods_decls()
+ self.generate_cached_methods_decls()
self.generate_string_constants()
self.generate_num_constants()
self.generate_object_constant_decls()
def generate_object_constant_decls(self):
- consts = [(len(c.cname), c.cname, c)
- for c in self.py_constants]
+ consts = [(len(c.cname), c.cname, c)
+ for c in self.py_constants]
consts.sort()
decls_writer = self.parts['decls']
for _, cname, c in consts:
decls_writer.putln(
"static %s;" % c.type.declaration_code(cname))
- def generate_cached_methods_decls(self):
- if not self.cached_cmethods:
- return
-
- decl = self.parts['decls']
- init = self.parts['init_globals']
- cnames = []
+ def generate_cached_methods_decls(self):
+ if not self.cached_cmethods:
+ return
+
+ decl = self.parts['decls']
+ init = self.parts['init_globals']
+ cnames = []
for (type_cname, method_name), cname in sorted(self.cached_cmethods.items()):
- cnames.append(cname)
- method_name_cname = self.get_interned_identifier(StringEncoding.EncodedString(method_name)).cname
- decl.putln('static __Pyx_CachedCFunction %s = {0, &%s, 0, 0, 0};' % (
- cname, method_name_cname))
- # split type reference storage as it might not be static
- init.putln('%s.type = (PyObject*)&%s;' % (
- cname, type_cname))
-
- if Options.generate_cleanup_code:
- cleanup = self.parts['cleanup_globals']
- for cname in cnames:
- cleanup.putln("Py_CLEAR(%s.method);" % cname)
-
+ cnames.append(cname)
+ method_name_cname = self.get_interned_identifier(StringEncoding.EncodedString(method_name)).cname
+ decl.putln('static __Pyx_CachedCFunction %s = {0, &%s, 0, 0, 0};' % (
+ cname, method_name_cname))
+ # split type reference storage as it might not be static
+ init.putln('%s.type = (PyObject*)&%s;' % (
+ cname, type_cname))
+
+ if Options.generate_cleanup_code:
+ cleanup = self.parts['cleanup_globals']
+ for cname in cnames:
+ cleanup.putln("Py_CLEAR(%s.method);" % cname)
+
def generate_string_constants(self):
- c_consts = [(len(c.cname), c.cname, c) for c in self.string_const_index.values()]
+ c_consts = [(len(c.cname), c.cname, c) for c in self.string_const_index.values()]
c_consts.sort()
py_strings = []
- decls_writer = self.parts['string_decls']
+ decls_writer = self.parts['string_decls']
for _, cname, c in c_consts:
conditional = False
if c.py_versions and (2 not in c.py_versions or 3 not in c.py_versions):
conditional = True
decls_writer.putln("#if PY_MAJOR_VERSION %s 3" % (
(2 in c.py_versions) and '<' or '>='))
- decls_writer.putln('static const char %s[] = "%s";' % (
+ decls_writer.putln('static const char %s[] = "%s";' % (
cname, StringEncoding.split_string_literal(c.escaped_value)))
if conditional:
decls_writer.putln("#endif")
@@ -1506,7 +1506,7 @@ class GlobalState(object):
for py_string in c.py_strings.values():
py_strings.append((c.cname, len(py_string.cname), py_string))
- for c, cname in sorted(self.pyunicode_ptr_const_index.items()):
+ for c, cname in sorted(self.pyunicode_ptr_const_index.items()):
utf16_array, utf32_array = StringEncoding.encode_pyunicode_string(c)
if utf16_array:
# Narrow and wide representations differ
@@ -1522,11 +1522,11 @@ class GlobalState(object):
py_strings.sort()
w = self.parts['pystring_table']
w.putln("")
- w.putln("static __Pyx_StringTabEntry %s[] = {" % Naming.stringtab_cname)
+ w.putln("static __Pyx_StringTabEntry %s[] = {" % Naming.stringtab_cname)
for c_cname, _, py_string in py_strings:
if not py_string.is_str or not py_string.encoding or \
- py_string.encoding in ('ASCII', 'USASCII', 'US-ASCII',
- 'UTF8', 'UTF-8'):
+ py_string.encoding in ('ASCII', 'USASCII', 'US-ASCII',
+ 'UTF8', 'UTF-8'):
encoding = '0'
else:
encoding = '"%s"' % py_string.encoding.lower()
@@ -1535,7 +1535,7 @@ class GlobalState(object):
"static PyObject *%s;" % py_string.cname)
if py_string.py3str_cstring:
w.putln("#if PY_MAJOR_VERSION >= 3")
- w.putln("{&%s, %s, sizeof(%s), %s, %d, %d, %d}," % (
+ w.putln("{&%s, %s, sizeof(%s), %s, %d, %d, %d}," % (
py_string.cname,
py_string.py3str_cstring.cname,
py_string.py3str_cstring.cname,
@@ -1543,7 +1543,7 @@ class GlobalState(object):
py_string.intern
))
w.putln("#else")
- w.putln("{&%s, %s, sizeof(%s), %s, %d, %d, %d}," % (
+ w.putln("{&%s, %s, sizeof(%s), %s, %d, %d, %d}," % (
py_string.cname,
c_cname,
c_cname,
@@ -1605,13 +1605,13 @@ class GlobalState(object):
# File name state
#
- def lookup_filename(self, source_desc):
+ def lookup_filename(self, source_desc):
entry = source_desc.get_filenametable_entry()
try:
index = self.filename_table[entry]
except KeyError:
index = len(self.filename_list)
- self.filename_list.append(source_desc)
+ self.filename_list.append(source_desc)
self.filename_table[entry] = index
return index
@@ -1649,21 +1649,21 @@ class GlobalState(object):
See UtilityCode.
"""
- if utility_code and utility_code not in self.utility_codes:
+ if utility_code and utility_code not in self.utility_codes:
self.utility_codes.add(utility_code)
utility_code.put_code(self)
- def use_entry_utility_code(self, entry):
- if entry is None:
- return
- if entry.utility_code:
- self.use_utility_code(entry.utility_code)
- if entry.utility_code_definition:
- self.use_utility_code(entry.utility_code_definition)
-
-
-def funccontext_property(func):
- name = func.__name__
+ def use_entry_utility_code(self, entry):
+ if entry is None:
+ return
+ if entry.utility_code:
+ self.use_utility_code(entry.utility_code)
+ if entry.utility_code_definition:
+ self.use_utility_code(entry.utility_code_definition)
+
+
+def funccontext_property(func):
+ name = func.__name__
attribute_of = operator.attrgetter(name)
def get(self):
return attribute_of(self.funcstate)
@@ -1672,17 +1672,17 @@ def funccontext_property(func):
return property(get, set)
-class CCodeConfig(object):
- # emit_linenums boolean write #line pragmas?
- # emit_code_comments boolean copy the original code into C comments?
- # c_line_in_traceback boolean append the c file and line number to the traceback for exceptions?
-
- def __init__(self, emit_linenums=True, emit_code_comments=True, c_line_in_traceback=True):
- self.emit_code_comments = emit_code_comments
- self.emit_linenums = emit_linenums
- self.c_line_in_traceback = c_line_in_traceback
-
-
+class CCodeConfig(object):
+ # emit_linenums boolean write #line pragmas?
+ # emit_code_comments boolean copy the original code into C comments?
+ # c_line_in_traceback boolean append the c file and line number to the traceback for exceptions?
+
+ def __init__(self, emit_linenums=True, emit_code_comments=True, c_line_in_traceback=True):
+ self.emit_code_comments = emit_code_comments
+ self.emit_linenums = emit_linenums
+ self.c_line_in_traceback = c_line_in_traceback
+
+
class CCodeWriter(object):
"""
Utility class to output C code.
@@ -1712,46 +1712,46 @@ class CCodeWriter(object):
# utility code, declared constants etc.)
# pyclass_stack list used during recursive code generation to pass information
# about the current class one is in
- # code_config CCodeConfig configuration options for the C code writer
+ # code_config CCodeConfig configuration options for the C code writer
- @cython.locals(create_from='CCodeWriter')
- def __init__(self, create_from=None, buffer=None, copy_formatting=False):
+ @cython.locals(create_from='CCodeWriter')
+ def __init__(self, create_from=None, buffer=None, copy_formatting=False):
if buffer is None: buffer = StringIOTree()
self.buffer = buffer
- self.last_pos = None
- self.last_marked_pos = None
+ self.last_pos = None
+ self.last_marked_pos = None
self.pyclass_stack = []
self.funcstate = None
- self.globalstate = None
- self.code_config = None
+ self.globalstate = None
+ self.code_config = None
self.level = 0
self.call_level = 0
self.bol = 1
if create_from is not None:
# Use same global state
- self.set_global_state(create_from.globalstate)
+ self.set_global_state(create_from.globalstate)
self.funcstate = create_from.funcstate
# Clone formatting state
if copy_formatting:
self.level = create_from.level
self.bol = create_from.bol
self.call_level = create_from.call_level
- self.last_pos = create_from.last_pos
- self.last_marked_pos = create_from.last_marked_pos
+ self.last_pos = create_from.last_pos
+ self.last_marked_pos = create_from.last_marked_pos
def create_new(self, create_from, buffer, copy_formatting):
# polymorphic constructor -- very slightly more versatile
# than using __class__
- result = CCodeWriter(create_from, buffer, copy_formatting)
+ result = CCodeWriter(create_from, buffer, copy_formatting)
return result
- def set_global_state(self, global_state):
- assert self.globalstate is None # prevent overwriting once it's set
- self.globalstate = global_state
- self.code_config = global_state.code_config
-
+ def set_global_state(self, global_state):
+ assert self.globalstate is None # prevent overwriting once it's set
+ self.globalstate = global_state
+ self.code_config = global_state.code_config
+
def copyto(self, f):
self.buffer.copyto(f)
@@ -1761,7 +1761,7 @@ class CCodeWriter(object):
def write(self, s):
# also put invalid markers (lineno 0), to indicate that those lines
# have no Cython source code correspondence
- cython_lineno = self.last_marked_pos[1] if self.last_marked_pos else 0
+ cython_lineno = self.last_marked_pos[1] if self.last_marked_pos else 0
self.buffer.markers.extend([cython_lineno] * s.count('\n'))
self.buffer.write(s)
@@ -1774,7 +1774,7 @@ class CCodeWriter(object):
Creates a new CCodeWriter connected to the same global state, which
can later be inserted using insert.
"""
- return CCodeWriter(create_from=self)
+ return CCodeWriter(create_from=self)
def insert(self, writer):
"""
@@ -1787,22 +1787,22 @@ class CCodeWriter(object):
self.buffer.insert(writer.buffer)
# Properties delegated to function scope
- @funccontext_property
- def label_counter(self): pass
- @funccontext_property
- def return_label(self): pass
- @funccontext_property
- def error_label(self): pass
- @funccontext_property
- def labels_used(self): pass
- @funccontext_property
- def continue_label(self): pass
- @funccontext_property
- def break_label(self): pass
- @funccontext_property
- def return_from_error_cleanup_label(self): pass
- @funccontext_property
- def yield_labels(self): pass
+ @funccontext_property
+ def label_counter(self): pass
+ @funccontext_property
+ def return_label(self): pass
+ @funccontext_property
+ def error_label(self): pass
+ @funccontext_property
+ def labels_used(self): pass
+ @funccontext_property
+ def continue_label(self): pass
+ @funccontext_property
+ def break_label(self): pass
+ @funccontext_property
+ def return_from_error_cleanup_label(self): pass
+ @funccontext_property
+ def yield_labels(self): pass
# Functions delegated to function scope
def new_label(self, name=None): return self.funcstate.new_label(name)
@@ -1818,8 +1818,8 @@ class CCodeWriter(object):
def label_used(self, lbl): return self.funcstate.label_used(lbl)
- def enter_cfunc_scope(self, scope=None):
- self.funcstate = FunctionState(self, scope=scope)
+ def enter_cfunc_scope(self, scope=None):
+ self.funcstate = FunctionState(self, scope=scope)
def exit_cfunc_scope(self):
self.funcstate = None
@@ -1832,8 +1832,8 @@ class CCodeWriter(object):
def get_py_float(self, str_value, value_code):
return self.globalstate.get_float_const(str_value, value_code).cname
- def get_py_const(self, type, prefix='', cleanup_level=None, dedup_key=None):
- return self.globalstate.get_py_const(type, prefix, cleanup_level, dedup_key).cname
+ def get_py_const(self, type, prefix='', cleanup_level=None, dedup_key=None):
+ return self.globalstate.get_py_const(type, prefix, cleanup_level, dedup_key).cname
def get_string_const(self, text):
return self.globalstate.get_string_const(text).cname
@@ -1855,17 +1855,17 @@ class CCodeWriter(object):
def intern_identifier(self, text):
return self.get_py_string_const(text, identifier=True)
- def get_cached_constants_writer(self, target=None):
- return self.globalstate.get_cached_constants_writer(target)
+ def get_cached_constants_writer(self, target=None):
+ return self.globalstate.get_cached_constants_writer(target)
# code generation
def putln(self, code="", safe=False):
- if self.last_pos and self.bol:
+ if self.last_pos and self.bol:
self.emit_marker()
- if self.code_config.emit_linenums and self.last_marked_pos:
- source_desc, line, _ = self.last_marked_pos
- self.write('\n#line %s "%s"\n' % (line, source_desc.get_escaped_description()))
+ if self.code_config.emit_linenums and self.last_marked_pos:
+ source_desc, line, _ = self.last_marked_pos
+ self.write('\n#line %s "%s"\n' % (line, source_desc.get_escaped_description()))
if code:
if safe:
self.put_safe(code)
@@ -1874,35 +1874,35 @@ class CCodeWriter(object):
self.write("\n")
self.bol = 1
- def mark_pos(self, pos, trace=True):
- if pos is None:
- return
- if self.last_marked_pos and self.last_marked_pos[:2] == pos[:2]:
- return
- self.last_pos = (pos, trace)
-
+ def mark_pos(self, pos, trace=True):
+ if pos is None:
+ return
+ if self.last_marked_pos and self.last_marked_pos[:2] == pos[:2]:
+ return
+ self.last_pos = (pos, trace)
+
def emit_marker(self):
- pos, trace = self.last_pos
- self.last_marked_pos = pos
- self.last_pos = None
+ pos, trace = self.last_pos
+ self.last_marked_pos = pos
+ self.last_pos = None
self.write("\n")
- if self.code_config.emit_code_comments:
- self.indent()
- self.write("/* %s */\n" % self._build_marker(pos))
- if trace and self.funcstate and self.funcstate.can_trace and self.globalstate.directives['linetrace']:
+ if self.code_config.emit_code_comments:
+ self.indent()
+ self.write("/* %s */\n" % self._build_marker(pos))
+ if trace and self.funcstate and self.funcstate.can_trace and self.globalstate.directives['linetrace']:
self.indent()
- self.write('__Pyx_TraceLine(%d,%d,%s)\n' % (
- pos[1], not self.funcstate.gil_owned, self.error_goto(pos)))
-
- def _build_marker(self, pos):
- source_desc, line, col = pos
- assert isinstance(source_desc, SourceDescriptor)
- contents = self.globalstate.commented_file_contents(source_desc)
- lines = contents[max(0, line-3):line] # line numbers start at 1
- lines[-1] += u' # <<<<<<<<<<<<<<'
- lines += contents[line:line+2]
- return u'"%s":%d\n%s\n' % (source_desc.get_escaped_description(), line, u'\n'.join(lines))
-
+ self.write('__Pyx_TraceLine(%d,%d,%s)\n' % (
+ pos[1], not self.funcstate.gil_owned, self.error_goto(pos)))
+
+ def _build_marker(self, pos):
+ source_desc, line, col = pos
+ assert isinstance(source_desc, SourceDescriptor)
+ contents = self.globalstate.commented_file_contents(source_desc)
+ lines = contents[max(0, line-3):line] # line numbers start at 1
+ lines[-1] += u' # <<<<<<<<<<<<<<'
+ lines += contents[line:line+2]
+ return u'"%s":%d\n%s\n' % (source_desc.get_escaped_description(), line, u'\n'.join(lines))
+
def put_safe(self, code):
# put code, but ignore {}
self.write(code)
@@ -1916,7 +1916,7 @@ class CCodeWriter(object):
path = os.path.join(include_dir, include_file)
if not os.path.exists(path):
tmp_path = '%s.tmp%s' % (path, os.getpid())
- with closing(Utils.open_new_file(tmp_path)) as f:
+ with closing(Utils.open_new_file(tmp_path)) as f:
f.write(code)
shutil.move(tmp_path, path)
code = '#include "%s"\n' % path
@@ -2023,10 +2023,10 @@ class CCodeWriter(object):
self.putln("%sconst char *%s = NULL;" % (unused, Naming.filename_cname))
self.putln("%sint %s = 0;" % (unused, Naming.clineno_cname))
- def put_generated_by(self):
- self.putln("/* Generated by Cython %s */" % Version.watermark)
- self.putln("")
-
+ def put_generated_by(self):
+ self.putln("/* Generated by Cython %s */" % Version.watermark)
+ self.putln("")
+
def put_h_guard(self, guard):
self.putln("#ifndef %s" % guard)
self.putln("#define %s" % guard)
@@ -2100,10 +2100,10 @@ class CCodeWriter(object):
else:
self.putln("Py_INCREF(%s);" % self.entry_as_pyobject(entry))
- def put_var_xincref(self, entry):
- if entry.type.is_pyobject:
- self.putln("__Pyx_XINCREF(%s);" % self.entry_as_pyobject(entry))
-
+ def put_var_xincref(self, entry):
+ if entry.type.is_pyobject:
+ self.putln("__Pyx_XINCREF(%s);" % self.entry_as_pyobject(entry))
+
def put_decref_clear(self, cname, type, nanny=True, clear_before_decref=False):
self._put_decref(cname, type, nanny, null_check=False,
clear=True, clear_before_decref=clear_before_decref)
@@ -2219,9 +2219,9 @@ class CCodeWriter(object):
if entry.in_closure:
self.put_giveref('Py_None')
- def put_pymethoddef(self, entry, term, allow_skip=True, wrapper_code_writer=None):
+ def put_pymethoddef(self, entry, term, allow_skip=True, wrapper_code_writer=None):
if entry.is_special or entry.name == '__getattribute__':
- if entry.name not in special_py_methods:
+ if entry.name not in special_py_methods:
if entry.name == '__getattr__' and not self.globalstate.directives['fast_getattr']:
pass
# Python's typeobject.c will automatically fill in our slot
@@ -2229,39 +2229,39 @@ class CCodeWriter(object):
# that's better than ours.
elif allow_skip:
return
-
+
method_flags = entry.signature.method_flags()
- if not method_flags:
- return
- if entry.is_special:
- from . import TypeSlots
- method_flags += [TypeSlots.method_coexist]
- func_ptr = wrapper_code_writer.put_pymethoddef_wrapper(entry) if wrapper_code_writer else entry.func_cname
- # Add required casts, but try not to shadow real warnings.
- cast = '__Pyx_PyCFunctionFast' if 'METH_FASTCALL' in method_flags else 'PyCFunction'
- if 'METH_KEYWORDS' in method_flags:
- cast += 'WithKeywords'
- if cast != 'PyCFunction':
- func_ptr = '(void*)(%s)%s' % (cast, func_ptr)
- self.putln(
- '{"%s", (PyCFunction)%s, %s, %s}%s' % (
- entry.name,
- func_ptr,
- "|".join(method_flags),
- entry.doc_cname if entry.doc else '0',
- term))
-
- def put_pymethoddef_wrapper(self, entry):
- func_cname = entry.func_cname
- if entry.is_special:
- method_flags = entry.signature.method_flags()
- if method_flags and 'METH_NOARGS' in method_flags:
- # Special NOARGS methods really take no arguments besides 'self', but PyCFunction expects one.
- func_cname = Naming.method_wrapper_prefix + func_cname
- self.putln("static PyObject *%s(PyObject *self, CYTHON_UNUSED PyObject *arg) {return %s(self);}" % (
- func_cname, entry.func_cname))
- return func_cname
-
+ if not method_flags:
+ return
+ if entry.is_special:
+ from . import TypeSlots
+ method_flags += [TypeSlots.method_coexist]
+ func_ptr = wrapper_code_writer.put_pymethoddef_wrapper(entry) if wrapper_code_writer else entry.func_cname
+ # Add required casts, but try not to shadow real warnings.
+ cast = '__Pyx_PyCFunctionFast' if 'METH_FASTCALL' in method_flags else 'PyCFunction'
+ if 'METH_KEYWORDS' in method_flags:
+ cast += 'WithKeywords'
+ if cast != 'PyCFunction':
+ func_ptr = '(void*)(%s)%s' % (cast, func_ptr)
+ self.putln(
+ '{"%s", (PyCFunction)%s, %s, %s}%s' % (
+ entry.name,
+ func_ptr,
+ "|".join(method_flags),
+ entry.doc_cname if entry.doc else '0',
+ term))
+
+ def put_pymethoddef_wrapper(self, entry):
+ func_cname = entry.func_cname
+ if entry.is_special:
+ method_flags = entry.signature.method_flags()
+ if method_flags and 'METH_NOARGS' in method_flags:
+ # Special NOARGS methods really take no arguments besides 'self', but PyCFunction expects one.
+ func_cname = Naming.method_wrapper_prefix + func_cname
+ self.putln("static PyObject *%s(PyObject *self, CYTHON_UNUSED PyObject *arg) {return %s(self);}" % (
+ func_cname, entry.func_cname))
+ return func_cname
+
# GIL methods
def put_ensure_gil(self, declare_gilstate=True, variable=None):
@@ -2337,8 +2337,8 @@ class CCodeWriter(object):
# error handling
def put_error_if_neg(self, pos, value):
- # TODO this path is almost _never_ taken, yet this macro makes is slower!
- # return self.putln("if (unlikely(%s < 0)) %s" % (value, self.error_goto(pos)))
+ # TODO this path is almost _never_ taken, yet this macro makes is slower!
+ # return self.putln("if (unlikely(%s < 0)) %s" % (value, self.error_goto(pos)))
return self.putln("if (%s < 0) %s" % (value, self.error_goto(pos)))
def put_error_if_unbound(self, pos, entry, in_nogil_context=False):
@@ -2373,14 +2373,14 @@ class CCodeWriter(object):
def error_goto(self, pos, used=True):
lbl = self.funcstate.error_label
self.funcstate.use_label(lbl)
- if pos is None:
- return 'goto %s;' % lbl
+ if pos is None:
+ return 'goto %s;' % lbl
self.funcstate.should_declare_error_indicator = True
if used:
self.funcstate.uses_error_indicator = True
- return "__PYX_ERR(%s, %s, %s)" % (
- self.lookup_filename(pos[0]),
- pos[1],
+ return "__PYX_ERR(%s, %s, %s)" % (
+ self.lookup_filename(pos[0]),
+ pos[1],
lbl)
def error_goto_if(self, cond, pos):
@@ -2425,7 +2425,7 @@ class CCodeWriter(object):
self.funcstate.uses_error_indicator = True
self.putln('__Pyx_AddTraceback("%s", %s, %s, %s);' % format_tuple)
- def put_unraisable(self, qualified_name, nogil=False):
+ def put_unraisable(self, qualified_name, nogil=False):
"""
Generate code to print a Python warning for an unraisable exception.
@@ -2436,30 +2436,30 @@ class CCodeWriter(object):
Naming.clineno_cname,
Naming.lineno_cname,
Naming.filename_cname,
- self.globalstate.directives['unraisable_tracebacks'],
- nogil,
+ self.globalstate.directives['unraisable_tracebacks'],
+ nogil,
)
self.funcstate.uses_error_indicator = True
- self.putln('__Pyx_WriteUnraisable("%s", %s, %s, %s, %d, %d);' % format_tuple)
+ self.putln('__Pyx_WriteUnraisable("%s", %s, %s, %s, %d, %d);' % format_tuple)
self.globalstate.use_utility_code(
UtilityCode.load_cached("WriteUnraisableException", "Exceptions.c"))
def put_trace_declarations(self):
self.putln('__Pyx_TraceDeclarations')
- def put_trace_frame_init(self, codeobj=None):
- if codeobj:
- self.putln('__Pyx_TraceFrameInit(%s)' % codeobj)
-
- def put_trace_call(self, name, pos, nogil=False):
- self.putln('__Pyx_TraceCall("%s", %s[%s], %s, %d, %s);' % (
- name, Naming.filetable_cname, self.lookup_filename(pos[0]), pos[1], nogil, self.error_goto(pos)))
+ def put_trace_frame_init(self, codeobj=None):
+ if codeobj:
+ self.putln('__Pyx_TraceFrameInit(%s)' % codeobj)
+ def put_trace_call(self, name, pos, nogil=False):
+ self.putln('__Pyx_TraceCall("%s", %s[%s], %s, %d, %s);' % (
+ name, Naming.filetable_cname, self.lookup_filename(pos[0]), pos[1], nogil, self.error_goto(pos)))
+
def put_trace_exception(self):
self.putln("__Pyx_TraceException();")
- def put_trace_return(self, retvalue_cname, nogil=False):
- self.putln("__Pyx_TraceReturn(%s, %d);" % (retvalue_cname, nogil))
+ def put_trace_return(self, retvalue_cname, nogil=False):
+ self.putln("__Pyx_TraceReturn(%s, %d);" % (retvalue_cname, nogil))
def putln_openmp(self, string):
self.putln("#ifdef _OPENMP")
@@ -2543,7 +2543,7 @@ class PyxCodeWriter(object):
def getvalue(self):
result = self.buffer.getvalue()
- if isinstance(result, bytes):
+ if isinstance(result, bytes):
result = result.decode(self.encoding)
return result
@@ -2585,7 +2585,7 @@ class ClosureTempAllocator(object):
self.temps_free[type] = list(cnames)
def allocate_temp(self, type):
- if type not in self.temps_allocated:
+ if type not in self.temps_allocated:
self.temps_allocated[type] = []
self.temps_free[type] = []
elif self.temps_free[type]:
diff --git a/contrib/tools/cython/Cython/Compiler/CythonScope.py b/contrib/tools/cython/Cython/Compiler/CythonScope.py
index 1c25d1a6b4..70e83916b5 100644
--- a/contrib/tools/cython/Cython/Compiler/CythonScope.py
+++ b/contrib/tools/cython/Cython/Compiler/CythonScope.py
@@ -71,9 +71,9 @@ class CythonScope(ModuleScope):
name_path = qname.split(u'.')
scope = self
while len(name_path) > 1:
- scope = scope.lookup_here(name_path[0])
- if scope:
- scope = scope.as_module
+ scope = scope.lookup_here(name_path[0])
+ if scope:
+ scope = scope.as_module
del name_path[0]
if scope is None:
return None
diff --git a/contrib/tools/cython/Cython/Compiler/Errors.py b/contrib/tools/cython/Cython/Compiler/Errors.py
index 9761b52c32..aa7a40437c 100644
--- a/contrib/tools/cython/Cython/Compiler/Errors.py
+++ b/contrib/tools/cython/Cython/Compiler/Errors.py
@@ -4,11 +4,11 @@
from __future__ import absolute_import
-try:
- from __builtin__ import basestring as any_string_type
-except ImportError:
- any_string_type = (bytes, str)
-
+try:
+ from __builtin__ import basestring as any_string_type
+except ImportError:
+ any_string_type = (bytes, str)
+
import sys
from contextlib import contextmanager
@@ -27,7 +27,7 @@ class PyrexWarning(Exception):
def context(position):
source = position[0]
- assert not (isinstance(source, any_string_type)), (
+ assert not (isinstance(source, any_string_type)), (
"Please replace filename strings with Scanning.FileSourceDescriptor instances %r" % source)
try:
F = source.get_lines()
@@ -173,7 +173,7 @@ def report_error(err, use_stack=True):
def error(position, message):
- #print("Errors.error:", repr(position), repr(message)) ###
+ #print("Errors.error:", repr(position), repr(message)) ###
if position is None:
raise InternalError(message)
err = CompileError(position, message)
diff --git a/contrib/tools/cython/Cython/Compiler/ExprNodes.py b/contrib/tools/cython/Cython/Compiler/ExprNodes.py
index 4a402f8126..45938521c9 100644
--- a/contrib/tools/cython/Cython/Compiler/ExprNodes.py
+++ b/contrib/tools/cython/Cython/Compiler/ExprNodes.py
@@ -13,12 +13,12 @@ cython.declare(error=object, warning=object, warn_once=object, InternalError=obj
unicode_type=object, str_type=object, bytes_type=object, type_type=object,
Builtin=object, Symtab=object, Utils=object, find_coercion_error=object,
debug_disposal_code=object, debug_temp_alloc=object, debug_coercion=object,
- bytearray_type=object, slice_type=object, _py_int_types=object,
- IS_PYTHON3=cython.bint)
+ bytearray_type=object, slice_type=object, _py_int_types=object,
+ IS_PYTHON3=cython.bint)
import re
-import sys
-import copy
+import sys
+import copy
import os.path
import operator
@@ -43,31 +43,31 @@ from . import Future
from ..Debugging import print_call_chain
from .DebugFlags import debug_disposal_code, debug_temp_alloc, \
debug_coercion
-from .Pythran import (to_pythran, is_pythran_supported_type, is_pythran_supported_operation_type,
- is_pythran_expr, pythran_func_type, pythran_binop_type, pythran_unaryop_type, has_np_pythran,
- pythran_indexing_code, pythran_indexing_type, is_pythran_supported_node_or_none, pythran_type,
- pythran_is_numpy_func_supported, pythran_get_func_include_file, pythran_functor)
+from .Pythran import (to_pythran, is_pythran_supported_type, is_pythran_supported_operation_type,
+ is_pythran_expr, pythran_func_type, pythran_binop_type, pythran_unaryop_type, has_np_pythran,
+ pythran_indexing_code, pythran_indexing_type, is_pythran_supported_node_or_none, pythran_type,
+ pythran_is_numpy_func_supported, pythran_get_func_include_file, pythran_functor)
from .PyrexTypes import PythranExpr
try:
from __builtin__ import basestring
except ImportError:
- # Python 3
- basestring = str
- any_string_type = (bytes, str)
-else:
- # Python 2
- any_string_type = (bytes, unicode)
-
-
-if sys.version_info[0] >= 3:
- IS_PYTHON3 = True
- _py_int_types = int
-else:
- IS_PYTHON3 = False
- _py_int_types = (int, long)
-
-
+ # Python 3
+ basestring = str
+ any_string_type = (bytes, str)
+else:
+ # Python 2
+ any_string_type = (bytes, unicode)
+
+
+if sys.version_info[0] >= 3:
+ IS_PYTHON3 = True
+ _py_int_types = int
+else:
+ IS_PYTHON3 = False
+ _py_int_types = (int, long)
+
+
class NotConstant(object):
_obj = None
@@ -86,46 +86,46 @@ constant_value_not_set = object()
# error messages when coercing from key[0] to key[1]
coercion_error_dict = {
# string related errors
- (unicode_type, str_type): ("Cannot convert Unicode string to 'str' implicitly."
- " This is not portable and requires explicit encoding."),
- (unicode_type, bytes_type): "Cannot convert Unicode string to 'bytes' implicitly, encoding required.",
- (unicode_type, PyrexTypes.c_char_ptr_type): "Unicode objects only support coercion to Py_UNICODE*.",
- (unicode_type, PyrexTypes.c_const_char_ptr_type): "Unicode objects only support coercion to Py_UNICODE*.",
- (unicode_type, PyrexTypes.c_uchar_ptr_type): "Unicode objects only support coercion to Py_UNICODE*.",
- (unicode_type, PyrexTypes.c_const_uchar_ptr_type): "Unicode objects only support coercion to Py_UNICODE*.",
- (bytes_type, unicode_type): "Cannot convert 'bytes' object to unicode implicitly, decoding required",
- (bytes_type, str_type): "Cannot convert 'bytes' object to str implicitly. This is not portable to Py3.",
- (bytes_type, basestring_type): ("Cannot convert 'bytes' object to basestring implicitly."
- " This is not portable to Py3."),
- (bytes_type, PyrexTypes.c_py_unicode_ptr_type): "Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'.",
- (bytes_type, PyrexTypes.c_const_py_unicode_ptr_type): (
- "Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'."),
- (basestring_type, bytes_type): "Cannot convert 'basestring' object to bytes implicitly. This is not portable.",
- (str_type, unicode_type): ("str objects do not support coercion to unicode,"
- " use a unicode string literal instead (u'')"),
- (str_type, bytes_type): "Cannot convert 'str' to 'bytes' implicitly. This is not portable.",
- (str_type, PyrexTypes.c_char_ptr_type): "'str' objects do not support coercion to C types (use 'bytes'?).",
- (str_type, PyrexTypes.c_const_char_ptr_type): "'str' objects do not support coercion to C types (use 'bytes'?).",
- (str_type, PyrexTypes.c_uchar_ptr_type): "'str' objects do not support coercion to C types (use 'bytes'?).",
- (str_type, PyrexTypes.c_const_uchar_ptr_type): "'str' objects do not support coercion to C types (use 'bytes'?).",
- (str_type, PyrexTypes.c_py_unicode_ptr_type): "'str' objects do not support coercion to C types (use 'unicode'?).",
- (str_type, PyrexTypes.c_const_py_unicode_ptr_type): (
- "'str' objects do not support coercion to C types (use 'unicode'?)."),
- (PyrexTypes.c_char_ptr_type, unicode_type): "Cannot convert 'char*' to unicode implicitly, decoding required",
- (PyrexTypes.c_const_char_ptr_type, unicode_type): (
- "Cannot convert 'char*' to unicode implicitly, decoding required"),
- (PyrexTypes.c_uchar_ptr_type, unicode_type): "Cannot convert 'char*' to unicode implicitly, decoding required",
- (PyrexTypes.c_const_uchar_ptr_type, unicode_type): (
- "Cannot convert 'char*' to unicode implicitly, decoding required"),
+ (unicode_type, str_type): ("Cannot convert Unicode string to 'str' implicitly."
+ " This is not portable and requires explicit encoding."),
+ (unicode_type, bytes_type): "Cannot convert Unicode string to 'bytes' implicitly, encoding required.",
+ (unicode_type, PyrexTypes.c_char_ptr_type): "Unicode objects only support coercion to Py_UNICODE*.",
+ (unicode_type, PyrexTypes.c_const_char_ptr_type): "Unicode objects only support coercion to Py_UNICODE*.",
+ (unicode_type, PyrexTypes.c_uchar_ptr_type): "Unicode objects only support coercion to Py_UNICODE*.",
+ (unicode_type, PyrexTypes.c_const_uchar_ptr_type): "Unicode objects only support coercion to Py_UNICODE*.",
+ (bytes_type, unicode_type): "Cannot convert 'bytes' object to unicode implicitly, decoding required",
+ (bytes_type, str_type): "Cannot convert 'bytes' object to str implicitly. This is not portable to Py3.",
+ (bytes_type, basestring_type): ("Cannot convert 'bytes' object to basestring implicitly."
+ " This is not portable to Py3."),
+ (bytes_type, PyrexTypes.c_py_unicode_ptr_type): "Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'.",
+ (bytes_type, PyrexTypes.c_const_py_unicode_ptr_type): (
+ "Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'."),
+ (basestring_type, bytes_type): "Cannot convert 'basestring' object to bytes implicitly. This is not portable.",
+ (str_type, unicode_type): ("str objects do not support coercion to unicode,"
+ " use a unicode string literal instead (u'')"),
+ (str_type, bytes_type): "Cannot convert 'str' to 'bytes' implicitly. This is not portable.",
+ (str_type, PyrexTypes.c_char_ptr_type): "'str' objects do not support coercion to C types (use 'bytes'?).",
+ (str_type, PyrexTypes.c_const_char_ptr_type): "'str' objects do not support coercion to C types (use 'bytes'?).",
+ (str_type, PyrexTypes.c_uchar_ptr_type): "'str' objects do not support coercion to C types (use 'bytes'?).",
+ (str_type, PyrexTypes.c_const_uchar_ptr_type): "'str' objects do not support coercion to C types (use 'bytes'?).",
+ (str_type, PyrexTypes.c_py_unicode_ptr_type): "'str' objects do not support coercion to C types (use 'unicode'?).",
+ (str_type, PyrexTypes.c_const_py_unicode_ptr_type): (
+ "'str' objects do not support coercion to C types (use 'unicode'?)."),
+ (PyrexTypes.c_char_ptr_type, unicode_type): "Cannot convert 'char*' to unicode implicitly, decoding required",
+ (PyrexTypes.c_const_char_ptr_type, unicode_type): (
+ "Cannot convert 'char*' to unicode implicitly, decoding required"),
+ (PyrexTypes.c_uchar_ptr_type, unicode_type): "Cannot convert 'char*' to unicode implicitly, decoding required",
+ (PyrexTypes.c_const_uchar_ptr_type, unicode_type): (
+ "Cannot convert 'char*' to unicode implicitly, decoding required"),
}
def find_coercion_error(type_tuple, default, env):
err = coercion_error_dict.get(type_tuple)
if err is None:
return default
- elif (env.directives['c_string_encoding'] and
- any(t in type_tuple for t in (PyrexTypes.c_char_ptr_type, PyrexTypes.c_uchar_ptr_type,
- PyrexTypes.c_const_char_ptr_type, PyrexTypes.c_const_uchar_ptr_type))):
+ elif (env.directives['c_string_encoding'] and
+ any(t in type_tuple for t in (PyrexTypes.c_char_ptr_type, PyrexTypes.c_uchar_ptr_type,
+ PyrexTypes.c_const_char_ptr_type, PyrexTypes.c_const_uchar_ptr_type))):
if type_tuple[1].is_pyobject:
return default
elif env.directives['c_string_encoding'] in ('ascii', 'default'):
@@ -151,9 +151,9 @@ def check_negative_indices(*nodes):
Used to find (potential) bugs inside of "wraparound=False" sections.
"""
for node in nodes:
- if node is None or (
- not isinstance(node.constant_result, _py_int_types) and
- not isinstance(node.constant_result, float)):
+ if node is None or (
+ not isinstance(node.constant_result, _py_int_types) and
+ not isinstance(node.constant_result, float)):
continue
if node.constant_result < 0:
warning(node.pos,
@@ -187,111 +187,111 @@ def infer_sequence_item_type(env, seq_node, index_node=None, seq_type=None):
return item_types.pop()
return None
-
-def make_dedup_key(outer_type, item_nodes):
- """
- Recursively generate a deduplication key from a sequence of values.
- Includes Cython node types to work around the fact that (1, 2.0) == (1.0, 2), for example.
-
- @param outer_type: The type of the outer container.
- @param item_nodes: A sequence of constant nodes that will be traversed recursively.
- @return: A tuple that can be used as a dict key for deduplication.
- """
- item_keys = [
- (py_object_type, None, type(None)) if node is None
- # For sequences and their "mult_factor", see TupleNode.
- else make_dedup_key(node.type, [node.mult_factor if node.is_literal else None] + node.args) if node.is_sequence_constructor
- else make_dedup_key(node.type, (node.start, node.stop, node.step)) if node.is_slice
- # For constants, look at the Python value type if we don't know the concrete Cython type.
- else (node.type, node.constant_result,
- type(node.constant_result) if node.type is py_object_type else None) if node.has_constant_result()
- else None # something we cannot handle => short-circuit below
- for node in item_nodes
- ]
- if None in item_keys:
- return None
- return outer_type, tuple(item_keys)
-
-
-# Returns a block of code to translate the exception,
-# plus a boolean indicating whether to check for Python exceptions.
-def get_exception_handler(exception_value):
- if exception_value is None:
- return "__Pyx_CppExn2PyErr();", False
- elif (exception_value.type == PyrexTypes.c_char_type
- and exception_value.value == '*'):
- return "__Pyx_CppExn2PyErr();", True
- elif exception_value.type.is_pyobject:
- return (
- 'try { throw; } catch(const std::exception& exn) {'
- 'PyErr_SetString(%s, exn.what());'
- '} catch(...) { PyErr_SetNone(%s); }' % (
- exception_value.entry.cname,
- exception_value.entry.cname),
- False)
- else:
- return (
- '%s(); if (!PyErr_Occurred())'
- 'PyErr_SetString(PyExc_RuntimeError, '
- '"Error converting c++ exception.");' % (
- exception_value.entry.cname),
- False)
-
-def maybe_check_py_error(code, check_py_exception, pos, nogil):
- if check_py_exception:
- if nogil:
- code.putln(code.error_goto_if("__Pyx_ErrOccurredWithGIL()", pos))
- else:
- code.putln(code.error_goto_if("PyErr_Occurred()", pos))
-
-def translate_cpp_exception(code, pos, inside, py_result, exception_value, nogil):
- raise_py_exception, check_py_exception = get_exception_handler(exception_value)
- code.putln("try {")
- code.putln("%s" % inside)
- if py_result:
- code.putln(code.error_goto_if_null(py_result, pos))
- maybe_check_py_error(code, check_py_exception, pos, nogil)
- code.putln("} catch(...) {")
- if nogil:
- code.put_ensure_gil(declare_gilstate=True)
- code.putln(raise_py_exception)
- if nogil:
- code.put_release_ensured_gil()
- code.putln(code.error_goto(pos))
- code.putln("}")
-
-# Used to handle the case where an lvalue expression and an overloaded assignment
-# both have an exception declaration.
-def translate_double_cpp_exception(code, pos, lhs_type, lhs_code, rhs_code,
- lhs_exc_val, assign_exc_val, nogil):
- handle_lhs_exc, lhc_check_py_exc = get_exception_handler(lhs_exc_val)
- handle_assignment_exc, assignment_check_py_exc = get_exception_handler(assign_exc_val)
- code.putln("try {")
- code.putln(lhs_type.declaration_code("__pyx_local_lvalue = %s;" % lhs_code))
- maybe_check_py_error(code, lhc_check_py_exc, pos, nogil)
- code.putln("try {")
- code.putln("__pyx_local_lvalue = %s;" % rhs_code)
- maybe_check_py_error(code, assignment_check_py_exc, pos, nogil)
- # Catch any exception from the overloaded assignment.
- code.putln("} catch(...) {")
- if nogil:
- code.put_ensure_gil(declare_gilstate=True)
- code.putln(handle_assignment_exc)
- if nogil:
- code.put_release_ensured_gil()
- code.putln(code.error_goto(pos))
- code.putln("}")
- # Catch any exception from evaluating lhs.
- code.putln("} catch(...) {")
- if nogil:
- code.put_ensure_gil(declare_gilstate=True)
- code.putln(handle_lhs_exc)
- if nogil:
- code.put_release_ensured_gil()
- code.putln(code.error_goto(pos))
- code.putln('}')
-
-
+
+def make_dedup_key(outer_type, item_nodes):
+ """
+ Recursively generate a deduplication key from a sequence of values.
+ Includes Cython node types to work around the fact that (1, 2.0) == (1.0, 2), for example.
+
+ @param outer_type: The type of the outer container.
+ @param item_nodes: A sequence of constant nodes that will be traversed recursively.
+ @return: A tuple that can be used as a dict key for deduplication.
+ """
+ item_keys = [
+ (py_object_type, None, type(None)) if node is None
+ # For sequences and their "mult_factor", see TupleNode.
+ else make_dedup_key(node.type, [node.mult_factor if node.is_literal else None] + node.args) if node.is_sequence_constructor
+ else make_dedup_key(node.type, (node.start, node.stop, node.step)) if node.is_slice
+ # For constants, look at the Python value type if we don't know the concrete Cython type.
+ else (node.type, node.constant_result,
+ type(node.constant_result) if node.type is py_object_type else None) if node.has_constant_result()
+ else None # something we cannot handle => short-circuit below
+ for node in item_nodes
+ ]
+ if None in item_keys:
+ return None
+ return outer_type, tuple(item_keys)
+
+
+# Returns a block of code to translate the exception,
+# plus a boolean indicating whether to check for Python exceptions.
+def get_exception_handler(exception_value):
+ if exception_value is None:
+ return "__Pyx_CppExn2PyErr();", False
+ elif (exception_value.type == PyrexTypes.c_char_type
+ and exception_value.value == '*'):
+ return "__Pyx_CppExn2PyErr();", True
+ elif exception_value.type.is_pyobject:
+ return (
+ 'try { throw; } catch(const std::exception& exn) {'
+ 'PyErr_SetString(%s, exn.what());'
+ '} catch(...) { PyErr_SetNone(%s); }' % (
+ exception_value.entry.cname,
+ exception_value.entry.cname),
+ False)
+ else:
+ return (
+ '%s(); if (!PyErr_Occurred())'
+ 'PyErr_SetString(PyExc_RuntimeError, '
+ '"Error converting c++ exception.");' % (
+ exception_value.entry.cname),
+ False)
+
+def maybe_check_py_error(code, check_py_exception, pos, nogil):
+ if check_py_exception:
+ if nogil:
+ code.putln(code.error_goto_if("__Pyx_ErrOccurredWithGIL()", pos))
+ else:
+ code.putln(code.error_goto_if("PyErr_Occurred()", pos))
+
+def translate_cpp_exception(code, pos, inside, py_result, exception_value, nogil):
+ raise_py_exception, check_py_exception = get_exception_handler(exception_value)
+ code.putln("try {")
+ code.putln("%s" % inside)
+ if py_result:
+ code.putln(code.error_goto_if_null(py_result, pos))
+ maybe_check_py_error(code, check_py_exception, pos, nogil)
+ code.putln("} catch(...) {")
+ if nogil:
+ code.put_ensure_gil(declare_gilstate=True)
+ code.putln(raise_py_exception)
+ if nogil:
+ code.put_release_ensured_gil()
+ code.putln(code.error_goto(pos))
+ code.putln("}")
+
+# Used to handle the case where an lvalue expression and an overloaded assignment
+# both have an exception declaration.
+def translate_double_cpp_exception(code, pos, lhs_type, lhs_code, rhs_code,
+ lhs_exc_val, assign_exc_val, nogil):
+ handle_lhs_exc, lhc_check_py_exc = get_exception_handler(lhs_exc_val)
+ handle_assignment_exc, assignment_check_py_exc = get_exception_handler(assign_exc_val)
+ code.putln("try {")
+ code.putln(lhs_type.declaration_code("__pyx_local_lvalue = %s;" % lhs_code))
+ maybe_check_py_error(code, lhc_check_py_exc, pos, nogil)
+ code.putln("try {")
+ code.putln("__pyx_local_lvalue = %s;" % rhs_code)
+ maybe_check_py_error(code, assignment_check_py_exc, pos, nogil)
+ # Catch any exception from the overloaded assignment.
+ code.putln("} catch(...) {")
+ if nogil:
+ code.put_ensure_gil(declare_gilstate=True)
+ code.putln(handle_assignment_exc)
+ if nogil:
+ code.put_release_ensured_gil()
+ code.putln(code.error_goto(pos))
+ code.putln("}")
+ # Catch any exception from evaluating lhs.
+ code.putln("} catch(...) {")
+ if nogil:
+ code.put_ensure_gil(declare_gilstate=True)
+ code.putln(handle_lhs_exc)
+ if nogil:
+ code.put_release_ensured_gil()
+ code.putln(code.error_goto(pos))
+ code.putln('}')
+
+
class ExprNode(Node):
# subexprs [string] Class var holding names of subexpr node attrs
# type PyrexType Type of the result
@@ -434,18 +434,18 @@ class ExprNode(Node):
is_sequence_constructor = False
is_dict_literal = False
- is_set_literal = False
+ is_set_literal = False
is_string_literal = False
is_attribute = False
is_subscript = False
- is_slice = False
-
- is_buffer_access = False
- is_memview_index = False
- is_memview_slice = False
- is_memview_broadcast = False
- is_memview_copy_assignment = False
-
+ is_slice = False
+
+ is_buffer_access = False
+ is_memview_index = False
+ is_memview_slice = False
+ is_memview_broadcast = False
+ is_memview_copy_assignment = False
+
saved_subexpr_nodes = None
is_temp = False
is_target = False
@@ -505,12 +505,12 @@ class ExprNode(Node):
assert(type_ is not None)
return to_pythran(self, type_)
- def is_c_result_required(self):
- """
- Subtypes may return False here if result temp allocation can be skipped.
- """
- return True
-
+ def is_c_result_required(self):
+ """
+ Subtypes may return False here if result temp allocation can be skipped.
+ """
+ return True
+
def result_as(self, type = None):
# Return the result code cast to the specified C type.
if (self.is_temp and self.type.is_pyobject and
@@ -635,14 +635,14 @@ class ExprNode(Node):
# can't be modified as part of globals or closures.
return self.is_literal or self.is_temp or self.type.is_array or self.type.is_cfunction
- def inferable_item_node(self, index=0):
- """
- Return a node that represents the (type) result of an indexing operation,
- e.g. for tuple unpacking or iteration.
- """
- return IndexNode(self.pos, base=self, index=IntNode(
- self.pos, value=str(index), constant_result=index, type=PyrexTypes.c_py_ssize_t_type))
-
+ def inferable_item_node(self, index=0):
+ """
+ Return a node that represents the (type) result of an indexing operation,
+ e.g. for tuple unpacking or iteration.
+ """
+ return IndexNode(self.pos, base=self, index=IntNode(
+ self.pos, value=str(index), constant_result=index, type=PyrexTypes.c_py_ssize_t_type))
+
# --------------- Type Analysis ------------------
def analyse_as_module(self, env):
@@ -718,9 +718,9 @@ class ExprNode(Node):
if not type.is_void:
if type.is_pyobject:
type = PyrexTypes.py_object_type
- elif not (self.result_is_used or type.is_memoryviewslice or self.is_c_result_required()):
- self.temp_code = None
- return
+ elif not (self.result_is_used or type.is_memoryviewslice or self.is_c_result_required()):
+ self.temp_code = None
+ return
self.temp_code = code.funcstate.allocate_temp(
type, manage_ref=self.use_managed_ref)
else:
@@ -796,8 +796,8 @@ class ExprNode(Node):
elif self.type.is_memoryviewslice:
code.put_xdecref_memoryviewslice(
self.result(), have_gil=not self.in_nogil_context)
- code.putln("%s.memview = NULL;" % self.result())
- code.putln("%s.data = NULL;" % self.result())
+ code.putln("%s.memview = NULL;" % self.result())
+ code.putln("%s.data = NULL;" % self.result())
else:
# Already done if self.is_temp
self.generate_subexpr_disposal_code(code)
@@ -822,8 +822,8 @@ class ExprNode(Node):
else:
self.generate_subexpr_disposal_code(code)
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
- exception_check=None, exception_value=None):
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
+ exception_check=None, exception_value=None):
# Stub method for nodes which are not legal as
# the LHS of an assignment. An error will have
# been reported earlier.
@@ -879,8 +879,8 @@ class ExprNode(Node):
if self.check_for_coercion_error(dst_type, env):
return self
- used_as_reference = dst_type.is_reference
- if used_as_reference and not src_type.is_reference:
+ used_as_reference = dst_type.is_reference
+ if used_as_reference and not src_type.is_reference:
dst_type = dst_type.ref_base_type
if src_type.is_const:
@@ -903,9 +903,9 @@ class ExprNode(Node):
if src_type.is_fused:
error(self.pos, "Type is not specialized")
- elif src_type.is_null_ptr and dst_type.is_ptr:
- # NULL can be implicitly cast to any pointer type
- return self
+ elif src_type.is_null_ptr and dst_type.is_ptr:
+ # NULL can be implicitly cast to any pointer type
+ return self
else:
error(self.pos, "Cannot coerce to a type that is not specialized")
@@ -923,10 +923,10 @@ class ExprNode(Node):
if src.type.is_pyobject:
src = CoerceToMemViewSliceNode(src, dst_type, env)
elif src.type.is_array:
- src = CythonArrayNode.from_carray(src, env).coerce_to(dst_type, env)
+ src = CythonArrayNode.from_carray(src, env).coerce_to(dst_type, env)
elif not src_type.is_error:
error(self.pos,
- "Cannot convert '%s' to memoryviewslice" % (src_type,))
+ "Cannot convert '%s' to memoryviewslice" % (src_type,))
else:
if src.type.writable_needed:
dst_type.writable_needed = True
@@ -961,10 +961,10 @@ class ExprNode(Node):
# Else, we need to convert the Pythran expression to a Python object
src = CoerceToPyTypeNode(src, env, type=dst_type)
elif src.type.is_pyobject:
- if used_as_reference and dst_type.is_cpp_class:
- warning(
- self.pos,
- "Cannot pass Python object as C++ data structure reference (%s &), will pass by copy." % dst_type)
+ if used_as_reference and dst_type.is_cpp_class:
+ warning(
+ self.pos,
+ "Cannot pass Python object as C++ data structure reference (%s &), will pass by copy." % dst_type)
src = CoerceFromPyTypeNode(dst_type, src, env)
elif (dst_type.is_complex
and src_type != dst_type
@@ -974,8 +974,8 @@ class ExprNode(Node):
# Added the string comparison, since for c types that
# is enough, but Cython gets confused when the types are
# in different pxi files.
- # TODO: Remove this hack and require shared declarations.
- if not (src.type == dst_type or str(src.type) == str(dst_type) or dst_type.assignable_from(src_type)):
+ # TODO: Remove this hack and require shared declarations.
+ if not (src.type == dst_type or str(src.type) == str(dst_type) or dst_type.assignable_from(src_type)):
self.fail_assignment(dst_type)
return src
@@ -1013,15 +1013,15 @@ class ExprNode(Node):
elif type.is_pyobject or type.is_int or type.is_ptr or type.is_float:
return CoerceToBooleanNode(self, env)
elif type.is_cpp_class and type.scope and type.scope.lookup("operator bool"):
- return SimpleCallNode(
- self.pos,
- function=AttributeNode(
+ return SimpleCallNode(
+ self.pos,
+ function=AttributeNode(
self.pos, obj=self, attribute=StringEncoding.EncodedString('operator bool')),
- args=[]).analyse_types(env)
- elif type.is_ctuple:
- bool_value = len(type.components) == 0
- return BoolNode(self.pos, value=bool_value,
- constant_result=bool_value)
+ args=[]).analyse_types(env)
+ elif type.is_ctuple:
+ bool_value = len(type.components) == 0
+ return BoolNode(self.pos, value=bool_value,
+ constant_result=bool_value)
else:
error(self.pos, "Type '%s' not acceptable as a boolean" % type)
return self
@@ -1209,10 +1209,10 @@ class BoolNode(ConstNode):
return str(int(self.value))
def coerce_to(self, dst_type, env):
- if dst_type == self.type:
- return self
- if dst_type is py_object_type and self.type is Builtin.bool_type:
- return self
+ if dst_type == self.type:
+ return self
+ if dst_type is py_object_type and self.type is Builtin.bool_type:
+ return self
if dst_type.is_pyobject and self.type.is_int:
return BoolNode(
self.pos, value=self.value,
@@ -1272,7 +1272,7 @@ class IntNode(ConstNode):
# we ignore 'is_c_literal = True' and instead map signed 32bit
# integers as C long values
if self.is_c_literal or \
- not self.has_constant_result() or \
+ not self.has_constant_result() or \
self.unsigned or self.longness == 'LL':
# clearly a C literal
rank = (self.longness == 'LL') and 2 or 1
@@ -1302,12 +1302,12 @@ class IntNode(ConstNode):
constant_result=not_a_constant)
if dst_type.is_numeric and not dst_type.is_complex:
node = IntNode(self.pos, value=self.value, constant_result=self.constant_result,
- type=dst_type, is_c_literal=True,
+ type=dst_type, is_c_literal=True,
unsigned=self.unsigned, longness=self.longness)
return node
elif dst_type.is_pyobject:
node = IntNode(self.pos, value=self.value, constant_result=self.constant_result,
- type=PyrexTypes.py_object_type, is_c_literal=False,
+ type=PyrexTypes.py_object_type, is_c_literal=False,
unsigned=self.unsigned, longness=self.longness)
else:
# FIXME: not setting the type here to keep it working with
@@ -1335,43 +1335,43 @@ class IntNode(ConstNode):
self.result_code = self.get_constant_c_result_code()
def get_constant_c_result_code(self):
- unsigned, longness = self.unsigned, self.longness
- literal = self.value_as_c_integer_string()
- if not (unsigned or longness) and self.type.is_int and literal[0] == '-' and literal[1] != '0':
- # negative decimal literal => guess longness from type to prevent wrap-around
- if self.type.rank >= PyrexTypes.c_longlong_type.rank:
- longness = 'LL'
- elif self.type.rank >= PyrexTypes.c_long_type.rank:
- longness = 'L'
- return literal + unsigned + longness
+ unsigned, longness = self.unsigned, self.longness
+ literal = self.value_as_c_integer_string()
+ if not (unsigned or longness) and self.type.is_int and literal[0] == '-' and literal[1] != '0':
+ # negative decimal literal => guess longness from type to prevent wrap-around
+ if self.type.rank >= PyrexTypes.c_longlong_type.rank:
+ longness = 'LL'
+ elif self.type.rank >= PyrexTypes.c_long_type.rank:
+ longness = 'L'
+ return literal + unsigned + longness
def value_as_c_integer_string(self):
value = self.value
- if len(value) <= 2:
- # too short to go wrong (and simplifies code below)
- return value
- neg_sign = ''
- if value[0] == '-':
- neg_sign = '-'
- value = value[1:]
- if value[0] == '0':
- literal_type = value[1] # 0'o' - 0'b' - 0'x'
- # 0x123 hex literals and 0123 octal literals work nicely in C
- # but C-incompatible Py3 oct/bin notations need conversion
- if neg_sign and literal_type in 'oOxX0123456789' and value[2:].isdigit():
- # negative hex/octal literal => prevent C compiler from using
- # unsigned integer types by converting to decimal (see C standard 6.4.4.1)
- value = str(Utils.str_to_number(value))
- elif literal_type in 'oO':
- value = '0' + value[2:] # '0o123' => '0123'
- elif literal_type in 'bB':
- value = str(int(value[2:], 2))
- elif value.isdigit() and not self.unsigned and not self.longness:
- if not neg_sign:
- # C compilers do not consider unsigned types for decimal literals,
- # but they do for hex (see C standard 6.4.4.1)
- value = '0x%X' % int(value)
- return neg_sign + value
+ if len(value) <= 2:
+ # too short to go wrong (and simplifies code below)
+ return value
+ neg_sign = ''
+ if value[0] == '-':
+ neg_sign = '-'
+ value = value[1:]
+ if value[0] == '0':
+ literal_type = value[1] # 0'o' - 0'b' - 0'x'
+ # 0x123 hex literals and 0123 octal literals work nicely in C
+ # but C-incompatible Py3 oct/bin notations need conversion
+ if neg_sign and literal_type in 'oOxX0123456789' and value[2:].isdigit():
+ # negative hex/octal literal => prevent C compiler from using
+ # unsigned integer types by converting to decimal (see C standard 6.4.4.1)
+ value = str(Utils.str_to_number(value))
+ elif literal_type in 'oO':
+ value = '0' + value[2:] # '0o123' => '0123'
+ elif literal_type in 'bB':
+ value = str(int(value[2:], 2))
+ elif value.isdigit() and not self.unsigned and not self.longness:
+ if not neg_sign:
+ # C compilers do not consider unsigned types for decimal literals,
+ # but they do for hex (see C standard 6.4.4.1)
+ value = '0x%X' % int(value)
+ return neg_sign + value
def calculate_result_code(self):
return self.result_code
@@ -1409,7 +1409,7 @@ class FloatNode(ConstNode):
def get_constant_c_result_code(self):
strval = self.value
- assert isinstance(strval, basestring)
+ assert isinstance(strval, basestring)
cmpval = repr(float(strval))
if cmpval == 'nan':
return "(Py_HUGE_VAL * 0)"
@@ -1433,12 +1433,12 @@ def _analyse_name_as_type(name, pos, env):
if type is not None:
return type
- global_entry = env.global_scope().lookup(name)
- if global_entry and global_entry.type and (
- global_entry.type.is_extension_type
- or global_entry.type.is_struct_or_union
- or global_entry.type.is_builtin_type
- or global_entry.type.is_cpp_class):
+ global_entry = env.global_scope().lookup(name)
+ if global_entry and global_entry.type and (
+ global_entry.type.is_extension_type
+ or global_entry.type.is_struct_or_union
+ or global_entry.type.is_builtin_type
+ or global_entry.type.is_cpp_class):
return global_entry.type
from .TreeFragment import TreeFragment
@@ -1470,11 +1470,11 @@ class BytesNode(ConstNode):
self.constant_result = self.value
def as_sliced_node(self, start, stop, step=None):
- value = StringEncoding.bytes_literal(self.value[start:stop:step], self.value.encoding)
- return BytesNode(self.pos, value=value, constant_result=value)
+ value = StringEncoding.bytes_literal(self.value[start:stop:step], self.value.encoding)
+ return BytesNode(self.pos, value=value, constant_result=value)
def compile_time_value(self, denv):
- return self.value.byteencode()
+ return self.value.byteencode()
def analyse_as_type(self, env):
return _analyse_name_as_type(self.value.decode('ISO8859-1'), self.pos, env)
@@ -1501,20 +1501,20 @@ class BytesNode(ConstNode):
return CharNode(self.pos, value=self.value,
constant_result=ord(self.value))
- node = BytesNode(self.pos, value=self.value, constant_result=self.constant_result)
+ node = BytesNode(self.pos, value=self.value, constant_result=self.constant_result)
if dst_type.is_pyobject:
if dst_type in (py_object_type, Builtin.bytes_type):
node.type = Builtin.bytes_type
else:
self.check_for_coercion_error(dst_type, env, fail=True)
return node
- elif dst_type in (PyrexTypes.c_char_ptr_type, PyrexTypes.c_const_char_ptr_type):
+ elif dst_type in (PyrexTypes.c_char_ptr_type, PyrexTypes.c_const_char_ptr_type):
node.type = dst_type
return node
- elif dst_type in (PyrexTypes.c_uchar_ptr_type, PyrexTypes.c_const_uchar_ptr_type, PyrexTypes.c_void_ptr_type):
- node.type = (PyrexTypes.c_const_char_ptr_type if dst_type == PyrexTypes.c_const_uchar_ptr_type
- else PyrexTypes.c_char_ptr_type)
- return CastNode(node, dst_type)
+ elif dst_type in (PyrexTypes.c_uchar_ptr_type, PyrexTypes.c_const_uchar_ptr_type, PyrexTypes.c_void_ptr_type):
+ node.type = (PyrexTypes.c_const_char_ptr_type if dst_type == PyrexTypes.c_const_uchar_ptr_type
+ else PyrexTypes.c_char_ptr_type)
+ return CastNode(node, dst_type)
elif dst_type.assignable_from(PyrexTypes.c_char_ptr_type):
# Exclude the case of passing a C string literal into a non-const C++ string.
if not dst_type.is_cpp_class or dst_type.is_const:
@@ -1528,15 +1528,15 @@ class BytesNode(ConstNode):
def generate_evaluation_code(self, code):
if self.type.is_pyobject:
- result = code.get_py_string_const(self.value)
- elif self.type.is_const:
- result = code.get_string_const(self.value)
+ result = code.get_py_string_const(self.value)
+ elif self.type.is_const:
+ result = code.get_string_const(self.value)
else:
- # not const => use plain C string literal and cast to mutable type
- literal = self.value.as_c_string_literal()
- # C++ may require a cast
- result = typecast(self.type, PyrexTypes.c_void_ptr_type, literal)
- self.result_code = result
+ # not const => use plain C string literal and cast to mutable type
+ literal = self.value.as_c_string_literal()
+ # C++ may require a cast
+ result = typecast(self.type, PyrexTypes.c_void_ptr_type, literal)
+ self.result_code = result
def get_constant_c_result_code(self):
return None # FIXME
@@ -1570,8 +1570,8 @@ class UnicodeNode(ConstNode):
value = StringEncoding.EncodedString(self.value[start:stop:step])
value.encoding = self.value.encoding
if self.bytes_value is not None:
- bytes_value = StringEncoding.bytes_literal(
- self.bytes_value[start:stop:step], self.bytes_value.encoding)
+ bytes_value = StringEncoding.bytes_literal(
+ self.bytes_value[start:stop:step], self.bytes_value.encoding)
else:
bytes_value = None
return UnicodeNode(
@@ -1634,17 +1634,17 @@ class UnicodeNode(ConstNode):
self.result_code = code.get_py_const(py_object_type, 'ustring')
data_cname = code.get_string_const(
StringEncoding.BytesLiteral(self.value.encode('unicode_escape')))
- const_code = code.get_cached_constants_writer(self.result_code)
- if const_code is None:
- return # already initialised
- const_code.mark_pos(self.pos)
- const_code.putln(
+ const_code = code.get_cached_constants_writer(self.result_code)
+ if const_code is None:
+ return # already initialised
+ const_code.mark_pos(self.pos)
+ const_code.putln(
"%s = PyUnicode_DecodeUnicodeEscape(%s, sizeof(%s) - 1, NULL); %s" % (
self.result_code,
data_cname,
data_cname,
- const_code.error_goto_if_null(self.result_code, self.pos)))
- const_code.put_error_if_neg(
+ const_code.error_goto_if_null(self.result_code, self.pos)))
+ const_code.put_error_if_neg(
self.pos, "__Pyx_PyUnicode_READY(%s)" % self.result_code)
else:
self.result_code = code.get_py_string_const(self.value)
@@ -1720,15 +1720,15 @@ class StringNode(PyConstNode):
return self.result_code
def compile_time_value(self, env):
- if self.value.is_unicode:
- return self.value
- if not IS_PYTHON3:
- # use plain str/bytes object in Py2
- return self.value.byteencode()
- # in Py3, always return a Unicode string
- if self.unicode_value is not None:
- return self.unicode_value
- return self.value.decode('iso8859-1')
+ if self.value.is_unicode:
+ return self.value
+ if not IS_PYTHON3:
+ # use plain str/bytes object in Py2
+ return self.value.byteencode()
+ # in Py3, always return a Unicode string
+ if self.unicode_value is not None:
+ return self.unicode_value
+ return self.value.decode('iso8859-1')
class IdentifierStringNode(StringNode):
@@ -1820,7 +1820,7 @@ class NewExprNode(AtomicExprNode):
pass
def calculate_result_code(self):
- return "new " + self.class_type.empty_declaration_code()
+ return "new " + self.class_type.empty_declaration_code()
class NameNode(AtomicExprNode):
@@ -2023,25 +2023,25 @@ class NameNode(AtomicExprNode):
def analyse_target_types(self, env):
self.analyse_entry(env, is_target=True)
- entry = self.entry
- if entry.is_cfunction and entry.as_variable:
- # FIXME: unify "is_overridable" flags below
- if (entry.is_overridable or entry.type.is_overridable) or not self.is_lvalue() and entry.fused_cfunction:
- # We need this for assigning to cpdef names and for the fused 'def' TreeFragment
- entry = self.entry = entry.as_variable
- self.type = entry.type
+ entry = self.entry
+ if entry.is_cfunction and entry.as_variable:
+ # FIXME: unify "is_overridable" flags below
+ if (entry.is_overridable or entry.type.is_overridable) or not self.is_lvalue() and entry.fused_cfunction:
+ # We need this for assigning to cpdef names and for the fused 'def' TreeFragment
+ entry = self.entry = entry.as_variable
+ self.type = entry.type
if self.type.is_const:
error(self.pos, "Assignment to const '%s'" % self.name)
if self.type.is_reference:
error(self.pos, "Assignment to reference '%s'" % self.name)
if not self.is_lvalue():
- error(self.pos, "Assignment to non-lvalue '%s'" % self.name)
+ error(self.pos, "Assignment to non-lvalue '%s'" % self.name)
self.type = PyrexTypes.error_type
- entry.used = 1
- if entry.type.is_buffer:
+ entry.used = 1
+ if entry.type.is_buffer:
from . import Buffer
- Buffer.used_buffer_aux_vars(entry)
+ Buffer.used_buffer_aux_vars(entry)
return self
def analyse_rvalue_entry(self, env):
@@ -2096,11 +2096,11 @@ class NameNode(AtomicExprNode):
entry = self.entry
if entry.is_type and entry.type.is_extension_type:
self.type_entry = entry
- if entry.is_type and entry.type.is_enum:
- py_entry = Symtab.Entry(self.name, None, py_object_type)
- py_entry.is_pyglobal = True
- py_entry.scope = self.entry.scope
- self.entry = py_entry
+ if entry.is_type and entry.type.is_enum:
+ py_entry = Symtab.Entry(self.name, None, py_object_type)
+ py_entry.is_pyglobal = True
+ py_entry.scope = self.entry.scope
+ self.entry = py_entry
elif not (entry.is_const or entry.is_variable or
entry.is_builtin or entry.is_cfunction or
entry.is_cpp_class):
@@ -2170,13 +2170,13 @@ class NameNode(AtomicExprNode):
return True
def is_lvalue(self):
- return (
- self.entry.is_variable and
+ return (
+ self.entry.is_variable and
not self.entry.is_readonly
- ) or (
- self.entry.is_cfunction and
- self.entry.is_overridable
- )
+ ) or (
+ self.entry.is_cfunction and
+ self.entry.is_overridable
+ )
def is_addressable(self):
return self.entry.is_variable and not self.type.is_memoryviewslice
@@ -2197,8 +2197,8 @@ class NameNode(AtomicExprNode):
entry = self.entry
if entry is None:
return # There was an error earlier
- if entry.utility_code:
- code.globalstate.use_utility_code(entry.utility_code)
+ if entry.utility_code:
+ code.globalstate.use_utility_code(entry.utility_code)
if entry.is_builtin and entry.is_const:
return # Lookup already cached
elif entry.is_pyclass_attr:
@@ -2219,7 +2219,7 @@ class NameNode(AtomicExprNode):
code.globalstate.use_utility_code(
UtilityCode.load_cached("GetModuleGlobalName", "ObjectHandling.c"))
code.putln(
- '__Pyx_GetModuleGlobalName(%s, %s);' % (
+ '__Pyx_GetModuleGlobalName(%s, %s);' % (
self.result(),
interned_cname))
if not self.cf_is_null:
@@ -2248,7 +2248,7 @@ class NameNode(AtomicExprNode):
code.globalstate.use_utility_code(
UtilityCode.load_cached("GetModuleGlobalName", "ObjectHandling.c"))
code.putln(
- '__Pyx_GetModuleGlobalName(%s, %s); %s' % (
+ '__Pyx_GetModuleGlobalName(%s, %s); %s' % (
self.result(),
interned_cname,
code.error_goto_if_null(self.result(), self.pos)))
@@ -2257,7 +2257,7 @@ class NameNode(AtomicExprNode):
code.globalstate.use_utility_code(
UtilityCode.load_cached("GetNameInClass", "ObjectHandling.c"))
code.putln(
- '__Pyx_GetNameInClass(%s, %s, %s); %s' % (
+ '__Pyx_GetNameInClass(%s, %s, %s); %s' % (
self.result(),
entry.scope.namespace_cname,
interned_cname,
@@ -2275,15 +2275,15 @@ class NameNode(AtomicExprNode):
if null_code and raise_unbound and (entry.type.is_pyobject or memslice_check):
code.put_error_if_unbound(self.pos, entry, self.in_nogil_context)
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
- exception_check=None, exception_value=None):
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
+ exception_check=None, exception_value=None):
#print "NameNode.generate_assignment_code:", self.name ###
entry = self.entry
if entry is None:
return # There was an error earlier
if (self.entry.type.is_ptr and isinstance(rhs, ListNode)
- and not self.lhs_of_first_assignment and not rhs.in_module_scope):
+ and not self.lhs_of_first_assignment and not rhs.in_module_scope):
error(self.pos, "Literal list must be assigned to pointer at time of declaration")
# is_pyglobal seems to be True for module level-globals only.
@@ -2367,22 +2367,22 @@ class NameNode(AtomicExprNode):
code.put_giveref(rhs.py_result())
if not self.type.is_memoryviewslice:
if not assigned:
- if overloaded_assignment:
- result = rhs.result()
- if exception_check == '+':
- translate_cpp_exception(
- code, self.pos,
- '%s = %s;' % (self.result(), result),
- self.result() if self.type.is_pyobject else None,
- exception_value, self.in_nogil_context)
- else:
- code.putln('%s = %s;' % (self.result(), result))
- else:
- result = rhs.result_as(self.ctype())
+ if overloaded_assignment:
+ result = rhs.result()
+ if exception_check == '+':
+ translate_cpp_exception(
+ code, self.pos,
+ '%s = %s;' % (self.result(), result),
+ self.result() if self.type.is_pyobject else None,
+ exception_value, self.in_nogil_context)
+ else:
+ code.putln('%s = %s;' % (self.result(), result))
+ else:
+ result = rhs.result_as(self.ctype())
if is_pythran_expr(self.type):
code.putln('new (&%s) decltype(%s){%s};' % (self.result(), self.result(), result))
- elif result != self.result():
+ elif result != self.result():
code.putln('%s = %s;' % (self.result(), result))
if debug_disposal_code:
print("NameNode.generate_assignment_code:")
@@ -2456,10 +2456,10 @@ class NameNode(AtomicExprNode):
del_code = '__Pyx_PyObject_DelAttrStr(%s, %s)' % (
Naming.module_cname, interned_cname)
if ignore_nonexisting:
- code.putln(
- 'if (unlikely(%s < 0)) {'
- ' if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else %s '
- '}' % (del_code, code.error_goto(self.pos)))
+ code.putln(
+ 'if (unlikely(%s < 0)) {'
+ ' if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else %s '
+ '}' % (del_code, code.error_goto(self.pos)))
else:
code.put_error_if_neg(self.pos, del_code)
elif self.entry.type.is_pyobject or self.entry.type.is_memoryviewslice:
@@ -2566,24 +2566,24 @@ class ImportNode(ExprNode):
name_list_code = self.name_list.py_result()
else:
name_list_code = "0"
-
- code.globalstate.use_utility_code(UtilityCode.load_cached("Import", "ImportExport.c"))
- import_code = "__Pyx_Import(%s, %s, %d)" % (
- self.module_name.py_result(),
- name_list_code,
- self.level)
-
- if (self.level <= 0 and
- self.module_name.is_string_literal and
- self.module_name.value in utility_code_for_imports):
- helper_func, code_name, code_file = utility_code_for_imports[self.module_name.value]
- code.globalstate.use_utility_code(UtilityCode.load_cached(code_name, code_file))
- import_code = '%s(%s)' % (helper_func, import_code)
-
- code.putln("%s = %s; %s" % (
- self.result(),
- import_code,
- code.error_goto_if_null(self.result(), self.pos)))
+
+ code.globalstate.use_utility_code(UtilityCode.load_cached("Import", "ImportExport.c"))
+ import_code = "__Pyx_Import(%s, %s, %d)" % (
+ self.module_name.py_result(),
+ name_list_code,
+ self.level)
+
+ if (self.level <= 0 and
+ self.module_name.is_string_literal and
+ self.module_name.value in utility_code_for_imports):
+ helper_func, code_name, code_file = utility_code_for_imports[self.module_name.value]
+ code.globalstate.use_utility_code(UtilityCode.load_cached(code_name, code_file))
+ import_code = '%s(%s)' % (helper_func, import_code)
+
+ code.putln("%s = %s; %s" % (
+ self.result(),
+ import_code,
+ code.error_goto_if_null(self.result(), self.pos)))
code.put_gotref(self.py_result())
@@ -2599,7 +2599,7 @@ class IteratorNode(ExprNode):
counter_cname = None
cpp_iterator_cname = None
reversed = False # currently only used for list/tuple types (see Optimize.py)
- is_async = False
+ is_async = False
subexprs = ['sequence']
@@ -2613,7 +2613,7 @@ class IteratorNode(ExprNode):
self.analyse_cpp_types(env)
else:
self.sequence = self.sequence.coerce_to_pyobject(env)
- if self.sequence.type in (list_type, tuple_type):
+ if self.sequence.type in (list_type, tuple_type):
self.sequence = self.sequence.as_none_safe_node("'NoneType' object is not iterable")
self.is_temp = 1
return self
@@ -2701,8 +2701,8 @@ class IteratorNode(ExprNode):
return
if sequence_type.is_array or sequence_type.is_ptr:
raise InternalError("for in carray slice not transformed")
-
- is_builtin_sequence = sequence_type in (list_type, tuple_type)
+
+ is_builtin_sequence = sequence_type in (list_type, tuple_type)
if not is_builtin_sequence:
# reversed() not currently optimised (see Optimize.py)
assert not self.reversed, "internal error: reversed() only implemented for list/tuple objects"
@@ -2712,7 +2712,7 @@ class IteratorNode(ExprNode):
"if (likely(PyList_CheckExact(%s)) || PyTuple_CheckExact(%s)) {" % (
self.sequence.py_result(),
self.sequence.py_result()))
-
+
if is_builtin_sequence or self.may_be_a_sequence:
self.counter_cname = code.funcstate.allocate_temp(
PyrexTypes.c_py_ssize_t_type, manage_ref=False)
@@ -2723,25 +2723,25 @@ class IteratorNode(ExprNode):
init_value = 'PyTuple_GET_SIZE(%s) - 1' % self.result()
else:
init_value = '0'
- code.putln("%s = %s; __Pyx_INCREF(%s); %s = %s;" % (
- self.result(),
- self.sequence.py_result(),
- self.result(),
- self.counter_cname,
- init_value))
+ code.putln("%s = %s; __Pyx_INCREF(%s); %s = %s;" % (
+ self.result(),
+ self.sequence.py_result(),
+ self.result(),
+ self.counter_cname,
+ init_value))
if not is_builtin_sequence:
self.iter_func_ptr = code.funcstate.allocate_temp(self._func_iternext_type, manage_ref=False)
if self.may_be_a_sequence:
code.putln("%s = NULL;" % self.iter_func_ptr)
code.putln("} else {")
code.put("%s = -1; " % self.counter_cname)
-
+
code.putln("%s = PyObject_GetIter(%s); %s" % (
- self.result(),
- self.sequence.py_result(),
- code.error_goto_if_null(self.result(), self.pos)))
+ self.result(),
+ self.sequence.py_result(),
+ code.error_goto_if_null(self.result(), self.pos)))
code.put_gotref(self.py_result())
-
+
# PyObject_GetIter() fails if "tp_iternext" is not set, but the check below
# makes it visible to the C compiler that the pointer really isn't NULL, so that
# it can distinguish between the special cases and the generic case
@@ -2758,14 +2758,14 @@ class IteratorNode(ExprNode):
item_count = len(self.sequence.args)
if self.sequence.mult_factor is None:
final_size = item_count
- elif isinstance(self.sequence.mult_factor.constant_result, _py_int_types):
+ elif isinstance(self.sequence.mult_factor.constant_result, _py_int_types):
final_size = item_count * self.sequence.mult_factor.constant_result
code.putln("if (%s >= %s) break;" % (self.counter_cname, final_size))
if self.reversed:
inc_dec = '--'
else:
inc_dec = '++'
- code.putln("#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS")
+ code.putln("#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS")
code.putln(
"%s = Py%s_GET_ITEM(%s, %s); __Pyx_INCREF(%s); %s%s; %s" % (
result_name,
@@ -2787,7 +2787,7 @@ class IteratorNode(ExprNode):
self.counter_cname,
inc_dec,
code.error_goto_if_null(result_name, self.pos)))
- code.put_gotref(result_name)
+ code.put_gotref(result_name)
code.putln("#endif")
def generate_iter_next_result_code(self, result_name, code):
@@ -2854,7 +2854,7 @@ class IteratorNode(ExprNode):
class NextNode(AtomicExprNode):
# Used as part of for statement implementation.
- # Implements result = next(iterator)
+ # Implements result = next(iterator)
# Created during analyse_types phase.
# The iterator is not owned by this node.
#
@@ -2864,14 +2864,14 @@ class NextNode(AtomicExprNode):
AtomicExprNode.__init__(self, iterator.pos)
self.iterator = iterator
- def nogil_check(self, env):
- # ignore - errors (if any) are already handled by IteratorNode
- pass
-
+ def nogil_check(self, env):
+ # ignore - errors (if any) are already handled by IteratorNode
+ pass
+
def type_dependencies(self, env):
return self.iterator.type_dependencies(env)
- def infer_type(self, env, iterator_type=None):
+ def infer_type(self, env, iterator_type=None):
if iterator_type is None:
iterator_type = self.iterator.infer_type(env)
if iterator_type.is_ptr or iterator_type.is_array:
@@ -2901,68 +2901,68 @@ class NextNode(AtomicExprNode):
self.iterator.generate_iter_next_result_code(self.result(), code)
-class AsyncIteratorNode(ExprNode):
- # Used as part of 'async for' statement implementation.
- #
- # Implements result = sequence.__aiter__()
- #
- # sequence ExprNode
-
- subexprs = ['sequence']
-
- is_async = True
- type = py_object_type
- is_temp = 1
-
- def infer_type(self, env):
- return py_object_type
-
- def analyse_types(self, env):
- self.sequence = self.sequence.analyse_types(env)
- if not self.sequence.type.is_pyobject:
- error(self.pos, "async for loops not allowed on C/C++ types")
- self.sequence = self.sequence.coerce_to_pyobject(env)
- return self
-
- def generate_result_code(self, code):
- code.globalstate.use_utility_code(UtilityCode.load_cached("AsyncIter", "Coroutine.c"))
- code.putln("%s = __Pyx_Coroutine_GetAsyncIter(%s); %s" % (
- self.result(),
- self.sequence.py_result(),
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_gotref(self.result())
-
-
-class AsyncNextNode(AtomicExprNode):
- # Used as part of 'async for' statement implementation.
- # Implements result = iterator.__anext__()
- # Created during analyse_types phase.
- # The iterator is not owned by this node.
- #
- # iterator IteratorNode
-
- type = py_object_type
- is_temp = 1
-
- def __init__(self, iterator):
- AtomicExprNode.__init__(self, iterator.pos)
- self.iterator = iterator
-
- def infer_type(self, env):
- return py_object_type
-
- def analyse_types(self, env):
- return self
-
- def generate_result_code(self, code):
- code.globalstate.use_utility_code(UtilityCode.load_cached("AsyncIter", "Coroutine.c"))
- code.putln("%s = __Pyx_Coroutine_AsyncIterNext(%s); %s" % (
- self.result(),
- self.iterator.py_result(),
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_gotref(self.result())
-
-
+class AsyncIteratorNode(ExprNode):
+ # Used as part of 'async for' statement implementation.
+ #
+ # Implements result = sequence.__aiter__()
+ #
+ # sequence ExprNode
+
+ subexprs = ['sequence']
+
+ is_async = True
+ type = py_object_type
+ is_temp = 1
+
+ def infer_type(self, env):
+ return py_object_type
+
+ def analyse_types(self, env):
+ self.sequence = self.sequence.analyse_types(env)
+ if not self.sequence.type.is_pyobject:
+ error(self.pos, "async for loops not allowed on C/C++ types")
+ self.sequence = self.sequence.coerce_to_pyobject(env)
+ return self
+
+ def generate_result_code(self, code):
+ code.globalstate.use_utility_code(UtilityCode.load_cached("AsyncIter", "Coroutine.c"))
+ code.putln("%s = __Pyx_Coroutine_GetAsyncIter(%s); %s" % (
+ self.result(),
+ self.sequence.py_result(),
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_gotref(self.result())
+
+
+class AsyncNextNode(AtomicExprNode):
+ # Used as part of 'async for' statement implementation.
+ # Implements result = iterator.__anext__()
+ # Created during analyse_types phase.
+ # The iterator is not owned by this node.
+ #
+ # iterator IteratorNode
+
+ type = py_object_type
+ is_temp = 1
+
+ def __init__(self, iterator):
+ AtomicExprNode.__init__(self, iterator.pos)
+ self.iterator = iterator
+
+ def infer_type(self, env):
+ return py_object_type
+
+ def analyse_types(self, env):
+ return self
+
+ def generate_result_code(self, code):
+ code.globalstate.use_utility_code(UtilityCode.load_cached("AsyncIter", "Coroutine.c"))
+ code.putln("%s = __Pyx_Coroutine_AsyncIterNext(%s); %s" % (
+ self.result(),
+ self.iterator.py_result(),
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_gotref(self.result())
+
+
class WithExitCallNode(ExprNode):
# The __exit__() call of a 'with' statement. Used in both the
# except and finally clauses.
@@ -3004,14 +3004,14 @@ class WithExitCallNode(ExprNode):
code.putln(code.error_goto_if_null(result_var, self.pos))
code.put_gotref(result_var)
-
+
if self.await_expr:
- # FIXME: result_var temp currently leaks into the closure
+ # FIXME: result_var temp currently leaks into the closure
self.await_expr.generate_evaluation_code(code, source_cname=result_var, decref_source=True)
code.putln("%s = %s;" % (result_var, self.await_expr.py_result()))
self.await_expr.generate_post_assignment_code(code)
self.await_expr.free_temps(code)
-
+
if self.result_is_used:
self.allocate_temp_result(code)
code.putln("%s = __Pyx_PyObject_IsTrue(%s);" % (self.result(), result_var))
@@ -3123,59 +3123,59 @@ class RawCNameExprNode(ExprNode):
#-------------------------------------------------------------------
#
-# F-strings
-#
-#-------------------------------------------------------------------
-
-
-class JoinedStrNode(ExprNode):
- # F-strings
- #
- # values [UnicodeNode|FormattedValueNode] Substrings of the f-string
- #
- type = unicode_type
- is_temp = True
-
- subexprs = ['values']
-
- def analyse_types(self, env):
- self.values = [v.analyse_types(env).coerce_to_pyobject(env) for v in self.values]
- return self
-
- def may_be_none(self):
- # PyUnicode_Join() always returns a Unicode string or raises an exception
- return False
-
- def generate_evaluation_code(self, code):
- code.mark_pos(self.pos)
- num_items = len(self.values)
- list_var = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
- ulength_var = code.funcstate.allocate_temp(PyrexTypes.c_py_ssize_t_type, manage_ref=False)
- max_char_var = code.funcstate.allocate_temp(PyrexTypes.c_py_ucs4_type, manage_ref=False)
-
- code.putln('%s = PyTuple_New(%s); %s' % (
- list_var,
- num_items,
- code.error_goto_if_null(list_var, self.pos)))
- code.put_gotref(list_var)
- code.putln("%s = 0;" % ulength_var)
- code.putln("%s = 127;" % max_char_var) # at least ASCII character range
-
- for i, node in enumerate(self.values):
- node.generate_evaluation_code(code)
- node.make_owned_reference(code)
-
- ulength = "__Pyx_PyUnicode_GET_LENGTH(%s)" % node.py_result()
- max_char_value = "__Pyx_PyUnicode_MAX_CHAR_VALUE(%s)" % node.py_result()
- is_ascii = False
- if isinstance(node, UnicodeNode):
- try:
+# F-strings
+#
+#-------------------------------------------------------------------
+
+
+class JoinedStrNode(ExprNode):
+ # F-strings
+ #
+ # values [UnicodeNode|FormattedValueNode] Substrings of the f-string
+ #
+ type = unicode_type
+ is_temp = True
+
+ subexprs = ['values']
+
+ def analyse_types(self, env):
+ self.values = [v.analyse_types(env).coerce_to_pyobject(env) for v in self.values]
+ return self
+
+ def may_be_none(self):
+ # PyUnicode_Join() always returns a Unicode string or raises an exception
+ return False
+
+ def generate_evaluation_code(self, code):
+ code.mark_pos(self.pos)
+ num_items = len(self.values)
+ list_var = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
+ ulength_var = code.funcstate.allocate_temp(PyrexTypes.c_py_ssize_t_type, manage_ref=False)
+ max_char_var = code.funcstate.allocate_temp(PyrexTypes.c_py_ucs4_type, manage_ref=False)
+
+ code.putln('%s = PyTuple_New(%s); %s' % (
+ list_var,
+ num_items,
+ code.error_goto_if_null(list_var, self.pos)))
+ code.put_gotref(list_var)
+ code.putln("%s = 0;" % ulength_var)
+ code.putln("%s = 127;" % max_char_var) # at least ASCII character range
+
+ for i, node in enumerate(self.values):
+ node.generate_evaluation_code(code)
+ node.make_owned_reference(code)
+
+ ulength = "__Pyx_PyUnicode_GET_LENGTH(%s)" % node.py_result()
+ max_char_value = "__Pyx_PyUnicode_MAX_CHAR_VALUE(%s)" % node.py_result()
+ is_ascii = False
+ if isinstance(node, UnicodeNode):
+ try:
# most strings will be ASCII or at least Latin-1
- node.value.encode('iso8859-1')
- max_char_value = '255'
- node.value.encode('us-ascii')
- is_ascii = True
- except UnicodeEncodeError:
+ node.value.encode('iso8859-1')
+ max_char_value = '255'
+ node.value.encode('us-ascii')
+ is_ascii = True
+ except UnicodeEncodeError:
if max_char_value != '255':
# not ISO8859-1 => check BMP limit
max_char = max(map(ord, node.value))
@@ -3191,133 +3191,133 @@ class JoinedStrNode(ExprNode):
# not really worth implementing a check for surrogate pairs here
# drawback: C code can differ when generating on Py2 with 2-byte Unicode
pass
- else:
- ulength = str(len(node.value))
- elif isinstance(node, FormattedValueNode) and node.value.type.is_numeric:
- is_ascii = True # formatted C numbers are always ASCII
-
- if not is_ascii:
- code.putln("%s = (%s > %s) ? %s : %s;" % (
- max_char_var, max_char_value, max_char_var, max_char_value, max_char_var))
- code.putln("%s += %s;" % (ulength_var, ulength))
-
- code.put_giveref(node.py_result())
- code.putln('PyTuple_SET_ITEM(%s, %s, %s);' % (list_var, i, node.py_result()))
- node.generate_post_assignment_code(code)
- node.free_temps(code)
-
- code.mark_pos(self.pos)
- self.allocate_temp_result(code)
- code.globalstate.use_utility_code(UtilityCode.load_cached("JoinPyUnicode", "StringTools.c"))
- code.putln('%s = __Pyx_PyUnicode_Join(%s, %d, %s, %s); %s' % (
- self.result(),
- list_var,
- num_items,
- ulength_var,
- max_char_var,
- code.error_goto_if_null(self.py_result(), self.pos)))
- code.put_gotref(self.py_result())
-
- code.put_decref_clear(list_var, py_object_type)
- code.funcstate.release_temp(list_var)
- code.funcstate.release_temp(ulength_var)
- code.funcstate.release_temp(max_char_var)
-
-
-class FormattedValueNode(ExprNode):
- # {}-delimited portions of an f-string
- #
- # value ExprNode The expression itself
+ else:
+ ulength = str(len(node.value))
+ elif isinstance(node, FormattedValueNode) and node.value.type.is_numeric:
+ is_ascii = True # formatted C numbers are always ASCII
+
+ if not is_ascii:
+ code.putln("%s = (%s > %s) ? %s : %s;" % (
+ max_char_var, max_char_value, max_char_var, max_char_value, max_char_var))
+ code.putln("%s += %s;" % (ulength_var, ulength))
+
+ code.put_giveref(node.py_result())
+ code.putln('PyTuple_SET_ITEM(%s, %s, %s);' % (list_var, i, node.py_result()))
+ node.generate_post_assignment_code(code)
+ node.free_temps(code)
+
+ code.mark_pos(self.pos)
+ self.allocate_temp_result(code)
+ code.globalstate.use_utility_code(UtilityCode.load_cached("JoinPyUnicode", "StringTools.c"))
+ code.putln('%s = __Pyx_PyUnicode_Join(%s, %d, %s, %s); %s' % (
+ self.result(),
+ list_var,
+ num_items,
+ ulength_var,
+ max_char_var,
+ code.error_goto_if_null(self.py_result(), self.pos)))
+ code.put_gotref(self.py_result())
+
+ code.put_decref_clear(list_var, py_object_type)
+ code.funcstate.release_temp(list_var)
+ code.funcstate.release_temp(ulength_var)
+ code.funcstate.release_temp(max_char_var)
+
+
+class FormattedValueNode(ExprNode):
+ # {}-delimited portions of an f-string
+ #
+ # value ExprNode The expression itself
# conversion_char str or None Type conversion (!s, !r, !a, or none, or 'd' for integer conversion)
- # format_spec JoinedStrNode or None Format string passed to __format__
- # c_format_spec str or None If not None, formatting can be done at the C level
-
- subexprs = ['value', 'format_spec']
-
- type = unicode_type
- is_temp = True
- c_format_spec = None
-
- find_conversion_func = {
- 's': 'PyObject_Unicode',
- 'r': 'PyObject_Repr',
- 'a': 'PyObject_ASCII', # NOTE: mapped to PyObject_Repr() in Py2
+ # format_spec JoinedStrNode or None Format string passed to __format__
+ # c_format_spec str or None If not None, formatting can be done at the C level
+
+ subexprs = ['value', 'format_spec']
+
+ type = unicode_type
+ is_temp = True
+ c_format_spec = None
+
+ find_conversion_func = {
+ 's': 'PyObject_Unicode',
+ 'r': 'PyObject_Repr',
+ 'a': 'PyObject_ASCII', # NOTE: mapped to PyObject_Repr() in Py2
'd': '__Pyx_PyNumber_IntOrLong', # NOTE: internal mapping for '%d' formatting
- }.get
-
- def may_be_none(self):
- # PyObject_Format() always returns a Unicode string or raises an exception
- return False
-
- def analyse_types(self, env):
- self.value = self.value.analyse_types(env)
- if not self.format_spec or self.format_spec.is_string_literal:
- c_format_spec = self.format_spec.value if self.format_spec else self.value.type.default_format_spec
- if self.value.type.can_coerce_to_pystring(env, format_spec=c_format_spec):
- self.c_format_spec = c_format_spec
-
- if self.format_spec:
- self.format_spec = self.format_spec.analyse_types(env).coerce_to_pyobject(env)
- if self.c_format_spec is None:
- self.value = self.value.coerce_to_pyobject(env)
+ }.get
+
+ def may_be_none(self):
+ # PyObject_Format() always returns a Unicode string or raises an exception
+ return False
+
+ def analyse_types(self, env):
+ self.value = self.value.analyse_types(env)
+ if not self.format_spec or self.format_spec.is_string_literal:
+ c_format_spec = self.format_spec.value if self.format_spec else self.value.type.default_format_spec
+ if self.value.type.can_coerce_to_pystring(env, format_spec=c_format_spec):
+ self.c_format_spec = c_format_spec
+
+ if self.format_spec:
+ self.format_spec = self.format_spec.analyse_types(env).coerce_to_pyobject(env)
+ if self.c_format_spec is None:
+ self.value = self.value.coerce_to_pyobject(env)
if not self.format_spec and (not self.conversion_char or self.conversion_char == 's'):
- if self.value.type is unicode_type and not self.value.may_be_none():
- # value is definitely a unicode string and we don't format it any special
- return self.value
- return self
-
- def generate_result_code(self, code):
- if self.c_format_spec is not None and not self.value.type.is_pyobject:
- convert_func_call = self.value.type.convert_to_pystring(
- self.value.result(), code, self.c_format_spec)
- code.putln("%s = %s; %s" % (
- self.result(),
- convert_func_call,
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_gotref(self.py_result())
- return
-
- value_result = self.value.py_result()
- value_is_unicode = self.value.type is unicode_type and not self.value.may_be_none()
- if self.format_spec:
- format_func = '__Pyx_PyObject_Format'
- format_spec = self.format_spec.py_result()
- else:
- # common case: expect simple Unicode pass-through if no format spec
- format_func = '__Pyx_PyObject_FormatSimple'
- # passing a Unicode format string in Py2 forces PyObject_Format() to also return a Unicode string
- format_spec = Naming.empty_unicode
-
- conversion_char = self.conversion_char
- if conversion_char == 's' and value_is_unicode:
- # no need to pipe unicode strings through str()
- conversion_char = None
-
- if conversion_char:
- fn = self.find_conversion_func(conversion_char)
- assert fn is not None, "invalid conversion character found: '%s'" % conversion_char
- value_result = '%s(%s)' % (fn, value_result)
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyObjectFormatAndDecref", "StringTools.c"))
- format_func += 'AndDecref'
- elif self.format_spec:
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyObjectFormat", "StringTools.c"))
- else:
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyObjectFormatSimple", "StringTools.c"))
-
- code.putln("%s = %s(%s, %s); %s" % (
- self.result(),
- format_func,
- value_result,
- format_spec,
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_gotref(self.py_result())
-
-
-#-------------------------------------------------------------------
-#
+ if self.value.type is unicode_type and not self.value.may_be_none():
+ # value is definitely a unicode string and we don't format it any special
+ return self.value
+ return self
+
+ def generate_result_code(self, code):
+ if self.c_format_spec is not None and not self.value.type.is_pyobject:
+ convert_func_call = self.value.type.convert_to_pystring(
+ self.value.result(), code, self.c_format_spec)
+ code.putln("%s = %s; %s" % (
+ self.result(),
+ convert_func_call,
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_gotref(self.py_result())
+ return
+
+ value_result = self.value.py_result()
+ value_is_unicode = self.value.type is unicode_type and not self.value.may_be_none()
+ if self.format_spec:
+ format_func = '__Pyx_PyObject_Format'
+ format_spec = self.format_spec.py_result()
+ else:
+ # common case: expect simple Unicode pass-through if no format spec
+ format_func = '__Pyx_PyObject_FormatSimple'
+ # passing a Unicode format string in Py2 forces PyObject_Format() to also return a Unicode string
+ format_spec = Naming.empty_unicode
+
+ conversion_char = self.conversion_char
+ if conversion_char == 's' and value_is_unicode:
+ # no need to pipe unicode strings through str()
+ conversion_char = None
+
+ if conversion_char:
+ fn = self.find_conversion_func(conversion_char)
+ assert fn is not None, "invalid conversion character found: '%s'" % conversion_char
+ value_result = '%s(%s)' % (fn, value_result)
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("PyObjectFormatAndDecref", "StringTools.c"))
+ format_func += 'AndDecref'
+ elif self.format_spec:
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("PyObjectFormat", "StringTools.c"))
+ else:
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("PyObjectFormatSimple", "StringTools.c"))
+
+ code.putln("%s = %s(%s, %s); %s" % (
+ self.result(),
+ format_func,
+ value_result,
+ format_spec,
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_gotref(self.py_result())
+
+
+#-------------------------------------------------------------------
+#
# Parallel nodes (cython.parallel.thread(savailable|id))
#
#-------------------------------------------------------------------
@@ -3380,38 +3380,38 @@ class ParallelThreadIdNode(AtomicExprNode): #, Nodes.ParallelNode):
#
#-------------------------------------------------------------------
-
-class _IndexingBaseNode(ExprNode):
- # Base class for indexing nodes.
- #
- # base ExprNode the value being indexed
-
- def is_ephemeral(self):
- # in most cases, indexing will return a safe reference to an object in a container,
- # so we consider the result safe if the base object is
- return self.base.is_ephemeral() or self.base.type in (
+
+class _IndexingBaseNode(ExprNode):
+ # Base class for indexing nodes.
+ #
+ # base ExprNode the value being indexed
+
+ def is_ephemeral(self):
+ # in most cases, indexing will return a safe reference to an object in a container,
+ # so we consider the result safe if the base object is
+ return self.base.is_ephemeral() or self.base.type in (
basestring_type, str_type, bytes_type, bytearray_type, unicode_type)
-
- def check_const_addr(self):
- return self.base.check_const_addr() and self.index.check_const()
-
- def is_lvalue(self):
- # NOTE: references currently have both is_reference and is_ptr
- # set. Since pointers and references have different lvalue
- # rules, we must be careful to separate the two.
- if self.type.is_reference:
- if self.type.ref_base_type.is_array:
- # fixed-sized arrays aren't l-values
- return False
- elif self.type.is_ptr:
- # non-const pointers can always be reassigned
- return True
- # Just about everything else returned by the index operator
- # can be an lvalue.
- return True
-
-
-class IndexNode(_IndexingBaseNode):
+
+ def check_const_addr(self):
+ return self.base.check_const_addr() and self.index.check_const()
+
+ def is_lvalue(self):
+ # NOTE: references currently have both is_reference and is_ptr
+ # set. Since pointers and references have different lvalue
+ # rules, we must be careful to separate the two.
+ if self.type.is_reference:
+ if self.type.ref_base_type.is_array:
+ # fixed-sized arrays aren't l-values
+ return False
+ elif self.type.is_ptr:
+ # non-const pointers can always be reassigned
+ return True
+ # Just about everything else returned by the index operator
+ # can be an lvalue.
+ return True
+
+
+class IndexNode(_IndexingBaseNode):
# Sequence indexing.
#
# base ExprNode
@@ -3421,21 +3421,21 @@ class IndexNode(_IndexingBaseNode):
# is_fused_index boolean Whether the index is used to specialize a
# c(p)def function
- subexprs = ['base', 'index']
+ subexprs = ['base', 'index']
type_indices = None
is_subscript = True
is_fused_index = False
def calculate_constant_result(self):
- self.constant_result = self.base.constant_result[self.index.constant_result]
+ self.constant_result = self.base.constant_result[self.index.constant_result]
def compile_time_value(self, denv):
base = self.base.compile_time_value(denv)
index = self.index.compile_time_value(denv)
try:
return base[index]
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def is_simple(self):
@@ -3467,26 +3467,26 @@ class IndexNode(_IndexingBaseNode):
else:
template_values = [self.index]
type_node = Nodes.TemplatedTypeNode(
- pos=self.pos,
- positional_args=template_values,
- keyword_args=None)
- return type_node.analyse(env, base_type=base_type)
- elif self.index.is_slice or self.index.is_sequence_constructor:
- # memory view
- from . import MemoryView
- env.use_utility_code(MemoryView.view_utility_code)
- axes = [self.index] if self.index.is_slice else list(self.index.args)
- return PyrexTypes.MemoryViewSliceType(base_type, MemoryView.get_axes_specs(env, axes))
+ pos=self.pos,
+ positional_args=template_values,
+ keyword_args=None)
+ return type_node.analyse(env, base_type=base_type)
+ elif self.index.is_slice or self.index.is_sequence_constructor:
+ # memory view
+ from . import MemoryView
+ env.use_utility_code(MemoryView.view_utility_code)
+ axes = [self.index] if self.index.is_slice else list(self.index.args)
+ return PyrexTypes.MemoryViewSliceType(base_type, MemoryView.get_axes_specs(env, axes))
else:
- # C array
+ # C array
index = self.index.compile_time_value(env)
if index is not None:
- try:
- index = int(index)
- except (ValueError, TypeError):
- pass
- else:
- return PyrexTypes.CArrayType(base_type, index)
+ try:
+ index = int(index)
+ except (ValueError, TypeError):
+ pass
+ else:
+ return PyrexTypes.CArrayType(base_type, index)
error(self.pos, "Array size must be a compile time constant")
return None
@@ -3495,7 +3495,7 @@ class IndexNode(_IndexingBaseNode):
def infer_type(self, env):
base_type = self.base.infer_type(env)
- if self.index.is_slice:
+ if self.index.is_slice:
# slicing!
if base_type.is_string:
# sliced C strings must coerce to Python
@@ -3542,13 +3542,13 @@ class IndexNode(_IndexingBaseNode):
return item_type
elif base_type.is_ptr or base_type.is_array:
return base_type.base_type
- elif base_type.is_ctuple and isinstance(self.index, IntNode):
- if self.index.has_constant_result():
- index = self.index.constant_result
- if index < 0:
- index += base_type.size
- if 0 <= index < base_type.size:
- return base_type.components[index]
+ elif base_type.is_ctuple and isinstance(self.index, IntNode):
+ if self.index.has_constant_result():
+ index = self.index.constant_result
+ if index < 0:
+ index += base_type.size
+ if 0 <= index < base_type.size:
+ return base_type.components[index]
if base_type.is_cpp_class:
class FakeOperand:
@@ -3581,7 +3581,7 @@ class IndexNode(_IndexingBaseNode):
node = self.analyse_base_and_index_types(env, setting=True)
if node.type.is_const:
error(self.pos, "Assignment to const dereference")
- if node is self and not node.is_lvalue():
+ if node is self and not node.is_lvalue():
error(self.pos, "Assignment to non-lvalue of type '%s'" % node.type)
return node
@@ -3599,7 +3599,7 @@ class IndexNode(_IndexingBaseNode):
self.type = PyrexTypes.error_type
return self
- is_slice = self.index.is_slice
+ is_slice = self.index.is_slice
if not env.directives['wraparound']:
if is_slice:
check_negative_indices(self.index.start, self.index.stop)
@@ -3616,16 +3616,16 @@ class IndexNode(_IndexingBaseNode):
if self.base.type.is_string or not (self.base.type.is_ptr or self.base.type.is_array):
self.base = self.base.coerce_to_pyobject(env)
- replacement_node = self.analyse_as_buffer_operation(env, getting)
- if replacement_node is not None:
- return replacement_node
+ replacement_node = self.analyse_as_buffer_operation(env, getting)
+ if replacement_node is not None:
+ return replacement_node
self.nogil = env.nogil
- base_type = self.base.type
+ base_type = self.base.type
- if not base_type.is_cfunction:
- self.index = self.index.analyse_types(env)
- self.original_index_type = self.index.type
+ if not base_type.is_cfunction:
+ self.index = self.index.analyse_types(env)
+ self.original_index_type = self.index.type
if base_type.is_unicode_char:
# we infer Py_UNICODE/Py_UCS4 for unicode strings in some
@@ -3637,26 +3637,26 @@ class IndexNode(_IndexingBaseNode):
return self.base
self.base = self.base.coerce_to_pyobject(env)
base_type = self.base.type
-
- if base_type.is_pyobject:
- return self.analyse_as_pyobject(env, is_slice, getting, setting)
- elif base_type.is_ptr or base_type.is_array:
- return self.analyse_as_c_array(env, is_slice)
- elif base_type.is_cpp_class:
- return self.analyse_as_cpp(env, setting)
- elif base_type.is_cfunction:
- return self.analyse_as_c_function(env)
- elif base_type.is_ctuple:
- return self.analyse_as_c_tuple(env, getting, setting)
- else:
- error(self.pos,
- "Attempting to index non-array type '%s'" %
- base_type)
- self.type = PyrexTypes.error_type
- return self
-
- def analyse_as_pyobject(self, env, is_slice, getting, setting):
- base_type = self.base.type
+
+ if base_type.is_pyobject:
+ return self.analyse_as_pyobject(env, is_slice, getting, setting)
+ elif base_type.is_ptr or base_type.is_array:
+ return self.analyse_as_c_array(env, is_slice)
+ elif base_type.is_cpp_class:
+ return self.analyse_as_cpp(env, setting)
+ elif base_type.is_cfunction:
+ return self.analyse_as_c_function(env)
+ elif base_type.is_ctuple:
+ return self.analyse_as_c_tuple(env, getting, setting)
+ else:
+ error(self.pos,
+ "Attempting to index non-array type '%s'" %
+ base_type)
+ self.type = PyrexTypes.error_type
+ return self
+
+ def analyse_as_pyobject(self, env, is_slice, getting, setting):
+ base_type = self.base.type
if self.index.type.is_unicode_char and base_type is not dict_type:
# TODO: eventually fold into case below and remove warning, once people have adapted their code
warning(self.pos,
@@ -3665,139 +3665,139 @@ class IndexNode(_IndexingBaseNode):
self.index = self.index.coerce_to_pyobject(env)
self.is_temp = 1
elif self.index.type.is_int and base_type is not dict_type:
- if (getting
- and (base_type in (list_type, tuple_type, bytearray_type))
- and (not self.index.type.signed
- or not env.directives['wraparound']
- or (isinstance(self.index, IntNode) and
- self.index.has_constant_result() and self.index.constant_result >= 0))
- and not env.directives['boundscheck']):
- self.is_temp = 0
- else:
- self.is_temp = 1
- self.index = self.index.coerce_to(PyrexTypes.c_py_ssize_t_type, env).coerce_to_simple(env)
- self.original_index_type.create_to_py_utility_code(env)
- else:
- self.index = self.index.coerce_to_pyobject(env)
- self.is_temp = 1
-
- if self.index.type.is_int and base_type is unicode_type:
- # Py_UNICODE/Py_UCS4 will automatically coerce to a unicode string
- # if required, so this is fast and safe
- self.type = PyrexTypes.c_py_ucs4_type
- elif self.index.type.is_int and base_type is bytearray_type:
- if setting:
- self.type = PyrexTypes.c_uchar_type
+ if (getting
+ and (base_type in (list_type, tuple_type, bytearray_type))
+ and (not self.index.type.signed
+ or not env.directives['wraparound']
+ or (isinstance(self.index, IntNode) and
+ self.index.has_constant_result() and self.index.constant_result >= 0))
+ and not env.directives['boundscheck']):
+ self.is_temp = 0
else:
- # not using 'uchar' to enable fast and safe error reporting as '-1'
- self.type = PyrexTypes.c_int_type
+ self.is_temp = 1
+ self.index = self.index.coerce_to(PyrexTypes.c_py_ssize_t_type, env).coerce_to_simple(env)
+ self.original_index_type.create_to_py_utility_code(env)
+ else:
+ self.index = self.index.coerce_to_pyobject(env)
+ self.is_temp = 1
+
+ if self.index.type.is_int and base_type is unicode_type:
+ # Py_UNICODE/Py_UCS4 will automatically coerce to a unicode string
+ # if required, so this is fast and safe
+ self.type = PyrexTypes.c_py_ucs4_type
+ elif self.index.type.is_int and base_type is bytearray_type:
+ if setting:
+ self.type = PyrexTypes.c_uchar_type
+ else:
+ # not using 'uchar' to enable fast and safe error reporting as '-1'
+ self.type = PyrexTypes.c_int_type
elif is_slice and base_type in (bytes_type, bytearray_type, str_type, unicode_type, list_type, tuple_type):
- self.type = base_type
- else:
- item_type = None
- if base_type in (list_type, tuple_type) and self.index.type.is_int:
- item_type = infer_sequence_item_type(
- env, self.base, self.index, seq_type=base_type)
- if item_type is None:
- item_type = py_object_type
- self.type = item_type
- if base_type in (list_type, tuple_type, dict_type):
- # do the None check explicitly (not in a helper) to allow optimising it away
- self.base = self.base.as_none_safe_node("'NoneType' object is not subscriptable")
-
+ self.type = base_type
+ else:
+ item_type = None
+ if base_type in (list_type, tuple_type) and self.index.type.is_int:
+ item_type = infer_sequence_item_type(
+ env, self.base, self.index, seq_type=base_type)
+ if item_type is None:
+ item_type = py_object_type
+ self.type = item_type
+ if base_type in (list_type, tuple_type, dict_type):
+ # do the None check explicitly (not in a helper) to allow optimising it away
+ self.base = self.base.as_none_safe_node("'NoneType' object is not subscriptable")
+
self.wrap_in_nonecheck_node(env, getting)
return self
- def analyse_as_c_array(self, env, is_slice):
- base_type = self.base.type
- self.type = base_type.base_type
- if is_slice:
- self.type = base_type
- elif self.index.type.is_pyobject:
- self.index = self.index.coerce_to(PyrexTypes.c_py_ssize_t_type, env)
- elif not self.index.type.is_int:
- error(self.pos, "Invalid index type '%s'" % self.index.type)
- return self
-
- def analyse_as_cpp(self, env, setting):
- base_type = self.base.type
- function = env.lookup_operator("[]", [self.base, self.index])
- if function is None:
- error(self.pos, "Indexing '%s' not supported for index type '%s'" % (base_type, self.index.type))
- self.type = PyrexTypes.error_type
- self.result_code = "<error>"
- return self
- func_type = function.type
- if func_type.is_ptr:
- func_type = func_type.base_type
- self.exception_check = func_type.exception_check
- self.exception_value = func_type.exception_value
- if self.exception_check:
- if not setting:
- self.is_temp = True
- if self.exception_value is None:
- env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
- self.index = self.index.coerce_to(func_type.args[0].type, env)
- self.type = func_type.return_type
- if setting and not func_type.return_type.is_reference:
- error(self.pos, "Can't set non-reference result '%s'" % self.type)
- return self
-
- def analyse_as_c_function(self, env):
- base_type = self.base.type
- if base_type.is_fused:
- self.parse_indexed_fused_cdef(env)
- else:
- self.type_indices = self.parse_index_as_types(env)
- self.index = None # FIXME: use a dedicated Node class instead of generic IndexNode
- if base_type.templates is None:
- error(self.pos, "Can only parameterize template functions.")
- self.type = error_type
+ def analyse_as_c_array(self, env, is_slice):
+ base_type = self.base.type
+ self.type = base_type.base_type
+ if is_slice:
+ self.type = base_type
+ elif self.index.type.is_pyobject:
+ self.index = self.index.coerce_to(PyrexTypes.c_py_ssize_t_type, env)
+ elif not self.index.type.is_int:
+ error(self.pos, "Invalid index type '%s'" % self.index.type)
+ return self
+
+ def analyse_as_cpp(self, env, setting):
+ base_type = self.base.type
+ function = env.lookup_operator("[]", [self.base, self.index])
+ if function is None:
+ error(self.pos, "Indexing '%s' not supported for index type '%s'" % (base_type, self.index.type))
+ self.type = PyrexTypes.error_type
+ self.result_code = "<error>"
+ return self
+ func_type = function.type
+ if func_type.is_ptr:
+ func_type = func_type.base_type
+ self.exception_check = func_type.exception_check
+ self.exception_value = func_type.exception_value
+ if self.exception_check:
+ if not setting:
+ self.is_temp = True
+ if self.exception_value is None:
+ env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
+ self.index = self.index.coerce_to(func_type.args[0].type, env)
+ self.type = func_type.return_type
+ if setting and not func_type.return_type.is_reference:
+ error(self.pos, "Can't set non-reference result '%s'" % self.type)
+ return self
+
+ def analyse_as_c_function(self, env):
+ base_type = self.base.type
+ if base_type.is_fused:
+ self.parse_indexed_fused_cdef(env)
+ else:
+ self.type_indices = self.parse_index_as_types(env)
+ self.index = None # FIXME: use a dedicated Node class instead of generic IndexNode
+ if base_type.templates is None:
+ error(self.pos, "Can only parameterize template functions.")
+ self.type = error_type
elif self.type_indices is None:
# Error recorded earlier.
self.type = error_type
- elif len(base_type.templates) != len(self.type_indices):
- error(self.pos, "Wrong number of template arguments: expected %s, got %s" % (
- (len(base_type.templates), len(self.type_indices))))
- self.type = error_type
- else:
- self.type = base_type.specialize(dict(zip(base_type.templates, self.type_indices)))
- # FIXME: use a dedicated Node class instead of generic IndexNode
- return self
-
- def analyse_as_c_tuple(self, env, getting, setting):
- base_type = self.base.type
- if isinstance(self.index, IntNode) and self.index.has_constant_result():
- index = self.index.constant_result
- if -base_type.size <= index < base_type.size:
- if index < 0:
- index += base_type.size
- self.type = base_type.components[index]
+ elif len(base_type.templates) != len(self.type_indices):
+ error(self.pos, "Wrong number of template arguments: expected %s, got %s" % (
+ (len(base_type.templates), len(self.type_indices))))
+ self.type = error_type
else:
- error(self.pos,
- "Index %s out of bounds for '%s'" %
- (index, base_type))
- self.type = PyrexTypes.error_type
- return self
- else:
- self.base = self.base.coerce_to_pyobject(env)
- return self.analyse_base_and_index_types(env, getting=getting, setting=setting, analyse_base=False)
-
- def analyse_as_buffer_operation(self, env, getting):
- """
- Analyse buffer indexing and memoryview indexing/slicing
- """
- if isinstance(self.index, TupleNode):
- indices = self.index.args
- else:
- indices = [self.index]
+ self.type = base_type.specialize(dict(zip(base_type.templates, self.type_indices)))
+ # FIXME: use a dedicated Node class instead of generic IndexNode
+ return self
+
+ def analyse_as_c_tuple(self, env, getting, setting):
+ base_type = self.base.type
+ if isinstance(self.index, IntNode) and self.index.has_constant_result():
+ index = self.index.constant_result
+ if -base_type.size <= index < base_type.size:
+ if index < 0:
+ index += base_type.size
+ self.type = base_type.components[index]
+ else:
+ error(self.pos,
+ "Index %s out of bounds for '%s'" %
+ (index, base_type))
+ self.type = PyrexTypes.error_type
+ return self
+ else:
+ self.base = self.base.coerce_to_pyobject(env)
+ return self.analyse_base_and_index_types(env, getting=getting, setting=setting, analyse_base=False)
+
+ def analyse_as_buffer_operation(self, env, getting):
+ """
+ Analyse buffer indexing and memoryview indexing/slicing
+ """
+ if isinstance(self.index, TupleNode):
+ indices = self.index.args
+ else:
+ indices = [self.index]
base = self.base
base_type = base.type
- replacement_node = None
- if base_type.is_memoryviewslice:
- # memoryviewslice indexing or slicing
- from . import MemoryView
+ replacement_node = None
+ if base_type.is_memoryviewslice:
+ # memoryviewslice indexing or slicing
+ from . import MemoryView
if base.is_memview_slice:
# For memory views, "view[i][j]" is the same as "view[i, j]" => use the latter for speed.
merged_indices = base.merged_indices(indices)
@@ -3805,10 +3805,10 @@ class IndexNode(_IndexingBaseNode):
base = base.base
base_type = base.type
indices = merged_indices
- have_slices, indices, newaxes = MemoryView.unellipsify(indices, base_type.ndim)
- if have_slices:
+ have_slices, indices, newaxes = MemoryView.unellipsify(indices, base_type.ndim)
+ if have_slices:
replacement_node = MemoryViewSliceNode(self.pos, indices=indices, base=base)
- else:
+ else:
replacement_node = MemoryViewIndexNode(self.pos, indices=indices, base=base)
elif base_type.is_buffer or base_type.is_pythran_expr:
if base_type.is_pythran_expr or len(indices) == base_type.ndim:
@@ -3831,16 +3831,16 @@ class IndexNode(_IndexingBaseNode):
replacement_node = BufferIndexNode(self.pos, indices=indices, base=base)
# On cloning, indices is cloned. Otherwise, unpack index into indices.
assert not isinstance(self.index, CloneNode)
-
- if replacement_node is not None:
- replacement_node = replacement_node.analyse_types(env, getting)
- return replacement_node
-
- def wrap_in_nonecheck_node(self, env, getting):
- if not env.directives['nonecheck'] or not self.base.may_be_none():
- return
- self.base = self.base.as_none_safe_node("'NoneType' object is not subscriptable")
-
+
+ if replacement_node is not None:
+ replacement_node = replacement_node.analyse_types(env, getting)
+ return replacement_node
+
+ def wrap_in_nonecheck_node(self, env, getting):
+ if not env.directives['nonecheck'] or not self.base.may_be_none():
+ return
+ self.base = self.base.as_none_safe_node("'NoneType' object is not subscriptable")
+
def parse_index_as_types(self, env, required=True):
if isinstance(self.index, TupleNode):
indices = self.index.args
@@ -3949,7 +3949,7 @@ class IndexNode(_IndexingBaseNode):
gil_message = "Indexing Python object"
def calculate_result_code(self):
- if self.base.type in (list_type, tuple_type, bytearray_type):
+ if self.base.type in (list_type, tuple_type, bytearray_type):
if self.base.type is list_type:
index_code = "PyList_GET_ITEM(%s, %s)"
elif self.base.type is tuple_type:
@@ -3961,12 +3961,12 @@ class IndexNode(_IndexingBaseNode):
elif self.base.type.is_cfunction:
return "%s<%s>" % (
self.base.result(),
- ",".join([param.empty_declaration_code() for param in self.type_indices]))
- elif self.base.type.is_ctuple:
- index = self.index.constant_result
- if index < 0:
- index += self.base.type.size
- return "%s.f%s" % (self.base.result(), index)
+ ",".join([param.empty_declaration_code() for param in self.type_indices]))
+ elif self.base.type.is_ctuple:
+ index = self.index.constant_result
+ if index < 0:
+ index += self.base.type.size
+ return "%s.f%s" % (self.base.result(), index)
else:
if (self.type.is_ptr or self.type.is_array) and self.type == self.base.type:
error(self.pos, "Invalid use of pointer slice")
@@ -3980,11 +3980,11 @@ class IndexNode(_IndexingBaseNode):
wraparound = (
bool(code.globalstate.directives['wraparound']) and
self.original_index_type.signed and
- not (isinstance(self.index.constant_result, _py_int_types)
+ not (isinstance(self.index.constant_result, _py_int_types)
and self.index.constant_result >= 0))
boundscheck = bool(code.globalstate.directives['boundscheck'])
return ", %s, %d, %s, %d, %d, %d" % (
- self.original_index_type.empty_declaration_code(),
+ self.original_index_type.empty_declaration_code(),
self.original_index_type.signed and 1 or 0,
self.original_index_type.to_py_function,
is_list, wraparound, boundscheck)
@@ -3992,24 +3992,24 @@ class IndexNode(_IndexingBaseNode):
return ""
def generate_result_code(self, code):
- if not self.is_temp:
- # all handled in self.calculate_result_code()
- return
+ if not self.is_temp:
+ # all handled in self.calculate_result_code()
+ return
utility_code = None
- if self.type.is_pyobject:
- error_value = 'NULL'
- if self.index.type.is_int:
- if self.base.type is list_type:
- function = "__Pyx_GetItemInt_List"
- elif self.base.type is tuple_type:
- function = "__Pyx_GetItemInt_Tuple"
+ if self.type.is_pyobject:
+ error_value = 'NULL'
+ if self.index.type.is_int:
+ if self.base.type is list_type:
+ function = "__Pyx_GetItemInt_List"
+ elif self.base.type is tuple_type:
+ function = "__Pyx_GetItemInt_Tuple"
else:
- function = "__Pyx_GetItemInt"
+ function = "__Pyx_GetItemInt"
utility_code = TempitaUtilityCode.load_cached("GetItemInt", "ObjectHandling.c")
else:
- if self.base.type is dict_type:
- function = "__Pyx_PyDict_GetItem"
+ if self.base.type is dict_type:
+ function = "__Pyx_PyDict_GetItem"
utility_code = UtilityCode.load_cached("DictGetItem", "ObjectHandling.c")
elif self.base.type is py_object_type and self.index.type in (str_type, unicode_type):
# obj[str] is probably doing a dict lookup
@@ -4017,50 +4017,50 @@ class IndexNode(_IndexingBaseNode):
utility_code = UtilityCode.load_cached("DictGetItem", "ObjectHandling.c")
else:
function = "__Pyx_PyObject_GetItem"
- code.globalstate.use_utility_code(
+ code.globalstate.use_utility_code(
TempitaUtilityCode.load_cached("GetItemInt", "ObjectHandling.c"))
utility_code = UtilityCode.load_cached("ObjectGetItem", "ObjectHandling.c")
- elif self.type.is_unicode_char and self.base.type is unicode_type:
- assert self.index.type.is_int
- function = "__Pyx_GetItemInt_Unicode"
- error_value = '(Py_UCS4)-1'
+ elif self.type.is_unicode_char and self.base.type is unicode_type:
+ assert self.index.type.is_int
+ function = "__Pyx_GetItemInt_Unicode"
+ error_value = '(Py_UCS4)-1'
utility_code = UtilityCode.load_cached("GetItemIntUnicode", "StringTools.c")
- elif self.base.type is bytearray_type:
- assert self.index.type.is_int
- assert self.type.is_int
- function = "__Pyx_GetItemInt_ByteArray"
- error_value = '-1'
+ elif self.base.type is bytearray_type:
+ assert self.index.type.is_int
+ assert self.type.is_int
+ function = "__Pyx_GetItemInt_ByteArray"
+ error_value = '-1'
utility_code = UtilityCode.load_cached("GetItemIntByteArray", "StringTools.c")
- elif not (self.base.type.is_cpp_class and self.exception_check):
- assert False, "unexpected type %s and base type %s for indexing" % (
- self.type, self.base.type)
+ elif not (self.base.type.is_cpp_class and self.exception_check):
+ assert False, "unexpected type %s and base type %s for indexing" % (
+ self.type, self.base.type)
if utility_code is not None:
code.globalstate.use_utility_code(utility_code)
- if self.index.type.is_int:
- index_code = self.index.result()
- else:
- index_code = self.index.py_result()
-
- if self.base.type.is_cpp_class and self.exception_check:
- translate_cpp_exception(code, self.pos,
- "%s = %s[%s];" % (self.result(), self.base.result(),
- self.index.result()),
- self.result() if self.type.is_pyobject else None,
- self.exception_value, self.in_nogil_context)
- else:
- error_check = '!%s' if error_value == 'NULL' else '%%s == %s' % error_value
+ if self.index.type.is_int:
+ index_code = self.index.result()
+ else:
+ index_code = self.index.py_result()
+
+ if self.base.type.is_cpp_class and self.exception_check:
+ translate_cpp_exception(code, self.pos,
+ "%s = %s[%s];" % (self.result(), self.base.result(),
+ self.index.result()),
+ self.result() if self.type.is_pyobject else None,
+ self.exception_value, self.in_nogil_context)
+ else:
+ error_check = '!%s' if error_value == 'NULL' else '%%s == %s' % error_value
code.putln(
- "%s = %s(%s, %s%s); %s" % (
+ "%s = %s(%s, %s%s); %s" % (
self.result(),
function,
self.base.py_result(),
index_code,
self.extra_index_params(code),
- code.error_goto_if(error_check % self.result(), self.pos)))
- if self.type.is_pyobject:
- code.put_gotref(self.py_result())
+ code.error_goto_if(error_check % self.result(), self.pos)))
+ if self.type.is_pyobject:
+ code.put_gotref(self.py_result())
def generate_setitem_code(self, value_code, code):
if self.index.type.is_int:
@@ -4086,46 +4086,46 @@ class IndexNode(_IndexingBaseNode):
# (PyTuple_SetItem() is for creating new tuples from scratch).
else:
function = "PyObject_SetItem"
- code.putln(code.error_goto_if_neg(
- "%s(%s, %s, %s%s)" % (
+ code.putln(code.error_goto_if_neg(
+ "%s(%s, %s, %s%s)" % (
function,
self.base.py_result(),
index_code,
value_code,
- self.extra_index_params(code)),
- self.pos))
+ self.extra_index_params(code)),
+ self.pos))
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
- exception_check=None, exception_value=None):
- self.generate_subexpr_evaluation_code(code)
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
+ exception_check=None, exception_value=None):
+ self.generate_subexpr_evaluation_code(code)
- if self.type.is_pyobject:
+ if self.type.is_pyobject:
self.generate_setitem_code(rhs.py_result(), code)
elif self.base.type is bytearray_type:
value_code = self._check_byte_value(code, rhs)
self.generate_setitem_code(value_code, code)
- elif self.base.type.is_cpp_class and self.exception_check and self.exception_check == '+':
- if overloaded_assignment and exception_check and \
- self.exception_value != exception_value:
- # Handle the case that both the index operator and the assignment
- # operator have a c++ exception handler and they are not the same.
- translate_double_cpp_exception(code, self.pos, self.type,
- self.result(), rhs.result(), self.exception_value,
- exception_value, self.in_nogil_context)
- else:
- # Handle the case that only the index operator has a
- # c++ exception handler, or that
- # both exception handlers are the same.
- translate_cpp_exception(code, self.pos,
- "%s = %s;" % (self.result(), rhs.result()),
- self.result() if self.type.is_pyobject else None,
- self.exception_value, self.in_nogil_context)
+ elif self.base.type.is_cpp_class and self.exception_check and self.exception_check == '+':
+ if overloaded_assignment and exception_check and \
+ self.exception_value != exception_value:
+ # Handle the case that both the index operator and the assignment
+ # operator have a c++ exception handler and they are not the same.
+ translate_double_cpp_exception(code, self.pos, self.type,
+ self.result(), rhs.result(), self.exception_value,
+ exception_value, self.in_nogil_context)
+ else:
+ # Handle the case that only the index operator has a
+ # c++ exception handler, or that
+ # both exception handlers are the same.
+ translate_cpp_exception(code, self.pos,
+ "%s = %s;" % (self.result(), rhs.result()),
+ self.result() if self.type.is_pyobject else None,
+ self.exception_value, self.in_nogil_context)
else:
code.putln(
- "%s = %s;" % (self.result(), rhs.result()))
+ "%s = %s;" % (self.result(), rhs.result()))
- self.generate_subexpr_disposal_code(code)
- self.free_subexpr_temps(code)
+ self.generate_subexpr_disposal_code(code)
+ self.free_subexpr_temps(code)
rhs.generate_disposal_code(code)
rhs.free_temps(code)
@@ -4179,101 +4179,101 @@ class IndexNode(_IndexingBaseNode):
function = "PyDict_DelItem"
else:
function = "PyObject_DelItem"
- code.putln(code.error_goto_if_neg(
- "%s(%s, %s%s)" % (
+ code.putln(code.error_goto_if_neg(
+ "%s(%s, %s%s)" % (
function,
self.base.py_result(),
index_code,
- self.extra_index_params(code)),
- self.pos))
+ self.extra_index_params(code)),
+ self.pos))
self.generate_subexpr_disposal_code(code)
self.free_subexpr_temps(code)
-
-class BufferIndexNode(_IndexingBaseNode):
- """
- Indexing of buffers and memoryviews. This node is created during type
- analysis from IndexNode and replaces it.
-
- Attributes:
- base - base node being indexed
- indices - list of indexing expressions
- """
-
- subexprs = ['base', 'indices']
-
- is_buffer_access = True
-
- # Whether we're assigning to a buffer (in that case it needs to be writable)
- writable_needed = False
-
+
+class BufferIndexNode(_IndexingBaseNode):
+ """
+ Indexing of buffers and memoryviews. This node is created during type
+ analysis from IndexNode and replaces it.
+
+ Attributes:
+ base - base node being indexed
+ indices - list of indexing expressions
+ """
+
+ subexprs = ['base', 'indices']
+
+ is_buffer_access = True
+
+ # Whether we're assigning to a buffer (in that case it needs to be writable)
+ writable_needed = False
+
# Any indexing temp variables that we need to clean up.
index_temps = ()
- def analyse_target_types(self, env):
- self.analyse_types(env, getting=False)
-
- def analyse_types(self, env, getting=True):
- """
- Analyse types for buffer indexing only. Overridden by memoryview
- indexing and slicing subclasses
- """
- # self.indices are already analyzed
+ def analyse_target_types(self, env):
+ self.analyse_types(env, getting=False)
+
+ def analyse_types(self, env, getting=True):
+ """
+ Analyse types for buffer indexing only. Overridden by memoryview
+ indexing and slicing subclasses
+ """
+ # self.indices are already analyzed
if not self.base.is_name and not is_pythran_expr(self.base.type):
- error(self.pos, "Can only index buffer variables")
- self.type = error_type
- return self
-
- if not getting:
- if not self.base.entry.type.writable:
- error(self.pos, "Writing to readonly buffer")
- else:
- self.writable_needed = True
- if self.base.type.is_buffer:
- self.base.entry.buffer_aux.writable_needed = True
-
- self.none_error_message = "'NoneType' object is not subscriptable"
- self.analyse_buffer_index(env, getting)
- self.wrap_in_nonecheck_node(env)
- return self
-
- def analyse_buffer_index(self, env, getting):
+ error(self.pos, "Can only index buffer variables")
+ self.type = error_type
+ return self
+
+ if not getting:
+ if not self.base.entry.type.writable:
+ error(self.pos, "Writing to readonly buffer")
+ else:
+ self.writable_needed = True
+ if self.base.type.is_buffer:
+ self.base.entry.buffer_aux.writable_needed = True
+
+ self.none_error_message = "'NoneType' object is not subscriptable"
+ self.analyse_buffer_index(env, getting)
+ self.wrap_in_nonecheck_node(env)
+ return self
+
+ def analyse_buffer_index(self, env, getting):
if is_pythran_expr(self.base.type):
index_with_type_list = [(idx, idx.type) for idx in self.indices]
self.type = PythranExpr(pythran_indexing_type(self.base.type, index_with_type_list))
else:
self.base = self.base.coerce_to_simple(env)
self.type = self.base.type.dtype
- self.buffer_type = self.base.type
-
+ self.buffer_type = self.base.type
+
if getting and (self.type.is_pyobject or self.type.is_pythran_expr):
- self.is_temp = True
-
- def analyse_assignment(self, rhs):
- """
- Called by IndexNode when this node is assigned to,
- with the rhs of the assignment
- """
-
- def wrap_in_nonecheck_node(self, env):
- if not env.directives['nonecheck'] or not self.base.may_be_none():
- return
- self.base = self.base.as_none_safe_node(self.none_error_message)
-
- def nogil_check(self, env):
- if self.is_buffer_access or self.is_memview_index:
- if self.type.is_pyobject:
- error(self.pos, "Cannot access buffer with object dtype without gil")
- self.type = error_type
-
- def calculate_result_code(self):
- return "(*%s)" % self.buffer_ptr_code
-
+ self.is_temp = True
+
+ def analyse_assignment(self, rhs):
+ """
+ Called by IndexNode when this node is assigned to,
+ with the rhs of the assignment
+ """
+
+ def wrap_in_nonecheck_node(self, env):
+ if not env.directives['nonecheck'] or not self.base.may_be_none():
+ return
+ self.base = self.base.as_none_safe_node(self.none_error_message)
+
+ def nogil_check(self, env):
+ if self.is_buffer_access or self.is_memview_index:
+ if self.type.is_pyobject:
+ error(self.pos, "Cannot access buffer with object dtype without gil")
+ self.type = error_type
+
+ def calculate_result_code(self):
+ return "(*%s)" % self.buffer_ptr_code
+
def buffer_entry(self):
base = self.base
if self.base.is_nonecheck:
base = base.arg
- return base.type.get_entry(base)
+ return base.type.get_entry(base)
def get_index_in_temp(self, code, ivar):
ret = code.funcstate.allocate_temp(
@@ -4285,15 +4285,15 @@ class BufferIndexNode(_IndexingBaseNode):
return ret
def buffer_lookup_code(self, code):
- """
- ndarray[1, 2, 3] and memslice[1, 2, 3]
- """
+ """
+ ndarray[1, 2, 3] and memslice[1, 2, 3]
+ """
if self.in_nogil_context:
if self.is_buffer_access or self.is_memview_index:
if code.globalstate.directives['boundscheck']:
warning(self.pos, "Use boundscheck(False) for faster access", level=1)
- # Assign indices to temps of at least (s)size_t to allow further index calculations.
+ # Assign indices to temps of at least (s)size_t to allow further index calculations.
self.index_temps = index_temps = [self.get_index_in_temp(code,ivar) for ivar in self.indices]
# Generate buffer access code using these temps
@@ -4305,23 +4305,23 @@ class BufferIndexNode(_IndexingBaseNode):
negative_indices = Buffer.buffer_defaults['negative_indices']
return buffer_entry, Buffer.put_buffer_lookup_code(
- entry=buffer_entry,
- index_signeds=[ivar.type.signed for ivar in self.indices],
- index_cnames=index_temps,
- directives=code.globalstate.directives,
- pos=self.pos, code=code,
- negative_indices=negative_indices,
- in_nogil_context=self.in_nogil_context)
-
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
- self.generate_subexpr_evaluation_code(code)
- self.generate_buffer_setitem_code(rhs, code)
- self.generate_subexpr_disposal_code(code)
- self.free_subexpr_temps(code)
- rhs.generate_disposal_code(code)
- rhs.free_temps(code)
-
- def generate_buffer_setitem_code(self, rhs, code, op=""):
+ entry=buffer_entry,
+ index_signeds=[ivar.type.signed for ivar in self.indices],
+ index_cnames=index_temps,
+ directives=code.globalstate.directives,
+ pos=self.pos, code=code,
+ negative_indices=negative_indices,
+ in_nogil_context=self.in_nogil_context)
+
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
+ self.generate_subexpr_evaluation_code(code)
+ self.generate_buffer_setitem_code(rhs, code)
+ self.generate_subexpr_disposal_code(code)
+ self.free_subexpr_temps(code)
+ rhs.generate_disposal_code(code)
+ rhs.free_temps(code)
+
+ def generate_buffer_setitem_code(self, rhs, code, op=""):
base_type = self.base.type
if is_pythran_expr(base_type) and is_pythran_supported_type(rhs.type):
obj = code.funcstate.allocate_temp(PythranExpr(pythran_type(self.base.type)), manage_ref=False)
@@ -4343,27 +4343,27 @@ class BufferIndexNode(_IndexingBaseNode):
code.funcstate.release_temp(obj)
return
- # Used from generate_assignment_code and InPlaceAssignmentNode
- buffer_entry, ptrexpr = self.buffer_lookup_code(code)
-
- if self.buffer_type.dtype.is_pyobject:
- # Must manage refcounts. Decref what is already there
- # and incref what we put in.
- ptr = code.funcstate.allocate_temp(buffer_entry.buf_ptr_type,
- manage_ref=False)
- rhs_code = rhs.result()
- code.putln("%s = %s;" % (ptr, ptrexpr))
- code.put_gotref("*%s" % ptr)
- code.putln("__Pyx_INCREF(%s); __Pyx_DECREF(*%s);" % (
- rhs_code, ptr))
- code.putln("*%s %s= %s;" % (ptr, op, rhs_code))
- code.put_giveref("*%s" % ptr)
- code.funcstate.release_temp(ptr)
- else:
- # Simple case
- code.putln("*%s %s= %s;" % (ptrexpr, op, rhs.result()))
-
- def generate_result_code(self, code):
+ # Used from generate_assignment_code and InPlaceAssignmentNode
+ buffer_entry, ptrexpr = self.buffer_lookup_code(code)
+
+ if self.buffer_type.dtype.is_pyobject:
+ # Must manage refcounts. Decref what is already there
+ # and incref what we put in.
+ ptr = code.funcstate.allocate_temp(buffer_entry.buf_ptr_type,
+ manage_ref=False)
+ rhs_code = rhs.result()
+ code.putln("%s = %s;" % (ptr, ptrexpr))
+ code.put_gotref("*%s" % ptr)
+ code.putln("__Pyx_INCREF(%s); __Pyx_DECREF(*%s);" % (
+ rhs_code, ptr))
+ code.putln("*%s %s= %s;" % (ptr, op, rhs_code))
+ code.put_giveref("*%s" % ptr)
+ code.funcstate.release_temp(ptr)
+ else:
+ # Simple case
+ code.putln("*%s %s= %s;" % (ptrexpr, op, rhs.result()))
+
+ def generate_result_code(self, code):
if is_pythran_expr(self.base.type):
res = self.result()
code.putln("__Pyx_call_destructor(%s);" % res)
@@ -4373,187 +4373,187 @@ class BufferIndexNode(_IndexingBaseNode):
self.base.pythran_result(),
pythran_indexing_code(self.indices)))
return
- buffer_entry, self.buffer_ptr_code = self.buffer_lookup_code(code)
- if self.type.is_pyobject:
- # is_temp is True, so must pull out value and incref it.
- # NOTE: object temporary results for nodes are declared
- # as PyObject *, so we need a cast
- code.putln("%s = (PyObject *) *%s;" % (self.result(), self.buffer_ptr_code))
- code.putln("__Pyx_INCREF((PyObject*)%s);" % self.result())
-
+ buffer_entry, self.buffer_ptr_code = self.buffer_lookup_code(code)
+ if self.type.is_pyobject:
+ # is_temp is True, so must pull out value and incref it.
+ # NOTE: object temporary results for nodes are declared
+ # as PyObject *, so we need a cast
+ code.putln("%s = (PyObject *) *%s;" % (self.result(), self.buffer_ptr_code))
+ code.putln("__Pyx_INCREF((PyObject*)%s);" % self.result())
+
def free_subexpr_temps(self, code):
for temp in self.index_temps:
code.funcstate.release_temp(temp)
self.index_temps = ()
super(BufferIndexNode, self).free_subexpr_temps(code)
-
-
-class MemoryViewIndexNode(BufferIndexNode):
-
- is_memview_index = True
- is_buffer_access = False
- warned_untyped_idx = False
-
- def analyse_types(self, env, getting=True):
- # memoryviewslice indexing or slicing
- from . import MemoryView
-
+
+
+class MemoryViewIndexNode(BufferIndexNode):
+
+ is_memview_index = True
+ is_buffer_access = False
+ warned_untyped_idx = False
+
+ def analyse_types(self, env, getting=True):
+ # memoryviewslice indexing or slicing
+ from . import MemoryView
+
self.is_pythran_mode = has_np_pythran(env)
- indices = self.indices
- have_slices, indices, newaxes = MemoryView.unellipsify(indices, self.base.type.ndim)
-
+ indices = self.indices
+ have_slices, indices, newaxes = MemoryView.unellipsify(indices, self.base.type.ndim)
+
if not getting:
self.writable_needed = True
if self.base.is_name or self.base.is_attribute:
self.base.entry.type.writable_needed = True
- self.memslice_index = (not newaxes and len(indices) == self.base.type.ndim)
- axes = []
-
- index_type = PyrexTypes.c_py_ssize_t_type
- new_indices = []
-
- if len(indices) - len(newaxes) > self.base.type.ndim:
- self.type = error_type
- error(indices[self.base.type.ndim].pos,
- "Too many indices specified for type %s" % self.base.type)
- return self
-
- axis_idx = 0
- for i, index in enumerate(indices[:]):
- index = index.analyse_types(env)
- if index.is_none:
- self.is_memview_slice = True
- new_indices.append(index)
- axes.append(('direct', 'strided'))
- continue
-
- access, packing = self.base.type.axes[axis_idx]
- axis_idx += 1
-
- if index.is_slice:
- self.is_memview_slice = True
- if index.step.is_none:
- axes.append((access, packing))
- else:
- axes.append((access, 'strided'))
-
- # Coerce start, stop and step to temps of the right type
- for attr in ('start', 'stop', 'step'):
- value = getattr(index, attr)
- if not value.is_none:
- value = value.coerce_to(index_type, env)
- #value = value.coerce_to_temp(env)
- setattr(index, attr, value)
- new_indices.append(value)
-
- elif index.type.is_int or index.type.is_pyobject:
- if index.type.is_pyobject and not self.warned_untyped_idx:
- warning(index.pos, "Index should be typed for more efficient access", level=2)
- MemoryViewIndexNode.warned_untyped_idx = True
-
- self.is_memview_index = True
- index = index.coerce_to(index_type, env)
- indices[i] = index
- new_indices.append(index)
-
- else:
- self.type = error_type
- error(index.pos, "Invalid index for memoryview specified, type %s" % index.type)
- return self
-
- ### FIXME: replace by MemoryViewSliceNode if is_memview_slice ?
- self.is_memview_index = self.is_memview_index and not self.is_memview_slice
- self.indices = new_indices
- # All indices with all start/stop/step for slices.
- # We need to keep this around.
- self.original_indices = indices
- self.nogil = env.nogil
-
- self.analyse_operation(env, getting, axes)
- self.wrap_in_nonecheck_node(env)
- return self
-
- def analyse_operation(self, env, getting, axes):
- self.none_error_message = "Cannot index None memoryview slice"
- self.analyse_buffer_index(env, getting)
-
- def analyse_broadcast_operation(self, rhs):
- """
- Support broadcasting for slice assignment.
- E.g.
- m_2d[...] = m_1d # or,
- m_1d[...] = m_2d # if the leading dimension has extent 1
- """
- if self.type.is_memoryviewslice:
- lhs = self
- if lhs.is_memview_broadcast or rhs.is_memview_broadcast:
- lhs.is_memview_broadcast = True
- rhs.is_memview_broadcast = True
-
- def analyse_as_memview_scalar_assignment(self, rhs):
- lhs = self.analyse_assignment(rhs)
- if lhs:
- rhs.is_memview_copy_assignment = lhs.is_memview_copy_assignment
- return lhs
- return self
-
-
-class MemoryViewSliceNode(MemoryViewIndexNode):
-
- is_memview_slice = True
-
- # No-op slicing operation, this node will be replaced
- is_ellipsis_noop = False
- is_memview_scalar_assignment = False
- is_memview_index = False
- is_memview_broadcast = False
-
- def analyse_ellipsis_noop(self, env, getting):
- """Slicing operations needing no evaluation, i.e. m[...] or m[:, :]"""
- ### FIXME: replace directly
- self.is_ellipsis_noop = all(
- index.is_slice and index.start.is_none and index.stop.is_none and index.step.is_none
- for index in self.indices)
-
- if self.is_ellipsis_noop:
- self.type = self.base.type
-
- def analyse_operation(self, env, getting, axes):
- from . import MemoryView
-
- if not getting:
- self.is_memview_broadcast = True
- self.none_error_message = "Cannot assign to None memoryview slice"
- else:
- self.none_error_message = "Cannot slice None memoryview slice"
-
- self.analyse_ellipsis_noop(env, getting)
- if self.is_ellipsis_noop:
- return
-
- self.index = None
- self.is_temp = True
- self.use_managed_ref = True
-
- if not MemoryView.validate_axes(self.pos, axes):
- self.type = error_type
- return
-
- self.type = PyrexTypes.MemoryViewSliceType(self.base.type.dtype, axes)
-
- if not (self.base.is_simple() or self.base.result_in_temp()):
- self.base = self.base.coerce_to_temp(env)
-
- def analyse_assignment(self, rhs):
- if not rhs.type.is_memoryviewslice and (
- self.type.dtype.assignable_from(rhs.type) or
- rhs.type.is_pyobject):
- # scalar assignment
- return MemoryCopyScalar(self.pos, self)
- else:
- return MemoryCopySlice(self.pos, self)
-
+ self.memslice_index = (not newaxes and len(indices) == self.base.type.ndim)
+ axes = []
+
+ index_type = PyrexTypes.c_py_ssize_t_type
+ new_indices = []
+
+ if len(indices) - len(newaxes) > self.base.type.ndim:
+ self.type = error_type
+ error(indices[self.base.type.ndim].pos,
+ "Too many indices specified for type %s" % self.base.type)
+ return self
+
+ axis_idx = 0
+ for i, index in enumerate(indices[:]):
+ index = index.analyse_types(env)
+ if index.is_none:
+ self.is_memview_slice = True
+ new_indices.append(index)
+ axes.append(('direct', 'strided'))
+ continue
+
+ access, packing = self.base.type.axes[axis_idx]
+ axis_idx += 1
+
+ if index.is_slice:
+ self.is_memview_slice = True
+ if index.step.is_none:
+ axes.append((access, packing))
+ else:
+ axes.append((access, 'strided'))
+
+ # Coerce start, stop and step to temps of the right type
+ for attr in ('start', 'stop', 'step'):
+ value = getattr(index, attr)
+ if not value.is_none:
+ value = value.coerce_to(index_type, env)
+ #value = value.coerce_to_temp(env)
+ setattr(index, attr, value)
+ new_indices.append(value)
+
+ elif index.type.is_int or index.type.is_pyobject:
+ if index.type.is_pyobject and not self.warned_untyped_idx:
+ warning(index.pos, "Index should be typed for more efficient access", level=2)
+ MemoryViewIndexNode.warned_untyped_idx = True
+
+ self.is_memview_index = True
+ index = index.coerce_to(index_type, env)
+ indices[i] = index
+ new_indices.append(index)
+
+ else:
+ self.type = error_type
+ error(index.pos, "Invalid index for memoryview specified, type %s" % index.type)
+ return self
+
+ ### FIXME: replace by MemoryViewSliceNode if is_memview_slice ?
+ self.is_memview_index = self.is_memview_index and not self.is_memview_slice
+ self.indices = new_indices
+ # All indices with all start/stop/step for slices.
+ # We need to keep this around.
+ self.original_indices = indices
+ self.nogil = env.nogil
+
+ self.analyse_operation(env, getting, axes)
+ self.wrap_in_nonecheck_node(env)
+ return self
+
+ def analyse_operation(self, env, getting, axes):
+ self.none_error_message = "Cannot index None memoryview slice"
+ self.analyse_buffer_index(env, getting)
+
+ def analyse_broadcast_operation(self, rhs):
+ """
+ Support broadcasting for slice assignment.
+ E.g.
+ m_2d[...] = m_1d # or,
+ m_1d[...] = m_2d # if the leading dimension has extent 1
+ """
+ if self.type.is_memoryviewslice:
+ lhs = self
+ if lhs.is_memview_broadcast or rhs.is_memview_broadcast:
+ lhs.is_memview_broadcast = True
+ rhs.is_memview_broadcast = True
+
+ def analyse_as_memview_scalar_assignment(self, rhs):
+ lhs = self.analyse_assignment(rhs)
+ if lhs:
+ rhs.is_memview_copy_assignment = lhs.is_memview_copy_assignment
+ return lhs
+ return self
+
+
+class MemoryViewSliceNode(MemoryViewIndexNode):
+
+ is_memview_slice = True
+
+ # No-op slicing operation, this node will be replaced
+ is_ellipsis_noop = False
+ is_memview_scalar_assignment = False
+ is_memview_index = False
+ is_memview_broadcast = False
+
+ def analyse_ellipsis_noop(self, env, getting):
+ """Slicing operations needing no evaluation, i.e. m[...] or m[:, :]"""
+ ### FIXME: replace directly
+ self.is_ellipsis_noop = all(
+ index.is_slice and index.start.is_none and index.stop.is_none and index.step.is_none
+ for index in self.indices)
+
+ if self.is_ellipsis_noop:
+ self.type = self.base.type
+
+ def analyse_operation(self, env, getting, axes):
+ from . import MemoryView
+
+ if not getting:
+ self.is_memview_broadcast = True
+ self.none_error_message = "Cannot assign to None memoryview slice"
+ else:
+ self.none_error_message = "Cannot slice None memoryview slice"
+
+ self.analyse_ellipsis_noop(env, getting)
+ if self.is_ellipsis_noop:
+ return
+
+ self.index = None
+ self.is_temp = True
+ self.use_managed_ref = True
+
+ if not MemoryView.validate_axes(self.pos, axes):
+ self.type = error_type
+ return
+
+ self.type = PyrexTypes.MemoryViewSliceType(self.base.type.dtype, axes)
+
+ if not (self.base.is_simple() or self.base.result_in_temp()):
+ self.base = self.base.coerce_to_temp(env)
+
+ def analyse_assignment(self, rhs):
+ if not rhs.type.is_memoryviewslice and (
+ self.type.dtype.assignable_from(rhs.type) or
+ rhs.type.is_pyobject):
+ # scalar assignment
+ return MemoryCopyScalar(self.pos, self)
+ else:
+ return MemoryCopySlice(self.pos, self)
+
def merged_indices(self, indices):
"""Return a new list of indices/slices with 'indices' merged into the current ones
according to slicing rules.
@@ -4585,29 +4585,29 @@ class MemoryViewSliceNode(MemoryViewIndexNode):
new_indices += indices
return new_indices
- def is_simple(self):
- if self.is_ellipsis_noop:
- # TODO: fix SimpleCallNode.is_simple()
- return self.base.is_simple() or self.base.result_in_temp()
-
- return self.result_in_temp()
-
- def calculate_result_code(self):
- """This is called in case this is a no-op slicing node"""
- return self.base.result()
-
- def generate_result_code(self, code):
- if self.is_ellipsis_noop:
- return ### FIXME: remove
+ def is_simple(self):
+ if self.is_ellipsis_noop:
+ # TODO: fix SimpleCallNode.is_simple()
+ return self.base.is_simple() or self.base.result_in_temp()
+
+ return self.result_in_temp()
+
+ def calculate_result_code(self):
+ """This is called in case this is a no-op slicing node"""
+ return self.base.result()
+
+ def generate_result_code(self, code):
+ if self.is_ellipsis_noop:
+ return ### FIXME: remove
buffer_entry = self.buffer_entry()
have_gil = not self.in_nogil_context
- # TODO Mark: this is insane, do it better
+ # TODO Mark: this is insane, do it better
have_slices = False
it = iter(self.indices)
for index in self.original_indices:
- if index.is_slice:
- have_slices = True
+ if index.is_slice:
+ have_slices = True
if not index.start.is_none:
index.start = next(it)
if not index.stop.is_none:
@@ -4619,126 +4619,126 @@ class MemoryViewSliceNode(MemoryViewIndexNode):
assert not list(it)
- buffer_entry.generate_buffer_slice_code(
- code, self.original_indices, self.result(),
- have_gil=have_gil, have_slices=have_slices,
- directives=code.globalstate.directives)
-
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
- if self.is_ellipsis_noop:
- self.generate_subexpr_evaluation_code(code)
- else:
- self.generate_evaluation_code(code)
-
- if self.is_memview_scalar_assignment:
- self.generate_memoryviewslice_assign_scalar_code(rhs, code)
- else:
- self.generate_memoryviewslice_setslice_code(rhs, code)
-
- if self.is_ellipsis_noop:
- self.generate_subexpr_disposal_code(code)
- else:
- self.generate_disposal_code(code)
-
- rhs.generate_disposal_code(code)
- rhs.free_temps(code)
-
-
-class MemoryCopyNode(ExprNode):
- """
- Wraps a memoryview slice for slice assignment.
-
- dst: destination mememoryview slice
- """
-
- subexprs = ['dst']
-
- def __init__(self, pos, dst):
- super(MemoryCopyNode, self).__init__(pos)
- self.dst = dst
- self.type = dst.type
-
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
- self.dst.generate_evaluation_code(code)
- self._generate_assignment_code(rhs, code)
- self.dst.generate_disposal_code(code)
+ buffer_entry.generate_buffer_slice_code(
+ code, self.original_indices, self.result(),
+ have_gil=have_gil, have_slices=have_slices,
+ directives=code.globalstate.directives)
+
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
+ if self.is_ellipsis_noop:
+ self.generate_subexpr_evaluation_code(code)
+ else:
+ self.generate_evaluation_code(code)
+
+ if self.is_memview_scalar_assignment:
+ self.generate_memoryviewslice_assign_scalar_code(rhs, code)
+ else:
+ self.generate_memoryviewslice_setslice_code(rhs, code)
+
+ if self.is_ellipsis_noop:
+ self.generate_subexpr_disposal_code(code)
+ else:
+ self.generate_disposal_code(code)
+
+ rhs.generate_disposal_code(code)
+ rhs.free_temps(code)
+
+
+class MemoryCopyNode(ExprNode):
+ """
+ Wraps a memoryview slice for slice assignment.
+
+ dst: destination mememoryview slice
+ """
+
+ subexprs = ['dst']
+
+ def __init__(self, pos, dst):
+ super(MemoryCopyNode, self).__init__(pos)
+ self.dst = dst
+ self.type = dst.type
+
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
+ self.dst.generate_evaluation_code(code)
+ self._generate_assignment_code(rhs, code)
+ self.dst.generate_disposal_code(code)
self.dst.free_temps(code)
- rhs.generate_disposal_code(code)
- rhs.free_temps(code)
-
-
-class MemoryCopySlice(MemoryCopyNode):
- """
- Copy the contents of slice src to slice dst. Does not support indirect
- slices.
-
- memslice1[...] = memslice2
- memslice1[:] = memslice2
- """
-
- is_memview_copy_assignment = True
- copy_slice_cname = "__pyx_memoryview_copy_contents"
-
- def _generate_assignment_code(self, src, code):
- dst = self.dst
-
- src.type.assert_direct_dims(src.pos)
- dst.type.assert_direct_dims(dst.pos)
-
- code.putln(code.error_goto_if_neg(
- "%s(%s, %s, %d, %d, %d)" % (self.copy_slice_cname,
- src.result(), dst.result(),
- src.type.ndim, dst.type.ndim,
- dst.type.dtype.is_pyobject),
- dst.pos))
-
-
-class MemoryCopyScalar(MemoryCopyNode):
- """
- Assign a scalar to a slice. dst must be simple, scalar will be assigned
- to a correct type and not just something assignable.
-
- memslice1[...] = 0.0
- memslice1[:] = 0.0
- """
-
- def __init__(self, pos, dst):
- super(MemoryCopyScalar, self).__init__(pos, dst)
- self.type = dst.type.dtype
-
- def _generate_assignment_code(self, scalar, code):
+ rhs.generate_disposal_code(code)
+ rhs.free_temps(code)
+
+
+class MemoryCopySlice(MemoryCopyNode):
+ """
+ Copy the contents of slice src to slice dst. Does not support indirect
+ slices.
+
+ memslice1[...] = memslice2
+ memslice1[:] = memslice2
+ """
+
+ is_memview_copy_assignment = True
+ copy_slice_cname = "__pyx_memoryview_copy_contents"
+
+ def _generate_assignment_code(self, src, code):
+ dst = self.dst
+
+ src.type.assert_direct_dims(src.pos)
+ dst.type.assert_direct_dims(dst.pos)
+
+ code.putln(code.error_goto_if_neg(
+ "%s(%s, %s, %d, %d, %d)" % (self.copy_slice_cname,
+ src.result(), dst.result(),
+ src.type.ndim, dst.type.ndim,
+ dst.type.dtype.is_pyobject),
+ dst.pos))
+
+
+class MemoryCopyScalar(MemoryCopyNode):
+ """
+ Assign a scalar to a slice. dst must be simple, scalar will be assigned
+ to a correct type and not just something assignable.
+
+ memslice1[...] = 0.0
+ memslice1[:] = 0.0
+ """
+
+ def __init__(self, pos, dst):
+ super(MemoryCopyScalar, self).__init__(pos, dst)
+ self.type = dst.type.dtype
+
+ def _generate_assignment_code(self, scalar, code):
from . import MemoryView
- self.dst.type.assert_direct_dims(self.dst.pos)
-
- dtype = self.dst.type.dtype
- type_decl = dtype.declaration_code("")
- slice_decl = self.dst.type.declaration_code("")
-
- code.begin_block()
- code.putln("%s __pyx_temp_scalar = %s;" % (type_decl, scalar.result()))
- if self.dst.result_in_temp() or self.dst.is_simple():
- dst_temp = self.dst.result()
- else:
- code.putln("%s __pyx_temp_slice = %s;" % (slice_decl, self.dst.result()))
- dst_temp = "__pyx_temp_slice"
-
- slice_iter_obj = MemoryView.slice_iter(self.dst.type, dst_temp,
- self.dst.type.ndim, code)
- p = slice_iter_obj.start_loops()
-
- if dtype.is_pyobject:
- code.putln("Py_DECREF(*(PyObject **) %s);" % p)
-
- code.putln("*((%s *) %s) = __pyx_temp_scalar;" % (type_decl, p))
-
- if dtype.is_pyobject:
- code.putln("Py_INCREF(__pyx_temp_scalar);")
-
- slice_iter_obj.end_loops()
- code.end_block()
-
-
+ self.dst.type.assert_direct_dims(self.dst.pos)
+
+ dtype = self.dst.type.dtype
+ type_decl = dtype.declaration_code("")
+ slice_decl = self.dst.type.declaration_code("")
+
+ code.begin_block()
+ code.putln("%s __pyx_temp_scalar = %s;" % (type_decl, scalar.result()))
+ if self.dst.result_in_temp() or self.dst.is_simple():
+ dst_temp = self.dst.result()
+ else:
+ code.putln("%s __pyx_temp_slice = %s;" % (slice_decl, self.dst.result()))
+ dst_temp = "__pyx_temp_slice"
+
+ slice_iter_obj = MemoryView.slice_iter(self.dst.type, dst_temp,
+ self.dst.type.ndim, code)
+ p = slice_iter_obj.start_loops()
+
+ if dtype.is_pyobject:
+ code.putln("Py_DECREF(*(PyObject **) %s);" % p)
+
+ code.putln("*((%s *) %s) = __pyx_temp_scalar;" % (type_decl, p))
+
+ if dtype.is_pyobject:
+ code.putln("Py_INCREF(__pyx_temp_scalar);")
+
+ slice_iter_obj.end_loops()
+ code.end_block()
+
+
class SliceIndexNode(ExprNode):
# 2-element slice indexing
#
@@ -4764,15 +4764,15 @@ class SliceIndexNode(ExprNode):
return PyrexTypes.c_array_type(base_type.base_type, None)
return py_object_type
- def inferable_item_node(self, index=0):
- # slicing shouldn't change the result type of the base, but the index might
- if index is not not_a_constant and self.start:
- if self.start.has_constant_result():
- index += self.start.constant_result
- else:
- index = not_a_constant
- return self.base.inferable_item_node(index)
-
+ def inferable_item_node(self, index=0):
+ # slicing shouldn't change the result type of the base, but the index might
+ if index is not not_a_constant and self.start:
+ if self.start.has_constant_result():
+ index += self.start.constant_result
+ else:
+ index = not_a_constant
+ return self.base.inferable_item_node(index)
+
def may_be_none(self):
base_type = self.base.type
if base_type:
@@ -4806,7 +4806,7 @@ class SliceIndexNode(ExprNode):
stop = self.stop.compile_time_value(denv)
try:
return base[start:stop]
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def analyse_target_declaration(self, env):
@@ -4842,13 +4842,13 @@ class SliceIndexNode(ExprNode):
check_negative_indices(self.start, self.stop)
base_type = self.base.type
- if base_type.is_array and not getting:
- # cannot assign directly to C array => try to assign by making a copy
- if not self.start and not self.stop:
- self.type = base_type
- else:
- self.type = PyrexTypes.CPtrType(base_type.base_type)
- elif base_type.is_string or base_type.is_cpp_string:
+ if base_type.is_array and not getting:
+ # cannot assign directly to C array => try to assign by making a copy
+ if not self.start and not self.stop:
+ self.type = base_type
+ else:
+ self.type = PyrexTypes.CPtrType(base_type.base_type)
+ elif base_type.is_string or base_type.is_cpp_string:
self.type = default_str_type(env)
elif base_type.is_pyunicode_ptr:
self.type = unicode_type
@@ -4880,59 +4880,59 @@ class SliceIndexNode(ExprNode):
).analyse_types(env)
else:
c_int = PyrexTypes.c_py_ssize_t_type
-
- def allow_none(node, default_value, env):
- # Coerce to Py_ssize_t, but allow None as meaning the default slice bound.
- from .UtilNodes import EvalWithTempExprNode, ResultRefNode
-
- node_ref = ResultRefNode(node)
- new_expr = CondExprNode(
- node.pos,
- true_val=IntNode(
- node.pos,
- type=c_int,
- value=default_value,
- constant_result=int(default_value) if default_value.isdigit() else not_a_constant,
- ),
- false_val=node_ref.coerce_to(c_int, env),
- test=PrimaryCmpNode(
- node.pos,
- operand1=node_ref,
- operator='is',
- operand2=NoneNode(node.pos),
- ).analyse_types(env)
- ).analyse_result_type(env)
- return EvalWithTempExprNode(node_ref, new_expr)
-
+
+ def allow_none(node, default_value, env):
+ # Coerce to Py_ssize_t, but allow None as meaning the default slice bound.
+ from .UtilNodes import EvalWithTempExprNode, ResultRefNode
+
+ node_ref = ResultRefNode(node)
+ new_expr = CondExprNode(
+ node.pos,
+ true_val=IntNode(
+ node.pos,
+ type=c_int,
+ value=default_value,
+ constant_result=int(default_value) if default_value.isdigit() else not_a_constant,
+ ),
+ false_val=node_ref.coerce_to(c_int, env),
+ test=PrimaryCmpNode(
+ node.pos,
+ operand1=node_ref,
+ operator='is',
+ operand2=NoneNode(node.pos),
+ ).analyse_types(env)
+ ).analyse_result_type(env)
+ return EvalWithTempExprNode(node_ref, new_expr)
+
if self.start:
- if self.start.type.is_pyobject:
- self.start = allow_none(self.start, '0', env)
+ if self.start.type.is_pyobject:
+ self.start = allow_none(self.start, '0', env)
self.start = self.start.coerce_to(c_int, env)
if self.stop:
- if self.stop.type.is_pyobject:
- self.stop = allow_none(self.stop, 'PY_SSIZE_T_MAX', env)
+ if self.stop.type.is_pyobject:
+ self.stop = allow_none(self.stop, 'PY_SSIZE_T_MAX', env)
self.stop = self.stop.coerce_to(c_int, env)
self.is_temp = 1
return self
- def analyse_as_type(self, env):
- base_type = self.base.analyse_as_type(env)
- if base_type and not base_type.is_pyobject:
- if not self.start and not self.stop:
- # memory view
- from . import MemoryView
- env.use_utility_code(MemoryView.view_utility_code)
- none_node = NoneNode(self.pos)
- slice_node = SliceNode(
- self.pos,
- start=none_node,
- stop=none_node,
- step=none_node,
- )
- return PyrexTypes.MemoryViewSliceType(
- base_type, MemoryView.get_axes_specs(env, [slice_node]))
- return None
-
+ def analyse_as_type(self, env):
+ base_type = self.base.analyse_as_type(env)
+ if base_type and not base_type.is_pyobject:
+ if not self.start and not self.stop:
+ # memory view
+ from . import MemoryView
+ env.use_utility_code(MemoryView.view_utility_code)
+ none_node = NoneNode(self.pos)
+ slice_node = SliceNode(
+ self.pos,
+ start=none_node,
+ stop=none_node,
+ step=none_node,
+ )
+ return PyrexTypes.MemoryViewSliceType(
+ base_type, MemoryView.get_axes_specs(env, [slice_node]))
+ return None
+
nogil_check = Node.gil_error
gil_message = "Slicing Python object"
@@ -4951,11 +4951,11 @@ class SliceIndexNode(ExprNode):
"default encoding required for conversion from '%s' to '%s'" %
(self.base.type, dst_type))
self.type = dst_type
- if dst_type.is_array and self.base.type.is_array:
- if not self.start and not self.stop:
- # redundant slice building, copy C arrays directly
- return self.base.coerce_to(dst_type, env)
- # else: check array size if possible
+ if dst_type.is_array and self.base.type.is_array:
+ if not self.start and not self.stop:
+ # redundant slice building, copy C arrays directly
+ return self.base.coerce_to(dst_type, env)
+ # else: check array size if possible
return super(SliceIndexNode, self).coerce_to(dst_type, env)
def generate_result_code(self, code):
@@ -4970,7 +4970,7 @@ class SliceIndexNode(ExprNode):
stop_code = self.stop_code()
if self.base.type.is_string:
base_result = self.base.result()
- if self.base.type not in (PyrexTypes.c_char_ptr_type, PyrexTypes.c_const_char_ptr_type):
+ if self.base.type not in (PyrexTypes.c_char_ptr_type, PyrexTypes.c_const_char_ptr_type):
base_result = '((const char*)%s)' % base_result
if self.type is bytearray_type:
type_name = 'ByteArray'
@@ -5059,8 +5059,8 @@ class SliceIndexNode(ExprNode):
code.error_goto_if_null(result, self.pos)))
code.put_gotref(self.py_result())
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
- exception_check=None, exception_value=None):
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
+ exception_check=None, exception_value=None):
self.generate_subexpr_evaluation_code(code)
if self.type.is_pyobject:
code.globalstate.use_utility_code(self.set_slice_utility_code)
@@ -5075,20 +5075,20 @@ class SliceIndexNode(ExprNode):
has_c_start, has_c_stop,
bool(code.globalstate.directives['wraparound'])))
else:
- start_offset = self.start_code() if self.start else '0'
+ start_offset = self.start_code() if self.start else '0'
if rhs.type.is_array:
array_length = rhs.type.size
self.generate_slice_guard_code(code, array_length)
else:
- array_length = '%s - %s' % (self.stop_code(), start_offset)
-
- code.globalstate.use_utility_code(UtilityCode.load_cached("IncludeStringH", "StringTools.c"))
- code.putln("memcpy(&(%s[%s]), %s, sizeof(%s[0]) * (%s));" % (
- self.base.result(), start_offset,
- rhs.result(),
- self.base.result(), array_length
- ))
-
+ array_length = '%s - %s' % (self.stop_code(), start_offset)
+
+ code.globalstate.use_utility_code(UtilityCode.load_cached("IncludeStringH", "StringTools.c"))
+ code.putln("memcpy(&(%s[%s]), %s, sizeof(%s[0]) * (%s));" % (
+ self.base.result(), start_offset,
+ rhs.result(),
+ self.base.result(), array_length
+ ))
+
self.generate_subexpr_disposal_code(code)
self.free_subexpr_temps(code)
rhs.generate_disposal_code(code)
@@ -5136,77 +5136,77 @@ class SliceIndexNode(ExprNode):
if not self.base.type.is_array:
return
slice_size = self.base.type.size
- try:
- total_length = slice_size = int(slice_size)
- except ValueError:
- total_length = None
-
+ try:
+ total_length = slice_size = int(slice_size)
+ except ValueError:
+ total_length = None
+
start = stop = None
if self.stop:
stop = self.stop.result()
try:
stop = int(stop)
if stop < 0:
- if total_length is None:
- slice_size = '%s + %d' % (slice_size, stop)
- else:
- slice_size += stop
+ if total_length is None:
+ slice_size = '%s + %d' % (slice_size, stop)
+ else:
+ slice_size += stop
else:
slice_size = stop
stop = None
except ValueError:
pass
-
+
if self.start:
start = self.start.result()
try:
start = int(start)
if start < 0:
- if total_length is None:
- start = '%s + %d' % (self.base.type.size, start)
- else:
- start += total_length
- if isinstance(slice_size, _py_int_types):
- slice_size -= start
- else:
- slice_size = '%s - (%s)' % (slice_size, start)
+ if total_length is None:
+ start = '%s + %d' % (self.base.type.size, start)
+ else:
+ start += total_length
+ if isinstance(slice_size, _py_int_types):
+ slice_size -= start
+ else:
+ slice_size = '%s - (%s)' % (slice_size, start)
start = None
except ValueError:
pass
-
- runtime_check = None
- compile_time_check = False
- try:
- int_target_size = int(target_size)
- except ValueError:
- int_target_size = None
- else:
- compile_time_check = isinstance(slice_size, _py_int_types)
-
- if compile_time_check and slice_size < 0:
- if int_target_size > 0:
+
+ runtime_check = None
+ compile_time_check = False
+ try:
+ int_target_size = int(target_size)
+ except ValueError:
+ int_target_size = None
+ else:
+ compile_time_check = isinstance(slice_size, _py_int_types)
+
+ if compile_time_check and slice_size < 0:
+ if int_target_size > 0:
error(self.pos, "Assignment to empty slice.")
- elif compile_time_check and start is None and stop is None:
+ elif compile_time_check and start is None and stop is None:
# we know the exact slice length
- if int_target_size != slice_size:
- error(self.pos, "Assignment to slice of wrong length, expected %s, got %s" % (
- slice_size, target_size))
+ if int_target_size != slice_size:
+ error(self.pos, "Assignment to slice of wrong length, expected %s, got %s" % (
+ slice_size, target_size))
elif start is not None:
if stop is None:
stop = slice_size
- runtime_check = "(%s)-(%s)" % (stop, start)
- elif stop is not None:
- runtime_check = stop
- else:
- runtime_check = slice_size
-
- if runtime_check:
- code.putln("if (unlikely((%s) != (%s))) {" % (runtime_check, target_size))
- code.putln(
- 'PyErr_Format(PyExc_ValueError, "Assignment to slice of wrong length,'
- ' expected %%" CYTHON_FORMAT_SSIZE_T "d, got %%" CYTHON_FORMAT_SSIZE_T "d",'
- ' (Py_ssize_t)(%s), (Py_ssize_t)(%s));' % (
- target_size, runtime_check))
+ runtime_check = "(%s)-(%s)" % (stop, start)
+ elif stop is not None:
+ runtime_check = stop
+ else:
+ runtime_check = slice_size
+
+ if runtime_check:
+ code.putln("if (unlikely((%s) != (%s))) {" % (runtime_check, target_size))
+ code.putln(
+ 'PyErr_Format(PyExc_ValueError, "Assignment to slice of wrong length,'
+ ' expected %%" CYTHON_FORMAT_SSIZE_T "d, got %%" CYTHON_FORMAT_SSIZE_T "d",'
+ ' (Py_ssize_t)(%s), (Py_ssize_t)(%s));' % (
+ target_size, runtime_check))
code.putln(code.error_goto(self.pos))
code.putln("}")
@@ -5237,7 +5237,7 @@ class SliceNode(ExprNode):
# step ExprNode
subexprs = ['start', 'stop', 'step']
- is_slice = True
+ is_slice = True
type = slice_type
is_temp = 1
@@ -5253,7 +5253,7 @@ class SliceNode(ExprNode):
step = self.step.compile_time_value(denv)
try:
return slice(start, stop, step)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def may_be_none(self):
@@ -5278,11 +5278,11 @@ class SliceNode(ExprNode):
def generate_result_code(self, code):
if self.is_literal:
- dedup_key = make_dedup_key(self.type, (self,))
- self.result_code = code.get_py_const(py_object_type, 'slice', cleanup_level=2, dedup_key=dedup_key)
- code = code.get_cached_constants_writer(self.result_code)
- if code is None:
- return # already initialised
+ dedup_key = make_dedup_key(self.type, (self,))
+ self.result_code = code.get_py_const(py_object_type, 'slice', cleanup_level=2, dedup_key=dedup_key)
+ code = code.get_cached_constants_writer(self.result_code)
+ if code is None:
+ return # already initialised
code.mark_pos(self.pos)
code.putln(
@@ -5357,7 +5357,7 @@ class CallNode(ExprNode):
may_return_none = None
def infer_type(self, env):
- # TODO(robertwb): Reduce redundancy with analyse_types.
+ # TODO(robertwb): Reduce redundancy with analyse_types.
function = self.function
func_type = function.infer_type(env)
if isinstance(function, NewExprNode):
@@ -5371,15 +5371,15 @@ class CallNode(ExprNode):
if func_type.is_ptr:
func_type = func_type.base_type
if func_type.is_cfunction:
- if getattr(self.function, 'entry', None) and hasattr(self, 'args'):
- alternatives = self.function.entry.all_alternatives()
- arg_types = [arg.infer_type(env) for arg in self.args]
- func_entry = PyrexTypes.best_match(arg_types, alternatives)
- if func_entry:
- func_type = func_entry.type
- if func_type.is_ptr:
- func_type = func_type.base_type
- return func_type.return_type
+ if getattr(self.function, 'entry', None) and hasattr(self, 'args'):
+ alternatives = self.function.entry.all_alternatives()
+ arg_types = [arg.infer_type(env) for arg in self.args]
+ func_entry = PyrexTypes.best_match(arg_types, alternatives)
+ if func_entry:
+ func_type = func_entry.type
+ if func_type.is_ptr:
+ func_type = func_type.base_type
+ return func_type.return_type
return func_type.return_type
elif func_type is type_type:
if function.is_name and function.entry and function.entry.type:
@@ -5467,7 +5467,7 @@ class CallNode(ExprNode):
return self
self.function = RawCNameExprNode(self.function.pos, constructor.type)
self.function.entry = constructor
- self.function.set_cname(type.empty_declaration_code())
+ self.function.set_cname(type.empty_declaration_code())
self.analyse_c_function_call(env)
self.type = type
return True
@@ -5513,7 +5513,7 @@ class SimpleCallNode(CallNode):
args = [arg.compile_time_value(denv) for arg in self.args]
try:
return function(*args)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def analyse_as_type(self, env):
@@ -5554,8 +5554,8 @@ class SimpleCallNode(CallNode):
func_type = self.function_type()
self.is_numpy_call_with_exprs = False
- if (has_np_pythran(env) and function.is_numpy_attribute and
- pythran_is_numpy_func_supported(function)):
+ if (has_np_pythran(env) and function.is_numpy_attribute and
+ pythran_is_numpy_func_supported(function)):
has_pythran_args = True
self.arg_tuple = TupleNode(self.pos, args = self.args)
self.arg_tuple = self.arg_tuple.analyse_types(env)
@@ -5563,24 +5563,24 @@ class SimpleCallNode(CallNode):
has_pythran_args &= is_pythran_supported_node_or_none(arg)
self.is_numpy_call_with_exprs = bool(has_pythran_args)
if self.is_numpy_call_with_exprs:
- env.add_include_file(pythran_get_func_include_file(function))
+ env.add_include_file(pythran_get_func_include_file(function))
return NumPyMethodCallNode.from_node(
self,
function_cname=pythran_functor(function),
arg_tuple=self.arg_tuple,
- type=PythranExpr(pythran_func_type(function, self.arg_tuple.args)),
+ type=PythranExpr(pythran_func_type(function, self.arg_tuple.args)),
)
elif func_type.is_pyobject:
self.arg_tuple = TupleNode(self.pos, args = self.args)
- self.arg_tuple = self.arg_tuple.analyse_types(env).coerce_to_pyobject(env)
+ self.arg_tuple = self.arg_tuple.analyse_types(env).coerce_to_pyobject(env)
self.args = None
self.set_py_result_type(function, func_type)
self.is_temp = 1
else:
self.args = [ arg.analyse_types(env) for arg in self.args ]
self.analyse_c_function_call(env)
- if func_type.exception_check == '+':
- self.is_temp = True
+ if func_type.exception_check == '+':
+ self.is_temp = True
return self
def function_type(self):
@@ -5620,7 +5620,7 @@ class SimpleCallNode(CallNode):
return
elif hasattr(self.function, 'entry'):
overloaded_entry = self.function.entry
- elif self.function.is_subscript and self.function.is_fused_index:
+ elif self.function.is_subscript and self.function.is_fused_index:
overloaded_entry = self.function.type.entry
else:
overloaded_entry = None
@@ -5632,8 +5632,8 @@ class SimpleCallNode(CallNode):
else:
alternatives = overloaded_entry.all_alternatives()
- entry = PyrexTypes.best_match(
- [arg.type for arg in args], alternatives, self.pos, env, args)
+ entry = PyrexTypes.best_match(
+ [arg.type for arg in args], alternatives, self.pos, env, args)
if not entry:
self.type = PyrexTypes.error_type
@@ -5641,8 +5641,8 @@ class SimpleCallNode(CallNode):
return
entry.used = True
- if not func_type.is_cpp_class:
- self.function.entry = entry
+ if not func_type.is_cpp_class:
+ self.function.entry = entry
self.function.type = entry.type
func_type = self.function_type()
else:
@@ -5692,7 +5692,7 @@ class SimpleCallNode(CallNode):
# Coerce arguments
some_args_in_temps = False
- for i in range(min(max_nargs, actual_nargs)):
+ for i in range(min(max_nargs, actual_nargs)):
formal_arg = func_type.args[i]
formal_type = formal_arg.type
arg = args[i].coerce_to(formal_type, env)
@@ -5722,13 +5722,13 @@ class SimpleCallNode(CallNode):
args[i] = arg
# handle additional varargs parameters
- for i in range(max_nargs, actual_nargs):
+ for i in range(max_nargs, actual_nargs):
arg = args[i]
if arg.type.is_pyobject:
- if arg.type is str_type:
- arg_ctype = PyrexTypes.c_char_ptr_type
- else:
- arg_ctype = arg.type.default_coerced_ctype()
+ if arg.type is str_type:
+ arg_ctype = PyrexTypes.c_char_ptr_type
+ else:
+ arg_ctype = arg.type.default_coerced_ctype()
if arg_ctype is None:
error(self.args[i].pos,
"Python object cannot be passed as a varargs parameter")
@@ -5743,7 +5743,7 @@ class SimpleCallNode(CallNode):
# sure they are either all temps or all not temps (except
# for the last argument, which is evaluated last in any
# case)
- for i in range(actual_nargs-1):
+ for i in range(actual_nargs-1):
if i == 0 and self.self is not None:
continue # self is ok
arg = args[i]
@@ -5774,22 +5774,22 @@ class SimpleCallNode(CallNode):
self.type = func_type.return_type
if self.function.is_name or self.function.is_attribute:
- func_entry = self.function.entry
- if func_entry and (func_entry.utility_code or func_entry.utility_code_definition):
- self.is_temp = 1 # currently doesn't work for self.calculate_result_code()
+ func_entry = self.function.entry
+ if func_entry and (func_entry.utility_code or func_entry.utility_code_definition):
+ self.is_temp = 1 # currently doesn't work for self.calculate_result_code()
if self.type.is_pyobject:
self.result_ctype = py_object_type
self.is_temp = 1
- elif func_type.exception_value is not None or func_type.exception_check:
+ elif func_type.exception_value is not None or func_type.exception_check:
self.is_temp = 1
elif self.type.is_memoryviewslice:
self.is_temp = 1
# func_type.exception_check = True
- if self.is_temp and self.type.is_reference:
- self.type = PyrexTypes.CFakeReferenceType(self.type.ref_base_type)
-
+ if self.is_temp and self.type.is_reference:
+ self.type = PyrexTypes.CFakeReferenceType(self.type.ref_base_type)
+
# Called in 'nogil' context?
self.nogil = env.nogil
if (self.nogil and
@@ -5836,12 +5836,12 @@ class SimpleCallNode(CallNode):
result = "%s(%s)" % (self.function.result(), ', '.join(arg_list_code))
return result
- def is_c_result_required(self):
- func_type = self.function_type()
- if not func_type.exception_value or func_type.exception_check == '+':
- return False # skip allocation of unused result temp
- return True
-
+ def is_c_result_required(self):
+ func_type = self.function_type()
+ if not func_type.exception_value or func_type.exception_check == '+':
+ return False # skip allocation of unused result temp
+ return True
+
def generate_evaluation_code(self, code):
function = self.function
if function.is_name or function.is_attribute:
@@ -5934,7 +5934,7 @@ class SimpleCallNode(CallNode):
elif self.type.is_memoryviewslice:
assert self.is_temp
exc_checks.append(self.type.error_condition(self.result()))
- elif func_type.exception_check != '+':
+ elif func_type.exception_check != '+':
exc_val = func_type.exception_value
exc_check = func_type.exception_check
if exc_val is not None:
@@ -5956,9 +5956,9 @@ class SimpleCallNode(CallNode):
else:
lhs = ""
if func_type.exception_check == '+':
- translate_cpp_exception(code, self.pos, '%s%s;' % (lhs, rhs),
- self.result() if self.type.is_pyobject else None,
- func_type.exception_value, self.nogil)
+ translate_cpp_exception(code, self.pos, '%s%s;' % (lhs, rhs),
+ self.result() if self.type.is_pyobject else None,
+ func_type.exception_value, self.nogil)
else:
if exc_checks:
goto_error = code.error_goto_if(" && ".join(exc_checks), self.pos)
@@ -5992,7 +5992,7 @@ class NumPyMethodCallNode(ExprNode):
code.putln("// function evaluation code for numpy function")
code.putln("__Pyx_call_destructor(%s);" % self.result())
- code.putln("new (&%s) decltype(%s){%s{}(%s)};" % (
+ code.putln("new (&%s) decltype(%s){%s{}(%s)};" % (
self.result(),
self.result(),
self.function_cname,
@@ -6034,7 +6034,7 @@ class PyMethodCallNode(SimpleCallNode):
code.putln("%s = NULL;" % self_arg)
arg_offset_cname = None
if len(args) > 1:
- arg_offset_cname = code.funcstate.allocate_temp(PyrexTypes.c_int_type, manage_ref=False)
+ arg_offset_cname = code.funcstate.allocate_temp(PyrexTypes.c_int_type, manage_ref=False)
code.putln("%s = 0;" % arg_offset_cname)
def attribute_is_likely_method(attr):
@@ -6058,7 +6058,7 @@ class PyMethodCallNode(SimpleCallNode):
else:
likely_method = 'unlikely'
- code.putln("if (CYTHON_UNPACK_METHODS && %s(PyMethod_Check(%s))) {" % (likely_method, function))
+ code.putln("if (CYTHON_UNPACK_METHODS && %s(PyMethod_Check(%s))) {" % (likely_method, function))
code.putln("%s = PyMethod_GET_SELF(%s);" % (self_arg, function))
# the following is always true in Py3 (kept only for safety),
# but is false for unbound methods in Py2
@@ -6076,85 +6076,85 @@ class PyMethodCallNode(SimpleCallNode):
if not args:
# fastest special case: try to avoid tuple creation
code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyObjectCallNoArg", "ObjectHandling.c"))
- code.globalstate.use_utility_code(
+ UtilityCode.load_cached("PyObjectCallNoArg", "ObjectHandling.c"))
+ code.globalstate.use_utility_code(
UtilityCode.load_cached("PyObjectCallOneArg", "ObjectHandling.c"))
code.putln(
- "%s = (%s) ? __Pyx_PyObject_CallOneArg(%s, %s) : __Pyx_PyObject_CallNoArg(%s);" % (
- self.result(), self_arg,
+ "%s = (%s) ? __Pyx_PyObject_CallOneArg(%s, %s) : __Pyx_PyObject_CallNoArg(%s);" % (
+ self.result(), self_arg,
function, self_arg,
- function))
- code.put_xdecref_clear(self_arg, py_object_type)
+ function))
+ code.put_xdecref_clear(self_arg, py_object_type)
code.funcstate.release_temp(self_arg)
- code.putln(code.error_goto_if_null(self.result(), self.pos))
- code.put_gotref(self.py_result())
- elif len(args) == 1:
- # fastest special case: try to avoid tuple creation
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyObjectCall2Args", "ObjectHandling.c"))
+ code.putln(code.error_goto_if_null(self.result(), self.pos))
+ code.put_gotref(self.py_result())
+ elif len(args) == 1:
+ # fastest special case: try to avoid tuple creation
code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyObjectCallOneArg", "ObjectHandling.c"))
- arg = args[0]
+ UtilityCode.load_cached("PyObjectCall2Args", "ObjectHandling.c"))
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("PyObjectCallOneArg", "ObjectHandling.c"))
+ arg = args[0]
code.putln(
- "%s = (%s) ? __Pyx_PyObject_Call2Args(%s, %s, %s) : __Pyx_PyObject_CallOneArg(%s, %s);" % (
- self.result(), self_arg,
- function, self_arg, arg.py_result(),
- function, arg.py_result()))
- code.put_xdecref_clear(self_arg, py_object_type)
- code.funcstate.release_temp(self_arg)
- arg.generate_disposal_code(code)
- arg.free_temps(code)
- code.putln(code.error_goto_if_null(self.result(), self.pos))
+ "%s = (%s) ? __Pyx_PyObject_Call2Args(%s, %s, %s) : __Pyx_PyObject_CallOneArg(%s, %s);" % (
+ self.result(), self_arg,
+ function, self_arg, arg.py_result(),
+ function, arg.py_result()))
+ code.put_xdecref_clear(self_arg, py_object_type)
+ code.funcstate.release_temp(self_arg)
+ arg.generate_disposal_code(code)
+ arg.free_temps(code)
+ code.putln(code.error_goto_if_null(self.result(), self.pos))
code.put_gotref(self.py_result())
else:
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyFunctionFastCall", "ObjectHandling.c"))
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyCFunctionFastCall", "ObjectHandling.c"))
- for test_func, call_prefix in [('PyFunction_Check', 'Py'), ('__Pyx_PyFastCFunction_Check', 'PyC')]:
- code.putln("#if CYTHON_FAST_%sCALL" % call_prefix.upper())
- code.putln("if (%s(%s)) {" % (test_func, function))
- code.putln("PyObject *%s[%d] = {%s, %s};" % (
- Naming.quick_temp_cname,
- len(args)+1,
- self_arg,
- ', '.join(arg.py_result() for arg in args)))
- code.putln("%s = __Pyx_%sFunction_FastCall(%s, %s+1-%s, %d+%s); %s" % (
- self.result(),
- call_prefix,
- function,
- Naming.quick_temp_cname,
- arg_offset_cname,
- len(args),
- arg_offset_cname,
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_xdecref_clear(self_arg, py_object_type)
- code.put_gotref(self.py_result())
- for arg in args:
- arg.generate_disposal_code(code)
- code.putln("} else")
- code.putln("#endif")
-
- code.putln("{")
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("PyFunctionFastCall", "ObjectHandling.c"))
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("PyCFunctionFastCall", "ObjectHandling.c"))
+ for test_func, call_prefix in [('PyFunction_Check', 'Py'), ('__Pyx_PyFastCFunction_Check', 'PyC')]:
+ code.putln("#if CYTHON_FAST_%sCALL" % call_prefix.upper())
+ code.putln("if (%s(%s)) {" % (test_func, function))
+ code.putln("PyObject *%s[%d] = {%s, %s};" % (
+ Naming.quick_temp_cname,
+ len(args)+1,
+ self_arg,
+ ', '.join(arg.py_result() for arg in args)))
+ code.putln("%s = __Pyx_%sFunction_FastCall(%s, %s+1-%s, %d+%s); %s" % (
+ self.result(),
+ call_prefix,
+ function,
+ Naming.quick_temp_cname,
+ arg_offset_cname,
+ len(args),
+ arg_offset_cname,
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_xdecref_clear(self_arg, py_object_type)
+ code.put_gotref(self.py_result())
+ for arg in args:
+ arg.generate_disposal_code(code)
+ code.putln("} else")
+ code.putln("#endif")
+
+ code.putln("{")
args_tuple = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
code.putln("%s = PyTuple_New(%d+%s); %s" % (
- args_tuple, len(args), arg_offset_cname,
+ args_tuple, len(args), arg_offset_cname,
code.error_goto_if_null(args_tuple, self.pos)))
code.put_gotref(args_tuple)
if len(args) > 1:
code.putln("if (%s) {" % self_arg)
- code.putln("__Pyx_GIVEREF(%s); PyTuple_SET_ITEM(%s, 0, %s); %s = NULL;" % (
- self_arg, args_tuple, self_arg, self_arg)) # stealing owned ref in this case
+ code.putln("__Pyx_GIVEREF(%s); PyTuple_SET_ITEM(%s, 0, %s); %s = NULL;" % (
+ self_arg, args_tuple, self_arg, self_arg)) # stealing owned ref in this case
code.funcstate.release_temp(self_arg)
if len(args) > 1:
code.putln("}")
for i, arg in enumerate(args):
arg.make_owned_reference(code)
- code.put_giveref(arg.py_result())
+ code.put_giveref(arg.py_result())
code.putln("PyTuple_SET_ITEM(%s, %d+%s, %s);" % (
- args_tuple, i, arg_offset_cname, arg.py_result()))
+ args_tuple, i, arg_offset_cname, arg.py_result()))
if len(args) > 1:
code.funcstate.release_temp(arg_offset_cname)
@@ -6176,7 +6176,7 @@ class PyMethodCallNode(SimpleCallNode):
if len(args) == 1:
code.putln("}")
- code.putln("}") # !CYTHON_FAST_PYCALL
+ code.putln("}") # !CYTHON_FAST_PYCALL
if reuse_function_temp:
self.function.generate_disposal_code(code)
@@ -6205,8 +6205,8 @@ class InlinedDefNodeCallNode(CallNode):
return False
if len(func_type.args) != len(self.args):
return False
- if func_type.num_kwonly_args:
- return False # actually wrong number of arguments
+ if func_type.num_kwonly_args:
+ return False # actually wrong number of arguments
return True
def analyse_types(self, env):
@@ -6218,7 +6218,7 @@ class InlinedDefNodeCallNode(CallNode):
# Coerce arguments
some_args_in_temps = False
- for i in range(actual_nargs):
+ for i in range(actual_nargs):
formal_type = func_type.args[i].type
arg = self.args[i].coerce_to(formal_type, env)
if arg.is_temp:
@@ -6245,7 +6245,7 @@ class InlinedDefNodeCallNode(CallNode):
# sure they are either all temps or all not temps (except
# for the last argument, which is evaluated last in any
# case)
- for i in range(actual_nargs-1):
+ for i in range(actual_nargs-1):
arg = self.args[i]
if arg.nonlocally_immutable():
# locals, C functions, unassignable types are safe.
@@ -6374,12 +6374,12 @@ class GeneralCallNode(CallNode):
keyword_args = self.keyword_args.compile_time_value(denv)
try:
return function(*positional_args, **keyword_args)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def explicit_args_kwds(self):
- if (self.keyword_args and not self.keyword_args.is_dict_literal or
- not self.positional_args.is_sequence_constructor):
+ if (self.keyword_args and not self.keyword_args.is_dict_literal or
+ not self.positional_args.is_sequence_constructor):
raise CompileError(self.pos,
'Compile-time keyword arguments must be explicit.')
return self.positional_args.args, self.keyword_args
@@ -6425,7 +6425,7 @@ class GeneralCallNode(CallNode):
if not isinstance(self.positional_args, TupleNode):
# has starred argument
return self
- if not self.keyword_args.is_dict_literal:
+ if not self.keyword_args.is_dict_literal:
# keywords come from arbitrary expression => nothing to do here
return self
function = self.function
@@ -6588,13 +6588,13 @@ class AsTupleNode(ExprNode):
arg = self.arg.compile_time_value(denv)
try:
return tuple(arg)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def analyse_types(self, env):
- self.arg = self.arg.analyse_types(env).coerce_to_pyobject(env)
- if self.arg.type is tuple_type:
- return self.arg.as_none_safe_node("'NoneType' object is not iterable")
+ self.arg = self.arg.analyse_types(env).coerce_to_pyobject(env)
+ if self.arg.type is tuple_type:
+ return self.arg.as_none_safe_node("'NoneType' object is not iterable")
self.type = tuple_type
return self
@@ -6614,159 +6614,159 @@ class AsTupleNode(ExprNode):
code.put_gotref(self.py_result())
-class MergedDictNode(ExprNode):
- # Helper class for keyword arguments and other merged dicts.
- #
- # keyword_args [DictNode or other ExprNode]
-
- subexprs = ['keyword_args']
- is_temp = 1
- type = dict_type
- reject_duplicates = True
-
- def calculate_constant_result(self):
- result = {}
- reject_duplicates = self.reject_duplicates
- for item in self.keyword_args:
- if item.is_dict_literal:
- # process items in order
- items = ((key.constant_result, value.constant_result)
- for key, value in item.key_value_pairs)
- else:
- items = item.constant_result.iteritems()
-
- for key, value in items:
- if reject_duplicates and key in result:
- raise ValueError("duplicate keyword argument found: %s" % key)
- result[key] = value
-
- self.constant_result = result
-
- def compile_time_value(self, denv):
- result = {}
- reject_duplicates = self.reject_duplicates
- for item in self.keyword_args:
- if item.is_dict_literal:
- # process items in order
- items = [(key.compile_time_value(denv), value.compile_time_value(denv))
- for key, value in item.key_value_pairs]
- else:
- items = item.compile_time_value(denv).iteritems()
-
- try:
- for key, value in items:
- if reject_duplicates and key in result:
- raise ValueError("duplicate keyword argument found: %s" % key)
- result[key] = value
- except Exception as e:
- self.compile_time_value_error(e)
- return result
-
- def type_dependencies(self, env):
- return ()
-
- def infer_type(self, env):
- return dict_type
-
- def analyse_types(self, env):
+class MergedDictNode(ExprNode):
+ # Helper class for keyword arguments and other merged dicts.
+ #
+ # keyword_args [DictNode or other ExprNode]
+
+ subexprs = ['keyword_args']
+ is_temp = 1
+ type = dict_type
+ reject_duplicates = True
+
+ def calculate_constant_result(self):
+ result = {}
+ reject_duplicates = self.reject_duplicates
+ for item in self.keyword_args:
+ if item.is_dict_literal:
+ # process items in order
+ items = ((key.constant_result, value.constant_result)
+ for key, value in item.key_value_pairs)
+ else:
+ items = item.constant_result.iteritems()
+
+ for key, value in items:
+ if reject_duplicates and key in result:
+ raise ValueError("duplicate keyword argument found: %s" % key)
+ result[key] = value
+
+ self.constant_result = result
+
+ def compile_time_value(self, denv):
+ result = {}
+ reject_duplicates = self.reject_duplicates
+ for item in self.keyword_args:
+ if item.is_dict_literal:
+ # process items in order
+ items = [(key.compile_time_value(denv), value.compile_time_value(denv))
+ for key, value in item.key_value_pairs]
+ else:
+ items = item.compile_time_value(denv).iteritems()
+
+ try:
+ for key, value in items:
+ if reject_duplicates and key in result:
+ raise ValueError("duplicate keyword argument found: %s" % key)
+ result[key] = value
+ except Exception as e:
+ self.compile_time_value_error(e)
+ return result
+
+ def type_dependencies(self, env):
+ return ()
+
+ def infer_type(self, env):
+ return dict_type
+
+ def analyse_types(self, env):
self.keyword_args = [
- arg.analyse_types(env).coerce_to_pyobject(env).as_none_safe_node(
- # FIXME: CPython's error message starts with the runtime function name
- 'argument after ** must be a mapping, not NoneType')
- for arg in self.keyword_args
- ]
-
- return self
-
- def may_be_none(self):
- return False
-
- gil_message = "Constructing Python dict"
-
- def generate_evaluation_code(self, code):
- code.mark_pos(self.pos)
- self.allocate_temp_result(code)
-
- args = iter(self.keyword_args)
- item = next(args)
- item.generate_evaluation_code(code)
- if item.type is not dict_type:
- # CPython supports calling functions with non-dicts, so do we
- code.putln('if (likely(PyDict_CheckExact(%s))) {' %
- item.py_result())
-
- if item.is_dict_literal:
- item.make_owned_reference(code)
- code.putln("%s = %s;" % (self.result(), item.py_result()))
- item.generate_post_assignment_code(code)
- else:
- code.putln("%s = PyDict_Copy(%s); %s" % (
- self.result(),
- item.py_result(),
- code.error_goto_if_null(self.result(), item.pos)))
- code.put_gotref(self.result())
- item.generate_disposal_code(code)
-
- if item.type is not dict_type:
- code.putln('} else {')
- code.putln("%s = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, %s, NULL); %s" % (
- self.result(),
- item.py_result(),
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_gotref(self.py_result())
- item.generate_disposal_code(code)
- code.putln('}')
- item.free_temps(code)
-
- helpers = set()
- for item in args:
- if item.is_dict_literal:
- # inline update instead of creating an intermediate dict
- for arg in item.key_value_pairs:
- arg.generate_evaluation_code(code)
- if self.reject_duplicates:
- code.putln("if (unlikely(PyDict_Contains(%s, %s))) {" % (
- self.result(),
- arg.key.py_result()))
- helpers.add("RaiseDoubleKeywords")
- # FIXME: find out function name at runtime!
- code.putln('__Pyx_RaiseDoubleKeywordsError("function", %s); %s' % (
- arg.key.py_result(),
- code.error_goto(self.pos)))
- code.putln("}")
- code.put_error_if_neg(arg.key.pos, "PyDict_SetItem(%s, %s, %s)" % (
- self.result(),
- arg.key.py_result(),
- arg.value.py_result()))
- arg.generate_disposal_code(code)
- arg.free_temps(code)
- else:
- item.generate_evaluation_code(code)
- if self.reject_duplicates:
- # merge mapping into kwdict one by one as we need to check for duplicates
- helpers.add("MergeKeywords")
- code.put_error_if_neg(item.pos, "__Pyx_MergeKeywords(%s, %s)" % (
- self.result(), item.py_result()))
- else:
- # simple case, just add all entries
- helpers.add("RaiseMappingExpected")
- code.putln("if (unlikely(PyDict_Update(%s, %s) < 0)) {" % (
- self.result(), item.py_result()))
- code.putln("if (PyErr_ExceptionMatches(PyExc_AttributeError)) "
- "__Pyx_RaiseMappingExpectedError(%s);" % item.py_result())
- code.putln(code.error_goto(item.pos))
- code.putln("}")
- item.generate_disposal_code(code)
- item.free_temps(code)
-
- for helper in sorted(helpers):
- code.globalstate.use_utility_code(UtilityCode.load_cached(helper, "FunctionArguments.c"))
-
- def annotate(self, code):
- for item in self.keyword_args:
- item.annotate(code)
-
-
+ arg.analyse_types(env).coerce_to_pyobject(env).as_none_safe_node(
+ # FIXME: CPython's error message starts with the runtime function name
+ 'argument after ** must be a mapping, not NoneType')
+ for arg in self.keyword_args
+ ]
+
+ return self
+
+ def may_be_none(self):
+ return False
+
+ gil_message = "Constructing Python dict"
+
+ def generate_evaluation_code(self, code):
+ code.mark_pos(self.pos)
+ self.allocate_temp_result(code)
+
+ args = iter(self.keyword_args)
+ item = next(args)
+ item.generate_evaluation_code(code)
+ if item.type is not dict_type:
+ # CPython supports calling functions with non-dicts, so do we
+ code.putln('if (likely(PyDict_CheckExact(%s))) {' %
+ item.py_result())
+
+ if item.is_dict_literal:
+ item.make_owned_reference(code)
+ code.putln("%s = %s;" % (self.result(), item.py_result()))
+ item.generate_post_assignment_code(code)
+ else:
+ code.putln("%s = PyDict_Copy(%s); %s" % (
+ self.result(),
+ item.py_result(),
+ code.error_goto_if_null(self.result(), item.pos)))
+ code.put_gotref(self.result())
+ item.generate_disposal_code(code)
+
+ if item.type is not dict_type:
+ code.putln('} else {')
+ code.putln("%s = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, %s, NULL); %s" % (
+ self.result(),
+ item.py_result(),
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_gotref(self.py_result())
+ item.generate_disposal_code(code)
+ code.putln('}')
+ item.free_temps(code)
+
+ helpers = set()
+ for item in args:
+ if item.is_dict_literal:
+ # inline update instead of creating an intermediate dict
+ for arg in item.key_value_pairs:
+ arg.generate_evaluation_code(code)
+ if self.reject_duplicates:
+ code.putln("if (unlikely(PyDict_Contains(%s, %s))) {" % (
+ self.result(),
+ arg.key.py_result()))
+ helpers.add("RaiseDoubleKeywords")
+ # FIXME: find out function name at runtime!
+ code.putln('__Pyx_RaiseDoubleKeywordsError("function", %s); %s' % (
+ arg.key.py_result(),
+ code.error_goto(self.pos)))
+ code.putln("}")
+ code.put_error_if_neg(arg.key.pos, "PyDict_SetItem(%s, %s, %s)" % (
+ self.result(),
+ arg.key.py_result(),
+ arg.value.py_result()))
+ arg.generate_disposal_code(code)
+ arg.free_temps(code)
+ else:
+ item.generate_evaluation_code(code)
+ if self.reject_duplicates:
+ # merge mapping into kwdict one by one as we need to check for duplicates
+ helpers.add("MergeKeywords")
+ code.put_error_if_neg(item.pos, "__Pyx_MergeKeywords(%s, %s)" % (
+ self.result(), item.py_result()))
+ else:
+ # simple case, just add all entries
+ helpers.add("RaiseMappingExpected")
+ code.putln("if (unlikely(PyDict_Update(%s, %s) < 0)) {" % (
+ self.result(), item.py_result()))
+ code.putln("if (PyErr_ExceptionMatches(PyExc_AttributeError)) "
+ "__Pyx_RaiseMappingExpectedError(%s);" % item.py_result())
+ code.putln(code.error_goto(item.pos))
+ code.putln("}")
+ item.generate_disposal_code(code)
+ item.free_temps(code)
+
+ for helper in sorted(helpers):
+ code.globalstate.use_utility_code(UtilityCode.load_cached(helper, "FunctionArguments.c"))
+
+ def annotate(self, code):
+ for item in self.keyword_args:
+ item.annotate(code)
+
+
class AttributeNode(ExprNode):
# obj.attribute
#
@@ -6791,7 +6791,7 @@ class AttributeNode(ExprNode):
needs_none_check = True
is_memslice_transpose = False
is_special_lookup = False
- is_py_attr = 0
+ is_py_attr = 0
def as_cython_attribute(self):
if (isinstance(self.obj, NameNode) and
@@ -6832,7 +6832,7 @@ class AttributeNode(ExprNode):
obj = self.obj.compile_time_value(denv)
try:
return getattr(obj, attr)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def type_dependencies(self, env):
@@ -6847,7 +6847,7 @@ class AttributeNode(ExprNode):
return PyrexTypes.CPtrType(node.entry.type)
else:
return node.entry.type
- node = self.analyse_as_type_attribute(env)
+ node = self.analyse_as_type_attribute(env)
if node is not None:
return node.entry.type
obj_type = self.obj.infer_type(env)
@@ -6857,10 +6857,10 @@ class AttributeNode(ExprNode):
# builtin types cannot be inferred as C functions as
# that would prevent their use as bound methods
return py_object_type
- elif self.entry and self.entry.is_cmethod:
- # special case: bound methods should not be inferred
- # as their unbound method types
- return py_object_type
+ elif self.entry and self.entry.is_cmethod:
+ # special case: bound methods should not be inferred
+ # as their unbound method types
+ return py_object_type
return self.type
def analyse_target_declaration(self, env):
@@ -6878,7 +6878,7 @@ class AttributeNode(ExprNode):
self.initialized_check = env.directives['initializedcheck']
node = self.analyse_as_cimported_attribute_node(env, target)
if node is None and not target:
- node = self.analyse_as_type_attribute(env)
+ node = self.analyse_as_type_attribute(env)
if node is None:
node = self.analyse_as_ordinary_attribute_node(env, target)
assert node is not None
@@ -6905,7 +6905,7 @@ class AttributeNode(ExprNode):
return self
return None
- def analyse_as_type_attribute(self, env):
+ def analyse_as_type_attribute(self, env):
# Try to interpret this as a reference to an unbound
# C method of an extension type or builtin type. If successful,
# creates a corresponding NameNode and returns it, otherwise
@@ -6913,49 +6913,49 @@ class AttributeNode(ExprNode):
if self.obj.is_string_literal:
return
type = self.obj.analyse_as_type(env)
- if type:
- if type.is_extension_type or type.is_builtin_type or type.is_cpp_class:
- entry = type.scope.lookup_here(self.attribute)
- if entry and (entry.is_cmethod or type.is_cpp_class and entry.type.is_cfunction):
- if type.is_builtin_type:
- if not self.is_called:
- # must handle this as Python object
- return None
- ubcm_entry = entry
- else:
- # Create a temporary entry describing the C method
- # as an ordinary function.
- if entry.func_cname and not hasattr(entry.type, 'op_arg_struct'):
- cname = entry.func_cname
- if entry.type.is_static_method or (
- env.parent_scope and env.parent_scope.is_cpp_class_scope):
- ctype = entry.type
- elif type.is_cpp_class:
- error(self.pos, "%s not a static member of %s" % (entry.name, type))
- ctype = PyrexTypes.error_type
- else:
- # Fix self type.
- ctype = copy.copy(entry.type)
- ctype.args = ctype.args[:]
- ctype.args[0] = PyrexTypes.CFuncTypeArg('self', type, 'self', None)
- else:
- cname = "%s->%s" % (type.vtabptr_cname, entry.cname)
+ if type:
+ if type.is_extension_type or type.is_builtin_type or type.is_cpp_class:
+ entry = type.scope.lookup_here(self.attribute)
+ if entry and (entry.is_cmethod or type.is_cpp_class and entry.type.is_cfunction):
+ if type.is_builtin_type:
+ if not self.is_called:
+ # must handle this as Python object
+ return None
+ ubcm_entry = entry
+ else:
+ # Create a temporary entry describing the C method
+ # as an ordinary function.
+ if entry.func_cname and not hasattr(entry.type, 'op_arg_struct'):
+ cname = entry.func_cname
+ if entry.type.is_static_method or (
+ env.parent_scope and env.parent_scope.is_cpp_class_scope):
+ ctype = entry.type
+ elif type.is_cpp_class:
+ error(self.pos, "%s not a static member of %s" % (entry.name, type))
+ ctype = PyrexTypes.error_type
+ else:
+ # Fix self type.
+ ctype = copy.copy(entry.type)
+ ctype.args = ctype.args[:]
+ ctype.args[0] = PyrexTypes.CFuncTypeArg('self', type, 'self', None)
+ else:
+ cname = "%s->%s" % (type.vtabptr_cname, entry.cname)
ctype = entry.type
- ubcm_entry = Symtab.Entry(entry.name, cname, ctype)
- ubcm_entry.is_cfunction = 1
- ubcm_entry.func_cname = entry.func_cname
- ubcm_entry.is_unbound_cmethod = 1
- ubcm_entry.scope = entry.scope
- return self.as_name_node(env, ubcm_entry, target=False)
- elif type.is_enum:
- if self.attribute in type.values:
- for entry in type.entry.enum_values:
- if entry.name == self.attribute:
- return self.as_name_node(env, entry, target=False)
+ ubcm_entry = Symtab.Entry(entry.name, cname, ctype)
+ ubcm_entry.is_cfunction = 1
+ ubcm_entry.func_cname = entry.func_cname
+ ubcm_entry.is_unbound_cmethod = 1
+ ubcm_entry.scope = entry.scope
+ return self.as_name_node(env, ubcm_entry, target=False)
+ elif type.is_enum:
+ if self.attribute in type.values:
+ for entry in type.entry.enum_values:
+ if entry.name == self.attribute:
+ return self.as_name_node(env, entry, target=False)
else:
- error(self.pos, "%s not a known value of %s" % (self.attribute, type))
- else:
- error(self.pos, "%s not a known value of %s" % (self.attribute, type))
+ error(self.pos, "%s not a known value of %s" % (self.attribute, type))
+ else:
+ error(self.pos, "%s not a known value of %s" % (self.attribute, type))
return None
def analyse_as_type(self, env):
@@ -7036,23 +7036,23 @@ class AttributeNode(ExprNode):
self.op = "->"
elif obj_type.is_extension_type or obj_type.is_builtin_type:
self.op = "->"
- elif obj_type.is_reference and obj_type.is_fake_reference:
- self.op = "->"
+ elif obj_type.is_reference and obj_type.is_fake_reference:
+ self.op = "->"
else:
self.op = "."
if obj_type.has_attributes:
if obj_type.attributes_known():
- entry = obj_type.scope.lookup_here(self.attribute)
- if obj_type.is_memoryviewslice and not entry:
+ entry = obj_type.scope.lookup_here(self.attribute)
+ if obj_type.is_memoryviewslice and not entry:
if self.attribute == 'T':
self.is_memslice_transpose = True
self.is_temp = True
self.use_managed_ref = True
- self.type = self.obj.type.transpose(self.pos)
+ self.type = self.obj.type.transpose(self.pos)
return
else:
obj_type.declare_attribute(self.attribute, env, self.pos)
- entry = obj_type.scope.lookup_here(self.attribute)
+ entry = obj_type.scope.lookup_here(self.attribute)
if entry and entry.is_member:
entry = None
else:
@@ -7156,7 +7156,7 @@ class AttributeNode(ExprNode):
def is_lvalue(self):
if self.obj:
- return True
+ return True
else:
return NameNode.is_lvalue(self)
@@ -7231,7 +7231,7 @@ class AttributeNode(ExprNode):
return
code.putln("%s = %s;" % (self.result(), self.obj.result()))
- code.put_incref_memoryviewslice(self.result(), have_gil=True)
+ code.put_incref_memoryviewslice(self.result(), have_gil=True)
T = "__pyx_memslice_transpose(&%s) == 0"
code.putln(code.error_goto_if(T % self.result(), self.pos))
@@ -7245,24 +7245,24 @@ class AttributeNode(ExprNode):
else:
# result_code contains what is needed, but we may need to insert
# a check and raise an exception
- if self.obj.type and self.obj.type.is_extension_type:
+ if self.obj.type and self.obj.type.is_extension_type:
pass
- elif self.entry and self.entry.is_cmethod:
+ elif self.entry and self.entry.is_cmethod:
# C method implemented as function call with utility code
- code.globalstate.use_entry_utility_code(self.entry)
+ code.globalstate.use_entry_utility_code(self.entry)
def generate_disposal_code(self, code):
if self.is_temp and self.type.is_memoryviewslice and self.is_memslice_transpose:
# mirror condition for putting the memview incref here:
- code.put_xdecref_memoryviewslice(
- self.result(), have_gil=True)
- code.putln("%s.memview = NULL;" % self.result())
- code.putln("%s.data = NULL;" % self.result())
+ code.put_xdecref_memoryviewslice(
+ self.result(), have_gil=True)
+ code.putln("%s.memview = NULL;" % self.result())
+ code.putln("%s.data = NULL;" % self.result())
else:
ExprNode.generate_disposal_code(self, code)
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
- exception_check=None, exception_value=None):
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
+ exception_check=None, exception_value=None):
self.obj.generate_evaluation_code(code)
if self.is_py_attr:
code.globalstate.use_utility_code(
@@ -7333,14 +7333,14 @@ class AttributeNode(ExprNode):
#
#-------------------------------------------------------------------
-class StarredUnpackingNode(ExprNode):
+class StarredUnpackingNode(ExprNode):
# A starred expression like "*a"
#
- # This is only allowed in sequence assignment or construction such as
+ # This is only allowed in sequence assignment or construction such as
#
# a, *b = (1,2,3,4) => a = 1 ; b = [2,3,4]
#
- # and will be special cased during type analysis (or generate an error
+ # and will be special cased during type analysis (or generate an error
# if it's found at unexpected places).
#
# target ExprNode
@@ -7349,22 +7349,22 @@ class StarredUnpackingNode(ExprNode):
is_starred = 1
type = py_object_type
is_temp = 1
- starred_expr_allowed_here = False
+ starred_expr_allowed_here = False
def __init__(self, pos, target):
- ExprNode.__init__(self, pos, target=target)
+ ExprNode.__init__(self, pos, target=target)
def analyse_declarations(self, env):
- if not self.starred_expr_allowed_here:
- error(self.pos, "starred expression is not allowed here")
+ if not self.starred_expr_allowed_here:
+ error(self.pos, "starred expression is not allowed here")
self.target.analyse_declarations(env)
- def infer_type(self, env):
- return self.target.infer_type(env)
-
+ def infer_type(self, env):
+ return self.target.infer_type(env)
+
def analyse_types(self, env):
- if not self.starred_expr_allowed_here:
- error(self.pos, "starred expression is not allowed here")
+ if not self.starred_expr_allowed_here:
+ error(self.pos, "starred expression is not allowed here")
self.target = self.target.analyse_types(env)
self.type = self.target.type
return self
@@ -7423,9 +7423,9 @@ class SequenceNode(ExprNode):
arg.analyse_target_declaration(env)
def analyse_types(self, env, skip_children=False):
- for i, arg in enumerate(self.args):
- if not skip_children:
- arg = arg.analyse_types(env)
+ for i, arg in enumerate(self.args):
+ if not skip_children:
+ arg = arg.analyse_types(env)
self.args[i] = arg.coerce_to_pyobject(env)
if self.mult_factor:
self.mult_factor = self.mult_factor.analyse_types(env)
@@ -7435,49 +7435,49 @@ class SequenceNode(ExprNode):
# not setting self.type here, subtypes do this
return self
- def coerce_to_ctuple(self, dst_type, env):
- if self.type == dst_type:
- return self
- assert not self.mult_factor
- if len(self.args) != dst_type.size:
- error(self.pos, "trying to coerce sequence to ctuple of wrong length, expected %d, got %d" % (
- dst_type.size, len(self.args)))
- coerced_args = [arg.coerce_to(type, env) for arg, type in zip(self.args, dst_type.components)]
- return TupleNode(self.pos, args=coerced_args, type=dst_type, is_temp=True)
-
- def _create_merge_node_if_necessary(self, env):
- self._flatten_starred_args()
- if not any(arg.is_starred for arg in self.args):
- return self
- # convert into MergedSequenceNode by building partial sequences
- args = []
- values = []
- for arg in self.args:
- if arg.is_starred:
- if values:
- args.append(TupleNode(values[0].pos, args=values).analyse_types(env, skip_children=True))
- values = []
- args.append(arg.target)
- else:
- values.append(arg)
- if values:
- args.append(TupleNode(values[0].pos, args=values).analyse_types(env, skip_children=True))
- node = MergedSequenceNode(self.pos, args, self.type)
- if self.mult_factor:
- node = binop_node(
- self.pos, '*', node, self.mult_factor.coerce_to_pyobject(env),
- inplace=True, type=self.type, is_temp=True)
- return node
-
- def _flatten_starred_args(self):
- args = []
- for arg in self.args:
- if arg.is_starred and arg.target.is_sequence_constructor and not arg.target.mult_factor:
- args.extend(arg.target.args)
- else:
- args.append(arg)
- self.args[:] = args
-
+ def coerce_to_ctuple(self, dst_type, env):
+ if self.type == dst_type:
+ return self
+ assert not self.mult_factor
+ if len(self.args) != dst_type.size:
+ error(self.pos, "trying to coerce sequence to ctuple of wrong length, expected %d, got %d" % (
+ dst_type.size, len(self.args)))
+ coerced_args = [arg.coerce_to(type, env) for arg, type in zip(self.args, dst_type.components)]
+ return TupleNode(self.pos, args=coerced_args, type=dst_type, is_temp=True)
+
+ def _create_merge_node_if_necessary(self, env):
+ self._flatten_starred_args()
+ if not any(arg.is_starred for arg in self.args):
+ return self
+ # convert into MergedSequenceNode by building partial sequences
+ args = []
+ values = []
+ for arg in self.args:
+ if arg.is_starred:
+ if values:
+ args.append(TupleNode(values[0].pos, args=values).analyse_types(env, skip_children=True))
+ values = []
+ args.append(arg.target)
+ else:
+ values.append(arg)
+ if values:
+ args.append(TupleNode(values[0].pos, args=values).analyse_types(env, skip_children=True))
+ node = MergedSequenceNode(self.pos, args, self.type)
+ if self.mult_factor:
+ node = binop_node(
+ self.pos, '*', node, self.mult_factor.coerce_to_pyobject(env),
+ inplace=True, type=self.type, is_temp=True)
+ return node
+
+ def _flatten_starred_args(self):
+ args = []
+ for arg in self.args:
+ if arg.is_starred and arg.target.is_sequence_constructor and not arg.target.mult_factor:
+ args.extend(arg.target.args)
+ else:
+ args.append(arg)
+ self.args[:] = args
+
def may_be_none(self):
return False
@@ -7490,11 +7490,11 @@ class SequenceNode(ExprNode):
for i, arg in enumerate(self.args):
arg = self.args[i] = arg.analyse_target_types(env)
if arg.is_starred:
- if not arg.type.assignable_from(list_type):
+ if not arg.type.assignable_from(list_type):
error(arg.pos,
"starred target must have Python object (list) type")
if arg.type is py_object_type:
- arg.type = list_type
+ arg.type = list_type
unpacked_item = PyTempNode(self.pos, env)
coerced_unpacked_item = unpacked_item.coerce_to(arg.type, env)
if unpacked_item is not coerced_unpacked_item:
@@ -7517,31 +7517,31 @@ class SequenceNode(ExprNode):
mult_factor = self.mult_factor
if mult_factor.type.is_int:
c_mult = mult_factor.result()
- if (isinstance(mult_factor.constant_result, _py_int_types) and
- mult_factor.constant_result > 0):
+ if (isinstance(mult_factor.constant_result, _py_int_types) and
+ mult_factor.constant_result > 0):
size_factor = ' * %s' % mult_factor.constant_result
- elif mult_factor.type.signed:
- size_factor = ' * ((%s<0) ? 0:%s)' % (c_mult, c_mult)
+ elif mult_factor.type.signed:
+ size_factor = ' * ((%s<0) ? 0:%s)' % (c_mult, c_mult)
else:
- size_factor = ' * (%s)' % (c_mult,)
+ size_factor = ' * (%s)' % (c_mult,)
- if self.type is tuple_type and (self.is_literal or self.slow) and not c_mult:
+ if self.type is tuple_type and (self.is_literal or self.slow) and not c_mult:
# use PyTuple_Pack() to avoid generating huge amounts of one-time code
code.putln('%s = PyTuple_Pack(%d, %s); %s' % (
target,
len(self.args),
- ', '.join(arg.py_result() for arg in self.args),
+ ', '.join(arg.py_result() for arg in self.args),
code.error_goto_if_null(target, self.pos)))
code.put_gotref(target)
- elif self.type.is_ctuple:
- for i, arg in enumerate(self.args):
- code.putln("%s.f%s = %s;" % (
- target, i, arg.result()))
+ elif self.type.is_ctuple:
+ for i, arg in enumerate(self.args):
+ code.putln("%s.f%s = %s;" % (
+ target, i, arg.result()))
else:
# build the tuple/list step by step, potentially multiplying it as we go
- if self.type is list_type:
+ if self.type is list_type:
create_func, set_item_func = 'PyList_New', 'PyList_SET_ITEM'
- elif self.type is tuple_type:
+ elif self.type is tuple_type:
create_func, set_item_func = 'PyTuple_New', 'PyTuple_SET_ITEM'
else:
raise InternalError("sequence packing for unexpected type %s" % self.type)
@@ -7569,11 +7569,11 @@ class SequenceNode(ExprNode):
else:
offset = ''
- for i in range(arg_count):
+ for i in range(arg_count):
arg = self.args[i]
if c_mult or not arg.result_in_temp():
code.put_incref(arg.result(), arg.ctype())
- code.put_giveref(arg.py_result())
+ code.put_giveref(arg.py_result())
code.putln("%s(%s, %s, %s);" % (
set_item_func,
target,
@@ -7598,7 +7598,7 @@ class SequenceNode(ExprNode):
def generate_subexpr_disposal_code(self, code):
if self.mult_factor and self.mult_factor.type.is_int:
super(SequenceNode, self).generate_subexpr_disposal_code(code)
- elif self.type is tuple_type and (self.is_literal or self.slow):
+ elif self.type is tuple_type and (self.is_literal or self.slow):
super(SequenceNode, self).generate_subexpr_disposal_code(code)
else:
# We call generate_post_assignment_code here instead
@@ -7611,8 +7611,8 @@ class SequenceNode(ExprNode):
if self.mult_factor:
self.mult_factor.generate_disposal_code(code)
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
- exception_check=None, exception_value=None):
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False,
+ exception_check=None, exception_value=None):
if self.starred_assignment:
self.generate_starred_assignment_code(rhs, code)
else:
@@ -7685,7 +7685,7 @@ class SequenceNode(ExprNode):
code.putln(code.error_goto(self.pos))
code.putln("}")
- code.putln("#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS")
+ code.putln("#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS")
# unpack items from list/tuple in unrolled loop (can't fail)
if len(sequence_types) == 2:
code.putln("if (likely(Py%s_CheckExact(sequence))) {" % sequence_types[0])
@@ -7883,7 +7883,7 @@ class SequenceNode(ExprNode):
code.put_decref(target_list, py_object_type)
code.putln('%s = %s; %s = NULL;' % (target_list, sublist_temp, sublist_temp))
code.putln('#else')
- code.putln('(void)%s;' % sublist_temp) # avoid warning about unused variable
+ code.putln('(void)%s;' % sublist_temp) # avoid warning about unused variable
code.funcstate.release_temp(sublist_temp)
code.putln('#endif')
@@ -7908,82 +7908,82 @@ class TupleNode(SequenceNode):
gil_message = "Constructing Python tuple"
- def infer_type(self, env):
- if self.mult_factor or not self.args:
- return tuple_type
- arg_types = [arg.infer_type(env) for arg in self.args]
+ def infer_type(self, env):
+ if self.mult_factor or not self.args:
+ return tuple_type
+ arg_types = [arg.infer_type(env) for arg in self.args]
if any(type.is_pyobject or type.is_memoryviewslice or type.is_unspecified or type.is_fused
for type in arg_types):
- return tuple_type
+ return tuple_type
return env.declare_tuple_type(self.pos, arg_types).type
-
+
def analyse_types(self, env, skip_children=False):
if len(self.args) == 0:
- self.is_temp = False
- self.is_literal = True
- return self
-
- if not skip_children:
- for i, arg in enumerate(self.args):
- if arg.is_starred:
- arg.starred_expr_allowed_here = True
- self.args[i] = arg.analyse_types(env)
- if (not self.mult_factor and
+ self.is_temp = False
+ self.is_literal = True
+ return self
+
+ if not skip_children:
+ for i, arg in enumerate(self.args):
+ if arg.is_starred:
+ arg.starred_expr_allowed_here = True
+ self.args[i] = arg.analyse_types(env)
+ if (not self.mult_factor and
not any((arg.is_starred or arg.type.is_pyobject or arg.type.is_memoryviewslice or arg.type.is_fused)
for arg in self.args)):
- self.type = env.declare_tuple_type(self.pos, (arg.type for arg in self.args)).type
- self.is_temp = 1
- return self
-
- node = SequenceNode.analyse_types(self, env, skip_children=True)
- node = node._create_merge_node_if_necessary(env)
- if not node.is_sequence_constructor:
- return node
-
- if not all(child.is_literal for child in node.args):
- return node
- if not node.mult_factor or (
- node.mult_factor.is_literal and
- isinstance(node.mult_factor.constant_result, _py_int_types)):
+ self.type = env.declare_tuple_type(self.pos, (arg.type for arg in self.args)).type
+ self.is_temp = 1
+ return self
+
+ node = SequenceNode.analyse_types(self, env, skip_children=True)
+ node = node._create_merge_node_if_necessary(env)
+ if not node.is_sequence_constructor:
+ return node
+
+ if not all(child.is_literal for child in node.args):
+ return node
+ if not node.mult_factor or (
+ node.mult_factor.is_literal and
+ isinstance(node.mult_factor.constant_result, _py_int_types)):
node.is_temp = False
node.is_literal = True
else:
- if not node.mult_factor.type.is_pyobject:
- node.mult_factor = node.mult_factor.coerce_to_pyobject(env)
- node.is_temp = True
- node.is_partly_literal = True
+ if not node.mult_factor.type.is_pyobject:
+ node.mult_factor = node.mult_factor.coerce_to_pyobject(env)
+ node.is_temp = True
+ node.is_partly_literal = True
return node
- def analyse_as_type(self, env):
- # ctuple type
- if not self.args:
- return None
- item_types = [arg.analyse_as_type(env) for arg in self.args]
- if any(t is None for t in item_types):
- return None
- entry = env.declare_tuple_type(self.pos, item_types)
- return entry.type
-
- def coerce_to(self, dst_type, env):
- if self.type.is_ctuple:
- if dst_type.is_ctuple and self.type.size == dst_type.size:
- return self.coerce_to_ctuple(dst_type, env)
- elif dst_type is tuple_type or dst_type is py_object_type:
- coerced_args = [arg.coerce_to_pyobject(env) for arg in self.args]
- return TupleNode(self.pos, args=coerced_args, type=tuple_type, is_temp=1).analyse_types(env, skip_children=True)
- else:
- return self.coerce_to_pyobject(env).coerce_to(dst_type, env)
- elif dst_type.is_ctuple and not self.mult_factor:
- return self.coerce_to_ctuple(dst_type, env)
- else:
- return SequenceNode.coerce_to(self, dst_type, env)
-
- def as_list(self):
- t = ListNode(self.pos, args=self.args, mult_factor=self.mult_factor)
- if isinstance(self.constant_result, tuple):
- t.constant_result = list(self.constant_result)
- return t
-
+ def analyse_as_type(self, env):
+ # ctuple type
+ if not self.args:
+ return None
+ item_types = [arg.analyse_as_type(env) for arg in self.args]
+ if any(t is None for t in item_types):
+ return None
+ entry = env.declare_tuple_type(self.pos, item_types)
+ return entry.type
+
+ def coerce_to(self, dst_type, env):
+ if self.type.is_ctuple:
+ if dst_type.is_ctuple and self.type.size == dst_type.size:
+ return self.coerce_to_ctuple(dst_type, env)
+ elif dst_type is tuple_type or dst_type is py_object_type:
+ coerced_args = [arg.coerce_to_pyobject(env) for arg in self.args]
+ return TupleNode(self.pos, args=coerced_args, type=tuple_type, is_temp=1).analyse_types(env, skip_children=True)
+ else:
+ return self.coerce_to_pyobject(env).coerce_to(dst_type, env)
+ elif dst_type.is_ctuple and not self.mult_factor:
+ return self.coerce_to_ctuple(dst_type, env)
+ else:
+ return SequenceNode.coerce_to(self, dst_type, env)
+
+ def as_list(self):
+ t = ListNode(self.pos, args=self.args, mult_factor=self.mult_factor)
+ if isinstance(self.constant_result, tuple):
+ t.constant_result = list(self.constant_result)
+ return t
+
def is_simple(self):
# either temp or constant => always simple
return True
@@ -8006,7 +8006,7 @@ class TupleNode(SequenceNode):
values = self.compile_time_value_list(denv)
try:
return tuple(values)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def generate_operation_code(self, code):
@@ -8015,16 +8015,16 @@ class TupleNode(SequenceNode):
return
if self.is_literal or self.is_partly_literal:
- # The "mult_factor" is part of the deduplication if it is also constant, i.e. when
- # we deduplicate the multiplied result. Otherwise, only deduplicate the constant part.
- dedup_key = make_dedup_key(self.type, [self.mult_factor if self.is_literal else None] + self.args)
- tuple_target = code.get_py_const(py_object_type, 'tuple', cleanup_level=2, dedup_key=dedup_key)
- const_code = code.get_cached_constants_writer(tuple_target)
- if const_code is not None:
- # constant is not yet initialised
- const_code.mark_pos(self.pos)
- self.generate_sequence_packing_code(const_code, tuple_target, plain=not self.is_literal)
- const_code.put_giveref(tuple_target)
+ # The "mult_factor" is part of the deduplication if it is also constant, i.e. when
+ # we deduplicate the multiplied result. Otherwise, only deduplicate the constant part.
+ dedup_key = make_dedup_key(self.type, [self.mult_factor if self.is_literal else None] + self.args)
+ tuple_target = code.get_py_const(py_object_type, 'tuple', cleanup_level=2, dedup_key=dedup_key)
+ const_code = code.get_cached_constants_writer(tuple_target)
+ if const_code is not None:
+ # constant is not yet initialised
+ const_code.mark_pos(self.pos)
+ self.generate_sequence_packing_code(const_code, tuple_target, plain=not self.is_literal)
+ const_code.put_giveref(tuple_target)
if self.is_literal:
self.result_code = tuple_target
else:
@@ -8034,7 +8034,7 @@ class TupleNode(SequenceNode):
))
code.put_gotref(self.py_result())
else:
- self.type.entry.used = True
+ self.type.entry.used = True
self.generate_sequence_packing_code(code)
@@ -8054,13 +8054,13 @@ class ListNode(SequenceNode):
return ()
def infer_type(self, env):
- # TODO: Infer non-object list arrays.
+ # TODO: Infer non-object list arrays.
return list_type
def analyse_expressions(self, env):
- for arg in self.args:
- if arg.is_starred:
- arg.starred_expr_allowed_here = True
+ for arg in self.args:
+ if arg.is_starred:
+ arg.starred_expr_allowed_here = True
node = SequenceNode.analyse_expressions(self, env)
return node.coerce_to_pyobject(env)
@@ -8071,7 +8071,7 @@ class ListNode(SequenceNode):
node.obj_conversion_errors = errors
if env.is_module_scope:
self.in_module_scope = True
- node = node._create_merge_node_if_necessary(env)
+ node = node._create_merge_node_if_necessary(env)
return node
def coerce_to(self, dst_type, env):
@@ -8081,31 +8081,31 @@ class ListNode(SequenceNode):
self.obj_conversion_errors = []
if not self.type.subtype_of(dst_type):
error(self.pos, "Cannot coerce list to type '%s'" % dst_type)
- elif (dst_type.is_array or dst_type.is_ptr) and dst_type.base_type is not PyrexTypes.c_void_type:
- array_length = len(self.args)
- if self.mult_factor:
- if isinstance(self.mult_factor.constant_result, _py_int_types):
- if self.mult_factor.constant_result <= 0:
- error(self.pos, "Cannot coerce non-positively multiplied list to '%s'" % dst_type)
- else:
- array_length *= self.mult_factor.constant_result
- else:
- error(self.pos, "Cannot coerce dynamically multiplied list to '%s'" % dst_type)
+ elif (dst_type.is_array or dst_type.is_ptr) and dst_type.base_type is not PyrexTypes.c_void_type:
+ array_length = len(self.args)
+ if self.mult_factor:
+ if isinstance(self.mult_factor.constant_result, _py_int_types):
+ if self.mult_factor.constant_result <= 0:
+ error(self.pos, "Cannot coerce non-positively multiplied list to '%s'" % dst_type)
+ else:
+ array_length *= self.mult_factor.constant_result
+ else:
+ error(self.pos, "Cannot coerce dynamically multiplied list to '%s'" % dst_type)
base_type = dst_type.base_type
- self.type = PyrexTypes.CArrayType(base_type, array_length)
+ self.type = PyrexTypes.CArrayType(base_type, array_length)
for i in range(len(self.original_args)):
arg = self.args[i]
if isinstance(arg, CoerceToPyTypeNode):
arg = arg.arg
self.args[i] = arg.coerce_to(base_type, env)
- elif dst_type.is_cpp_class:
- # TODO(robertwb): Avoid object conversion for vector/list/set.
- return TypecastNode(self.pos, operand=self, type=PyrexTypes.py_object_type).coerce_to(dst_type, env)
- elif self.mult_factor:
- error(self.pos, "Cannot coerce multiplied list to '%s'" % dst_type)
+ elif dst_type.is_cpp_class:
+ # TODO(robertwb): Avoid object conversion for vector/list/set.
+ return TypecastNode(self.pos, operand=self, type=PyrexTypes.py_object_type).coerce_to(dst_type, env)
+ elif self.mult_factor:
+ error(self.pos, "Cannot coerce multiplied list to '%s'" % dst_type)
elif dst_type.is_struct:
if len(self.args) > len(dst_type.scope.var_entries):
- error(self.pos, "Too many members for '%s'" % dst_type)
+ error(self.pos, "Too many members for '%s'" % dst_type)
else:
if len(self.args) < len(dst_type.scope.var_entries):
warning(self.pos, "Too few members for '%s'" % dst_type, 1)
@@ -8114,16 +8114,16 @@ class ListNode(SequenceNode):
arg = arg.arg
self.args[i] = arg.coerce_to(member.type, env)
self.type = dst_type
- elif dst_type.is_ctuple:
- return self.coerce_to_ctuple(dst_type, env)
+ elif dst_type.is_ctuple:
+ return self.coerce_to_ctuple(dst_type, env)
else:
self.type = error_type
error(self.pos, "Cannot coerce list to type '%s'" % dst_type)
return self
- def as_list(self): # dummy for compatibility with TupleNode
- return self
-
+ def as_list(self): # dummy for compatibility with TupleNode
+ return self
+
def as_tuple(self):
t = TupleNode(self.pos, args=self.args, mult_factor=self.mult_factor)
if isinstance(self.constant_result, list):
@@ -8146,7 +8146,7 @@ class ListNode(SequenceNode):
def calculate_constant_result(self):
if self.mult_factor:
- raise ValueError() # may exceed the compile time memory
+ raise ValueError() # may exceed the compile time memory
self.constant_result = [
arg.constant_result for arg in self.args]
@@ -8162,36 +8162,36 @@ class ListNode(SequenceNode):
report_error(err)
self.generate_sequence_packing_code(code)
elif self.type.is_array:
- if self.mult_factor:
- code.putln("{")
- code.putln("Py_ssize_t %s;" % Naming.quick_temp_cname)
- code.putln("for ({i} = 0; {i} < {count}; {i}++) {{".format(
- i=Naming.quick_temp_cname, count=self.mult_factor.result()))
- offset = '+ (%d * %s)' % (len(self.args), Naming.quick_temp_cname)
- else:
- offset = ''
+ if self.mult_factor:
+ code.putln("{")
+ code.putln("Py_ssize_t %s;" % Naming.quick_temp_cname)
+ code.putln("for ({i} = 0; {i} < {count}; {i}++) {{".format(
+ i=Naming.quick_temp_cname, count=self.mult_factor.result()))
+ offset = '+ (%d * %s)' % (len(self.args), Naming.quick_temp_cname)
+ else:
+ offset = ''
for i, arg in enumerate(self.args):
- if arg.type.is_array:
- code.globalstate.use_utility_code(UtilityCode.load_cached("IncludeStringH", "StringTools.c"))
- code.putln("memcpy(&(%s[%s%s]), %s, sizeof(%s[0]));" % (
- self.result(), i, offset,
- arg.result(), self.result()
- ))
- else:
- code.putln("%s[%s%s] = %s;" % (
- self.result(),
- i,
- offset,
- arg.result()))
- if self.mult_factor:
- code.putln("}")
- code.putln("}")
+ if arg.type.is_array:
+ code.globalstate.use_utility_code(UtilityCode.load_cached("IncludeStringH", "StringTools.c"))
+ code.putln("memcpy(&(%s[%s%s]), %s, sizeof(%s[0]));" % (
+ self.result(), i, offset,
+ arg.result(), self.result()
+ ))
+ else:
+ code.putln("%s[%s%s] = %s;" % (
+ self.result(),
+ i,
+ offset,
+ arg.result()))
+ if self.mult_factor:
+ code.putln("}")
+ code.putln("}")
elif self.type.is_struct:
for arg, member in zip(self.args, self.type.scope.var_entries):
code.putln("%s.%s = %s;" % (
- self.result(),
- member.cname,
- arg.result()))
+ self.result(),
+ member.cname,
+ arg.result()))
else:
raise InternalError("List type never specified")
@@ -8416,228 +8416,228 @@ class DictComprehensionAppendNode(ComprehensionAppendNode):
self.value_expr.annotate(code)
-class InlinedGeneratorExpressionNode(ExprNode):
- # An inlined generator expression for which the result is calculated
- # inside of the loop and returned as a single, first and only Generator
- # return value.
- # This will only be created by transforms when replacing safe builtin
- # calls on generator expressions.
+class InlinedGeneratorExpressionNode(ExprNode):
+ # An inlined generator expression for which the result is calculated
+ # inside of the loop and returned as a single, first and only Generator
+ # return value.
+ # This will only be created by transforms when replacing safe builtin
+ # calls on generator expressions.
#
- # gen GeneratorExpressionNode the generator, not containing any YieldExprNodes
- # orig_func String the name of the builtin function this node replaces
- # target ExprNode or None a 'target' for a ComprehensionAppend node
-
- subexprs = ["gen"]
- orig_func = None
- target = None
- is_temp = True
+ # gen GeneratorExpressionNode the generator, not containing any YieldExprNodes
+ # orig_func String the name of the builtin function this node replaces
+ # target ExprNode or None a 'target' for a ComprehensionAppend node
+
+ subexprs = ["gen"]
+ orig_func = None
+ target = None
+ is_temp = True
type = py_object_type
- def __init__(self, pos, gen, comprehension_type=None, **kwargs):
- gbody = gen.def_node.gbody
- gbody.is_inlined = True
- if comprehension_type is not None:
- assert comprehension_type in (list_type, set_type, dict_type), comprehension_type
- gbody.inlined_comprehension_type = comprehension_type
- kwargs.update(
- target=RawCNameExprNode(pos, comprehension_type, Naming.retval_cname),
- type=comprehension_type,
- )
- super(InlinedGeneratorExpressionNode, self).__init__(pos, gen=gen, **kwargs)
+ def __init__(self, pos, gen, comprehension_type=None, **kwargs):
+ gbody = gen.def_node.gbody
+ gbody.is_inlined = True
+ if comprehension_type is not None:
+ assert comprehension_type in (list_type, set_type, dict_type), comprehension_type
+ gbody.inlined_comprehension_type = comprehension_type
+ kwargs.update(
+ target=RawCNameExprNode(pos, comprehension_type, Naming.retval_cname),
+ type=comprehension_type,
+ )
+ super(InlinedGeneratorExpressionNode, self).__init__(pos, gen=gen, **kwargs)
def may_be_none(self):
- return self.orig_func not in ('any', 'all', 'sorted')
+ return self.orig_func not in ('any', 'all', 'sorted')
def infer_type(self, env):
- return self.type
+ return self.type
def analyse_types(self, env):
- self.gen = self.gen.analyse_expressions(env)
+ self.gen = self.gen.analyse_expressions(env)
return self
- def generate_result_code(self, code):
- code.putln("%s = __Pyx_Generator_Next(%s); %s" % (
- self.result(), self.gen.result(),
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_gotref(self.result())
-
-
-class MergedSequenceNode(ExprNode):
- """
- Merge a sequence of iterables into a set/list/tuple.
-
- The target collection is determined by self.type, which must be set externally.
-
- args [ExprNode]
- """
- subexprs = ['args']
- is_temp = True
- gil_message = "Constructing Python collection"
-
- def __init__(self, pos, args, type):
- if type in (list_type, tuple_type) and args and args[0].is_sequence_constructor:
- # construct a list directly from the first argument that we can then extend
- if args[0].type is not list_type:
- args[0] = ListNode(args[0].pos, args=args[0].args, is_temp=True)
- ExprNode.__init__(self, pos, args=args, type=type)
-
- def calculate_constant_result(self):
- result = []
- for item in self.args:
- if item.is_sequence_constructor and item.mult_factor:
- if item.mult_factor.constant_result <= 0:
- continue
- # otherwise, adding each item once should be enough
- if item.is_set_literal or item.is_sequence_constructor:
- # process items in order
- items = (arg.constant_result for arg in item.args)
- else:
- items = item.constant_result
- result.extend(items)
- if self.type is set_type:
- result = set(result)
- elif self.type is tuple_type:
- result = tuple(result)
- else:
- assert self.type is list_type
- self.constant_result = result
-
- def compile_time_value(self, denv):
- result = []
- for item in self.args:
- if item.is_sequence_constructor and item.mult_factor:
- if item.mult_factor.compile_time_value(denv) <= 0:
- continue
- if item.is_set_literal or item.is_sequence_constructor:
- # process items in order
- items = (arg.compile_time_value(denv) for arg in item.args)
- else:
- items = item.compile_time_value(denv)
- result.extend(items)
- if self.type is set_type:
- try:
- result = set(result)
- except Exception as e:
- self.compile_time_value_error(e)
- elif self.type is tuple_type:
- result = tuple(result)
- else:
- assert self.type is list_type
- return result
-
- def type_dependencies(self, env):
- return ()
-
- def infer_type(self, env):
- return self.type
-
- def analyse_types(self, env):
- args = [
- arg.analyse_types(env).coerce_to_pyobject(env).as_none_safe_node(
- # FIXME: CPython's error message starts with the runtime function name
- 'argument after * must be an iterable, not NoneType')
- for arg in self.args
- ]
-
- if len(args) == 1 and args[0].type is self.type:
- # strip this intermediate node and use the bare collection
- return args[0]
-
- assert self.type in (set_type, list_type, tuple_type)
-
- self.args = args
+ def generate_result_code(self, code):
+ code.putln("%s = __Pyx_Generator_Next(%s); %s" % (
+ self.result(), self.gen.result(),
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_gotref(self.result())
+
+
+class MergedSequenceNode(ExprNode):
+ """
+ Merge a sequence of iterables into a set/list/tuple.
+
+ The target collection is determined by self.type, which must be set externally.
+
+ args [ExprNode]
+ """
+ subexprs = ['args']
+ is_temp = True
+ gil_message = "Constructing Python collection"
+
+ def __init__(self, pos, args, type):
+ if type in (list_type, tuple_type) and args and args[0].is_sequence_constructor:
+ # construct a list directly from the first argument that we can then extend
+ if args[0].type is not list_type:
+ args[0] = ListNode(args[0].pos, args=args[0].args, is_temp=True)
+ ExprNode.__init__(self, pos, args=args, type=type)
+
+ def calculate_constant_result(self):
+ result = []
+ for item in self.args:
+ if item.is_sequence_constructor and item.mult_factor:
+ if item.mult_factor.constant_result <= 0:
+ continue
+ # otherwise, adding each item once should be enough
+ if item.is_set_literal or item.is_sequence_constructor:
+ # process items in order
+ items = (arg.constant_result for arg in item.args)
+ else:
+ items = item.constant_result
+ result.extend(items)
+ if self.type is set_type:
+ result = set(result)
+ elif self.type is tuple_type:
+ result = tuple(result)
+ else:
+ assert self.type is list_type
+ self.constant_result = result
+
+ def compile_time_value(self, denv):
+ result = []
+ for item in self.args:
+ if item.is_sequence_constructor and item.mult_factor:
+ if item.mult_factor.compile_time_value(denv) <= 0:
+ continue
+ if item.is_set_literal or item.is_sequence_constructor:
+ # process items in order
+ items = (arg.compile_time_value(denv) for arg in item.args)
+ else:
+ items = item.compile_time_value(denv)
+ result.extend(items)
+ if self.type is set_type:
+ try:
+ result = set(result)
+ except Exception as e:
+ self.compile_time_value_error(e)
+ elif self.type is tuple_type:
+ result = tuple(result)
+ else:
+ assert self.type is list_type
+ return result
+
+ def type_dependencies(self, env):
+ return ()
+
+ def infer_type(self, env):
+ return self.type
+
+ def analyse_types(self, env):
+ args = [
+ arg.analyse_types(env).coerce_to_pyobject(env).as_none_safe_node(
+ # FIXME: CPython's error message starts with the runtime function name
+ 'argument after * must be an iterable, not NoneType')
+ for arg in self.args
+ ]
+
+ if len(args) == 1 and args[0].type is self.type:
+ # strip this intermediate node and use the bare collection
+ return args[0]
+
+ assert self.type in (set_type, list_type, tuple_type)
+
+ self.args = args
return self
- def may_be_none(self):
- return False
-
- def generate_evaluation_code(self, code):
- code.mark_pos(self.pos)
- self.allocate_temp_result(code)
-
- is_set = self.type is set_type
-
- args = iter(self.args)
- item = next(args)
- item.generate_evaluation_code(code)
- if (is_set and item.is_set_literal or
- not is_set and item.is_sequence_constructor and item.type is list_type):
- code.putln("%s = %s;" % (self.result(), item.py_result()))
- item.generate_post_assignment_code(code)
- else:
- code.putln("%s = %s(%s); %s" % (
- self.result(),
- 'PySet_New' if is_set else 'PySequence_List',
- item.py_result(),
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_gotref(self.py_result())
- item.generate_disposal_code(code)
- item.free_temps(code)
-
- helpers = set()
- if is_set:
- add_func = "PySet_Add"
- extend_func = "__Pyx_PySet_Update"
- else:
- add_func = "__Pyx_ListComp_Append"
- extend_func = "__Pyx_PyList_Extend"
-
- for item in args:
- if (is_set and (item.is_set_literal or item.is_sequence_constructor) or
- (item.is_sequence_constructor and not item.mult_factor)):
- if not is_set and item.args:
- helpers.add(("ListCompAppend", "Optimize.c"))
- for arg in item.args:
- arg.generate_evaluation_code(code)
- code.put_error_if_neg(arg.pos, "%s(%s, %s)" % (
- add_func,
- self.result(),
- arg.py_result()))
- arg.generate_disposal_code(code)
- arg.free_temps(code)
- continue
-
- if is_set:
- helpers.add(("PySet_Update", "Builtins.c"))
- else:
- helpers.add(("ListExtend", "Optimize.c"))
-
- item.generate_evaluation_code(code)
- code.put_error_if_neg(item.pos, "%s(%s, %s)" % (
- extend_func,
- self.result(),
- item.py_result()))
- item.generate_disposal_code(code)
- item.free_temps(code)
-
- if self.type is tuple_type:
- code.putln("{")
- code.putln("PyObject *%s = PyList_AsTuple(%s);" % (
- Naming.quick_temp_cname,
- self.result()))
- code.put_decref(self.result(), py_object_type)
- code.putln("%s = %s; %s" % (
- self.result(),
- Naming.quick_temp_cname,
- code.error_goto_if_null(self.result(), self.pos)))
- code.put_gotref(self.result())
- code.putln("}")
-
- for helper in sorted(helpers):
- code.globalstate.use_utility_code(UtilityCode.load_cached(*helper))
-
- def annotate(self, code):
- for item in self.args:
- item.annotate(code)
-
-
-class SetNode(ExprNode):
- """
- Set constructor.
- """
+ def may_be_none(self):
+ return False
+
+ def generate_evaluation_code(self, code):
+ code.mark_pos(self.pos)
+ self.allocate_temp_result(code)
+
+ is_set = self.type is set_type
+
+ args = iter(self.args)
+ item = next(args)
+ item.generate_evaluation_code(code)
+ if (is_set and item.is_set_literal or
+ not is_set and item.is_sequence_constructor and item.type is list_type):
+ code.putln("%s = %s;" % (self.result(), item.py_result()))
+ item.generate_post_assignment_code(code)
+ else:
+ code.putln("%s = %s(%s); %s" % (
+ self.result(),
+ 'PySet_New' if is_set else 'PySequence_List',
+ item.py_result(),
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_gotref(self.py_result())
+ item.generate_disposal_code(code)
+ item.free_temps(code)
+
+ helpers = set()
+ if is_set:
+ add_func = "PySet_Add"
+ extend_func = "__Pyx_PySet_Update"
+ else:
+ add_func = "__Pyx_ListComp_Append"
+ extend_func = "__Pyx_PyList_Extend"
+
+ for item in args:
+ if (is_set and (item.is_set_literal or item.is_sequence_constructor) or
+ (item.is_sequence_constructor and not item.mult_factor)):
+ if not is_set and item.args:
+ helpers.add(("ListCompAppend", "Optimize.c"))
+ for arg in item.args:
+ arg.generate_evaluation_code(code)
+ code.put_error_if_neg(arg.pos, "%s(%s, %s)" % (
+ add_func,
+ self.result(),
+ arg.py_result()))
+ arg.generate_disposal_code(code)
+ arg.free_temps(code)
+ continue
+
+ if is_set:
+ helpers.add(("PySet_Update", "Builtins.c"))
+ else:
+ helpers.add(("ListExtend", "Optimize.c"))
+
+ item.generate_evaluation_code(code)
+ code.put_error_if_neg(item.pos, "%s(%s, %s)" % (
+ extend_func,
+ self.result(),
+ item.py_result()))
+ item.generate_disposal_code(code)
+ item.free_temps(code)
+
+ if self.type is tuple_type:
+ code.putln("{")
+ code.putln("PyObject *%s = PyList_AsTuple(%s);" % (
+ Naming.quick_temp_cname,
+ self.result()))
+ code.put_decref(self.result(), py_object_type)
+ code.putln("%s = %s; %s" % (
+ self.result(),
+ Naming.quick_temp_cname,
+ code.error_goto_if_null(self.result(), self.pos)))
+ code.put_gotref(self.result())
+ code.putln("}")
+
+ for helper in sorted(helpers):
+ code.globalstate.use_utility_code(UtilityCode.load_cached(*helper))
+
+ def annotate(self, code):
+ for item in self.args:
+ item.annotate(code)
+
+
+class SetNode(ExprNode):
+ """
+ Set constructor.
+ """
subexprs = ['args']
- type = set_type
- is_set_literal = True
+ type = set_type
+ is_set_literal = True
gil_message = "Constructing Python set"
def analyse_types(self, env):
@@ -8659,7 +8659,7 @@ class SetNode(ExprNode):
values = [arg.compile_time_value(denv) for arg in self.args]
try:
return set(values)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def generate_evaluation_code(self, code):
@@ -8692,7 +8692,7 @@ class DictNode(ExprNode):
exclude_null_values = False
type = dict_type
is_dict_literal = True
- reject_duplicates = False
+ reject_duplicates = False
obj_conversion_errors = []
@@ -8710,14 +8710,14 @@ class DictNode(ExprNode):
for item in self.key_value_pairs]
try:
return dict(pairs)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def type_dependencies(self, env):
return ()
def infer_type(self, env):
- # TODO: Infer struct constructors.
+ # TODO: Infer struct constructors.
return dict_type
def analyse_types(self, env):
@@ -8735,13 +8735,13 @@ class DictNode(ExprNode):
def coerce_to(self, dst_type, env):
if dst_type.is_pyobject:
self.release_errors()
- if self.type.is_struct_or_union:
- if not dict_type.subtype_of(dst_type):
- error(self.pos, "Cannot interpret struct as non-dict type '%s'" % dst_type)
- return DictNode(self.pos, key_value_pairs=[
- DictItemNode(item.pos, key=item.key.coerce_to_pyobject(env),
- value=item.value.coerce_to_pyobject(env))
- for item in self.key_value_pairs])
+ if self.type.is_struct_or_union:
+ if not dict_type.subtype_of(dst_type):
+ error(self.pos, "Cannot interpret struct as non-dict type '%s'" % dst_type)
+ return DictNode(self.pos, key_value_pairs=[
+ DictItemNode(item.pos, key=item.key.coerce_to_pyobject(env),
+ value=item.value.coerce_to_pyobject(env))
+ for item in self.key_value_pairs])
if not self.type.subtype_of(dst_type):
error(self.pos, "Cannot interpret dict as type '%s'" % dst_type)
elif dst_type.is_struct_or_union:
@@ -8783,9 +8783,9 @@ class DictNode(ExprNode):
# pairs are evaluated and used one at a time.
code.mark_pos(self.pos)
self.allocate_temp_result(code)
-
- is_dict = self.type.is_pyobject
- if is_dict:
+
+ is_dict = self.type.is_pyobject
+ if is_dict:
self.release_errors()
code.putln(
"%s = __Pyx_PyDict_NewPresized(%d); %s" % (
@@ -8793,51 +8793,51 @@ class DictNode(ExprNode):
len(self.key_value_pairs),
code.error_goto_if_null(self.result(), self.pos)))
code.put_gotref(self.py_result())
-
- keys_seen = set()
- key_type = None
- needs_error_helper = False
-
+
+ keys_seen = set()
+ key_type = None
+ needs_error_helper = False
+
for item in self.key_value_pairs:
item.generate_evaluation_code(code)
- if is_dict:
+ if is_dict:
if self.exclude_null_values:
code.putln('if (%s) {' % item.value.py_result())
- key = item.key
- if self.reject_duplicates:
- if keys_seen is not None:
- # avoid runtime 'in' checks for literals that we can do at compile time
- if not key.is_string_literal:
- keys_seen = None
- elif key.value in keys_seen:
- # FIXME: this could be a compile time error, at least in Cython code
- keys_seen = None
- elif key_type is not type(key.value):
- if key_type is None:
- key_type = type(key.value)
- keys_seen.add(key.value)
- else:
- # different types => may not be able to compare at compile time
- keys_seen = None
- else:
- keys_seen.add(key.value)
-
- if keys_seen is None:
- code.putln('if (unlikely(PyDict_Contains(%s, %s))) {' % (
- self.result(), key.py_result()))
- # currently only used in function calls
- needs_error_helper = True
- code.putln('__Pyx_RaiseDoubleKeywordsError("function", %s); %s' % (
- key.py_result(),
- code.error_goto(item.pos)))
- code.putln("} else {")
-
- code.put_error_if_neg(self.pos, "PyDict_SetItem(%s, %s, %s)" % (
- self.result(),
- item.key.py_result(),
- item.value.py_result()))
- if self.reject_duplicates and keys_seen is None:
- code.putln('}')
+ key = item.key
+ if self.reject_duplicates:
+ if keys_seen is not None:
+ # avoid runtime 'in' checks for literals that we can do at compile time
+ if not key.is_string_literal:
+ keys_seen = None
+ elif key.value in keys_seen:
+ # FIXME: this could be a compile time error, at least in Cython code
+ keys_seen = None
+ elif key_type is not type(key.value):
+ if key_type is None:
+ key_type = type(key.value)
+ keys_seen.add(key.value)
+ else:
+ # different types => may not be able to compare at compile time
+ keys_seen = None
+ else:
+ keys_seen.add(key.value)
+
+ if keys_seen is None:
+ code.putln('if (unlikely(PyDict_Contains(%s, %s))) {' % (
+ self.result(), key.py_result()))
+ # currently only used in function calls
+ needs_error_helper = True
+ code.putln('__Pyx_RaiseDoubleKeywordsError("function", %s); %s' % (
+ key.py_result(),
+ code.error_goto(item.pos)))
+ code.putln("} else {")
+
+ code.put_error_if_neg(self.pos, "PyDict_SetItem(%s, %s, %s)" % (
+ self.result(),
+ item.key.py_result(),
+ item.value.py_result()))
+ if self.reject_duplicates and keys_seen is None:
+ code.putln('}')
if self.exclude_null_values:
code.putln('}')
else:
@@ -8848,15 +8848,15 @@ class DictNode(ExprNode):
item.generate_disposal_code(code)
item.free_temps(code)
- if needs_error_helper:
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("RaiseDoubleKeywords", "FunctionArguments.c"))
-
+ if needs_error_helper:
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("RaiseDoubleKeywords", "FunctionArguments.c"))
+
def annotate(self, code):
for item in self.key_value_pairs:
item.annotate(code)
-
+
class DictItemNode(ExprNode):
# Represents a single item in a DictNode
#
@@ -9239,16 +9239,16 @@ class PyCFunctionNode(ExprNode, ModuleNameMixin):
default_args = []
default_kwargs = []
annotations = []
-
- # For global cpdef functions and def/cpdef methods in cdef classes, we must use global constants
- # for default arguments to avoid the dependency on the CyFunction object as 'self' argument
- # in the underlying C function. Basically, cpdef functions/methods are static C functions,
- # so their optional arguments must be static, too.
- # TODO: change CyFunction implementation to pass both function object and owning object for method calls
- must_use_constants = env.is_c_class_scope or (self.def_node.is_wrapper and env.is_module_scope)
-
+
+ # For global cpdef functions and def/cpdef methods in cdef classes, we must use global constants
+ # for default arguments to avoid the dependency on the CyFunction object as 'self' argument
+ # in the underlying C function. Basically, cpdef functions/methods are static C functions,
+ # so their optional arguments must be static, too.
+ # TODO: change CyFunction implementation to pass both function object and owning object for method calls
+ must_use_constants = env.is_c_class_scope or (self.def_node.is_wrapper and env.is_module_scope)
+
for arg in self.def_node.args:
- if arg.default and not must_use_constants:
+ if arg.default and not must_use_constants:
if not arg.default.is_literal:
arg.is_dynamic = True
if arg.type.is_pyobject:
@@ -9264,12 +9264,12 @@ class PyCFunctionNode(ExprNode, ModuleNameMixin):
if arg.annotation:
arg.annotation = self.analyse_annotation(env, arg.annotation)
annotations.append((arg.pos, arg.name, arg.annotation))
-
- for arg in (self.def_node.star_arg, self.def_node.starstar_arg):
- if arg and arg.annotation:
+
+ for arg in (self.def_node.star_arg, self.def_node.starstar_arg):
+ if arg and arg.annotation:
arg.annotation = self.analyse_annotation(env, arg.annotation)
- annotations.append((arg.pos, arg.name, arg.annotation))
-
+ annotations.append((arg.pos, arg.name, arg.annotation))
+
annotation = self.def_node.return_type_annotation
if annotation:
annotation = self.analyse_annotation(env, annotation)
@@ -9305,7 +9305,7 @@ class PyCFunctionNode(ExprNode, ModuleNameMixin):
if default_args:
defaults_tuple = TupleNode(self.pos, args=[
arg.default for arg in default_args])
- self.defaults_tuple = defaults_tuple.analyse_types(env).coerce_to_pyobject(env)
+ self.defaults_tuple = defaults_tuple.analyse_types(env).coerce_to_pyobject(env)
if default_kwargs:
defaults_kwdict = DictNode(self.pos, key_value_pairs=[
DictItemNode(
@@ -9334,10 +9334,10 @@ class PyCFunctionNode(ExprNode, ModuleNameMixin):
self.pos, args=[defaults_tuple, defaults_kwdict])),
decorators=None,
name=StringEncoding.EncodedString("__defaults__"))
- # defaults getter must never live in class scopes, it's always a module function
- module_scope = env.global_scope()
- defaults_getter.analyse_declarations(module_scope)
- defaults_getter = defaults_getter.analyse_expressions(module_scope)
+ # defaults getter must never live in class scopes, it's always a module function
+ module_scope = env.global_scope()
+ defaults_getter.analyse_declarations(module_scope)
+ defaults_getter = defaults_getter.analyse_expressions(module_scope)
defaults_getter.body = defaults_getter.body.analyse_expressions(
defaults_getter.local_scope)
defaults_getter.py_wrapper_required = False
@@ -9421,7 +9421,7 @@ class PyCFunctionNode(ExprNode, ModuleNameMixin):
elif def_node.is_classmethod:
flags.append('__Pyx_CYFUNCTION_CLASSMETHOD')
- if def_node.local_scope.parent_scope.is_c_class_scope and not def_node.entry.is_anonymous:
+ if def_node.local_scope.parent_scope.is_c_class_scope and not def_node.entry.is_anonymous:
flags.append('__Pyx_CYFUNCTION_CCLASS')
if flags:
@@ -9471,8 +9471,8 @@ class PyCFunctionNode(ExprNode, ModuleNameMixin):
if self.defaults_kwdict:
code.putln('__Pyx_CyFunction_SetDefaultsKwDict(%s, %s);' % (
self.result(), self.defaults_kwdict.py_result()))
- if def_node.defaults_getter and not self.specialized_cpdefs:
- # Fused functions do not support dynamic defaults, only their specialisations can have them for now.
+ if def_node.defaults_getter and not self.specialized_cpdefs:
+ # Fused functions do not support dynamic defaults, only their specialisations can have them for now.
code.putln('__Pyx_CyFunction_SetDefaultsGetter(%s, %s);' % (
self.result(), def_node.defaults_getter.entry.pyfunc_cname))
if self.annotations_dict:
@@ -9501,7 +9501,7 @@ class CodeObjectNode(ExprNode):
subexprs = ['varnames']
is_temp = False
- result_code = None
+ result_code = None
def __init__(self, def_node):
ExprNode.__init__(self, def_node.pos, def_node=def_node)
@@ -9518,24 +9518,24 @@ class CodeObjectNode(ExprNode):
def may_be_none(self):
return False
- def calculate_result_code(self, code=None):
- if self.result_code is None:
- self.result_code = code.get_py_const(py_object_type, 'codeobj', cleanup_level=2)
+ def calculate_result_code(self, code=None):
+ if self.result_code is None:
+ self.result_code = code.get_py_const(py_object_type, 'codeobj', cleanup_level=2)
return self.result_code
def generate_result_code(self, code):
- if self.result_code is None:
- self.result_code = code.get_py_const(py_object_type, 'codeobj', cleanup_level=2)
+ if self.result_code is None:
+ self.result_code = code.get_py_const(py_object_type, 'codeobj', cleanup_level=2)
- code = code.get_cached_constants_writer(self.result_code)
- if code is None:
- return # already initialised
+ code = code.get_cached_constants_writer(self.result_code)
+ if code is None:
+ return # already initialised
code.mark_pos(self.pos)
func = self.def_node
func_name = code.get_py_string_const(
func.name, identifier=True, is_str=False, unicode_value=func.name)
# FIXME: better way to get the module file path at module init time? Encoding to use?
- file_path = StringEncoding.bytes_literal(func.pos[0].get_filenametable_entry().encode('utf8'), 'utf8')
+ file_path = StringEncoding.bytes_literal(func.pos[0].get_filenametable_entry().encode('utf8'), 'utf8')
# XXX Use get_description() to set arcadia root relative filename
file_path = StringEncoding.bytes_literal(func.pos[0].get_description().encode('utf8'), 'utf8')
file_path_const = code.get_py_string_const(file_path, identifier=False, is_str=True)
@@ -9635,10 +9635,10 @@ class DefaultsTupleNode(TupleNode):
args.append(arg)
super(DefaultsTupleNode, self).__init__(pos, args=args)
- def analyse_types(self, env, skip_children=False):
- return super(DefaultsTupleNode, self).analyse_types(env, skip_children).coerce_to_pyobject(env)
-
+ def analyse_types(self, env, skip_children=False):
+ return super(DefaultsTupleNode, self).analyse_types(env, skip_children).coerce_to_pyobject(env)
+
class DefaultsKwDictNode(DictNode):
# CyFunction's __kwdefaults__ dict
@@ -9669,7 +9669,7 @@ class LambdaNode(InnerFunctionNode):
name = StringEncoding.EncodedString('<lambda>')
def analyse_declarations(self, env):
- self.lambda_name = self.def_node.lambda_name = env.next_id('lambda')
+ self.lambda_name = self.def_node.lambda_name = env.next_id('lambda')
self.def_node.no_assignment_synthesis = True
self.def_node.pymethdef_required = True
self.def_node.analyse_declarations(env)
@@ -9698,7 +9698,7 @@ class GeneratorExpressionNode(LambdaNode):
binding = False
def analyse_declarations(self, env):
- self.genexpr_name = env.next_id('genexpr')
+ self.genexpr_name = env.next_id('genexpr')
super(GeneratorExpressionNode, self).analyse_declarations(env)
# No pymethdef required
self.def_node.pymethdef_required = False
@@ -9728,13 +9728,13 @@ class YieldExprNode(ExprNode):
type = py_object_type
label_num = 0
is_yield_from = False
- is_await = False
+ is_await = False
in_async_gen = False
- expr_keyword = 'yield'
+ expr_keyword = 'yield'
def analyse_types(self, env):
if not self.label_num or (self.is_yield_from and self.in_async_gen):
- error(self.pos, "'%s' not supported here" % self.expr_keyword)
+ error(self.pos, "'%s' not supported here" % self.expr_keyword)
self.is_temp = 1
if self.arg is not None:
self.arg = self.arg.analyse_types(env)
@@ -9820,22 +9820,22 @@ class YieldExprNode(ExprNode):
class _YieldDelegationExprNode(YieldExprNode):
- def yield_from_func(self, code):
+ def yield_from_func(self, code):
raise NotImplementedError()
- def generate_evaluation_code(self, code, source_cname=None, decref_source=False):
- if source_cname is None:
- self.arg.generate_evaluation_code(code)
- code.putln("%s = %s(%s, %s);" % (
+ def generate_evaluation_code(self, code, source_cname=None, decref_source=False):
+ if source_cname is None:
+ self.arg.generate_evaluation_code(code)
+ code.putln("%s = %s(%s, %s);" % (
Naming.retval_cname,
- self.yield_from_func(code),
+ self.yield_from_func(code),
Naming.generator_cname,
- self.arg.py_result() if source_cname is None else source_cname))
- if source_cname is None:
- self.arg.generate_disposal_code(code)
- self.arg.free_temps(code)
- elif decref_source:
- code.put_decref_clear(source_cname, py_object_type)
+ self.arg.py_result() if source_cname is None else source_cname))
+ if source_cname is None:
+ self.arg.generate_disposal_code(code)
+ self.arg.free_temps(code)
+ elif decref_source:
+ code.put_decref_clear(source_cname, py_object_type)
code.put_xgotref(Naming.retval_cname)
code.putln("if (likely(%s)) {" % Naming.retval_cname)
@@ -9843,26 +9843,26 @@ class _YieldDelegationExprNode(YieldExprNode):
code.putln("} else {")
# either error or sub-generator has normally terminated: return value => node result
if self.result_is_used:
- self.fetch_iteration_result(code)
+ self.fetch_iteration_result(code)
else:
- self.handle_iteration_exception(code)
+ self.handle_iteration_exception(code)
code.putln("}")
- def fetch_iteration_result(self, code):
- # YieldExprNode has allocated the result temp for us
- code.putln("%s = NULL;" % self.result())
- code.put_error_if_neg(self.pos, "__Pyx_PyGen_FetchStopIterationValue(&%s)" % self.result())
- code.put_gotref(self.result())
-
- def handle_iteration_exception(self, code):
+ def fetch_iteration_result(self, code):
+ # YieldExprNode has allocated the result temp for us
+ code.putln("%s = NULL;" % self.result())
+ code.put_error_if_neg(self.pos, "__Pyx_PyGen_FetchStopIterationValue(&%s)" % self.result())
+ code.put_gotref(self.result())
+
+ def handle_iteration_exception(self, code):
code.putln("PyObject* exc_type = __Pyx_PyErr_Occurred();")
- code.putln("if (exc_type) {")
+ code.putln("if (exc_type) {")
code.putln("if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit &&"
" __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();")
- code.putln("else %s" % code.error_goto(self.pos))
- code.putln("}")
-
-
+ code.putln("else %s" % code.error_goto(self.pos))
+ code.putln("}")
+
+
class YieldFromExprNode(_YieldDelegationExprNode):
# "yield from GEN" expression
is_yield_from = True
@@ -9880,44 +9880,44 @@ class YieldFromExprNode(_YieldDelegationExprNode):
class AwaitExprNode(_YieldDelegationExprNode):
- # 'await' expression node
- #
- # arg ExprNode the Awaitable value to await
- # label_num integer yield label number
-
- is_await = True
- expr_keyword = 'await'
-
- def coerce_yield_argument(self, env):
- if self.arg is not None:
- # FIXME: use same check as in YieldFromExprNode.coerce_yield_argument() ?
- self.arg = self.arg.coerce_to_pyobject(env)
-
- def yield_from_func(self, code):
- code.globalstate.use_utility_code(UtilityCode.load_cached("CoroutineYieldFrom", "Coroutine.c"))
- return "__Pyx_Coroutine_Yield_From"
-
-
-class AwaitIterNextExprNode(AwaitExprNode):
- # 'await' expression node as part of 'async for' iteration
- #
- # Breaks out of loop on StopAsyncIteration exception.
-
+ # 'await' expression node
+ #
+ # arg ExprNode the Awaitable value to await
+ # label_num integer yield label number
+
+ is_await = True
+ expr_keyword = 'await'
+
+ def coerce_yield_argument(self, env):
+ if self.arg is not None:
+ # FIXME: use same check as in YieldFromExprNode.coerce_yield_argument() ?
+ self.arg = self.arg.coerce_to_pyobject(env)
+
+ def yield_from_func(self, code):
+ code.globalstate.use_utility_code(UtilityCode.load_cached("CoroutineYieldFrom", "Coroutine.c"))
+ return "__Pyx_Coroutine_Yield_From"
+
+
+class AwaitIterNextExprNode(AwaitExprNode):
+ # 'await' expression node as part of 'async for' iteration
+ #
+ # Breaks out of loop on StopAsyncIteration exception.
+
def _generate_break(self, code):
- code.globalstate.use_utility_code(UtilityCode.load_cached("StopAsyncIteration", "Coroutine.c"))
+ code.globalstate.use_utility_code(UtilityCode.load_cached("StopAsyncIteration", "Coroutine.c"))
code.putln("PyObject* exc_type = __Pyx_PyErr_Occurred();")
code.putln("if (unlikely(exc_type && (exc_type == __Pyx_PyExc_StopAsyncIteration || ("
" exc_type != PyExc_StopIteration && exc_type != PyExc_GeneratorExit &&"
" __Pyx_PyErr_GivenExceptionMatches(exc_type, __Pyx_PyExc_StopAsyncIteration))))) {")
- code.putln("PyErr_Clear();")
- code.putln("break;")
- code.putln("}")
+ code.putln("PyErr_Clear();")
+ code.putln("break;")
+ code.putln("}")
def fetch_iteration_result(self, code):
assert code.break_label, "AwaitIterNextExprNode outside of 'async for' loop"
self._generate_break(code)
- super(AwaitIterNextExprNode, self).fetch_iteration_result(code)
-
+ super(AwaitIterNextExprNode, self).fetch_iteration_result(code)
+
def generate_sent_value_handling_code(self, code, value_cname):
assert code.break_label, "AwaitIterNextExprNode outside of 'async for' loop"
code.putln("if (unlikely(!%s)) {" % value_cname)
@@ -9925,7 +9925,7 @@ class AwaitIterNextExprNode(AwaitExprNode):
# all non-break exceptions are errors, as in parent class
code.putln(code.error_goto(self.pos))
code.putln("}")
-
+
class GlobalsExprNode(AtomicExprNode):
type = dict_type
@@ -10046,7 +10046,7 @@ class UnopNode(ExprNode):
operand = self.operand.compile_time_value(denv)
try:
return func(operand)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def infer_type(self, env):
@@ -10088,7 +10088,7 @@ class UnopNode(ExprNode):
return self.operand.check_const()
def is_py_operation(self):
- return self.operand.type.is_pyobject or self.operand.type.is_ctuple
+ return self.operand.type.is_pyobject or self.operand.type.is_ctuple
def is_pythran_operation(self, env):
np_pythran = has_np_pythran(env)
@@ -10117,14 +10117,14 @@ class UnopNode(ExprNode):
self.operand.pythran_result()))
elif self.operand.type.is_pyobject:
self.generate_py_operation_code(code)
- elif self.is_temp:
- if self.is_cpp_operation() and self.exception_check == '+':
- translate_cpp_exception(code, self.pos,
- "%s = %s %s;" % (self.result(), self.operator, self.operand.result()),
- self.result() if self.type.is_pyobject else None,
- self.exception_value, self.in_nogil_context)
- else:
- code.putln("%s = %s %s;" % (self.result(), self.operator, self.operand.result()))
+ elif self.is_temp:
+ if self.is_cpp_operation() and self.exception_check == '+':
+ translate_cpp_exception(code, self.pos,
+ "%s = %s %s;" % (self.result(), self.operator, self.operand.result()),
+ self.result() if self.type.is_pyobject else None,
+ self.exception_value, self.in_nogil_context)
+ else:
+ code.putln("%s = %s %s;" % (self.result(), self.operator, self.operand.result()))
def generate_py_operation_code(self, code):
function = self.py_operation_function(code)
@@ -10142,23 +10142,23 @@ class UnopNode(ExprNode):
(self.operator, self.operand.type))
self.type = PyrexTypes.error_type
- def analyse_cpp_operation(self, env, overload_check=True):
- entry = env.lookup_operator(self.operator, [self.operand])
- if overload_check and not entry:
- self.type_error()
- return
- if entry:
- self.exception_check = entry.type.exception_check
- self.exception_value = entry.type.exception_value
- if self.exception_check == '+':
- self.is_temp = True
- if self.exception_value is None:
- env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
- else:
- self.exception_check = ''
- self.exception_value = ''
+ def analyse_cpp_operation(self, env, overload_check=True):
+ entry = env.lookup_operator(self.operator, [self.operand])
+ if overload_check and not entry:
+ self.type_error()
+ return
+ if entry:
+ self.exception_check = entry.type.exception_check
+ self.exception_value = entry.type.exception_value
+ if self.exception_check == '+':
+ self.is_temp = True
+ if self.exception_value is None:
+ env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
+ else:
+ self.exception_check = ''
+ self.exception_value = ''
cpp_type = self.operand.type.find_cpp_operation_type(self.operator)
- if overload_check and cpp_type is None:
+ if overload_check and cpp_type is None:
error(self.pos, "'%s' operator not defined for %s" % (
self.operator, type))
self.type_error()
@@ -10181,7 +10181,7 @@ class NotNode(UnopNode):
operand = self.operand.compile_time_value(denv)
try:
return not operand
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def infer_unop_type(self, env, operand_type):
@@ -10191,7 +10191,7 @@ class NotNode(UnopNode):
self.operand = self.operand.analyse_types(env)
operand_type = self.operand.type
if operand_type.is_cpp_class:
- self.analyse_cpp_operation(env)
+ self.analyse_cpp_operation(env)
else:
self.operand = self.operand.coerce_to_boolean(env)
return self
@@ -10329,12 +10329,12 @@ class AmpersandNode(CUnopNode):
self.operand = self.operand.analyse_types(env)
argtype = self.operand.type
if argtype.is_cpp_class:
- self.analyse_cpp_operation(env, overload_check=False)
+ self.analyse_cpp_operation(env, overload_check=False)
if not (argtype.is_cfunction or argtype.is_reference or self.operand.is_addressable()):
if argtype.is_memoryviewslice:
self.error("Cannot take address of memoryview slice")
else:
- self.error("Taking address of non-lvalue (type %s)" % argtype)
+ self.error("Taking address of non-lvalue (type %s)" % argtype)
return self
if argtype.is_pyobject:
self.error("Cannot take address of Python %s" % (
@@ -10342,8 +10342,8 @@ class AmpersandNode(CUnopNode):
"object attribute '%s'" % self.operand.attribute if self.operand.is_attribute else
"object"))
return self
- if not argtype.is_cpp_class or not self.type:
- self.type = PyrexTypes.c_ptr_type(argtype)
+ if not argtype.is_cpp_class or not self.type:
+ self.type = PyrexTypes.c_ptr_type(argtype)
return self
def check_const(self):
@@ -10358,11 +10358,11 @@ class AmpersandNode(CUnopNode):
return "(&%s)" % self.operand.result()
def generate_result_code(self, code):
- if (self.operand.type.is_cpp_class and self.exception_check == '+'):
- translate_cpp_exception(code, self.pos,
- "%s = %s %s;" % (self.result(), self.operator, self.operand.result()),
- self.result() if self.type.is_pyobject else None,
- self.exception_value, self.in_nogil_context)
+ if (self.operand.type.is_cpp_class and self.exception_check == '+'):
+ translate_cpp_exception(code, self.pos,
+ "%s = %s %s;" % (self.result(), self.operator, self.operand.result()),
+ self.result() if self.type.is_pyobject else None,
+ self.exception_value, self.in_nogil_context)
unop_node_classes = {
@@ -10432,15 +10432,15 @@ class TypecastNode(ExprNode):
return CoerceIntToBytesNode(self.operand, env)
elif self.operand.type.can_coerce_to_pyobject(env):
self.result_ctype = py_object_type
- self.operand = self.operand.coerce_to(self.type, env)
+ self.operand = self.operand.coerce_to(self.type, env)
else:
if self.operand.type.is_ptr:
if not (self.operand.type.base_type.is_void or self.operand.type.base_type.is_struct):
error(self.pos, "Python objects cannot be cast from pointers of primitive types")
else:
# Should this be an error?
- warning(self.pos, "No conversion from %s to %s, python object pointer used." % (
- self.operand.type, self.type))
+ warning(self.pos, "No conversion from %s to %s, python object pointer used." % (
+ self.operand.type, self.type))
self.operand = self.operand.coerce_to_simple(env)
elif from_py and not to_py:
if self.type.create_from_py_utility_code(env):
@@ -10449,8 +10449,8 @@ class TypecastNode(ExprNode):
if not (self.type.base_type.is_void or self.type.base_type.is_struct):
error(self.pos, "Python objects cannot be cast to pointers of primitive types")
else:
- warning(self.pos, "No conversion from %s to %s, python object pointer used." % (
- self.type, self.operand.type))
+ warning(self.pos, "No conversion from %s to %s, python object pointer used." % (
+ self.type, self.operand.type))
elif from_py and to_py:
if self.typecheck:
self.operand = PyTypeTestNode(self.operand, self.type, env, notnone=True)
@@ -10462,13 +10462,13 @@ class TypecastNode(ExprNode):
elif self.operand.type.is_fused:
self.operand = self.operand.coerce_to(self.type, env)
#self.type = self.operand.type
- if self.type.is_ptr and self.type.base_type.is_cfunction and self.type.base_type.nogil:
- op_type = self.operand.type
- if op_type.is_ptr:
- op_type = op_type.base_type
- if op_type.is_cfunction and not op_type.nogil:
- warning(self.pos,
- "Casting a GIL-requiring function into a nogil function circumvents GIL validation", 1)
+ if self.type.is_ptr and self.type.base_type.is_cfunction and self.type.base_type.nogil:
+ op_type = self.operand.type
+ if op_type.is_ptr:
+ op_type = op_type.base_type
+ if op_type.is_cfunction and not op_type.nogil:
+ warning(self.pos,
+ "Casting a GIL-requiring function into a nogil function circumvents GIL validation", 1)
return self
def is_simple(self):
@@ -10538,7 +10538,7 @@ ERR_STEPS = ("Strides may only be given to indicate contiguity. "
ERR_NOT_POINTER = "Can only create cython.array from pointer or array"
ERR_BASE_TYPE = "Pointer base type does not match cython.array base type"
-
+
class CythonArrayNode(ExprNode):
"""
Used when a pointer of base_type is cast to a memoryviewslice with that
@@ -10667,7 +10667,7 @@ class CythonArrayNode(ExprNode):
axes[-1] = ('direct', 'contig')
self.coercion_type = PyrexTypes.MemoryViewSliceType(array_dtype, axes)
- self.coercion_type.validate_memslice_dtype(self.pos)
+ self.coercion_type.validate_memslice_dtype(self.pos)
self.type = self.get_cython_array_type(env)
MemoryView.use_cython_array_utility_code(env)
env.use_utility_code(MemoryView.typeinfo_to_format_code)
@@ -10697,7 +10697,7 @@ class CythonArrayNode(ExprNode):
shapes_temp = code.funcstate.allocate_temp(py_object_type, True)
format_temp = code.funcstate.allocate_temp(py_object_type, True)
- itemsize = "sizeof(%s)" % dtype.empty_declaration_code()
+ itemsize = "sizeof(%s)" % dtype.empty_declaration_code()
type_info = Buffer.get_type_information_cname(code, dtype)
if self.operand.type.is_ptr:
@@ -10805,8 +10805,8 @@ class SizeofTypeNode(SizeofNode):
def check_type(self):
arg_type = self.arg_type
- if not arg_type:
- return
+ if not arg_type:
+ return
if arg_type.is_pyobject and not arg_type.is_extension_type:
error(self.pos, "Cannot take sizeof Python object")
elif arg_type.is_void:
@@ -10820,7 +10820,7 @@ class SizeofTypeNode(SizeofNode):
# we want the size of the actual struct
arg_code = self.arg_type.declaration_code("", deref=1)
else:
- arg_code = self.arg_type.empty_declaration_code()
+ arg_code = self.arg_type.empty_declaration_code()
return "(sizeof(%s))" % arg_code
@@ -10851,78 +10851,78 @@ class SizeofVarNode(SizeofNode):
def generate_result_code(self, code):
pass
-
-class TypeidNode(ExprNode):
- # C++ typeid operator applied to a type or variable
- #
- # operand ExprNode
- # arg_type ExprNode
- # is_variable boolean
-
- type = PyrexTypes.error_type
-
- subexprs = ['operand']
-
- arg_type = None
- is_variable = None
- is_temp = 1
-
- def get_type_info_type(self, env):
- env_module = env
- while not env_module.is_module_scope:
- env_module = env_module.outer_scope
- typeinfo_module = env_module.find_module('libcpp.typeinfo', self.pos)
- typeinfo_entry = typeinfo_module.lookup('type_info')
- return PyrexTypes.CFakeReferenceType(PyrexTypes.c_const_type(typeinfo_entry.type))
-
+
+class TypeidNode(ExprNode):
+ # C++ typeid operator applied to a type or variable
+ #
+ # operand ExprNode
+ # arg_type ExprNode
+ # is_variable boolean
+
+ type = PyrexTypes.error_type
+
+ subexprs = ['operand']
+
+ arg_type = None
+ is_variable = None
+ is_temp = 1
+
+ def get_type_info_type(self, env):
+ env_module = env
+ while not env_module.is_module_scope:
+ env_module = env_module.outer_scope
+ typeinfo_module = env_module.find_module('libcpp.typeinfo', self.pos)
+ typeinfo_entry = typeinfo_module.lookup('type_info')
+ return PyrexTypes.CFakeReferenceType(PyrexTypes.c_const_type(typeinfo_entry.type))
+
cpp_message = 'typeid operator'
- def analyse_types(self, env):
+ def analyse_types(self, env):
self.cpp_check(env)
- type_info = self.get_type_info_type(env)
- if not type_info:
- self.error("The 'libcpp.typeinfo' module must be cimported to use the typeid() operator")
- return self
- self.type = type_info
- as_type = self.operand.analyse_as_type(env)
- if as_type:
- self.arg_type = as_type
- self.is_type = True
- else:
- self.arg_type = self.operand.analyse_types(env)
- self.is_type = False
- if self.arg_type.type.is_pyobject:
- self.error("Cannot use typeid on a Python object")
- return self
- elif self.arg_type.type.is_void:
- self.error("Cannot use typeid on void")
- return self
- elif not self.arg_type.type.is_complete():
- self.error("Cannot use typeid on incomplete type '%s'" % self.arg_type.type)
- return self
- env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
- return self
-
- def error(self, mess):
- error(self.pos, mess)
- self.type = PyrexTypes.error_type
- self.result_code = "<error>"
-
- def check_const(self):
- return True
-
- def calculate_result_code(self):
- return self.temp_code
-
- def generate_result_code(self, code):
- if self.is_type:
- arg_code = self.arg_type.empty_declaration_code()
- else:
- arg_code = self.arg_type.result()
- translate_cpp_exception(code, self.pos,
- "%s = typeid(%s);" % (self.temp_code, arg_code),
- None, None, self.in_nogil_context)
-
+ type_info = self.get_type_info_type(env)
+ if not type_info:
+ self.error("The 'libcpp.typeinfo' module must be cimported to use the typeid() operator")
+ return self
+ self.type = type_info
+ as_type = self.operand.analyse_as_type(env)
+ if as_type:
+ self.arg_type = as_type
+ self.is_type = True
+ else:
+ self.arg_type = self.operand.analyse_types(env)
+ self.is_type = False
+ if self.arg_type.type.is_pyobject:
+ self.error("Cannot use typeid on a Python object")
+ return self
+ elif self.arg_type.type.is_void:
+ self.error("Cannot use typeid on void")
+ return self
+ elif not self.arg_type.type.is_complete():
+ self.error("Cannot use typeid on incomplete type '%s'" % self.arg_type.type)
+ return self
+ env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
+ return self
+
+ def error(self, mess):
+ error(self.pos, mess)
+ self.type = PyrexTypes.error_type
+ self.result_code = "<error>"
+
+ def check_const(self):
+ return True
+
+ def calculate_result_code(self):
+ return self.temp_code
+
+ def generate_result_code(self, code):
+ if self.is_type:
+ arg_code = self.arg_type.empty_declaration_code()
+ else:
+ arg_code = self.arg_type.result()
+ translate_cpp_exception(code, self.pos,
+ "%s = typeid(%s);" % (self.temp_code, arg_code),
+ None, None, self.in_nogil_context)
+
class TypeofNode(ExprNode):
# Compile-time type of an expression, as a string.
#
@@ -11034,7 +11034,7 @@ class BinopNode(ExprNode):
operand2 = self.operand2.compile_time_value(denv)
try:
return func(operand1, operand2)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
def infer_type(self, env):
@@ -11068,7 +11068,7 @@ class BinopNode(ExprNode):
return self.is_py_operation_types(self.operand1.type, self.operand2.type)
def is_py_operation_types(self, type1, type2):
- return type1.is_pyobject or type2.is_pyobject or type1.is_ctuple or type2.is_ctuple
+ return type1.is_pyobject or type2.is_pyobject or type1.is_ctuple or type2.is_ctuple
def is_pythran_operation(self, env):
return self.is_pythran_operation_types(self.operand1.type, self.operand2.type, env)
@@ -11089,14 +11089,14 @@ class BinopNode(ExprNode):
self.type_error()
return
func_type = entry.type
- self.exception_check = func_type.exception_check
- self.exception_value = func_type.exception_value
- if self.exception_check == '+':
- # Used by NumBinopNodes to break up expressions involving multiple
- # operators so that exceptions can be handled properly.
- self.is_temp = 1
- if self.exception_value is None:
- env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
+ self.exception_check = func_type.exception_check
+ self.exception_value = func_type.exception_value
+ if self.exception_check == '+':
+ # Used by NumBinopNodes to break up expressions involving multiple
+ # operators so that exceptions can be handled properly.
+ self.is_temp = 1
+ if self.exception_value is None:
+ env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
if func_type.is_ptr:
func_type = func_type.base_type
if len(func_type.args) == 1:
@@ -11153,19 +11153,19 @@ class BinopNode(ExprNode):
if self.type.is_pythran_expr:
code.putln("// Pythran binop")
code.putln("__Pyx_call_destructor(%s);" % self.result())
- if self.operator == '**':
- code.putln("new (&%s) decltype(%s){pythonic::numpy::functor::power{}(%s, %s)};" % (
- self.result(),
- self.result(),
- self.operand1.pythran_result(),
- self.operand2.pythran_result()))
- else:
- code.putln("new (&%s) decltype(%s){%s %s %s};" % (
- self.result(),
- self.result(),
- self.operand1.pythran_result(),
- self.operator,
- self.operand2.pythran_result()))
+ if self.operator == '**':
+ code.putln("new (&%s) decltype(%s){pythonic::numpy::functor::power{}(%s, %s)};" % (
+ self.result(),
+ self.result(),
+ self.operand1.pythran_result(),
+ self.operand2.pythran_result()))
+ else:
+ code.putln("new (&%s) decltype(%s){%s %s %s};" % (
+ self.result(),
+ self.result(),
+ self.operand1.pythran_result(),
+ self.operator,
+ self.operand2.pythran_result()))
elif self.operand1.type.is_pyobject:
function = self.py_operation_function(code)
if self.operator == '**':
@@ -11182,15 +11182,15 @@ class BinopNode(ExprNode):
code.error_goto_if_null(self.result(), self.pos)))
code.put_gotref(self.py_result())
elif self.is_temp:
- # C++ overloaded operators with exception values are currently all
- # handled through temporaries.
- if self.is_cpp_operation() and self.exception_check == '+':
- translate_cpp_exception(code, self.pos,
- "%s = %s;" % (self.result(), self.calculate_result_code()),
- self.result() if self.type.is_pyobject else None,
- self.exception_value, self.in_nogil_context)
- else:
- code.putln("%s = %s;" % (self.result(), self.calculate_result_code()))
+ # C++ overloaded operators with exception values are currently all
+ # handled through temporaries.
+ if self.is_cpp_operation() and self.exception_check == '+':
+ translate_cpp_exception(code, self.pos,
+ "%s = %s;" % (self.result(), self.calculate_result_code()),
+ self.result() if self.type.is_pyobject else None,
+ self.exception_value, self.in_nogil_context)
+ else:
+ code.putln("%s = %s;" % (self.result(), self.calculate_result_code()))
def type_error(self):
if not (self.operand1.type.is_error
@@ -11222,8 +11222,8 @@ class CBinopNode(BinopNode):
cpp_type = None
if type1.is_cpp_class or type1.is_ptr:
cpp_type = type1.find_cpp_operation_type(self.operator, type2)
- if cpp_type is None and (type2.is_cpp_class or type2.is_ptr):
- cpp_type = type2.find_cpp_operation_type(self.operator, type1)
+ if cpp_type is None and (type2.is_cpp_class or type2.is_ptr):
+ cpp_type = type2.find_cpp_operation_type(self.operator, type1)
# FIXME: do we need to handle other cases here?
return cpp_type
@@ -11327,7 +11327,7 @@ class NumBinopNode(BinopNode):
self.operand1.result(),
self.operand2.result(),
self.overflow_bit_node.overflow_bit)
- elif self.type.is_cpp_class or self.infix:
+ elif self.type.is_cpp_class or self.infix:
if is_pythran_expr(self.type):
result1, result2 = self.operand1.pythran_result(), self.operand2.pythran_result()
else:
@@ -11416,14 +11416,14 @@ class AddNode(NumBinopNode):
def py_operation_function(self, code):
type1, type2 = self.operand1.type, self.operand2.type
-
+
if type1 is unicode_type or type2 is unicode_type:
if type1 in (unicode_type, str_type) and type2 in (unicode_type, str_type):
is_unicode_concat = True
elif isinstance(self.operand1, FormattedValueNode) or isinstance(self.operand2, FormattedValueNode):
# Assume that even if we don't know the second type, it's going to be a string.
is_unicode_concat = True
- else:
+ else:
# Operation depends on the second type.
is_unicode_concat = False
@@ -11500,7 +11500,7 @@ class DivNode(NumBinopNode):
func = compile_time_binary_operators[self.operator]
if self.operator == '/' and self.truedivision is None:
# => true div for floats, floor div for integers
- if isinstance(op1, _py_int_types) and isinstance(op2, _py_int_types):
+ if isinstance(op1, _py_int_types) and isinstance(op2, _py_int_types):
func = compile_time_binary_operators['//']
return func
@@ -11519,23 +11519,23 @@ class DivNode(NumBinopNode):
func = self.find_compile_time_binary_operator(
operand1, operand2)
return func(operand1, operand2)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
- def _check_truedivision(self, env):
+ def _check_truedivision(self, env):
if self.cdivision or env.directives['cdivision']:
self.ctruedivision = False
else:
self.ctruedivision = self.truedivision
-
- def infer_type(self, env):
- self._check_truedivision(env)
- return self.result_type(
- self.operand1.infer_type(env),
+
+ def infer_type(self, env):
+ self._check_truedivision(env)
+ return self.result_type(
+ self.operand1.infer_type(env),
self.operand2.infer_type(env), env)
-
- def analyse_operation(self, env):
- self._check_truedivision(env)
+
+ def analyse_operation(self, env):
+ self._check_truedivision(env)
NumBinopNode.analyse_operation(self, env)
if self.is_cpp_operation():
self.cdivision = True
@@ -11550,7 +11550,7 @@ class DivNode(NumBinopNode):
self.operand2 = self.operand2.coerce_to_simple(env)
def compute_c_result_type(self, type1, type2):
- if self.operator == '/' and self.ctruedivision and not type1.is_cpp_class and not type2.is_cpp_class:
+ if self.operator == '/' and self.ctruedivision and not type1.is_cpp_class and not type2.is_cpp_class:
if not type1.is_float and not type2.is_float:
widest_type = PyrexTypes.widest_numeric_type(type1, PyrexTypes.c_double_type)
widest_type = PyrexTypes.widest_numeric_type(type2, widest_type)
@@ -11566,19 +11566,19 @@ class DivNode(NumBinopNode):
def generate_evaluation_code(self, code):
if not self.type.is_pyobject and not self.type.is_complex:
if self.cdivision is None:
- self.cdivision = (
- code.globalstate.directives['cdivision']
- or self.type.is_float
- or ((self.type.is_numeric or self.type.is_enum) and not self.type.signed)
- )
+ self.cdivision = (
+ code.globalstate.directives['cdivision']
+ or self.type.is_float
+ or ((self.type.is_numeric or self.type.is_enum) and not self.type.signed)
+ )
if not self.cdivision:
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("DivInt", "CMath.c").specialize(self.type))
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("DivInt", "CMath.c").specialize(self.type))
NumBinopNode.generate_evaluation_code(self, code)
self.generate_div_warning_code(code)
def generate_div_warning_code(self, code):
- in_nogil = self.in_nogil_context
+ in_nogil = self.in_nogil_context
if not self.type.is_pyobject:
if self.zerodivision_check:
if not self.infix:
@@ -11586,62 +11586,62 @@ class DivNode(NumBinopNode):
else:
zero_test = "%s == 0" % self.operand2.result()
code.putln("if (unlikely(%s)) {" % zero_test)
- if in_nogil:
- code.put_ensure_gil()
+ if in_nogil:
+ code.put_ensure_gil()
code.putln('PyErr_SetString(PyExc_ZeroDivisionError, "%s");' % self.zero_division_message())
- if in_nogil:
- code.put_release_ensured_gil()
+ if in_nogil:
+ code.put_release_ensured_gil()
code.putln(code.error_goto(self.pos))
code.putln("}")
if self.type.is_int and self.type.signed and self.operator != '%':
- code.globalstate.use_utility_code(UtilityCode.load_cached("UnaryNegOverflows", "Overflow.c"))
+ code.globalstate.use_utility_code(UtilityCode.load_cached("UnaryNegOverflows", "Overflow.c"))
if self.operand2.type.signed == 2:
# explicitly signed, no runtime check needed
minus1_check = 'unlikely(%s == -1)' % self.operand2.result()
else:
- type_of_op2 = self.operand2.type.empty_declaration_code()
+ type_of_op2 = self.operand2.type.empty_declaration_code()
minus1_check = '(!(((%s)-1) > 0)) && unlikely(%s == (%s)-1)' % (
type_of_op2, self.operand2.result(), type_of_op2)
code.putln("else if (sizeof(%s) == sizeof(long) && %s "
" && unlikely(UNARY_NEG_WOULD_OVERFLOW(%s))) {" % (
- self.type.empty_declaration_code(),
+ self.type.empty_declaration_code(),
minus1_check,
self.operand1.result()))
- if in_nogil:
- code.put_ensure_gil()
+ if in_nogil:
+ code.put_ensure_gil()
code.putln('PyErr_SetString(PyExc_OverflowError, "value too large to perform division");')
- if in_nogil:
- code.put_release_ensured_gil()
+ if in_nogil:
+ code.put_release_ensured_gil()
code.putln(code.error_goto(self.pos))
code.putln("}")
if code.globalstate.directives['cdivision_warnings'] and self.operator != '/':
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("CDivisionWarning", "CMath.c"))
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("CDivisionWarning", "CMath.c"))
code.putln("if (unlikely((%s < 0) ^ (%s < 0))) {" % (
self.operand1.result(),
self.operand2.result()))
- warning_code = "__Pyx_cdivision_warning(%(FILENAME)s, %(LINENO)s)" % {
+ warning_code = "__Pyx_cdivision_warning(%(FILENAME)s, %(LINENO)s)" % {
'FILENAME': Naming.filename_cname,
'LINENO': Naming.lineno_cname,
- }
-
- if in_nogil:
- result_code = 'result'
- code.putln("int %s;" % result_code)
- code.put_ensure_gil()
- code.putln(code.set_error_info(self.pos, used=True))
- code.putln("%s = %s;" % (result_code, warning_code))
- code.put_release_ensured_gil()
- else:
- result_code = warning_code
- code.putln(code.set_error_info(self.pos, used=True))
-
- code.put("if (unlikely(%s)) " % result_code)
+ }
+
+ if in_nogil:
+ result_code = 'result'
+ code.putln("int %s;" % result_code)
+ code.put_ensure_gil()
+ code.putln(code.set_error_info(self.pos, used=True))
+ code.putln("%s = %s;" % (result_code, warning_code))
+ code.put_release_ensured_gil()
+ else:
+ result_code = warning_code
+ code.putln(code.set_error_info(self.pos, used=True))
+
+ code.put("if (unlikely(%s)) " % result_code)
code.put_goto(code.error_label)
code.putln("}")
def calculate_result_code(self):
- if self.type.is_complex or self.is_cpp_operation():
+ if self.type.is_complex or self.is_cpp_operation():
return NumBinopNode.calculate_result_code(self)
elif self.type.is_float and self.operator == '//':
return "floor(%s / %s)" % (
@@ -11725,12 +11725,12 @@ class ModNode(DivNode):
if not self.type.is_pyobject and not self.cdivision:
if self.type.is_int:
code.globalstate.use_utility_code(
- UtilityCode.load_cached("ModInt", "CMath.c").specialize(self.type))
+ UtilityCode.load_cached("ModInt", "CMath.c").specialize(self.type))
else: # float
code.globalstate.use_utility_code(
- UtilityCode.load_cached("ModFloat", "CMath.c").specialize(
+ UtilityCode.load_cached("ModFloat", "CMath.c").specialize(
self.type, math_h_modifier=self.type.math_h_modifier))
- # NOTE: skipping over DivNode here
+ # NOTE: skipping over DivNode here
NumBinopNode.generate_evaluation_code(self, code)
self.generate_div_warning_code(code)
@@ -11752,19 +11752,19 @@ class ModNode(DivNode):
self.operand2.result())
def py_operation_function(self, code):
- type1, type2 = self.operand1.type, self.operand2.type
- # ("..." % x) must call "x.__rmod__()" for string subtypes.
- if type1 is unicode_type:
- if self.operand1.may_be_none() or (
- type2.is_extension_type and type2.subtype_of(type1) or
- type2 is py_object_type and not isinstance(self.operand2, CoerceToPyTypeNode)):
+ type1, type2 = self.operand1.type, self.operand2.type
+ # ("..." % x) must call "x.__rmod__()" for string subtypes.
+ if type1 is unicode_type:
+ if self.operand1.may_be_none() or (
+ type2.is_extension_type and type2.subtype_of(type1) or
+ type2 is py_object_type and not isinstance(self.operand2, CoerceToPyTypeNode)):
return '__Pyx_PyUnicode_FormatSafe'
else:
return 'PyUnicode_Format'
- elif type1 is str_type:
- if self.operand1.may_be_none() or (
- type2.is_extension_type and type2.subtype_of(type1) or
- type2 is py_object_type and not isinstance(self.operand2, CoerceToPyTypeNode)):
+ elif type1 is str_type:
+ if self.operand1.may_be_none() or (
+ type2.is_extension_type and type2.subtype_of(type1) or
+ type2 is py_object_type and not isinstance(self.operand2, CoerceToPyTypeNode)):
return '__Pyx_PyString_FormatSafe'
else:
return '__Pyx_PyString_Format'
@@ -11780,18 +11780,18 @@ class PowNode(NumBinopNode):
if self.type.real_type.is_float:
self.operand1 = self.operand1.coerce_to(self.type, env)
self.operand2 = self.operand2.coerce_to(self.type, env)
- self.pow_func = self.type.binary_op('**')
+ self.pow_func = self.type.binary_op('**')
else:
error(self.pos, "complex int powers not supported")
self.pow_func = "<error>"
elif self.type.is_float:
self.pow_func = "pow" + self.type.math_h_modifier
elif self.type.is_int:
- self.pow_func = "__Pyx_pow_%s" % self.type.empty_declaration_code().replace(' ', '_')
+ self.pow_func = "__Pyx_pow_%s" % self.type.empty_declaration_code().replace(' ', '_')
env.use_utility_code(
- UtilityCode.load_cached("IntPow", "CMath.c").specialize(
+ UtilityCode.load_cached("IntPow", "CMath.c").specialize(
func_name=self.pow_func,
- type=self.type.empty_declaration_code(),
+ type=self.type.empty_declaration_code(),
signed=self.type.signed and 1 or 0))
elif not self.type.is_error:
error(self.pos, "got unexpected types for C power operator: %s, %s" %
@@ -11812,7 +11812,7 @@ class PowNode(NumBinopNode):
def py_operation_function(self, code):
if (self.type.is_pyobject and
self.operand1.constant_result == 2 and
- isinstance(self.operand1.constant_result, _py_int_types) and
+ isinstance(self.operand1.constant_result, _py_int_types) and
self.operand2.type is py_object_type):
code.globalstate.use_utility_code(UtilityCode.load_cached('PyNumberPow2', 'Optimize.c'))
if self.inplace:
@@ -11913,13 +11913,13 @@ class BoolBinopNode(ExprNode):
my_label = and_label = code.new_label('next_and')
else:
my_label = or_label = code.new_label('next_or')
- self.operand1.generate_bool_evaluation_code(
+ self.operand1.generate_bool_evaluation_code(
code, final_result_temp, final_result_type, and_label, or_label, end_label, my_label)
and_label, or_label = outer_labels
code.put_label(my_label)
- self.operand2.generate_bool_evaluation_code(
+ self.operand2.generate_bool_evaluation_code(
code, final_result_temp, final_result_type, and_label, or_label, end_label, fall_through)
def generate_evaluation_code(self, code):
@@ -11928,7 +11928,7 @@ class BoolBinopNode(ExprNode):
or_label = and_label = None
end_label = code.new_label('bool_binop_done')
self.generate_bool_evaluation_code(code, self.result(), result_type, and_label, or_label, end_label, end_label)
- code.put_label(end_label)
+ code.put_label(end_label)
gil_message = "Truth-testing Python object"
@@ -12024,43 +12024,43 @@ class BoolBinopResultNode(ExprNode):
self.arg.generate_evaluation_code(code)
if and_label or or_label:
test_result, uses_temp = self.generate_operand_test(code)
- if uses_temp and (and_label and or_label):
- # cannot become final result => free early
- # disposal: uses_temp and (and_label and or_label)
- self.arg.generate_disposal_code(code)
+ if uses_temp and (and_label and or_label):
+ # cannot become final result => free early
+ # disposal: uses_temp and (and_label and or_label)
+ self.arg.generate_disposal_code(code)
sense = '!' if or_label else ''
code.putln("if (%s%s) {" % (sense, test_result))
if uses_temp:
code.funcstate.release_temp(test_result)
- if not uses_temp or not (and_label and or_label):
- # disposal: (not uses_temp) or {not (and_label and or_label) [if]}
- self.arg.generate_disposal_code(code)
+ if not uses_temp or not (and_label and or_label):
+ # disposal: (not uses_temp) or {not (and_label and or_label) [if]}
+ self.arg.generate_disposal_code(code)
- if or_label and or_label != fall_through:
+ if or_label and or_label != fall_through:
# value is false => short-circuit to next 'or'
code.put_goto(or_label)
if and_label:
# value is true => go to next 'and'
- if or_label:
+ if or_label:
code.putln("} else {")
- if not uses_temp:
- # disposal: (not uses_temp) and {(and_label and or_label) [else]}
- self.arg.generate_disposal_code(code)
- if and_label != fall_through:
- code.put_goto(and_label)
+ if not uses_temp:
+ # disposal: (not uses_temp) and {(and_label and or_label) [else]}
+ self.arg.generate_disposal_code(code)
+ if and_label != fall_through:
+ code.put_goto(and_label)
if not and_label or not or_label:
# if no next 'and' or 'or', we provide the result
- if and_label or or_label:
- code.putln("} else {")
+ if and_label or or_label:
+ code.putln("} else {")
self.value.generate_evaluation_code(code)
self.value.make_owned_reference(code)
code.putln("%s = %s;" % (final_result_temp, self.value.result_as(final_result_type)))
self.value.generate_post_assignment_code(code)
- # disposal: {not (and_label and or_label) [else]}
+ # disposal: {not (and_label and or_label) [else]}
self.arg.generate_disposal_code(code)
self.value.free_temps(code)
- if end_label != fall_through:
+ if end_label != fall_through:
code.put_goto(end_label)
if and_label or or_label:
@@ -12077,7 +12077,7 @@ class CondExprNode(ExprNode):
true_val = None
false_val = None
- is_temp = True
+ is_temp = True
subexprs = ['test', 'true_val', 'false_val']
@@ -12107,8 +12107,8 @@ class CondExprNode(ExprNode):
def analyse_result_type(self, env):
self.type = PyrexTypes.independent_spanning_type(
self.true_val.type, self.false_val.type)
- if self.type.is_reference:
- self.type = PyrexTypes.CFakeReferenceType(self.type.ref_base_type)
+ if self.type.is_reference:
+ self.type = PyrexTypes.CFakeReferenceType(self.type.ref_base_type)
if self.type.is_pyobject:
self.result_ctype = py_object_type
elif self.true_val.is_ephemeral() or self.false_val.is_ephemeral():
@@ -12116,16 +12116,16 @@ class CondExprNode(ExprNode):
if self.true_val.type.is_pyobject or self.false_val.type.is_pyobject:
self.true_val = self.true_val.coerce_to(self.type, env)
self.false_val = self.false_val.coerce_to(self.type, env)
- if self.type.is_error:
+ if self.type.is_error:
self.type_error()
return self
- def coerce_to_integer(self, env):
- self.true_val = self.true_val.coerce_to_integer(env)
- self.false_val = self.false_val.coerce_to_integer(env)
- self.result_ctype = None
- return self.analyse_result_type(env)
-
+ def coerce_to_integer(self, env):
+ self.true_val = self.true_val.coerce_to_integer(env)
+ self.false_val = self.false_val.coerce_to_integer(env)
+ self.result_ctype = None
+ return self.analyse_result_type(env)
+
def coerce_to(self, dst_type, env):
self.true_val = self.true_val.coerce_to(dst_type, env)
self.false_val = self.false_val.coerce_to(dst_type, env)
@@ -12202,8 +12202,8 @@ class CmpNode(object):
def calculate_cascaded_constant_result(self, operand1_result):
func = compile_time_binary_operators[self.operator]
operand2_result = self.operand2.constant_result
- if (isinstance(operand1_result, any_string_type) and
- isinstance(operand2_result, any_string_type) and
+ if (isinstance(operand1_result, any_string_type) and
+ isinstance(operand2_result, any_string_type) and
type(operand1_result) != type(operand2_result)):
# string comparison of different types isn't portable
return
@@ -12228,7 +12228,7 @@ class CmpNode(object):
operand2 = self.operand2.compile_time_value(denv)
try:
result = func(operand1, operand2)
- except Exception as e:
+ except Exception as e:
self.compile_time_value_error(e)
result = None
if result:
@@ -12300,9 +12300,9 @@ class CmpNode(object):
if new_common_type is None:
# fall back to generic type compatibility tests
- if type1.is_ctuple or type2.is_ctuple:
- new_common_type = py_object_type
- elif type1 == type2:
+ if type1.is_ctuple or type2.is_ctuple:
+ new_common_type = py_object_type
+ elif type1 == type2:
new_common_type = type1
elif type1.is_pyobject or type2.is_pyobject:
if type2.is_numeric or type2.is_string:
@@ -12414,7 +12414,7 @@ class CmpNode(object):
if self.operand2.type is Builtin.dict_type:
self.operand2 = self.operand2.as_none_safe_node("'NoneType' object is not iterable")
self.special_bool_cmp_utility_code = UtilityCode.load_cached("PyDictContains", "ObjectHandling.c")
- self.special_bool_cmp_function = "__Pyx_PyDict_ContainsTF"
+ self.special_bool_cmp_function = "__Pyx_PyDict_ContainsTF"
return True
elif self.operand2.type is Builtin.set_type:
self.operand2 = self.operand2.as_none_safe_node("'NoneType' object is not iterable")
@@ -12424,13 +12424,13 @@ class CmpNode(object):
elif self.operand2.type is Builtin.unicode_type:
self.operand2 = self.operand2.as_none_safe_node("'NoneType' object is not iterable")
self.special_bool_cmp_utility_code = UtilityCode.load_cached("PyUnicodeContains", "StringTools.c")
- self.special_bool_cmp_function = "__Pyx_PyUnicode_ContainsTF"
+ self.special_bool_cmp_function = "__Pyx_PyUnicode_ContainsTF"
return True
else:
if not self.operand2.type.is_pyobject:
self.operand2 = self.operand2.coerce_to_pyobject(env)
self.special_bool_cmp_utility_code = UtilityCode.load_cached("PySequenceContains", "ObjectHandling.c")
- self.special_bool_cmp_function = "__Pyx_PySequence_ContainsTF"
+ self.special_bool_cmp_function = "__Pyx_PySequence_ContainsTF"
return True
return False
@@ -12501,20 +12501,20 @@ class CmpNode(object):
common_type = type1
code1 = operand1.result_as(common_type)
code2 = operand2.result_as(common_type)
- statement = "%s = %s(%s %s %s);" % (
+ statement = "%s = %s(%s %s %s);" % (
result_code,
coerce_result,
code1,
self.c_operator(op),
- code2)
- if self.is_cpp_comparison() and self.exception_check == '+':
- translate_cpp_exception(
- code,
- self.pos,
- statement,
- result_code if self.type.is_pyobject else None,
- self.exception_value,
- self.in_nogil_context)
+ code2)
+ if self.is_cpp_comparison() and self.exception_check == '+':
+ translate_cpp_exception(
+ code,
+ self.pos,
+ statement,
+ result_code if self.type.is_pyobject else None,
+ self.exception_value,
+ self.in_nogil_context)
else:
code.putln(statement)
@@ -12658,7 +12658,7 @@ class PrimaryCmpNode(ExprNode, CmpNode):
def analyse_cpp_comparison(self, env):
type1 = self.operand1.type
type2 = self.operand2.type
- self.is_pycmp = False
+ self.is_pycmp = False
entry = env.lookup_operator(self.operator, [self.operand1, self.operand2])
if entry is None:
error(self.pos, "Invalid types for '%s' (%s, %s)" %
@@ -12669,12 +12669,12 @@ class PrimaryCmpNode(ExprNode, CmpNode):
func_type = entry.type
if func_type.is_ptr:
func_type = func_type.base_type
- self.exception_check = func_type.exception_check
- self.exception_value = func_type.exception_value
- if self.exception_check == '+':
- self.is_temp = True
- if self.exception_value is None:
- env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
+ self.exception_check = func_type.exception_check
+ self.exception_value = func_type.exception_value
+ if self.exception_check == '+':
+ self.is_temp = True
+ if self.exception_value is None:
+ env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
if len(func_type.args) == 1:
self.operand2 = self.operand2.coerce_to(func_type.args[0].type, env)
else:
@@ -12836,10 +12836,10 @@ class CascadedCmpNode(Node, CmpNode):
def has_python_operands(self):
return self.operand2.type.is_pyobject
- def is_cpp_comparison(self):
- # cascaded comparisons aren't currently implemented for c++ classes.
- return False
-
+ def is_cpp_comparison(self):
+ # cascaded comparisons aren't currently implemented for c++ classes.
+ return False
+
def optimise_comparison(self, operand1, env, result_is_bool=False):
if self.find_special_bool_compare_function(env, operand1, result_is_bool):
self.is_pycmp = False
@@ -12912,19 +12912,19 @@ binop_node_classes = {
"**": PowNode,
}
-
-def binop_node(pos, operator, operand1, operand2, inplace=False, **kwargs):
+
+def binop_node(pos, operator, operand1, operand2, inplace=False, **kwargs):
# Construct binop node of appropriate class for
# given operator.
- return binop_node_classes[operator](
- pos,
- operator=operator,
- operand1=operand1,
- operand2=operand2,
- inplace=inplace,
- **kwargs)
-
-
+ return binop_node_classes[operator](
+ pos,
+ operator=operator,
+ operand1=operand1,
+ operand2=operand2,
+ inplace=inplace,
+ **kwargs)
+
+
#-------------------------------------------------------------------
#
# Coercion nodes
@@ -12961,7 +12961,7 @@ class CoercionNode(ExprNode):
code.annotate((file, line, col-1), AnnotationItem(
style='coerce', tag='coerce', text='[%s] to [%s]' % (self.arg.type, self.type)))
-
+
class CoerceToMemViewSliceNode(CoercionNode):
"""
Coerce an object to a memoryview slice. This holds a new reference in
@@ -13190,7 +13190,7 @@ class CoerceToPyTypeNode(CoercionNode):
# to a Python object.
type = py_object_type
- target_type = py_object_type
+ target_type = py_object_type
is_temp = 1
def __init__(self, arg, env, type=py_object_type):
@@ -13210,17 +13210,17 @@ class CoerceToPyTypeNode(CoercionNode):
self.type = unicode_type
elif arg.type.is_complex:
self.type = Builtin.complex_type
- self.target_type = self.type
+ self.target_type = self.type
elif arg.type.is_string or arg.type.is_cpp_string:
if (type not in (bytes_type, bytearray_type)
and not env.directives['c_string_encoding']):
error(arg.pos,
"default encoding required for conversion from '%s' to '%s'" %
(arg.type, type))
- self.type = self.target_type = type
+ self.type = self.target_type = type
else:
# FIXME: check that the target type and the resulting type are compatible
- self.target_type = type
+ self.target_type = type
gil_message = "Converting to Python object"
@@ -13248,11 +13248,11 @@ class CoerceToPyTypeNode(CoercionNode):
return self
def generate_result_code(self, code):
- code.putln('%s; %s' % (
- self.arg.type.to_py_call_code(
- self.arg.result(),
- self.result(),
- self.target_type),
+ code.putln('%s; %s' % (
+ self.arg.type.to_py_call_code(
+ self.arg.result(),
+ self.result(),
+ self.target_type),
code.error_goto_if_null(self.result(), self.pos)))
code.put_gotref(self.py_result())
@@ -13320,7 +13320,7 @@ class CoerceFromPyTypeNode(CoercionNode):
return self
def is_ephemeral(self):
- return (self.type.is_ptr and not self.type.is_array) and self.arg.is_ephemeral()
+ return (self.type.is_ptr and not self.type.is_array) and self.arg.is_ephemeral()
def generate_result_code(self, code):
from_py_function = None
@@ -13330,7 +13330,7 @@ class CoerceFromPyTypeNode(CoercionNode):
from_py_function = '__Pyx_PyBytes' + self.type.from_py_function[len('__Pyx_PyObject'):]
NoneCheckNode.generate_if_needed(self.arg, code, "expected bytes, NoneType found")
- code.putln(self.type.from_py_call_code(
+ code.putln(self.type.from_py_call_code(
self.arg.py_result(), self.result(), self.pos, code, from_py_function=from_py_function))
if self.type.is_pyobject:
code.put_gotref(self.py_result())
@@ -13346,14 +13346,14 @@ class CoerceToBooleanNode(CoercionNode):
type = PyrexTypes.c_bint_type
_special_builtins = {
- Builtin.list_type: 'PyList_GET_SIZE',
- Builtin.tuple_type: 'PyTuple_GET_SIZE',
- Builtin.set_type: 'PySet_GET_SIZE',
- Builtin.frozenset_type: 'PySet_GET_SIZE',
- Builtin.bytes_type: 'PyBytes_GET_SIZE',
+ Builtin.list_type: 'PyList_GET_SIZE',
+ Builtin.tuple_type: 'PyTuple_GET_SIZE',
+ Builtin.set_type: 'PySet_GET_SIZE',
+ Builtin.frozenset_type: 'PySet_GET_SIZE',
+ Builtin.bytes_type: 'PyBytes_GET_SIZE',
Builtin.bytearray_type: 'PyByteArray_GET_SIZE',
- Builtin.unicode_type: '__Pyx_PyUnicode_IS_TRUE',
- }
+ Builtin.unicode_type: '__Pyx_PyUnicode_IS_TRUE',
+ }
def __init__(self, arg, env):
CoercionNode.__init__(self, arg)
@@ -13390,7 +13390,7 @@ class CoerceToBooleanNode(CoercionNode):
self.arg.py_result(),
code.error_goto_if_neg(self.result(), self.pos)))
-
+
class CoerceToComplexNode(CoercionNode):
def __init__(self, arg, dst_type, env):
diff --git a/contrib/tools/cython/Cython/Compiler/FlowControl.pxd b/contrib/tools/cython/Cython/Compiler/FlowControl.pxd
index c87370b819..1b855455f7 100644
--- a/contrib/tools/cython/Cython/Compiler/FlowControl.pxd
+++ b/contrib/tools/cython/Cython/Compiler/FlowControl.pxd
@@ -12,7 +12,7 @@ cdef class ControlBlock:
cdef public dict gen
cdef public set bounded
- # Big integer bitsets
+ # Big integer bitsets
cdef public object i_input
cdef public object i_output
cdef public object i_gen
@@ -87,11 +87,11 @@ cdef class Uninitialized:
cdef class Unknown:
pass
-
-cdef class MessageCollection:
- cdef set messages
-
-
+
+cdef class MessageCollection:
+ cdef set messages
+
+
@cython.locals(dirty=bint, block=ControlBlock, parent=ControlBlock,
assmt=NameAssignment)
cdef check_definitions(ControlFlow flow, dict compiler_directives)
@@ -99,7 +99,7 @@ cdef check_definitions(ControlFlow flow, dict compiler_directives)
@cython.final
cdef class ControlFlowAnalysis(CythonTransform):
cdef object gv_ctx
- cdef object constant_folder
+ cdef object constant_folder
cdef set reductions
cdef list env_stack
cdef list stack
diff --git a/contrib/tools/cython/Cython/Compiler/FlowControl.py b/contrib/tools/cython/Cython/Compiler/FlowControl.py
index df04471f90..7e8270b198 100644
--- a/contrib/tools/cython/Cython/Compiler/FlowControl.py
+++ b/contrib/tools/cython/Cython/Compiler/FlowControl.py
@@ -2,7 +2,7 @@ from __future__ import absolute_import
import cython
cython.declare(PyrexTypes=object, ExprNodes=object, Nodes=object,
- Builtin=object, InternalError=object, error=object, warning=object,
+ Builtin=object, InternalError=object, error=object, warning=object,
py_object_type=object, unspecified_type=object,
object_expr=object, fake_rhs_expr=object, TypedExprNode=object)
@@ -15,9 +15,9 @@ from . import PyrexTypes
from .Visitor import TreeVisitor, CythonTransform
from .Errors import error, warning, InternalError
-from .Optimize import ConstantFolding
-
+from .Optimize import ConstantFolding
+
class TypedExprNode(ExprNodes.ExprNode):
# Used for declaring assignments of a specified type without a known entry.
def __init__(self, type, may_be_none=None, pos=None):
@@ -256,7 +256,7 @@ class ControlFlow(object):
for entry in block.bounded:
block.i_kill |= self.assmts[entry].bit
- for assmts in self.assmts.values():
+ for assmts in self.assmts.values():
self.entry_point.i_gen |= assmts.bit
self.entry_point.i_output = self.entry_point.i_gen
@@ -486,11 +486,11 @@ class GV(object):
if annotate_defs:
for stat in block.stats:
if isinstance(stat, NameAssignment):
- label += '\n %s [%s %s]' % (
- stat.entry.name, 'deletion' if stat.is_deletion else 'definition', stat.pos[1])
+ label += '\n %s [%s %s]' % (
+ stat.entry.name, 'deletion' if stat.is_deletion else 'definition', stat.pos[1])
elif isinstance(stat, NameReference):
if stat.entry:
- label += '\n %s [reference %s]' % (stat.entry.name, stat.pos[1])
+ label += '\n %s [reference %s]' % (stat.entry.name, stat.pos[1])
if not label:
label = 'empty'
pid = ctx.nodeid(block)
@@ -505,16 +505,16 @@ class GV(object):
class MessageCollection(object):
"""Collect error/warnings messages first then sort"""
def __init__(self):
- self.messages = set()
+ self.messages = set()
def error(self, pos, message):
- self.messages.add((pos, True, message))
+ self.messages.add((pos, True, message))
def warning(self, pos, message):
- self.messages.add((pos, False, message))
+ self.messages.add((pos, False, message))
def report(self):
- for pos, is_error, message in sorted(self.messages):
+ for pos, is_error, message in sorted(self.messages):
if is_error:
error(pos, message)
else:
@@ -582,14 +582,14 @@ def check_definitions(flow, compiler_directives):
node.cf_maybe_null = False
# Find uninitialized references and cf-hints
- for node, entry in references.items():
+ for node, entry in references.items():
if Uninitialized in node.cf_state:
node.cf_maybe_null = True
if not entry.from_closure and len(node.cf_state) == 1:
node.cf_is_null = True
if (node.allow_null or entry.from_closure
- or entry.is_pyclass_attr or entry.type.is_error):
- pass # Can be uninitialized here
+ or entry.is_pyclass_attr or entry.type.is_error):
+ pass # Can be uninitialized here
elif node.cf_is_null:
if entry.error_on_uninitialized or (
Options.error_on_uninitialized and (
@@ -635,7 +635,7 @@ def check_definitions(flow, compiler_directives):
for entry in flow.entries:
if (not entry.cf_references
and not entry.is_pyclass_attr):
- if entry.name != '_' and not entry.name.startswith('unused'):
+ if entry.name != '_' and not entry.name.startswith('unused'):
# '_' is often used for unused variables, e.g. in loops
if entry.is_arg:
if warn_unused_arg:
@@ -675,7 +675,7 @@ class ControlFlowAnalysis(CythonTransform):
def visit_ModuleNode(self, node):
self.gv_ctx = GVContext()
- self.constant_folder = ConstantFolding()
+ self.constant_folder = ConstantFolding()
# Set of NameNode reductions
self.reductions = set()
@@ -778,13 +778,13 @@ class ControlFlowAnalysis(CythonTransform):
if entry is None: # TODO: This shouldn't happen...
return
self.flow.mark_assignment(lhs, rhs, entry)
- elif lhs.is_sequence_constructor:
- for i, arg in enumerate(lhs.args):
- if not rhs or arg.is_starred:
- item_node = None
- else:
- item_node = rhs.inferable_item_node(i)
- self.mark_assignment(arg, item_node)
+ elif lhs.is_sequence_constructor:
+ for i, arg in enumerate(lhs.args):
+ if not rhs or arg.is_starred:
+ item_node = None
+ else:
+ item_node = rhs.inferable_item_node(i)
+ self.mark_assignment(arg, item_node)
else:
self._visit(lhs)
@@ -832,7 +832,7 @@ class ControlFlowAnalysis(CythonTransform):
self.in_inplace_assignment = True
self.visitchildren(node)
self.in_inplace_assignment = False
- self.mark_assignment(node.lhs, self.constant_folder(node.create_binop_node()))
+ self.mark_assignment(node.lhs, self.constant_folder(node.create_binop_node()))
return node
def visit_DelStatNode(self, node):
@@ -843,8 +843,8 @@ class ControlFlowAnalysis(CythonTransform):
error(arg.pos,
"can not delete variable '%s' "
"referenced in nested scope" % entry.name)
- if not node.ignore_nonexisting:
- self._visit(arg) # mark reference
+ if not node.ignore_nonexisting:
+ self._visit(arg) # mark reference
self.flow.mark_deletion(arg, entry)
else:
self._visit(arg)
@@ -981,11 +981,11 @@ class ControlFlowAnalysis(CythonTransform):
for arg in sequence.args[:2]:
self.mark_assignment(target, arg)
if len(sequence.args) > 2:
- self.mark_assignment(target, self.constant_folder(
+ self.mark_assignment(target, self.constant_folder(
ExprNodes.binop_node(node.pos,
'+',
sequence.args[0],
- sequence.args[2])))
+ sequence.args[2])))
if not is_special:
# A for-loop basically translates to subsequent calls to
@@ -996,9 +996,9 @@ class ControlFlowAnalysis(CythonTransform):
self.mark_assignment(target, node.item)
- def visit_AsyncForStatNode(self, node):
- return self.visit_ForInStatNode(node)
-
+ def visit_AsyncForStatNode(self, node):
+ return self.visit_ForInStatNode(node)
+
def visit_ForInStatNode(self, node):
condition_block = self.flow.nextblock()
next_block = self.flow.newblock()
@@ -1010,9 +1010,9 @@ class ControlFlowAnalysis(CythonTransform):
if isinstance(node, Nodes.ForInStatNode):
self.mark_forloop_target(node)
- elif isinstance(node, Nodes.AsyncForStatNode):
- # not entirely correct, but good enough for now
- self.mark_assignment(node.target, node.item)
+ elif isinstance(node, Nodes.AsyncForStatNode):
+ # not entirely correct, but good enough for now
+ self.mark_assignment(node.target, node.item)
else: # Parallel
self.mark_assignment(node.target)
@@ -1090,8 +1090,8 @@ class ControlFlowAnalysis(CythonTransform):
self.flow.nextblock()
self.mark_assignment(node.target, node.bound1)
if node.step is not None:
- self.mark_assignment(node.target, self.constant_folder(
- ExprNodes.binop_node(node.pos, '+', node.bound1, node.step)))
+ self.mark_assignment(node.target, self.constant_folder(
+ ExprNodes.binop_node(node.pos, '+', node.bound1, node.step)))
# Body block
self.flow.nextblock()
self._visit(node.body)
@@ -1182,7 +1182,7 @@ class ControlFlowAnalysis(CythonTransform):
# Exception entry point
entry_point = self.flow.newblock()
self.flow.block = entry_point
- self._visit(node.finally_except_clause)
+ self._visit(node.finally_except_clause)
if self.flow.block and self.flow.exceptions:
self.flow.block.add_child(self.flow.exceptions[-1].entry_point)
diff --git a/contrib/tools/cython/Cython/Compiler/FusedNode.py b/contrib/tools/cython/Cython/Compiler/FusedNode.py
index 26d6ffd3d6..5b743b51f9 100644
--- a/contrib/tools/cython/Cython/Compiler/FusedNode.py
+++ b/contrib/tools/cython/Cython/Compiler/FusedNode.py
@@ -93,8 +93,8 @@ class FusedCFuncDefNode(StatListNode):
for cname, fused_to_specific in permutations:
copied_node = copy.deepcopy(self.node)
- # keep signature object identity for special casing in DefNode.analyse_declarations()
- copied_node.entry.signature = self.node.entry.signature
+ # keep signature object identity for special casing in DefNode.analyse_declarations()
+ copied_node.entry.signature = self.node.entry.signature
self._specialize_function_args(copied_node.args, fused_to_specific)
copied_node.return_type = self.node.return_type.specialize(
@@ -219,7 +219,7 @@ class FusedCFuncDefNode(StatListNode):
if arg.type.is_fused:
arg.type = arg.type.specialize(fused_to_specific)
if arg.type.is_memoryviewslice:
- arg.type.validate_memslice_dtype(arg.pos)
+ arg.type.validate_memslice_dtype(arg.pos)
def create_new_local_scope(self, node, env, f2s):
"""
@@ -281,14 +281,14 @@ class FusedCFuncDefNode(StatListNode):
"""
for specialized_type in normal_types:
# all_numeric = all_numeric and specialized_type.is_numeric
- pyx_code.context.update(
- py_type_name=specialized_type.py_type_name(),
- specialized_type_name=specialized_type.specialization_string,
- )
+ pyx_code.context.update(
+ py_type_name=specialized_type.py_type_name(),
+ specialized_type_name=specialized_type.specialization_string,
+ )
pyx_code.put_chunk(
u"""
- if isinstance(arg, {{py_type_name}}):
- dest_sig[{{dest_sig_idx}}] = '{{specialized_type_name}}'; break
+ if isinstance(arg, {{py_type_name}}):
+ dest_sig[{{dest_sig_idx}}] = '{{specialized_type_name}}'; break
""")
def _dtype_name(self, dtype):
@@ -418,27 +418,27 @@ class FusedCFuncDefNode(StatListNode):
to each specialization, which obtains the buffer each time and tries
to match the format string.
"""
- # The first thing to find a match in this loop breaks out of the loop
- pyx_code.put_chunk(
- u"""
+ # The first thing to find a match in this loop breaks out of the loop
+ pyx_code.put_chunk(
+ u"""
""" + (u"arg_is_pythran_compatible = False" if pythran_types else u"") + u"""
- if ndarray is not None:
- if isinstance(arg, ndarray):
- dtype = arg.dtype
+ if ndarray is not None:
+ if isinstance(arg, ndarray):
+ dtype = arg.dtype
""" + (u"arg_is_pythran_compatible = True" if pythran_types else u"") + u"""
- elif __pyx_memoryview_check(arg):
- arg_base = arg.base
- if isinstance(arg_base, ndarray):
- dtype = arg_base.dtype
- else:
- dtype = None
- else:
- dtype = None
-
- itemsize = -1
- if dtype is not None:
- itemsize = dtype.itemsize
- kind = ord(dtype.kind)
+ elif __pyx_memoryview_check(arg):
+ arg_base = arg.base
+ if isinstance(arg_base, ndarray):
+ dtype = arg_base.dtype
+ else:
+ dtype = None
+ else:
+ dtype = None
+
+ itemsize = -1
+ if dtype is not None:
+ itemsize = dtype.itemsize
+ kind = ord(dtype.kind)
dtype_signed = kind == 'i'
""")
pyx_code.indent(2)
@@ -463,13 +463,13 @@ class FusedCFuncDefNode(StatListNode):
else:
arg_is_pythran_compatible = not (arg.flags.f_contiguous and (<Py_ssize_t>arg.ndim) > 1)
""")
- pyx_code.named_insertion_point("numpy_dtype_checks")
+ pyx_code.named_insertion_point("numpy_dtype_checks")
self._buffer_check_numpy_dtype(pyx_code, buffer_types, pythran_types)
- pyx_code.dedent(2)
+ pyx_code.dedent(2)
- for specialized_type in buffer_types:
- self._buffer_parse_format_string_check(
- pyx_code, decl_code, specialized_type, env)
+ for specialized_type in buffer_types:
+ self._buffer_parse_format_string_check(
+ pyx_code, decl_code, specialized_type, env)
def _buffer_declarations(self, pyx_code, decl_code, all_buffer_types, pythran_types):
"""
@@ -535,23 +535,23 @@ class FusedCFuncDefNode(StatListNode):
Specialize fused types and split into normal types and buffer types.
"""
specialized_types = PyrexTypes.get_specialized_types(arg.type)
-
- # Prefer long over int, etc by sorting (see type classes in PyrexTypes.py)
- specialized_types.sort()
-
+
+ # Prefer long over int, etc by sorting (see type classes in PyrexTypes.py)
+ specialized_types.sort()
+
seen_py_type_names = set()
normal_types, buffer_types, pythran_types = [], [], []
- has_object_fallback = False
+ has_object_fallback = False
for specialized_type in specialized_types:
py_type_name = specialized_type.py_type_name()
if py_type_name:
if py_type_name in seen_py_type_names:
continue
seen_py_type_names.add(py_type_name)
- if py_type_name == 'object':
- has_object_fallback = True
- else:
- normal_types.append(specialized_type)
+ if py_type_name == 'object':
+ has_object_fallback = True
+ else:
+ normal_types.append(specialized_type)
elif specialized_type.is_pythran_expr:
pythran_types.append(specialized_type)
elif specialized_type.is_buffer or specialized_type.is_memoryviewslice:
@@ -620,7 +620,7 @@ class FusedCFuncDefNode(StatListNode):
# FIXME: use a typed signature - currently fails badly because
# default arguments inherit the types we specify here!
- dest_sig = [None] * {{n_fused}}
+ dest_sig = [None] * {{n_fused}}
if kwargs is not None and not kwargs:
kwargs = None
@@ -659,22 +659,22 @@ class FusedCFuncDefNode(StatListNode):
normal_types, buffer_types, pythran_types, has_object_fallback = self._split_fused_types(arg)
self._unpack_argument(pyx_code)
-
- # 'unrolled' loop, first match breaks out of it
- if pyx_code.indenter("while 1:"):
- if normal_types:
- self._fused_instance_checks(normal_types, pyx_code, env)
+
+ # 'unrolled' loop, first match breaks out of it
+ if pyx_code.indenter("while 1:"):
+ if normal_types:
+ self._fused_instance_checks(normal_types, pyx_code, env)
if buffer_types or pythran_types:
env.use_utility_code(Code.UtilityCode.load_cached("IsLittleEndian", "ModuleSetupCode.c"))
self._buffer_checks(buffer_types, pythran_types, pyx_code, decl_code, env)
- if has_object_fallback:
- pyx_code.context.update(specialized_type_name='object')
- pyx_code.putln(self.match)
- else:
- pyx_code.putln(self.no_match)
- pyx_code.putln("break")
- pyx_code.dedent()
-
+ if has_object_fallback:
+ pyx_code.context.update(specialized_type_name='object')
+ pyx_code.putln(self.match)
+ else:
+ pyx_code.putln(self.no_match)
+ pyx_code.putln("break")
+ pyx_code.dedent()
+
fused_index += 1
all_buffer_types.update(buffer_types)
all_buffer_types.update(ty.org_buffer for ty in pythran_types)
@@ -716,14 +716,14 @@ class FusedCFuncDefNode(StatListNode):
fragment_code = pyx_code.getvalue()
# print decl_code.getvalue()
# print fragment_code
- from .Optimize import ConstantFolding
- fragment = TreeFragment.TreeFragment(
- fragment_code, level='module', pipeline=[ConstantFolding()])
+ from .Optimize import ConstantFolding
+ fragment = TreeFragment.TreeFragment(
+ fragment_code, level='module', pipeline=[ConstantFolding()])
ast = TreeFragment.SetPosTransform(self.node.pos)(fragment.root)
UtilityCode.declare_declarations_in_scope(
decl_code.getvalue(), env.global_scope())
ast.scope = env
- # FIXME: for static methods of cdef classes, we build the wrong signature here: first arg becomes 'self'
+ # FIXME: for static methods of cdef classes, we build the wrong signature here: first arg becomes 'self'
ast.analyse_declarations(env)
py_func = ast.stats[-1] # the DefNode
self.fragment_scope = ast.scope
@@ -806,7 +806,7 @@ class FusedCFuncDefNode(StatListNode):
if self.py_func:
args = [CloneNode(default) for default in defaults if default]
self.defaults_tuple = TupleNode(self.pos, args=args)
- self.defaults_tuple = self.defaults_tuple.analyse_types(env, skip_children=True).coerce_to_pyobject(env)
+ self.defaults_tuple = self.defaults_tuple.analyse_types(env, skip_children=True).coerce_to_pyobject(env)
self.defaults_tuple = ProxyNode(self.defaults_tuple)
self.code_object = ProxyNode(self.specialized_pycfuncs[0].code_object)
@@ -829,15 +829,15 @@ class FusedCFuncDefNode(StatListNode):
else:
nodes = self.nodes
- signatures = [StringEncoding.EncodedString(node.specialized_signature_string)
- for node in nodes]
+ signatures = [StringEncoding.EncodedString(node.specialized_signature_string)
+ for node in nodes]
keys = [ExprNodes.StringNode(node.pos, value=sig)
- for node, sig in zip(nodes, signatures)]
- values = [ExprNodes.PyCFunctionNode.from_defnode(node, binding=True)
- for node in nodes]
-
- self.__signatures__ = ExprNodes.DictNode.from_pairs(self.pos, zip(keys, values))
+ for node, sig in zip(nodes, signatures)]
+ values = [ExprNodes.PyCFunctionNode.from_defnode(node, binding=True)
+ for node in nodes]
+ self.__signatures__ = ExprNodes.DictNode.from_pairs(self.pos, zip(keys, values))
+
self.specialized_pycfuncs = values
for pycfuncnode in values:
pycfuncnode.is_specialization = True
diff --git a/contrib/tools/cython/Cython/Compiler/Future.py b/contrib/tools/cython/Cython/Compiler/Future.py
index 848792e00b..af9f55260e 100644
--- a/contrib/tools/cython/Cython/Compiler/Future.py
+++ b/contrib/tools/cython/Cython/Compiler/Future.py
@@ -4,12 +4,12 @@ def _get_feature(name):
return getattr(__future__, name, object())
unicode_literals = _get_feature("unicode_literals")
-with_statement = _get_feature("with_statement") # dummy
+with_statement = _get_feature("with_statement") # dummy
division = _get_feature("division")
print_function = _get_feature("print_function")
absolute_import = _get_feature("absolute_import")
nested_scopes = _get_feature("nested_scopes") # dummy
generators = _get_feature("generators") # dummy
-generator_stop = _get_feature("generator_stop")
+generator_stop = _get_feature("generator_stop")
del _get_feature
diff --git a/contrib/tools/cython/Cython/Compiler/Lexicon.py b/contrib/tools/cython/Cython/Compiler/Lexicon.py
index 72c9ceaefd..f88cfa8d5a 100644
--- a/contrib/tools/cython/Cython/Compiler/Lexicon.py
+++ b/contrib/tools/cython/Cython/Compiler/Lexicon.py
@@ -3,11 +3,11 @@
# Cython Scanner - Lexical Definitions
#
-from __future__ import absolute_import, unicode_literals
+from __future__ import absolute_import, unicode_literals
raw_prefixes = "rR"
bytes_prefixes = "bB"
-string_prefixes = "fFuU" + bytes_prefixes
+string_prefixes = "fFuU" + bytes_prefixes
char_prefixes = "cC"
any_string_prefix = raw_prefixes + string_prefixes + char_prefixes
IDENT = 'IDENT'
@@ -26,25 +26,25 @@ def make_lexicon():
hexdigit = Any("0123456789ABCDEFabcdef")
indentation = Bol + Rep(Any(" \t"))
- def underscore_digits(d):
- return Rep1(d) + Rep(Str("_") + Rep1(d))
-
- decimal = underscore_digits(digit)
+ def underscore_digits(d):
+ return Rep1(d) + Rep(Str("_") + Rep1(d))
+
+ decimal = underscore_digits(digit)
dot = Str(".")
exponent = Any("Ee") + Opt(Any("+-")) + decimal
decimal_fract = (decimal + dot + Opt(decimal)) | (dot + decimal)
name = letter + Rep(letter | digit)
- intconst = decimal | (Str("0") + ((Any("Xx") + underscore_digits(hexdigit)) |
- (Any("Oo") + underscore_digits(octdigit)) |
- (Any("Bb") + underscore_digits(bindigit)) ))
+ intconst = decimal | (Str("0") + ((Any("Xx") + underscore_digits(hexdigit)) |
+ (Any("Oo") + underscore_digits(octdigit)) |
+ (Any("Bb") + underscore_digits(bindigit)) ))
intsuffix = (Opt(Any("Uu")) + Opt(Any("Ll")) + Opt(Any("Ll"))) | (Opt(Any("Ll")) + Opt(Any("Ll")) + Opt(Any("Uu")))
intliteral = intconst + intsuffix
fltconst = (decimal_fract + Opt(exponent)) | (decimal + exponent)
imagconst = (intconst | fltconst) + Any("jJ")
- # invalid combinations of prefixes are caught in p_string_literal
- beginstring = Opt(Rep(Any(string_prefixes + raw_prefixes)) |
+ # invalid combinations of prefixes are caught in p_string_literal
+ beginstring = Opt(Rep(Any(string_prefixes + raw_prefixes)) |
Any(char_prefixes)
) + (Str("'") | Str('"') | Str("'''") | Str('"""'))
two_oct = octdigit + octdigit
@@ -70,9 +70,9 @@ def make_lexicon():
return Lexicon([
(name, IDENT),
- (intliteral, Method('strip_underscores', symbol='INT')),
- (fltconst, Method('strip_underscores', symbol='FLOAT')),
- (imagconst, Method('strip_underscores', symbol='IMAG')),
+ (intliteral, Method('strip_underscores', symbol='INT')),
+ (fltconst, Method('strip_underscores', symbol='FLOAT')),
+ (imagconst, Method('strip_underscores', symbol='IMAG')),
(punct | diphthong, TEXT),
(bra, Method('open_bracket_action')),
diff --git a/contrib/tools/cython/Cython/Compiler/Main.py b/contrib/tools/cython/Cython/Compiler/Main.py
index af873843b5..78b5131e6e 100644
--- a/contrib/tools/cython/Cython/Compiler/Main.py
+++ b/contrib/tools/cython/Cython/Compiler/Main.py
@@ -7,39 +7,39 @@ from __future__ import absolute_import
import os
import re
import sys
-import io
+import io
if sys.version_info[:2] < (2, 6) or (3, 0) <= sys.version_info[:2] < (3, 3):
sys.stderr.write("Sorry, Cython requires Python 2.6+ or 3.3+, found %d.%d\n" % tuple(sys.version_info[:2]))
sys.exit(1)
-try:
- from __builtin__ import basestring
-except ImportError:
- basestring = str
-
+try:
+ from __builtin__ import basestring
+except ImportError:
+ basestring = str
+
# Do not import Parsing here, import it when needed, because Parsing imports
# Nodes, which globally needs debug command line options initialized to set a
# conditional metaclass. These options are processed by CmdLine called from
# main() in this file.
# import Parsing
from . import Errors
-from .StringEncoding import EncodedString
+from .StringEncoding import EncodedString
from .Scanning import PyrexScanner, FileSourceDescriptor
from .Errors import PyrexError, CompileError, error, warning
from .Symtab import ModuleScope
from .. import Utils
from . import Options
-from . import Version # legacy import needed by old PyTables versions
-version = Version.version # legacy attribute - use "Cython.__version__" instead
-
+from . import Version # legacy import needed by old PyTables versions
+version = Version.version # legacy attribute - use "Cython.__version__" instead
+
module_name_pattern = re.compile(r"[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$")
verbose = 0
-standard_include_path = os.path.abspath(os.path.join(os.path.dirname(__file__),
- os.path.pardir, 'Includes'))
+standard_include_path = os.path.abspath(os.path.join(os.path.dirname(__file__),
+ os.path.pardir, 'Includes'))
class CompilationData(object):
# Bundles the information that is passed from transform to transform.
@@ -69,10 +69,10 @@ class Context(object):
# language_level int currently 2 or 3 for Python 2/3
cython_scope = None
- language_level = None # warn when not set but default to Py2
+ language_level = None # warn when not set but default to Py2
def __init__(self, include_directories, compiler_directives, cpp=False,
- language_level=None, options=None):
+ language_level=None, options=None):
# cython_scope is a hack, set to False by subclasses, in order to break
# an infinite loop.
# Better code organization would fix it.
@@ -87,51 +87,51 @@ class Context(object):
self.cpp = cpp
self.options = options
- self.pxds = {} # full name -> node tree
- self._interned = {} # (type(value), value, *key_args) -> interned_value
+ self.pxds = {} # full name -> node tree
+ self._interned = {} # (type(value), value, *key_args) -> interned_value
- if language_level is not None:
- self.set_language_level(language_level)
+ if language_level is not None:
+ self.set_language_level(language_level)
self.gdb_debug_outputwriter = None
def set_language_level(self, level):
- from .Future import print_function, unicode_literals, absolute_import, division
- future_directives = set()
- if level == '3str':
- level = 3
- else:
- level = int(level)
- if level >= 3:
- future_directives.add(unicode_literals)
- if level >= 3:
- future_directives.update([print_function, absolute_import, division])
+ from .Future import print_function, unicode_literals, absolute_import, division
+ future_directives = set()
+ if level == '3str':
+ level = 3
+ else:
+ level = int(level)
+ if level >= 3:
+ future_directives.add(unicode_literals)
+ if level >= 3:
+ future_directives.update([print_function, absolute_import, division])
self.language_level = level
- self.future_directives = future_directives
+ self.future_directives = future_directives
if level >= 3:
self.modules['builtins'] = self.modules['__builtin__']
- def intern_ustring(self, value, encoding=None):
- key = (EncodedString, value, encoding)
- try:
- return self._interned[key]
- except KeyError:
- pass
- value = EncodedString(value)
- if encoding:
- value.encoding = encoding
- self._interned[key] = value
- return value
-
- def intern_value(self, value, *key):
- key = (type(value), value) + key
- try:
- return self._interned[key]
- except KeyError:
- pass
- self._interned[key] = value
- return value
-
+ def intern_ustring(self, value, encoding=None):
+ key = (EncodedString, value, encoding)
+ try:
+ return self._interned[key]
+ except KeyError:
+ pass
+ value = EncodedString(value)
+ if encoding:
+ value.encoding = encoding
+ self._interned[key] = value
+ return value
+
+ def intern_value(self, value, *key):
+ key = (type(value), value) + key
+ try:
+ return self._interned[key]
+ except KeyError:
+ pass
+ self._interned[key] = value
+ return value
+
# pipeline creation functions can now be found in Pipeline.py
def process_pxd(self, source_desc, scope, module_name):
@@ -149,8 +149,8 @@ class Context(object):
def nonfatal_error(self, exc):
return Errors.report_error(exc)
- def find_module(self, module_name, relative_to=None, pos=None, need_pxd=1,
- absolute_fallback=True):
+ def find_module(self, module_name, relative_to=None, pos=None, need_pxd=1,
+ absolute_fallback=True):
# Finds and returns the module scope corresponding to
# the given relative or absolute module name. If this
# is the first time the module has been requested, finds
@@ -161,27 +161,27 @@ class Context(object):
debug_find_module = 0
if debug_find_module:
print("Context.find_module: module_name = %s, relative_to = %s, pos = %s, need_pxd = %s" % (
- module_name, relative_to, pos, need_pxd))
+ module_name, relative_to, pos, need_pxd))
scope = None
pxd_pathname = None
if relative_to:
- if module_name:
- # from .module import ...
- qualified_name = relative_to.qualify_name(module_name)
- else:
- # from . import ...
- qualified_name = relative_to.qualified_name
- scope = relative_to
- relative_to = None
- else:
- qualified_name = module_name
-
- if not module_name_pattern.match(qualified_name):
- raise CompileError(pos or (module_name, 0, 0),
- "'%s' is not a valid module name" % module_name)
-
- if relative_to:
+ if module_name:
+ # from .module import ...
+ qualified_name = relative_to.qualify_name(module_name)
+ else:
+ # from . import ...
+ qualified_name = relative_to.qualified_name
+ scope = relative_to
+ relative_to = None
+ else:
+ qualified_name = module_name
+
+ if not module_name_pattern.match(qualified_name):
+ raise CompileError(pos or (module_name, 0, 0),
+ "'%s' is not a valid module name" % module_name)
+
+ if relative_to:
if debug_find_module:
print("...trying relative import")
scope = relative_to.lookup_submodule(module_name)
@@ -192,12 +192,12 @@ class Context(object):
if not scope:
if debug_find_module:
print("...trying absolute import")
- if absolute_fallback:
- qualified_name = module_name
+ if absolute_fallback:
+ qualified_name = module_name
scope = self
- for name in qualified_name.split("."):
+ for name in qualified_name.split("."):
scope = scope.find_submodule(name)
-
+
if debug_find_module:
print("...scope = %s" % scope)
if not scope.pxd_file_loaded:
@@ -210,16 +210,16 @@ class Context(object):
if debug_find_module:
print("......found %s" % pxd_pathname)
if not pxd_pathname and need_pxd:
- # Set pxd_file_loaded such that we don't need to
- # look for the non-existing pxd file next time.
- scope.pxd_file_loaded = True
- package_pathname = self.search_include_directories(qualified_name, ".py", pos)
+ # Set pxd_file_loaded such that we don't need to
+ # look for the non-existing pxd file next time.
+ scope.pxd_file_loaded = True
+ package_pathname = self.search_include_directories(qualified_name, ".py", pos)
if package_pathname and package_pathname.endswith('__init__.py'):
pass
else:
- error(pos, "'%s.pxd' not found" % qualified_name.replace('.', os.sep))
+ error(pos, "'%s.pxd' not found" % qualified_name.replace('.', os.sep))
if pxd_pathname:
- scope.pxd_file_loaded = True
+ scope.pxd_file_loaded = True
try:
if debug_find_module:
print("Context.find_module: Parsing %s" % pxd_pathname)
@@ -229,7 +229,7 @@ class Context(object):
if Options.source_root:
rel_path = os.path.relpath(pxd_pathname, Options.source_root)
source_desc = FileSourceDescriptor(pxd_pathname, rel_path)
- err, result = self.process_pxd(source_desc, scope, qualified_name)
+ err, result = self.process_pxd(source_desc, scope, qualified_name)
if err:
raise err
(pxd_codenodes, pxd_scope) = result
@@ -239,15 +239,15 @@ class Context(object):
return scope
def find_pxd_file(self, qualified_name, pos, sys_path=False):
- # Search include path (and sys.path if sys_path is True) for
- # the .pxd file corresponding to the given fully-qualified
- # module name.
+ # Search include path (and sys.path if sys_path is True) for
+ # the .pxd file corresponding to the given fully-qualified
+ # module name.
# Will find either a dotted filename or a file in a
# package directory. If a source file position is given,
# the directory containing the source file is searched first
# for a dotted filename, and its containing package root
# directory is searched first for a non-dotted filename.
- pxd = self.search_include_directories(qualified_name, ".pxd", pos, sys_path=sys_path)
+ pxd = self.search_include_directories(qualified_name, ".pxd", pos, sys_path=sys_path)
if pxd is None: # XXX Keep this until Includes/Deprecated is removed
if (qualified_name.startswith('python') or
qualified_name in ('stdlib', 'stdio', 'stl')):
@@ -287,13 +287,13 @@ class Context(object):
def search_include_directories(self, qualified_name, suffix, pos,
include=False, sys_path=False):
- include_dirs = self.include_directories
- if sys_path:
- include_dirs = include_dirs + sys.path
- # include_dirs must be hashable for caching in @cached_function
- include_dirs = tuple(include_dirs + [standard_include_path])
- return search_include_directories(include_dirs, qualified_name,
- suffix, pos, include)
+ include_dirs = self.include_directories
+ if sys_path:
+ include_dirs = include_dirs + sys.path
+ # include_dirs must be hashable for caching in @cached_function
+ include_dirs = tuple(include_dirs + [standard_include_path])
+ return search_include_directories(include_dirs, qualified_name,
+ suffix, pos, include)
def find_root_package_dir(self, file_path):
return Utils.find_root_package_dir(file_path)
@@ -301,10 +301,10 @@ class Context(object):
def check_package_dir(self, dir, package_names):
return Utils.check_package_dir(dir, tuple(package_names))
- def c_file_out_of_date(self, source_path, output_path):
- if not os.path.exists(output_path):
+ def c_file_out_of_date(self, source_path, output_path):
+ if not os.path.exists(output_path):
return 1
- c_time = Utils.modification_time(output_path)
+ c_time = Utils.modification_time(output_path)
if Utils.file_newer_than(source_path, c_time):
return 1
pos = [source_path]
@@ -362,44 +362,44 @@ class Context(object):
# Parse the given source file and return a parse tree.
num_errors = Errors.num_errors
try:
- with Utils.open_source_file(source_filename) as f:
+ with Utils.open_source_file(source_filename) as f:
from . import Parsing
s = PyrexScanner(f, source_desc, source_encoding = f.encoding,
scope = scope, context = self)
tree = Parsing.p_module(s, pxd, full_module_name)
- if self.options.formal_grammar:
- try:
- from ..Parser import ConcreteSyntaxTree
- except ImportError:
- raise RuntimeError(
+ if self.options.formal_grammar:
+ try:
+ from ..Parser import ConcreteSyntaxTree
+ except ImportError:
+ raise RuntimeError(
"Formal grammar can only be used with compiled Cython with an available pgen.")
- ConcreteSyntaxTree.p_module(source_filename)
- except UnicodeDecodeError as e:
+ ConcreteSyntaxTree.p_module(source_filename)
+ except UnicodeDecodeError as e:
#import traceback
#traceback.print_exc()
- raise self._report_decode_error(source_desc, e)
-
- if Errors.num_errors > num_errors:
- raise CompileError()
- return tree
-
- def _report_decode_error(self, source_desc, exc):
- msg = exc.args[-1]
- position = exc.args[2]
- encoding = exc.args[0]
-
- line = 1
- column = idx = 0
- with io.open(source_desc.filename, "r", encoding='iso8859-1', newline='') as f:
- for line, data in enumerate(f, 1):
- idx += len(data)
- if idx >= position:
- column = position - (idx - len(data)) + 1
+ raise self._report_decode_error(source_desc, e)
+
+ if Errors.num_errors > num_errors:
+ raise CompileError()
+ return tree
+
+ def _report_decode_error(self, source_desc, exc):
+ msg = exc.args[-1]
+ position = exc.args[2]
+ encoding = exc.args[0]
+
+ line = 1
+ column = idx = 0
+ with io.open(source_desc.filename, "r", encoding='iso8859-1', newline='') as f:
+ for line, data in enumerate(f, 1):
+ idx += len(data)
+ if idx >= position:
+ column = position - (idx - len(data)) + 1
break
- return error((source_desc, line, column),
- "Decoding error, missing or incorrect coding=<encoding-name> "
- "at top of source (cannot decode with encoding %r: %s)" % (encoding, msg))
+ return error((source_desc, line, column),
+ "Decoding error, missing or incorrect coding=<encoding-name> "
+ "at top of source (cannot decode with encoding %r: %s)" % (encoding, msg))
def extract_module_name(self, path, options):
# Find fully_qualified module name from the full pathname
@@ -419,9 +419,9 @@ class Context(object):
return ".".join(names)
def setup_errors(self, options, result):
- Errors.reset() # clear any remaining error state
+ Errors.reset() # clear any remaining error state
if options.use_listing_file:
- path = result.listing_file = Utils.replace_suffix(result.main_source_file, ".lis")
+ path = result.listing_file = Utils.replace_suffix(result.main_source_file, ".lis")
else:
path = None
Errors.open_listing_file(path=path,
@@ -443,30 +443,30 @@ class Context(object):
result.c_file = None
-def get_output_filename(source_filename, cwd, options):
- if options.cplus:
- c_suffix = ".cpp"
- else:
- c_suffix = ".c"
- suggested_file_name = Utils.replace_suffix(source_filename, c_suffix)
- if options.output_file:
- out_path = os.path.join(cwd, options.output_file)
- if os.path.isdir(out_path):
- return os.path.join(out_path, os.path.basename(suggested_file_name))
- else:
- return out_path
- else:
- return suggested_file_name
-
+def get_output_filename(source_filename, cwd, options):
+ if options.cplus:
+ c_suffix = ".cpp"
+ else:
+ c_suffix = ".c"
+ suggested_file_name = Utils.replace_suffix(source_filename, c_suffix)
+ if options.output_file:
+ out_path = os.path.join(cwd, options.output_file)
+ if os.path.isdir(out_path):
+ return os.path.join(out_path, os.path.basename(suggested_file_name))
+ else:
+ return out_path
+ else:
+ return suggested_file_name
+
def create_default_resultobj(compilation_source, options):
result = CompilationResult()
result.main_source_file = compilation_source.source_desc.filename
result.compilation_source = compilation_source
source_desc = compilation_source.source_desc
- result.c_file = get_output_filename(source_desc.filename,
- compilation_source.cwd, options)
- result.embedded_metadata = options.embedded_metadata
+ result.c_file = get_output_filename(source_desc.filename,
+ compilation_source.cwd, options)
+ result.embedded_metadata = options.embedded_metadata
return result
@@ -481,10 +481,10 @@ def run_pipeline(source, options, full_module_name=None, context=None):
# Set up source object
cwd = os.getcwd()
abs_path = os.path.abspath(source)
- full_module_name = full_module_name or options.module_name or context.extract_module_name(source, options)
-
- Utils.raise_error_if_module_name_forbidden(full_module_name)
+ full_module_name = full_module_name or options.module_name or context.extract_module_name(source, options)
+ Utils.raise_error_if_module_name_forbidden(full_module_name)
+
if options.relative_path_in_code_position_comments:
rel_path = full_module_name.replace('.', os.sep) + source_ext
if not abs_path.endswith(rel_path):
@@ -503,9 +503,9 @@ def run_pipeline(source, options, full_module_name=None, context=None):
# By default, decide based on whether an html file already exists.
html_filename = os.path.splitext(result.c_file)[0] + ".html"
if os.path.exists(html_filename):
- with io.open(html_filename, "r", encoding="UTF-8") as html_file:
- if u'<!-- Generated by Cython' in html_file.read(100):
- options.annotate = True
+ with io.open(html_filename, "r", encoding="UTF-8") as html_file:
+ if u'<!-- Generated by Cython' in html_file.read(100):
+ options.annotate = True
# Get pipeline
if source_ext.lower() == '.py' or not source_ext:
@@ -537,10 +537,10 @@ class CompilationSource(object):
class CompilationOptions(object):
- r"""
- See default_options at the end of this module for a list of all possible
- options and CmdLine.usage and CmdLine.parse_command_line() for their
- meaning.
+ r"""
+ See default_options at the end of this module for a list of all possible
+ options and CmdLine.usage and CmdLine.parse_command_line() for their
+ meaning.
"""
def __init__(self, defaults=None, **kw):
self.include_path = []
@@ -559,15 +559,15 @@ class CompilationOptions(object):
# ignore valid options that are not in the defaults
unknown_options.difference_update(['include_path'])
if unknown_options:
- message = "got unknown compilation option%s, please remove: %s" % (
+ message = "got unknown compilation option%s, please remove: %s" % (
's' if len(unknown_options) > 1 else '',
- ', '.join(unknown_options))
+ ', '.join(unknown_options))
raise ValueError(message)
- directive_defaults = Options.get_directive_defaults()
- directives = dict(options['compiler_directives']) # copy mutable field
+ directive_defaults = Options.get_directive_defaults()
+ directives = dict(options['compiler_directives']) # copy mutable field
# check for invalid directives
- unknown_directives = set(directives) - set(directive_defaults)
+ unknown_directives = set(directives) - set(directive_defaults)
if unknown_directives:
message = "got unknown compiler directive%s: %s" % (
's' if len(unknown_directives) > 1 else '',
@@ -579,13 +579,13 @@ class CompilationOptions(object):
warnings.warn("C++ mode forced when in Pythran mode!")
options['cplus'] = True
if 'language_level' in directives and 'language_level' not in kw:
- options['language_level'] = directives['language_level']
- elif not options.get('language_level'):
- options['language_level'] = directive_defaults.get('language_level')
- if 'formal_grammar' in directives and 'formal_grammar' not in kw:
- options['formal_grammar'] = directives['formal_grammar']
- if options['cache'] is True:
- options['cache'] = os.path.join(Utils.get_cython_cache_dir(), 'compiler')
+ options['language_level'] = directives['language_level']
+ elif not options.get('language_level'):
+ options['language_level'] = directive_defaults.get('language_level')
+ if 'formal_grammar' in directives and 'formal_grammar' not in kw:
+ options['formal_grammar'] = directives['formal_grammar']
+ if options['cache'] is True:
+ options['cache'] = os.path.join(Utils.get_cython_cache_dir(), 'compiler')
self.__dict__.update(options)
@@ -598,84 +598,84 @@ class CompilationOptions(object):
return Context(self.include_path, self.compiler_directives,
self.cplus, self.language_level, options=self)
- def get_fingerprint(self):
- r"""
- Return a string that contains all the options that are relevant for cache invalidation.
- """
- # Collect only the data that can affect the generated file(s).
- data = {}
-
- for key, value in self.__dict__.items():
- if key in ['show_version', 'errors_to_stderr', 'verbose', 'quiet']:
- # verbosity flags have no influence on the compilation result
- continue
- elif key in ['output_file', 'output_dir']:
- # ignore the exact name of the output file
- continue
- elif key in ['timestamps']:
- # the cache cares about the content of files, not about the timestamps of sources
- continue
- elif key in ['cache']:
- # hopefully caching has no influence on the compilation result
- continue
- elif key in ['compiler_directives']:
- # directives passed on to the C compiler do not influence the generated C code
- continue
- elif key in ['include_path']:
- # this path changes which headers are tracked as dependencies,
- # it has no influence on the generated C code
- continue
- elif key in ['working_path']:
- # this path changes where modules and pxd files are found;
- # their content is part of the fingerprint anyway, their
- # absolute path does not matter
- continue
- elif key in ['create_extension']:
- # create_extension() has already mangled the options, e.g.,
- # embedded_metadata, when the fingerprint is computed so we
- # ignore it here.
- continue
- elif key in ['build_dir']:
- # the (temporary) directory where we collect dependencies
- # has no influence on the C output
- continue
- elif key in ['use_listing_file', 'generate_pxi', 'annotate', 'annotate_coverage_xml']:
- # all output files are contained in the cache so the types of
- # files generated must be part of the fingerprint
- data[key] = value
- elif key in ['formal_grammar', 'evaluate_tree_assertions']:
- # these bits can change whether compilation to C passes/fails
- data[key] = value
- elif key in ['embedded_metadata', 'emit_linenums', 'c_line_in_traceback', 'gdb_debug', 'relative_path_in_code_position_comments']:
- # the generated code contains additional bits when these are set
- data[key] = value
- elif key in ['cplus', 'language_level', 'compile_time_env', 'np_pythran']:
- # assorted bits that, e.g., influence the parser
- data[key] = value
- elif key == ['capi_reexport_cincludes']:
- if self.capi_reexport_cincludes:
- # our caching implementation does not yet include fingerprints of all the header files
- raise NotImplementedError('capi_reexport_cincludes is not compatible with Cython caching')
- elif key == ['common_utility_include_dir']:
- if self.common_utility_include_dir:
- raise NotImplementedError('common_utility_include_dir is not compatible with Cython caching yet')
- else:
- # any unexpected option should go into the fingerprint; it's better
- # to recompile than to return incorrect results from the cache.
- data[key] = value
-
- def to_fingerprint(item):
- r"""
- Recursively turn item into a string, turning dicts into lists with
- deterministic ordering.
- """
- if isinstance(item, dict):
- item = sorted([(repr(key), to_fingerprint(value)) for key, value in item.items()])
- return repr(item)
-
- return to_fingerprint(data)
-
-
+ def get_fingerprint(self):
+ r"""
+ Return a string that contains all the options that are relevant for cache invalidation.
+ """
+ # Collect only the data that can affect the generated file(s).
+ data = {}
+
+ for key, value in self.__dict__.items():
+ if key in ['show_version', 'errors_to_stderr', 'verbose', 'quiet']:
+ # verbosity flags have no influence on the compilation result
+ continue
+ elif key in ['output_file', 'output_dir']:
+ # ignore the exact name of the output file
+ continue
+ elif key in ['timestamps']:
+ # the cache cares about the content of files, not about the timestamps of sources
+ continue
+ elif key in ['cache']:
+ # hopefully caching has no influence on the compilation result
+ continue
+ elif key in ['compiler_directives']:
+ # directives passed on to the C compiler do not influence the generated C code
+ continue
+ elif key in ['include_path']:
+ # this path changes which headers are tracked as dependencies,
+ # it has no influence on the generated C code
+ continue
+ elif key in ['working_path']:
+ # this path changes where modules and pxd files are found;
+ # their content is part of the fingerprint anyway, their
+ # absolute path does not matter
+ continue
+ elif key in ['create_extension']:
+ # create_extension() has already mangled the options, e.g.,
+ # embedded_metadata, when the fingerprint is computed so we
+ # ignore it here.
+ continue
+ elif key in ['build_dir']:
+ # the (temporary) directory where we collect dependencies
+ # has no influence on the C output
+ continue
+ elif key in ['use_listing_file', 'generate_pxi', 'annotate', 'annotate_coverage_xml']:
+ # all output files are contained in the cache so the types of
+ # files generated must be part of the fingerprint
+ data[key] = value
+ elif key in ['formal_grammar', 'evaluate_tree_assertions']:
+ # these bits can change whether compilation to C passes/fails
+ data[key] = value
+ elif key in ['embedded_metadata', 'emit_linenums', 'c_line_in_traceback', 'gdb_debug', 'relative_path_in_code_position_comments']:
+ # the generated code contains additional bits when these are set
+ data[key] = value
+ elif key in ['cplus', 'language_level', 'compile_time_env', 'np_pythran']:
+ # assorted bits that, e.g., influence the parser
+ data[key] = value
+ elif key == ['capi_reexport_cincludes']:
+ if self.capi_reexport_cincludes:
+ # our caching implementation does not yet include fingerprints of all the header files
+ raise NotImplementedError('capi_reexport_cincludes is not compatible with Cython caching')
+ elif key == ['common_utility_include_dir']:
+ if self.common_utility_include_dir:
+ raise NotImplementedError('common_utility_include_dir is not compatible with Cython caching yet')
+ else:
+ # any unexpected option should go into the fingerprint; it's better
+ # to recompile than to return incorrect results from the cache.
+ data[key] = value
+
+ def to_fingerprint(item):
+ r"""
+ Recursively turn item into a string, turning dicts into lists with
+ deterministic ordering.
+ """
+ if isinstance(item, dict):
+ item = sorted([(repr(key), to_fingerprint(value)) for key, value in item.items()])
+ return repr(item)
+
+ return to_fingerprint(data)
+
+
class CompilationResult(object):
"""
Results from the Cython compiler:
@@ -745,14 +745,14 @@ def compile_multiple(sources, options):
timestamps = options.timestamps
verbose = options.verbose
context = None
- cwd = os.getcwd()
+ cwd = os.getcwd()
for source in sources:
if source not in processed:
if context is None:
context = options.create_context()
- output_filename = get_output_filename(source, cwd, options)
- out_of_date = context.c_file_out_of_date(source, output_filename)
- if (not timestamps) or out_of_date:
+ output_filename = get_output_filename(source, cwd, options)
+ out_of_date = context.c_file_out_of_date(source, output_filename)
+ if (not timestamps) or out_of_date:
if verbose:
sys.stderr.write("Compiling %s\n" % source)
@@ -782,71 +782,71 @@ def compile(source, options = None, full_module_name = None, **kwds):
return compile_multiple(source, options)
-@Utils.cached_function
-def search_include_directories(dirs, qualified_name, suffix, pos, include=False):
- """
- Search the list of include directories for the given file name.
-
- If a source file position is given, first searches the directory
- containing that file. Returns None if not found, but does not
- report an error.
-
- The 'include' option will disable package dereferencing.
- """
-
- if pos:
- file_desc = pos[0]
- if not isinstance(file_desc, FileSourceDescriptor):
- raise RuntimeError("Only file sources for code supported")
- if include:
- dirs = (os.path.dirname(file_desc.filename),) + dirs
- else:
- dirs = (Utils.find_root_package_dir(file_desc.filename),) + dirs
-
- dotted_filename = qualified_name
- if suffix:
- dotted_filename += suffix
-
- if not include:
- names = qualified_name.split('.')
- package_names = tuple(names[:-1])
- module_name = names[-1]
- module_filename = module_name + suffix
- package_filename = "__init__" + suffix
-
- for dirname in dirs:
- path = os.path.join(dirname, dotted_filename)
- if os.path.exists(path):
- return path
-
- if not include:
- package_dir = Utils.check_package_dir(dirname, package_names)
- if package_dir is not None:
- path = os.path.join(package_dir, module_filename)
- if os.path.exists(path):
- return path
- path = os.path.join(package_dir, module_name,
- package_filename)
- if os.path.exists(path):
- return path
-
- # Arcadia-specific lookup: search for packages in include paths,
- # ignoring existence of __init__.py files as packages markers
- # (they are not required by Arcadia build system)
- if not include:
- for dir in dirs:
- package_dir = os.path.join(dir, *package_names)
- path = os.path.join(package_dir, module_filename)
- if os.path.exists(path):
- return path
- path = os.path.join(dir, package_dir, module_name,
- package_filename)
- if os.path.exists(path):
- return path
-
- return None
-
-
+@Utils.cached_function
+def search_include_directories(dirs, qualified_name, suffix, pos, include=False):
+ """
+ Search the list of include directories for the given file name.
+
+ If a source file position is given, first searches the directory
+ containing that file. Returns None if not found, but does not
+ report an error.
+
+ The 'include' option will disable package dereferencing.
+ """
+
+ if pos:
+ file_desc = pos[0]
+ if not isinstance(file_desc, FileSourceDescriptor):
+ raise RuntimeError("Only file sources for code supported")
+ if include:
+ dirs = (os.path.dirname(file_desc.filename),) + dirs
+ else:
+ dirs = (Utils.find_root_package_dir(file_desc.filename),) + dirs
+
+ dotted_filename = qualified_name
+ if suffix:
+ dotted_filename += suffix
+
+ if not include:
+ names = qualified_name.split('.')
+ package_names = tuple(names[:-1])
+ module_name = names[-1]
+ module_filename = module_name + suffix
+ package_filename = "__init__" + suffix
+
+ for dirname in dirs:
+ path = os.path.join(dirname, dotted_filename)
+ if os.path.exists(path):
+ return path
+
+ if not include:
+ package_dir = Utils.check_package_dir(dirname, package_names)
+ if package_dir is not None:
+ path = os.path.join(package_dir, module_filename)
+ if os.path.exists(path):
+ return path
+ path = os.path.join(package_dir, module_name,
+ package_filename)
+ if os.path.exists(path):
+ return path
+
+ # Arcadia-specific lookup: search for packages in include paths,
+ # ignoring existence of __init__.py files as packages markers
+ # (they are not required by Arcadia build system)
+ if not include:
+ for dir in dirs:
+ package_dir = os.path.join(dir, *package_names)
+ path = os.path.join(package_dir, module_filename)
+ if os.path.exists(path):
+ return path
+ path = os.path.join(dir, package_dir, module_name,
+ package_filename)
+ if os.path.exists(path):
+ return path
+
+ return None
+
+
# ------------------------------------------------------------------------
#
# Main command-line entry point
@@ -875,7 +875,7 @@ def main(command_line = 0):
result = compile(sources, options)
if result.num_errors > 0:
any_failures = 1
- except (EnvironmentError, PyrexError) as e:
+ except (EnvironmentError, PyrexError) as e:
sys.stderr.write(str(e) + '\n')
any_failures = 1
if any_failures:
@@ -895,7 +895,7 @@ default_options = dict(
cplus = 0,
output_file = None,
annotate = None,
- annotate_coverage_xml = None,
+ annotate_coverage_xml = None,
generate_pxi = 0,
capi_reexport_cincludes = 0,
working_path = "",
@@ -903,21 +903,21 @@ default_options = dict(
verbose = 0,
quiet = 0,
compiler_directives = {},
- embedded_metadata = {},
+ embedded_metadata = {},
evaluate_tree_assertions = False,
emit_linenums = False,
relative_path_in_code_position_comments = True,
c_line_in_traceback = True,
- language_level = None, # warn but default to 2
- formal_grammar = False,
+ language_level = None, # warn but default to 2
+ formal_grammar = False,
gdb_debug = False,
- module_name = None,
- init_suffix = None,
+ module_name = None,
+ init_suffix = None,
compile_time_env = None,
common_utility_include_dir = None,
output_dir=None,
build_dir=None,
- cache=None,
+ cache=None,
create_extension=None,
np_pythran=False
)
diff --git a/contrib/tools/cython/Cython/Compiler/MemoryView.py b/contrib/tools/cython/Cython/Compiler/MemoryView.py
index 0406d6c716..9974bb4db3 100644
--- a/contrib/tools/cython/Cython/Compiler/MemoryView.py
+++ b/contrib/tools/cython/Cython/Compiler/MemoryView.py
@@ -25,7 +25,7 @@ ERR_UNINITIALIZED = ("Cannot check if memoryview %s is initialized without the "
def concat_flags(*flags):
return "(%s)" % "|".join(flags)
-
+
format_flag = "PyBUF_FORMAT"
memview_c_contiguous = "(PyBUF_C_CONTIGUOUS | PyBUF_FORMAT)"
@@ -67,7 +67,7 @@ memview_typeptr_cname = '__pyx_memoryview_type'
memview_objstruct_cname = '__pyx_memoryview_obj'
memviewslice_cname = u'__Pyx_memviewslice'
-
+
def put_init_entry(mv_cname, code):
code.putln("%s.data = NULL;" % mv_cname)
code.putln("%s.memview = NULL;" % mv_cname)
@@ -76,7 +76,7 @@ def put_init_entry(mv_cname, code):
#def axes_to_str(axes):
# return "".join([access[0].upper()+packing[0] for (access, packing) in axes])
-
+
def put_acquire_memoryviewslice(lhs_cname, lhs_type, lhs_pos, rhs, code,
have_gil=False, first_assignment=True):
"We can avoid decreffing the lhs if we know it is the first assignment"
@@ -97,7 +97,7 @@ def put_acquire_memoryviewslice(lhs_cname, lhs_type, lhs_pos, rhs, code,
if not pretty_rhs:
code.funcstate.release_temp(rhstmp)
-
+
def put_assign_to_memviewslice(lhs_cname, rhs, rhs_cname, memviewslicetype, code,
have_gil=False, first_assignment=False):
if not first_assignment:
@@ -108,7 +108,7 @@ def put_assign_to_memviewslice(lhs_cname, rhs, rhs_cname, memviewslicetype, code
code.putln("%s = %s;" % (lhs_cname, rhs_cname))
-
+
def get_buf_flags(specs):
is_c_contig, is_f_contig = is_cf_contig(specs)
@@ -124,13 +124,13 @@ def get_buf_flags(specs):
else:
return memview_strided_access
-
+
def insert_newaxes(memoryviewtype, n):
axes = [('direct', 'strided')] * n
axes.extend(memoryviewtype.axes)
return PyrexTypes.MemoryViewSliceType(memoryviewtype.dtype, axes)
-
+
def broadcast_types(src, dst):
n = abs(src.ndim - dst.ndim)
if src.ndim < dst.ndim:
@@ -173,20 +173,20 @@ def valid_memslice_dtype(dtype, i=0):
class MemoryViewSliceBufferEntry(Buffer.BufferEntry):
- """
- May be used during code generation time to be queried for
- shape/strides/suboffsets attributes, or to perform indexing or slicing.
- """
+ """
+ May be used during code generation time to be queried for
+ shape/strides/suboffsets attributes, or to perform indexing or slicing.
+ """
def __init__(self, entry):
self.entry = entry
self.type = entry.type
self.cname = entry.cname
-
+
self.buf_ptr = "%s.data" % self.cname
dtype = self.entry.type.dtype
- self.buf_ptr_type = PyrexTypes.CPtrType(dtype)
- self.init_attributes()
+ self.buf_ptr_type = PyrexTypes.CPtrType(dtype)
+ self.init_attributes()
def get_buf_suboffsetvars(self):
return self._for_all_ndim("%s.suboffsets[%d]")
@@ -203,12 +203,12 @@ class MemoryViewSliceBufferEntry(Buffer.BufferEntry):
return self._generate_buffer_lookup_code(code, axes)
def _generate_buffer_lookup_code(self, code, axes, cast_result=True):
- """
- Generate a single expression that indexes the memory view slice
- in each dimension.
- """
+ """
+ Generate a single expression that indexes the memory view slice
+ in each dimension.
+ """
bufp = self.buf_ptr
- type_decl = self.type.dtype.empty_declaration_code()
+ type_decl = self.type.dtype.empty_declaration_code()
for dim, index, access, packing in axes:
shape = "%s.shape[%d]" % (self.cname, dim)
@@ -257,9 +257,9 @@ class MemoryViewSliceBufferEntry(Buffer.BufferEntry):
then it must be coercible to Py_ssize_t
Simply call __pyx_memoryview_slice_memviewslice with the right
- arguments, unless the dimension is omitted or a bare ':', in which
- case we copy over the shape/strides/suboffsets attributes directly
- for that dimension.
+ arguments, unless the dimension is omitted or a bare ':', in which
+ case we copy over the shape/strides/suboffsets attributes directly
+ for that dimension.
"""
src = self.cname
@@ -267,46 +267,46 @@ class MemoryViewSliceBufferEntry(Buffer.BufferEntry):
code.putln("%(dst)s.memview = %(src)s.memview;" % locals())
code.put_incref_memoryviewslice(dst)
- all_dimensions_direct = all(access == 'direct' for access, packing in self.type.axes)
- suboffset_dim_temp = []
-
- def get_suboffset_dim():
- # create global temp variable at request
- if not suboffset_dim_temp:
- suboffset_dim = code.funcstate.allocate_temp(PyrexTypes.c_int_type, manage_ref=False)
- code.putln("%s = -1;" % suboffset_dim)
- suboffset_dim_temp.append(suboffset_dim)
- return suboffset_dim_temp[0]
-
+ all_dimensions_direct = all(access == 'direct' for access, packing in self.type.axes)
+ suboffset_dim_temp = []
+
+ def get_suboffset_dim():
+ # create global temp variable at request
+ if not suboffset_dim_temp:
+ suboffset_dim = code.funcstate.allocate_temp(PyrexTypes.c_int_type, manage_ref=False)
+ code.putln("%s = -1;" % suboffset_dim)
+ suboffset_dim_temp.append(suboffset_dim)
+ return suboffset_dim_temp[0]
+
dim = -1
- new_ndim = 0
+ new_ndim = 0
for index in indices:
- if index.is_none:
- # newaxis
- for attrib, value in [('shape', 1), ('strides', 0), ('suboffsets', -1)]:
- code.putln("%s.%s[%d] = %d;" % (dst, attrib, new_ndim, value))
-
- new_ndim += 1
- continue
-
- dim += 1
- access, packing = self.type.axes[dim]
+ if index.is_none:
+ # newaxis
+ for attrib, value in [('shape', 1), ('strides', 0), ('suboffsets', -1)]:
+ code.putln("%s.%s[%d] = %d;" % (dst, attrib, new_ndim, value))
+
+ new_ndim += 1
+ continue
+
+ dim += 1
+ access, packing = self.type.axes[dim]
if isinstance(index, ExprNodes.SliceNode):
# slice, unspecified dimension, or part of ellipsis
- d = dict(locals())
+ d = dict(locals())
for s in "start stop step".split():
idx = getattr(index, s)
have_idx = d['have_' + s] = not idx.is_none
- d[s] = idx.result() if have_idx else "0"
+ d[s] = idx.result() if have_idx else "0"
- if not (d['have_start'] or d['have_stop'] or d['have_step']):
+ if not (d['have_start'] or d['have_stop'] or d['have_step']):
# full slice (:), simply copy over the extent, stride
# and suboffset. Also update suboffset_dim if needed
d['access'] = access
- util_name = "SimpleSlice"
+ util_name = "SimpleSlice"
else:
- util_name = "ToughSlice"
+ util_name = "ToughSlice"
d['error_goto'] = code.error_goto(index.pos)
new_ndim += 1
@@ -314,42 +314,42 @@ class MemoryViewSliceBufferEntry(Buffer.BufferEntry):
# normal index
idx = index.result()
- indirect = access != 'direct'
- if indirect:
- generic = access == 'full'
+ indirect = access != 'direct'
+ if indirect:
+ generic = access == 'full'
if new_ndim != 0:
return error(index.pos,
"All preceding dimensions must be "
"indexed and not sliced")
- d = dict(
- locals(),
- wraparound=int(directives['wraparound']),
+ d = dict(
+ locals(),
+ wraparound=int(directives['wraparound']),
boundscheck=int(directives['boundscheck']),
- )
+ )
if d['boundscheck']:
d['error_goto'] = code.error_goto(index.pos)
- util_name = "SliceIndex"
-
- _, impl = TempitaUtilityCode.load_as_string(util_name, "MemoryView_C.c", context=d)
- code.put(impl)
+ util_name = "SliceIndex"
- if suboffset_dim_temp:
- code.funcstate.release_temp(suboffset_dim_temp[0])
+ _, impl = TempitaUtilityCode.load_as_string(util_name, "MemoryView_C.c", context=d)
+ code.put(impl)
+ if suboffset_dim_temp:
+ code.funcstate.release_temp(suboffset_dim_temp[0])
+
def empty_slice(pos):
none = ExprNodes.NoneNode(pos)
return ExprNodes.SliceNode(pos, start=none,
stop=none, step=none)
-
-def unellipsify(indices, ndim):
+
+def unellipsify(indices, ndim):
result = []
seen_ellipsis = False
have_slices = False
- newaxes = [newaxis for newaxis in indices if newaxis.is_none]
+ newaxes = [newaxis for newaxis in indices if newaxis.is_none]
n_indices = len(indices) - len(newaxes)
for index in indices:
@@ -364,7 +364,7 @@ def unellipsify(indices, ndim):
result.extend([full_slice] * nslices)
seen_ellipsis = True
else:
- have_slices = have_slices or index.is_slice or index.is_none
+ have_slices = have_slices or index.is_slice or index.is_none
result.append(index)
result_length = len(result) - len(newaxes)
@@ -373,9 +373,9 @@ def unellipsify(indices, ndim):
nslices = ndim - result_length
result.extend([empty_slice(indices[-1].pos)] * nslices)
- return have_slices, result, newaxes
-
+ return have_slices, result, newaxes
+
def get_memoryview_flag(access, packing):
if access == 'full' and packing in ('strided', 'follow'):
return 'generic'
@@ -391,47 +391,47 @@ def get_memoryview_flag(access, packing):
assert (access, packing) == ('direct', 'contig'), (access, packing)
return 'contiguous'
-
+
def get_is_contig_func_name(contig_type, ndim):
assert contig_type in ('C', 'F')
return "__pyx_memviewslice_is_contig_%s%d" % (contig_type, ndim)
-
+
def get_is_contig_utility(contig_type, ndim):
assert contig_type in ('C', 'F')
C = dict(context, ndim=ndim, contig_type=contig_type)
utility = load_memview_c_utility("MemviewSliceCheckContig", C, requires=[is_contig_utility])
return utility
-
-def slice_iter(slice_type, slice_result, ndim, code):
- if slice_type.is_c_contig or slice_type.is_f_contig:
- return ContigSliceIter(slice_type, slice_result, ndim, code)
+
+def slice_iter(slice_type, slice_result, ndim, code):
+ if slice_type.is_c_contig or slice_type.is_f_contig:
+ return ContigSliceIter(slice_type, slice_result, ndim, code)
else:
- return StridedSliceIter(slice_type, slice_result, ndim, code)
+ return StridedSliceIter(slice_type, slice_result, ndim, code)
class SliceIter(object):
- def __init__(self, slice_type, slice_result, ndim, code):
+ def __init__(self, slice_type, slice_result, ndim, code):
self.slice_type = slice_type
- self.slice_result = slice_result
+ self.slice_result = slice_result
self.code = code
self.ndim = ndim
-
+
class ContigSliceIter(SliceIter):
def start_loops(self):
code = self.code
code.begin_block()
- type_decl = self.slice_type.dtype.empty_declaration_code()
+ type_decl = self.slice_type.dtype.empty_declaration_code()
- total_size = ' * '.join("%s.shape[%d]" % (self.slice_result, i)
- for i in range(self.ndim))
+ total_size = ' * '.join("%s.shape[%d]" % (self.slice_result, i)
+ for i in range(self.ndim))
code.putln("Py_ssize_t __pyx_temp_extent = %s;" % total_size)
code.putln("Py_ssize_t __pyx_temp_idx;")
code.putln("%s *__pyx_temp_pointer = (%s *) %s.data;" % (
- type_decl, type_decl, self.slice_result))
+ type_decl, type_decl, self.slice_result))
code.putln("for (__pyx_temp_idx = 0; "
"__pyx_temp_idx < __pyx_temp_extent; "
"__pyx_temp_idx++) {")
@@ -443,20 +443,20 @@ class ContigSliceIter(SliceIter):
self.code.putln("}")
self.code.end_block()
-
+
class StridedSliceIter(SliceIter):
def start_loops(self):
code = self.code
code.begin_block()
for i in range(self.ndim):
- t = i, self.slice_result, i
+ t = i, self.slice_result, i
code.putln("Py_ssize_t __pyx_temp_extent_%d = %s.shape[%d];" % t)
code.putln("Py_ssize_t __pyx_temp_stride_%d = %s.strides[%d];" % t)
code.putln("char *__pyx_temp_pointer_%d;" % i)
code.putln("Py_ssize_t __pyx_temp_idx_%d;" % i)
- code.putln("__pyx_temp_pointer_0 = %s.data;" % self.slice_result)
+ code.putln("__pyx_temp_pointer_0 = %s.data;" % self.slice_result)
for i in range(self.ndim):
if i > 0:
@@ -486,23 +486,23 @@ def copy_c_or_fortran_cname(memview):
return "__pyx_memoryview_copy_slice_%s_%s" % (
memview.specialization_suffix(), c_or_f)
-
+
def get_copy_new_utility(pos, from_memview, to_memview):
- if (from_memview.dtype != to_memview.dtype and
- not (from_memview.dtype.is_const and from_memview.dtype.const_base_type == to_memview.dtype)):
- error(pos, "dtypes must be the same!")
- return
+ if (from_memview.dtype != to_memview.dtype and
+ not (from_memview.dtype.is_const and from_memview.dtype.const_base_type == to_memview.dtype)):
+ error(pos, "dtypes must be the same!")
+ return
if len(from_memview.axes) != len(to_memview.axes):
- error(pos, "number of dimensions must be same")
- return
+ error(pos, "number of dimensions must be same")
+ return
if not (to_memview.is_c_contig or to_memview.is_f_contig):
- error(pos, "to_memview must be c or f contiguous.")
- return
+ error(pos, "to_memview must be c or f contiguous.")
+ return
for (access, packing) in from_memview.axes:
if access != 'direct':
- error(pos, "cannot handle 'full' or 'ptr' access at this time.")
- return
+ error(pos, "cannot handle 'full' or 'ptr' access at this time.")
+ return
if to_memview.is_c_contig:
mode = 'c'
@@ -516,14 +516,14 @@ def get_copy_new_utility(pos, from_memview, to_memview):
context=dict(
context,
mode=mode,
- dtype_decl=to_memview.dtype.empty_declaration_code(),
+ dtype_decl=to_memview.dtype.empty_declaration_code(),
contig_flag=contig_flag,
ndim=to_memview.ndim,
func_cname=copy_c_or_fortran_cname(to_memview),
dtype_is_object=int(to_memview.dtype.is_pyobject)),
requires=[copy_contents_new_utility])
-
+
def get_axes_specs(env, axes):
'''
get_axes_specs(env, axes) -> list of (access, packing) specs for each axis.
@@ -569,7 +569,7 @@ def get_axes_specs(env, axes):
if entry.name in view_constant_to_access_packing:
axes_specs.append(view_constant_to_access_packing[entry.name])
else:
- raise CompileError(axis.step.pos, INVALID_ERR)
+ raise CompileError(axis.step.pos, INVALID_ERR)
else:
raise CompileError(axis.step.pos, INVALID_ERR)
@@ -704,7 +704,7 @@ def validate_axes_specs(positions, specs, is_c_contig, is_f_contig):
if access == 'ptr':
last_indirect_dimension = idx
- for idx, (pos, (access, packing)) in enumerate(zip(positions, specs)):
+ for idx, (pos, (access, packing)) in enumerate(zip(positions, specs)):
if not (access in access_specs and
packing in packing_specs):
diff --git a/contrib/tools/cython/Cython/Compiler/ModuleNode.py b/contrib/tools/cython/Cython/Compiler/ModuleNode.py
index cd7166408e..0eb4a02ab3 100644
--- a/contrib/tools/cython/Cython/Compiler/ModuleNode.py
+++ b/contrib/tools/cython/Cython/Compiler/ModuleNode.py
@@ -9,12 +9,12 @@ cython.declare(Naming=object, Options=object, PyrexTypes=object, TypeSlots=objec
error=object, warning=object, py_object_type=object, UtilityCode=object,
EncodedString=object, re=object)
-from collections import defaultdict
-import json
-import operator
+from collections import defaultdict
+import json
+import operator
import os
import re
-
+
from .PyrexTypes import CPtrType
from . import Future
from . import Annotate
@@ -28,7 +28,7 @@ from . import Pythran
from .Errors import error, warning
from .PyrexTypes import py_object_type
-from ..Utils import open_new_file, replace_suffix, decode_filename, build_hex_version
+from ..Utils import open_new_file, replace_suffix, decode_filename, build_hex_version
from .Code import UtilityCode, IncludeCode
from .StringEncoding import EncodedString
from .Pythran import has_np_pythran
@@ -37,25 +37,25 @@ def check_c_declarations_pxd(module_node):
module_node.scope.check_c_classes_pxd()
return module_node
-
+
def check_c_declarations(module_node):
module_node.scope.check_c_classes()
module_node.scope.check_c_functions()
return module_node
-
-def generate_c_code_config(env, options):
- if Options.annotate or options.annotate:
- emit_linenums = False
- else:
- emit_linenums = options.emit_linenums
-
- return Code.CCodeConfig(
- emit_linenums=emit_linenums,
- emit_code_comments=env.directives['emit_code_comments'],
- c_line_in_traceback=options.c_line_in_traceback)
-
-
+
+def generate_c_code_config(env, options):
+ if Options.annotate or options.annotate:
+ emit_linenums = False
+ else:
+ emit_linenums = options.emit_linenums
+
+ return Code.CCodeConfig(
+ emit_linenums=emit_linenums,
+ emit_code_comments=env.directives['emit_code_comments'],
+ c_line_in_traceback=options.c_line_in_traceback)
+
+
class ModuleNode(Nodes.Node, Nodes.BlockNode):
# doc string or None
# body StatListNode
@@ -108,13 +108,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def analyse_declarations(self, env):
if has_np_pythran(env):
Pythran.include_pythran_generic(env)
- if self.directives:
- env.old_style_globals = self.directives['old_style_globals']
+ if self.directives:
+ env.old_style_globals = self.directives['old_style_globals']
if not Options.docstrings:
env.doc = self.doc = None
elif Options.embed_pos_in_docstring:
env.doc = EncodedString(u'File: %s (starting at line %s)' % Nodes.relative_position(self.pos))
- if self.doc is not None:
+ if self.doc is not None:
env.doc = EncodedString(env.doc + u'\n' + self.doc)
env.doc.encoding = self.doc.encoding
else:
@@ -123,17 +123,17 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self.body.analyse_declarations(env)
- def prepare_utility_code(self):
- # prepare any utility code that must be created before code generation
- # specifically: CythonUtilityCode
- env = self.scope
- if env.has_import_star:
- self.create_import_star_conversion_utility_code(env)
- for name, entry in sorted(env.entries.items()):
- if (entry.create_wrapper and entry.scope is env
- and entry.is_type and entry.type.is_enum):
- entry.type.create_type_wrapper(env)
-
+ def prepare_utility_code(self):
+ # prepare any utility code that must be created before code generation
+ # specifically: CythonUtilityCode
+ env = self.scope
+ if env.has_import_star:
+ self.create_import_star_conversion_utility_code(env)
+ for name, entry in sorted(env.entries.items()):
+ if (entry.create_wrapper and entry.scope is env
+ and entry.is_type and entry.type.is_enum):
+ entry.type.create_type_wrapper(env)
+
def process_implementation(self, options, result):
env = self.scope
env.return_type = PyrexTypes.c_void_type
@@ -142,7 +142,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self.sort_cdef_classes(env)
self.generate_c_code(env, options, result)
self.generate_h_code(env, options, result)
- self.generate_api_code(env, options, result)
+ self.generate_api_code(env, options, result)
def has_imported_c_functions(self):
for module in self.referenced_modules:
@@ -161,18 +161,18 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
h_vars = h_entries(env.var_entries)
h_funcs = h_entries(env.cfunc_entries)
h_extension_types = h_entries(env.c_class_entries)
- if h_types or h_vars or h_funcs or h_extension_types:
+ if h_types or h_vars or h_funcs or h_extension_types:
result.h_file = replace_suffix(result.c_file, ".h")
h_code = Code.CCodeWriter()
- c_code_config = generate_c_code_config(env, options)
- Code.GlobalState(h_code, self, c_code_config)
+ c_code_config = generate_c_code_config(env, options)
+ Code.GlobalState(h_code, self, c_code_config)
if options.generate_pxi:
result.i_file = replace_suffix(result.c_file, ".pxi")
i_code = Code.PyrexCodeWriter(result.i_file)
else:
i_code = None
- h_code.put_generated_by()
+ h_code.put_generated_by()
h_guard = Naming.h_guard_prefix + self.api_name(env)
h_code.put_h_guard(h_guard)
h_code.putln("")
@@ -185,8 +185,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
h_code.putln("#ifndef %s" % api_guard)
h_code.putln("")
self.generate_extern_c_macro_definition(h_code)
- h_code.putln("")
- self.generate_dl_import_macro(h_code)
+ h_code.putln("")
+ self.generate_dl_import_macro(h_code)
if h_extension_types:
h_code.putln("")
for entry in h_extension_types:
@@ -208,8 +208,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
h_code.putln("/* It now returns a PyModuleDef instance instead of a PyModule instance. */")
h_code.putln("")
h_code.putln("#if PY_MAJOR_VERSION < 3")
- init_name = 'init' + (options.init_suffix or env.module_name)
- h_code.putln("PyMODINIT_FUNC %s(void);" % init_name)
+ init_name = 'init' + (options.init_suffix or env.module_name)
+ h_code.putln("PyMODINIT_FUNC %s(void);" % init_name)
h_code.putln("#else")
h_code.putln("PyMODINIT_FUNC %s(void);" % self.mod_init_func_cname('PyInit', env, options))
h_code.putln("#endif")
@@ -227,13 +227,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
Naming.extern_c_macro,
entry.type.declaration_code(entry.cname)))
if i_code:
- i_code.putln("cdef extern %s" % (
- entry.type.declaration_code(entry.cname, pyrex=1)))
+ i_code.putln("cdef extern %s" % (
+ entry.type.declaration_code(entry.cname, pyrex=1)))
def api_name(self, env):
return env.qualified_name.replace(".", "__")
- def generate_api_code(self, env, options, result):
+ def generate_api_code(self, env, options, result):
def api_entries(entries, pxd=0):
return [entry for entry in entries
if entry.api or (pxd and entry.defined_in_pxd)]
@@ -243,16 +243,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if api_vars or api_funcs or api_extension_types:
result.api_file = replace_suffix(result.c_file, "_api.h")
h_code = Code.CCodeWriter()
- c_code_config = generate_c_code_config(env, options)
- Code.GlobalState(h_code, self, c_code_config)
- h_code.put_generated_by()
+ c_code_config = generate_c_code_config(env, options)
+ Code.GlobalState(h_code, self, c_code_config)
+ h_code.put_generated_by()
api_guard = Naming.api_guard_prefix + self.api_name(env)
h_code.put_h_guard(api_guard)
- # Work around https://bugs.python.org/issue4709
- h_code.putln('#ifdef __MINGW64__')
- h_code.putln('#define MS_WIN64')
- h_code.putln('#endif')
-
+ # Work around https://bugs.python.org/issue4709
+ h_code.putln('#ifdef __MINGW64__')
+ h_code.putln('#define MS_WIN64')
+ h_code.putln('#endif')
+
h_code.putln('#include "Python.h"')
if result.h_file:
h_code.putln('#include "%s"' % os.path.basename(result.h_file))
@@ -267,14 +267,14 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
h_code.putln("")
for entry in api_funcs:
type = CPtrType(entry.type)
- cname = env.mangle(Naming.func_prefix_api, entry.name)
+ cname = env.mangle(Naming.func_prefix_api, entry.name)
h_code.putln("static %s = 0;" % type.declaration_code(cname))
h_code.putln("#define %s %s" % (entry.name, cname))
if api_vars:
h_code.putln("")
for entry in api_vars:
type = CPtrType(entry.type)
- cname = env.mangle(Naming.varptr_prefix_api, entry.name)
+ cname = env.mangle(Naming.varptr_prefix_api, entry.name)
h_code.putln("static %s = 0;" % type.declaration_code(cname))
h_code.putln("#define %s (*%s)" % (entry.name, cname))
h_code.put(UtilityCode.load_as_string("PyIdentifierFromString", "ImportExport.c")[0])
@@ -283,28 +283,28 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if api_funcs:
h_code.put(UtilityCode.load_as_string("FunctionImport", "ImportExport.c")[1])
if api_extension_types:
- h_code.put(UtilityCode.load_as_string("TypeImport", "ImportExport.c")[0])
+ h_code.put(UtilityCode.load_as_string("TypeImport", "ImportExport.c")[0])
h_code.put(UtilityCode.load_as_string("TypeImport", "ImportExport.c")[1])
h_code.putln("")
h_code.putln("static int import_%s(void) {" % self.api_name(env))
h_code.putln("PyObject *module = 0;")
- h_code.putln('module = PyImport_ImportModule("%s");' % env.qualified_name)
+ h_code.putln('module = PyImport_ImportModule("%s");' % env.qualified_name)
h_code.putln("if (!module) goto bad;")
for entry in api_funcs:
- cname = env.mangle(Naming.func_prefix_api, entry.name)
+ cname = env.mangle(Naming.func_prefix_api, entry.name)
sig = entry.type.signature_string()
h_code.putln(
'if (__Pyx_ImportFunction(module, "%s", (void (**)(void))&%s, "%s") < 0) goto bad;'
% (entry.name, cname, sig))
for entry in api_vars:
- cname = env.mangle(Naming.varptr_prefix_api, entry.name)
- sig = entry.type.empty_declaration_code()
+ cname = env.mangle(Naming.varptr_prefix_api, entry.name)
+ sig = entry.type.empty_declaration_code()
h_code.putln(
'if (__Pyx_ImportVoidPtr(module, "%s", (void **)&%s, "%s") < 0) goto bad;'
% (entry.name, cname, sig))
- with ModuleImportGenerator(h_code, imported_modules={env.qualified_name: 'module'}) as import_generator:
- for entry in api_extension_types:
- self.generate_type_import_call(entry.type, h_code, import_generator, error_code="goto bad;")
+ with ModuleImportGenerator(h_code, imported_modules={env.qualified_name: 'module'}) as import_generator:
+ for entry in api_extension_types:
+ self.generate_type_import_call(entry.type, h_code, import_generator, error_code="goto bad;")
h_code.putln("Py_DECREF(module); module = 0;")
h_code.putln("return 0;")
h_code.putln("bad:")
@@ -333,8 +333,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
var_entries = type.scope.var_entries
if var_entries:
for entry in var_entries:
- i_code.putln("cdef %s" % (
- entry.type.declaration_code(entry.cname, pyrex=1)))
+ i_code.putln("cdef %s" % (
+ entry.type.declaration_code(entry.cname, pyrex=1)))
else:
i_code.putln("pass")
i_code.dedent()
@@ -345,19 +345,19 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if Options.annotate or options.annotate:
rootwriter = Annotate.AnnotationCCodeWriter()
else:
- rootwriter = Code.CCodeWriter()
-
- c_code_config = generate_c_code_config(env, options)
-
- globalstate = Code.GlobalState(
- rootwriter, self,
- code_config=c_code_config,
- common_utility_include_dir=options.common_utility_include_dir,
- )
+ rootwriter = Code.CCodeWriter()
+
+ c_code_config = generate_c_code_config(env, options)
+
+ globalstate = Code.GlobalState(
+ rootwriter, self,
+ code_config=c_code_config,
+ common_utility_include_dir=options.common_utility_include_dir,
+ )
globalstate.initialize_main_c_code()
h_code = globalstate['h_code']
- self.generate_module_preamble(env, options, modules, result.embedded_metadata, h_code)
+ self.generate_module_preamble(env, options, modules, result.embedded_metadata, h_code)
globalstate.module_pos = self.pos
globalstate.directives = self.directives
@@ -382,21 +382,21 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self.generate_lambda_definitions(env, code)
# generate normal variable and function definitions
self.generate_variable_definitions(env, code)
-
+
self.body.generate_function_definitions(env, code)
-
+
code.mark_pos(None)
self.generate_typeobj_definitions(env, code)
self.generate_method_table(env, code)
if env.has_import_star:
self.generate_import_star(env, code)
- self.generate_pymoduledef_struct(env, options, code)
-
- # initialise the macro to reduce the code size of one-time functionality
- code.putln(UtilityCode.load_as_string("SmallCodeConfig", "ModuleSetupCode.c")[0].strip())
+ self.generate_pymoduledef_struct(env, options, code)
+ # initialise the macro to reduce the code size of one-time functionality
+ code.putln(UtilityCode.load_as_string("SmallCodeConfig", "ModuleSetupCode.c")[0].strip())
+
# init_globals is inserted before this
- self.generate_module_init_func(modules[:-1], env, options, globalstate['init_module'])
+ self.generate_module_init_func(modules[:-1], env, options, globalstate['init_module'])
self.generate_module_cleanup_func(env, globalstate['cleanup_module'])
if Options.embed:
self.generate_main_method(env, globalstate['main_method'])
@@ -418,29 +418,29 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if options.gdb_debug:
self._serialize_lineno_map(env, rootwriter)
if Options.annotate or options.annotate:
- self._generate_annotations(rootwriter, result, options)
+ self._generate_annotations(rootwriter, result, options)
- def _generate_annotations(self, rootwriter, result, options):
+ def _generate_annotations(self, rootwriter, result, options):
self.annotate(rootwriter)
- coverage_xml_filename = Options.annotate_coverage_xml or options.annotate_coverage_xml
- if coverage_xml_filename and os.path.exists(coverage_xml_filename):
- try:
- import xml.etree.cElementTree as ET
- except ImportError:
- import xml.etree.ElementTree as ET
- coverage_xml = ET.parse(coverage_xml_filename).getroot()
+ coverage_xml_filename = Options.annotate_coverage_xml or options.annotate_coverage_xml
+ if coverage_xml_filename and os.path.exists(coverage_xml_filename):
+ try:
+ import xml.etree.cElementTree as ET
+ except ImportError:
+ import xml.etree.ElementTree as ET
+ coverage_xml = ET.parse(coverage_xml_filename).getroot()
if hasattr(coverage_xml, 'iter'):
iterator = coverage_xml.iter() # Python 2.7 & 3.2+
else:
iterator = coverage_xml.getiterator()
for el in iterator:
- el.tail = None # save some memory
- else:
- coverage_xml = None
-
- rootwriter.save_annotation(result.main_source_file, result.c_file, coverage_xml=coverage_xml)
-
+ el.tail = None # save some memory
+ else:
+ coverage_xml = None
+
+ rootwriter.save_annotation(result.main_source_file, result.c_file, coverage_xml=coverage_xml)
+
# if we included files, additionally generate one annotation file for each
if not self.scope.included_files:
return
@@ -459,28 +459,28 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if target_file_dir != target_dir and not os.path.exists(target_file_dir):
try:
os.makedirs(target_file_dir)
- except OSError as e:
+ except OSError as e:
import errno
if e.errno != errno.EEXIST:
raise
- rootwriter.save_annotation(source_file, target_file, coverage_xml=coverage_xml)
+ rootwriter.save_annotation(source_file, target_file, coverage_xml=coverage_xml)
def _serialize_lineno_map(self, env, ccodewriter):
tb = env.context.gdb_debug_outputwriter
markers = ccodewriter.buffer.allmarkers()
- d = defaultdict(list)
+ d = defaultdict(list)
for c_lineno, cython_lineno in enumerate(markers):
if cython_lineno > 0:
- d[cython_lineno].append(c_lineno + 1)
+ d[cython_lineno].append(c_lineno + 1)
tb.start('LineNumberMapping')
- for cython_lineno, c_linenos in sorted(d.items()):
- tb.add_entry(
- 'LineNumber',
- c_linenos=' '.join(map(str, c_linenos)),
- cython_lineno=str(cython_lineno),
- )
+ for cython_lineno, c_linenos in sorted(d.items()):
+ tb.add_entry(
+ 'LineNumber',
+ c_linenos=' '.join(map(str, c_linenos)),
+ cython_lineno=str(cython_lineno),
+ )
tb.end('LineNumberMapping')
tb.serialize()
@@ -625,16 +625,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self.generate_cvariable_declarations(module, modulecode, defined_here)
self.generate_cfunction_declarations(module, modulecode, defined_here)
- def _put_setup_code(self, code, name):
- code.put(UtilityCode.load_as_string(name, "ModuleSetupCode.c")[1])
-
- def generate_module_preamble(self, env, options, cimported_modules, metadata, code):
- code.put_generated_by()
- if metadata:
- code.putln("/* BEGIN: Cython Metadata")
- code.putln(json.dumps(metadata, indent=4, sort_keys=True))
- code.putln("END: Cython Metadata */")
- code.putln("")
+ def _put_setup_code(self, code, name):
+ code.put(UtilityCode.load_as_string(name, "ModuleSetupCode.c")[1])
+
+ def generate_module_preamble(self, env, options, cimported_modules, metadata, code):
+ code.put_generated_by()
+ if metadata:
+ code.putln("/* BEGIN: Cython Metadata")
+ code.putln(json.dumps(metadata, indent=4, sort_keys=True))
+ code.putln("END: Cython Metadata */")
+ code.putln("")
code.putln("#ifndef PY_SSIZE_T_CLEAN")
code.putln("#define PY_SSIZE_T_CLEAN")
@@ -644,9 +644,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if inc.location == inc.INITIAL:
inc.write(code)
code.putln("#ifndef Py_PYTHON_H")
- code.putln(" #error Python headers needed to compile C extensions, "
- "please install development version of Python.")
- code.putln("#elif PY_VERSION_HEX < 0x02060000 || "
+ code.putln(" #error Python headers needed to compile C extensions, "
+ "please install development version of Python.")
+ code.putln("#elif PY_VERSION_HEX < 0x02060000 || "
"(0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)")
code.putln(" #error Cython requires Python 2.6+ or Python 3.3+.")
code.putln("#else")
@@ -654,23 +654,23 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
from .. import __version__
code.putln('#define CYTHON_ABI "%s"' % __version__.replace('.', '_'))
- code.putln('#define CYTHON_HEX_VERSION %s' % build_hex_version(__version__))
+ code.putln('#define CYTHON_HEX_VERSION %s' % build_hex_version(__version__))
code.putln("#define CYTHON_FUTURE_DIVISION %d" % (
Future.division in env.context.future_directives))
- self._put_setup_code(code, "CModulePreamble")
- if env.context.options.cplus:
- self._put_setup_code(code, "CppInitCode")
- else:
- self._put_setup_code(code, "CInitCode")
+ self._put_setup_code(code, "CModulePreamble")
+ if env.context.options.cplus:
+ self._put_setup_code(code, "CppInitCode")
+ else:
+ self._put_setup_code(code, "CInitCode")
self._put_setup_code(code, "PythonCompatibility")
- self._put_setup_code(code, "MathInitCode")
+ self._put_setup_code(code, "MathInitCode")
# Using "(void)cname" to prevent "unused" warnings.
- if options.c_line_in_traceback:
+ if options.c_line_in_traceback:
cinfo = "%s = %s; (void)%s; " % (Naming.clineno_cname, Naming.line_c_macro, Naming.clineno_cname)
- else:
- cinfo = ""
+ else:
+ cinfo = ""
code.putln("#define __PYX_MARK_ERR_POS(f_index, lineno) \\")
code.putln(" { %s = %s[f_index]; (void)%s; %s = lineno; (void)%s; %s}" % (
Naming.filename_cname, Naming.filetable_cname, Naming.filename_cname,
@@ -679,7 +679,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
))
code.putln("#define __PYX_ERR(f_index, lineno, Ln_error) \\")
code.putln(" { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; }")
-
+
code.putln("")
self.generate_extern_c_macro_definition(code)
code.putln("")
@@ -707,13 +707,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if c_string_type not in ('bytes', 'bytearray') and not c_string_encoding:
error(self.pos, "a default encoding must be provided if c_string_type is not a byte type")
code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII %s' % int(c_string_encoding == 'ascii'))
- code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 %s' %
- int(c_string_encoding.replace('-', '').lower() == 'utf8'))
+ code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 %s' %
+ int(c_string_encoding.replace('-', '').lower() == 'utf8'))
if c_string_encoding == 'default':
code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 1')
else:
- code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT '
- '(PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8)')
+ code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT '
+ '(PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8)')
code.putln('#define __PYX_DEFAULT_STRING_ENCODING "%s"' % c_string_encoding)
if c_string_type == 'bytearray':
c_string_func_name = 'ByteArray'
@@ -734,10 +734,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln('static PyObject *%s = NULL;' % env.module_cname)
code.putln('static PyObject *%s;' % env.module_dict_cname)
code.putln('static PyObject *%s;' % Naming.builtins_cname)
- code.putln('static PyObject *%s = NULL;' % Naming.cython_runtime_cname)
+ code.putln('static PyObject *%s = NULL;' % Naming.cython_runtime_cname)
code.putln('static PyObject *%s;' % Naming.empty_tuple)
code.putln('static PyObject *%s;' % Naming.empty_bytes)
- code.putln('static PyObject *%s;' % Naming.empty_unicode)
+ code.putln('static PyObject *%s;' % Naming.empty_unicode)
if Options.pre_import is not None:
code.putln('static PyObject *%s;' % Naming.preimport_cname)
code.putln('static int %s;' % Naming.lineno_cname)
@@ -759,11 +759,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln(" #endif")
code.putln("#endif")
- def generate_dl_import_macro(self, code):
- code.putln("#ifndef DL_IMPORT")
- code.putln(" #define DL_IMPORT(_T) _T")
- code.putln("#endif")
-
+ def generate_dl_import_macro(self, code):
+ code.putln("#ifndef DL_IMPORT")
+ code.putln(" #define DL_IMPORT(_T) _T")
+ code.putln("#endif")
+
def generate_includes(self, env, cimported_modules, code, early=True, late=True):
includes = []
for inc in sorted(env.c_includes.values(), key=IncludeCode.sortkey):
@@ -810,8 +810,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
pass
elif type.is_struct_or_union or type.is_cpp_class:
self.generate_struct_union_predeclaration(entry, code)
- elif type.is_ctuple and entry.used:
- self.generate_struct_union_predeclaration(entry.type.struct_entry, code)
+ elif type.is_ctuple and entry.used:
+ self.generate_struct_union_predeclaration(entry.type.struct_entry, code)
elif type.is_extension_type:
self.generate_objstruct_predeclaration(type, code)
# Actual declarations
@@ -825,8 +825,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self.generate_enum_definition(entry, code)
elif type.is_struct_or_union:
self.generate_struct_union_definition(entry, code)
- elif type.is_ctuple and entry.used:
- self.generate_struct_union_definition(entry.type.struct_entry, code)
+ elif type.is_ctuple and entry.used:
+ self.generate_struct_union_definition(entry.type.struct_entry, code)
elif type.is_cpp_class:
self.generate_cpp_class_definition(entry, code)
elif type.is_extension_type:
@@ -869,8 +869,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_struct_union_predeclaration(self, entry, code):
type = entry.type
if type.is_cpp_class and type.templates:
- code.putln("template <typename %s>" % ", typename ".join(
- [T.empty_declaration_code() for T in type.templates]))
+ code.putln("template <typename %s>" % ", typename ".join(
+ [T.empty_declaration_code() for T in type.templates]))
code.putln(self.sue_predeclaration(type, type.kind, type.cname))
def sue_header_footer(self, type, kind, name):
@@ -899,10 +899,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln(header)
var_entries = scope.var_entries
if not var_entries:
- error(entry.pos, "Empty struct or union definition not allowed outside a 'cdef extern from' block")
+ error(entry.pos, "Empty struct or union definition not allowed outside a 'cdef extern from' block")
for attr in var_entries:
code.putln(
- "%s;" % attr.type.declaration_code(attr.cname))
+ "%s;" % attr.type.declaration_code(attr.cname))
code.putln(footer)
if packed:
code.putln("#if defined(__SUNPRO_C)")
@@ -917,13 +917,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
scope = type.scope
if scope:
if type.templates:
- code.putln("template <class %s>" % ", class ".join(
- [T.empty_declaration_code() for T in type.templates]))
+ code.putln("template <class %s>" % ", class ".join(
+ [T.empty_declaration_code() for T in type.templates]))
# Just let everything be public.
code.put("struct %s" % type.cname)
if type.base_classes:
base_class_decl = ", public ".join(
- [base_class.empty_declaration_code() for base_class in type.base_classes])
+ [base_class.empty_declaration_code() for base_class in type.base_classes])
code.put(" : public %s" % base_class_decl)
code.putln(" {")
py_attrs = [e for e in scope.entries.values()
@@ -932,8 +932,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
constructor = None
destructor = None
for attr in scope.var_entries:
- if attr.type.is_cfunction:
- code.put("inline ")
+ if attr.type.is_cfunction:
+ code.put("inline ")
if attr.type.is_cfunction and attr.type.is_static_method:
code.put("static ")
elif attr.name == "<init>":
@@ -943,7 +943,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
elif attr.type.is_cfunction:
code.put("virtual ")
has_virtual_methods = True
- code.putln("%s;" % attr.type.declaration_code(attr.cname))
+ code.putln("%s;" % attr.type.declaration_code(attr.cname))
is_implementing = 'init_module' in code.globalstate.parts
if constructor or py_attrs:
if constructor:
@@ -1022,11 +1022,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.mark_pos(entry.pos)
type = entry.type
name = entry.cname or entry.name or ""
- header, footer = self.sue_header_footer(type, "enum", name)
+ header, footer = self.sue_header_footer(type, "enum", name)
code.putln(header)
enum_values = entry.enum_values
if not enum_values:
- error(entry.pos, "Empty enum definition not allowed outside a 'cdef extern from' block")
+ error(entry.pos, "Empty enum definition not allowed outside a 'cdef extern from' block")
else:
last_entry = enum_values[-1]
# this does not really generate code, just builds the result value
@@ -1080,15 +1080,15 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if type.vtabstruct_cname:
code.putln("")
- code.putln("struct %s {" % type.vtabstruct_cname)
+ code.putln("struct %s {" % type.vtabstruct_cname)
if type.base_type and type.base_type.vtabstruct_cname:
code.putln("struct %s %s;" % (
type.base_type.vtabstruct_cname,
Naming.obj_base_cname))
for method_entry in scope.cfunc_entries:
if not method_entry.is_inherited:
- code.putln("%s;" % method_entry.type.declaration_code("(*%s)" % method_entry.cname))
- code.putln("};")
+ code.putln("%s;" % method_entry.type.declaration_code("(*%s)" % method_entry.cname))
+ code.putln("};")
def generate_exttype_vtabptr_declaration(self, entry, code):
if not entry.used:
@@ -1155,7 +1155,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
else:
attr_type = attr.type
code.putln(
- "%s;" % attr_type.declaration_code(attr.cname))
+ "%s;" % attr_type.declaration_code(attr.cname))
code.putln(footer)
if type.objtypedef_cname is not None:
# Only for exposing public typedef name.
@@ -1164,15 +1164,15 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_c_class_declarations(self, env, code, definition):
for entry in env.c_class_entries:
if definition or entry.defined_in_pxd:
- code.putln("static PyTypeObject *%s = 0;" % (
- entry.type.typeptr_cname))
+ code.putln("static PyTypeObject *%s = 0;" % (
+ entry.type.typeptr_cname))
def generate_cvariable_declarations(self, env, code, definition):
if env.is_cython_builtin:
return
for entry in env.var_entries:
if (entry.in_cinclude or entry.in_closure or
- (entry.visibility == 'private' and not (entry.defined_in_pxd or entry.used))):
+ (entry.visibility == 'private' and not (entry.defined_in_pxd or entry.used))):
continue
storage_class = None
@@ -1192,7 +1192,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
storage_class = "static"
dll_linkage = None
if entry.init is not None:
- init = entry.type.literal_code(entry.init)
+ init = entry.type.literal_code(entry.init)
type = entry.type
cname = entry.cname
@@ -1206,7 +1206,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if storage_class:
code.put("%s " % storage_class)
code.put(type.declaration_code(
- cname, dll_linkage=dll_linkage))
+ cname, dll_linkage=dll_linkage))
if init is not None:
code.put_safe(" = %s" % init)
code.putln(";")
@@ -1220,10 +1220,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_variable_definitions(self, env, code):
for entry in env.var_entries:
- if not entry.in_cinclude and entry.visibility == "public":
+ if not entry.in_cinclude and entry.visibility == "public":
code.put(entry.type.declaration_code(entry.cname))
if entry.init is not None:
- init = entry.type.literal_code(entry.init)
+ init = entry.type.literal_code(entry.init)
code.put_safe(" = %s" % init)
code.putln(";")
@@ -1252,9 +1252,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if scope.defines_any_special(["__setitem__", "__delitem__"]):
self.generate_ass_subscript_function(scope, code)
if scope.defines_any_special(["__getslice__", "__setslice__", "__delslice__"]):
- warning(self.pos,
- "__getslice__, __setslice__, and __delslice__ are not supported by Python 3, "
- "use __getitem__, __setitem__, and __delitem__ instead", 1)
+ warning(self.pos,
+ "__getslice__, __setslice__, and __delslice__ are not supported by Python 3, "
+ "use __getitem__, __setitem__, and __delitem__ instead", 1)
code.putln("#if PY_MAJOR_VERSION >= 3")
code.putln("#error __getslice__, __setslice__, and __delslice__ not supported in Python 3.")
code.putln("#endif")
@@ -1269,7 +1269,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if scope.defines_any_special(["__set__", "__delete__"]):
self.generate_descr_set_function(scope, code)
if not scope.is_closure_class_scope and scope.defines_any(["__dict__"]):
- self.generate_dict_getter_function(scope, code)
+ self.generate_dict_getter_function(scope, code)
if scope.defines_any_special(TypeSlots.richcmp_special_methods):
self.generate_richcmp_function(scope, code)
self.generate_property_accessors(scope, code)
@@ -1290,7 +1290,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln(
"%s = (%s)o;" % (
type.declaration_code("p"),
- type.empty_declaration_code()))
+ type.empty_declaration_code()))
def generate_new_function(self, scope, code, cclass_entry):
tp_slot = TypeSlots.ConstructorSlot("tp_new", '__new__')
@@ -1332,8 +1332,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("static int %s = 0;" % freecount_name)
code.putln("")
code.putln(
- "static PyObject *%s(PyTypeObject *t, %sPyObject *a, %sPyObject *k) {" % (
- slot_func, unused_marker, unused_marker))
+ "static PyObject *%s(PyTypeObject *t, %sPyObject *a, %sPyObject *k) {" % (
+ slot_func, unused_marker, unused_marker))
need_self_cast = (type.vtabslot_cname or
(py_buffers or memoryview_slices or py_attrs) or
@@ -1355,9 +1355,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
else:
type_safety_check = ' & ((t->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0)'
obj_struct = type.declaration_code("", deref=True)
- code.putln(
- "if (CYTHON_COMPILING_IN_CPYTHON && likely((%s > 0) & (t->tp_basicsize == sizeof(%s))%s)) {" % (
- freecount_name, obj_struct, type_safety_check))
+ code.putln(
+ "if (CYTHON_COMPILING_IN_CPYTHON && likely((%s > 0) & (t->tp_basicsize == sizeof(%s))%s)) {" % (
+ freecount_name, obj_struct, type_safety_check))
code.putln("o = (PyObject*)%s[--%s];" % (
freelist_name, freecount_name))
code.putln("memset(o, 0, sizeof(%s));" % obj_struct)
@@ -1379,10 +1379,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("p = %s;" % type.cast_code("o"))
#if need_self_cast:
# self.generate_self_cast(scope, code)
-
- # from this point on, ensure DECREF(o) on failure
- needs_error_cleanup = False
-
+
+ # from this point on, ensure DECREF(o) on failure
+ needs_error_cleanup = False
+
if type.vtabslot_cname:
vtab_base_type = type
while vtab_base_type.base_type and vtab_base_type.base_type.vtabstruct_cname:
@@ -1396,16 +1396,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
struct_type_cast, type.vtabptr_cname))
for entry in cpp_class_attrs:
- code.putln("new((void*)&(p->%s)) %s();" % (
- entry.cname, entry.type.empty_declaration_code()))
+ code.putln("new((void*)&(p->%s)) %s();" % (
+ entry.cname, entry.type.empty_declaration_code()))
for entry in py_attrs:
- if entry.name == "__dict__":
- needs_error_cleanup = True
- code.put("p->%s = PyDict_New(); if (unlikely(!p->%s)) goto bad;" % (
- entry.cname, entry.cname))
- else:
- code.put_init_var_to_py_none(entry, "p->%s", nanny=False)
+ if entry.name == "__dict__":
+ needs_error_cleanup = True
+ code.put("p->%s = PyDict_New(); if (unlikely(!p->%s)) goto bad;" % (
+ entry.cname, entry.cname))
+ else:
+ code.put_init_var_to_py_none(entry, "p->%s", nanny=False)
for entry in memoryview_slices:
code.putln("p->%s.data = NULL;" % entry.cname)
@@ -1422,16 +1422,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
cinit_args = "o, %s, NULL" % Naming.empty_tuple
else:
cinit_args = "o, a, k"
- needs_error_cleanup = True
- code.putln("if (unlikely(%s(%s) < 0)) goto bad;" % (
- new_func_entry.func_cname, cinit_args))
-
+ needs_error_cleanup = True
+ code.putln("if (unlikely(%s(%s) < 0)) goto bad;" % (
+ new_func_entry.func_cname, cinit_args))
+
code.putln(
"return o;")
- if needs_error_cleanup:
- code.putln("bad:")
- code.put_decref_clear("o", py_object_type, nanny=False)
- code.putln("return NULL;")
+ if needs_error_cleanup:
+ code.putln("bad:")
+ code.put_decref_clear("o", py_object_type, nanny=False)
+ code.putln("return NULL;")
code.putln(
"}")
@@ -1455,14 +1455,14 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
weakref_slot = None
dict_slot = scope.lookup_here("__dict__") if not scope.is_closure_class_scope else None
- if dict_slot not in scope.var_entries:
- dict_slot = None
-
+ if dict_slot not in scope.var_entries:
+ dict_slot = None
+
_, (py_attrs, _, memoryview_slices) = scope.get_refcounted_entries()
cpp_class_attrs = [entry for entry in scope.var_entries
if entry.type.is_cpp_class]
- if py_attrs or cpp_class_attrs or memoryview_slices or weakref_slot or dict_slot:
+ if py_attrs or cpp_class_attrs or memoryview_slices or weakref_slot or dict_slot:
self.generate_self_cast(scope, code)
if not is_final_type:
@@ -1493,11 +1493,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if weakref_slot:
code.putln("if (p->__weakref__) PyObject_ClearWeakRefs(o);")
- if dict_slot:
- code.putln("if (p->__dict__) PyDict_Clear(p->__dict__);")
-
+ if dict_slot:
+ code.putln("if (p->__dict__) PyDict_Clear(p->__dict__);")
+
for entry in cpp_class_attrs:
- code.putln("__Pyx_call_destructor(p->%s);" % entry.cname)
+ code.putln("__Pyx_call_destructor(p->%s);" % entry.cname)
for entry in py_attrs:
code.put_xdecref_clear("p->%s" % entry.cname, entry.type, nanny=False,
@@ -1514,7 +1514,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if base_type.scope and base_type.scope.needs_gc():
code.putln("PyObject_GC_Track(o);")
else:
- code.putln("#if CYTHON_USE_TYPE_SLOTS")
+ code.putln("#if CYTHON_USE_TYPE_SLOTS")
code.putln("if (PyType_IS_GC(Py_TYPE(o)->tp_base))")
code.putln("#endif")
code.putln("PyObject_GC_Track(o);")
@@ -1548,12 +1548,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
' & ((Py_TYPE(o)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0)')
type = scope.parent_type
- code.putln(
- "if (CYTHON_COMPILING_IN_CPYTHON && ((%s < %d) & (Py_TYPE(o)->tp_basicsize == sizeof(%s))%s)) {" % (
- freecount_name,
- freelist_size,
- type.declaration_code("", deref=True),
- type_safety_check))
+ code.putln(
+ "if (CYTHON_COMPILING_IN_CPYTHON && ((%s < %d) & (Py_TYPE(o)->tp_basicsize == sizeof(%s))%s)) {" % (
+ freecount_name,
+ freelist_size,
+ type.declaration_code("", deref=True),
+ type_safety_check))
code.putln("%s[%s++] = %s;" % (
freelist_name, freecount_name, type.cast_code("o")))
code.putln("} else {")
@@ -1584,10 +1584,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
slot_func = scope.mangle_internal("tp_traverse")
base_type = scope.parent_type.base_type
if tp_slot.slot_code(scope) != slot_func:
- return # never used
+ return # never used
code.putln("")
code.putln(
- "static int %s(PyObject *o, visitproc v, void *a) {" % slot_func)
+ "static int %s(PyObject *o, visitproc v, void *a) {" % slot_func)
have_entries, (py_attrs, py_buffers, memoryview_slices) = (
scope.get_refcounted_entries(include_gc_simple=False))
@@ -1613,19 +1613,19 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# the module cleanup, which may already have cleared it.
# In that case, fall back to traversing the type hierarchy.
base_cname = base_type.typeptr_cname
- code.putln(
- "e = ((likely(%s)) ? ((%s->tp_traverse) ? %s->tp_traverse(o, v, a) : 0) : "
- "__Pyx_call_next_tp_traverse(o, v, a, %s)); if (e) return e;" % (
- base_cname, base_cname, base_cname, slot_func))
+ code.putln(
+ "e = ((likely(%s)) ? ((%s->tp_traverse) ? %s->tp_traverse(o, v, a) : 0) : "
+ "__Pyx_call_next_tp_traverse(o, v, a, %s)); if (e) return e;" % (
+ base_cname, base_cname, base_cname, slot_func))
code.globalstate.use_utility_code(
UtilityCode.load_cached("CallNextTpTraverse", "ExtensionTypes.c"))
for entry in py_attrs:
var_code = "p->%s" % entry.cname
var_as_pyobject = PyrexTypes.typecast(py_object_type, entry.type, var_code)
- code.putln("if (%s) {" % var_code)
+ code.putln("if (%s) {" % var_code)
code.putln("e = (*v)(%s, a); if (e) return e;" % var_as_pyobject)
- code.putln("}")
+ code.putln("}")
# Traverse buffer exporting objects.
# Note: not traversing memoryview attributes of memoryview slices!
@@ -1634,14 +1634,14 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
for entry in py_buffers:
cname = entry.cname + ".obj"
code.putln("if (p->%s) {" % cname)
- code.putln("e = (*v)(p->%s, a); if (e) return e;" % cname)
+ code.putln("e = (*v)(p->%s, a); if (e) return e;" % cname)
code.putln("}")
- code.putln("return 0;")
- code.putln("}")
+ code.putln("return 0;")
+ code.putln("}")
def generate_clear_function(self, scope, code, cclass_entry):
- tp_slot = TypeSlots.get_slot_by_name("tp_clear")
+ tp_slot = TypeSlots.get_slot_by_name("tp_clear")
slot_func = scope.mangle_internal("tp_clear")
base_type = scope.parent_type.base_type
if tp_slot.slot_code(scope) != slot_func:
@@ -1679,9 +1679,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# the module cleanup, which may already have cleared it.
# In that case, fall back to traversing the type hierarchy.
base_cname = base_type.typeptr_cname
- code.putln(
- "if (likely(%s)) { if (%s->tp_clear) %s->tp_clear(o); } else __Pyx_call_next_tp_clear(o, %s);" % (
- base_cname, base_cname, base_cname, slot_func))
+ code.putln(
+ "if (likely(%s)) { if (%s->tp_clear) %s->tp_clear(o); } else __Pyx_call_next_tp_clear(o, %s);" % (
+ base_cname, base_cname, base_cname, slot_func))
code.globalstate.use_utility_code(
UtilityCode.load_cached("CallNextTpClear", "ExtensionTypes.c"))
@@ -1705,26 +1705,26 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if cclass_entry.cname == '__pyx_memoryviewslice':
code.putln("__PYX_XDEC_MEMVIEW(&p->from_slice, 1);")
- code.putln("return 0;")
- code.putln("}")
+ code.putln("return 0;")
+ code.putln("}")
def generate_getitem_int_function(self, scope, code):
# This function is put into the sq_item slot when
# a __getitem__ method is present. It converts its
# argument to a Python integer and calls mp_subscript.
code.putln(
- "static PyObject *%s(PyObject *o, Py_ssize_t i) {" % (
- scope.mangle_internal("sq_item")))
+ "static PyObject *%s(PyObject *o, Py_ssize_t i) {" % (
+ scope.mangle_internal("sq_item")))
code.putln(
- "PyObject *r;")
+ "PyObject *r;")
code.putln(
- "PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;")
+ "PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;")
code.putln(
- "r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);")
+ "r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);")
code.putln(
- "Py_DECREF(x);")
+ "Py_DECREF(x);")
code.putln(
- "return r;")
+ "return r;")
code.putln(
"}")
@@ -1737,40 +1737,40 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
del_entry = scope.lookup_here("__delitem__")
code.putln("")
code.putln(
- "static int %s(PyObject *o, PyObject *i, PyObject *v) {" % (
- scope.mangle_internal("mp_ass_subscript")))
+ "static int %s(PyObject *o, PyObject *i, PyObject *v) {" % (
+ scope.mangle_internal("mp_ass_subscript")))
code.putln(
- "if (v) {")
+ "if (v) {")
if set_entry:
- code.putln("return %s(o, i, v);" % set_entry.func_cname)
+ code.putln("return %s(o, i, v);" % set_entry.func_cname)
else:
self.generate_guarded_basetype_call(
base_type, "tp_as_mapping", "mp_ass_subscript", "o, i, v", code)
code.putln(
- "PyErr_Format(PyExc_NotImplementedError,")
+ "PyErr_Format(PyExc_NotImplementedError,")
code.putln(
- ' "Subscript assignment not supported by %.200s", Py_TYPE(o)->tp_name);')
+ ' "Subscript assignment not supported by %.200s", Py_TYPE(o)->tp_name);')
code.putln(
- "return -1;")
+ "return -1;")
code.putln(
- "}")
+ "}")
code.putln(
- "else {")
+ "else {")
if del_entry:
code.putln(
- "return %s(o, i);" % (
- del_entry.func_cname))
+ "return %s(o, i);" % (
+ del_entry.func_cname))
else:
self.generate_guarded_basetype_call(
base_type, "tp_as_mapping", "mp_ass_subscript", "o, i, v", code)
code.putln(
- "PyErr_Format(PyExc_NotImplementedError,")
+ "PyErr_Format(PyExc_NotImplementedError,")
code.putln(
- ' "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name);')
+ ' "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name);')
code.putln(
- "return -1;")
+ "return -1;")
code.putln(
- "}")
+ "}")
code.putln(
"}")
@@ -1802,42 +1802,42 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
del_entry = scope.lookup_here("__delslice__")
code.putln("")
code.putln(
- "static int %s(PyObject *o, Py_ssize_t i, Py_ssize_t j, PyObject *v) {" % (
- scope.mangle_internal("sq_ass_slice")))
+ "static int %s(PyObject *o, Py_ssize_t i, Py_ssize_t j, PyObject *v) {" % (
+ scope.mangle_internal("sq_ass_slice")))
code.putln(
- "if (v) {")
+ "if (v) {")
if set_entry:
code.putln(
- "return %s(o, i, j, v);" % (
- set_entry.func_cname))
+ "return %s(o, i, j, v);" % (
+ set_entry.func_cname))
else:
self.generate_guarded_basetype_call(
base_type, "tp_as_sequence", "sq_ass_slice", "o, i, j, v", code)
code.putln(
- "PyErr_Format(PyExc_NotImplementedError,")
+ "PyErr_Format(PyExc_NotImplementedError,")
code.putln(
- ' "2-element slice assignment not supported by %.200s", Py_TYPE(o)->tp_name);')
+ ' "2-element slice assignment not supported by %.200s", Py_TYPE(o)->tp_name);')
code.putln(
- "return -1;")
+ "return -1;")
code.putln(
- "}")
+ "}")
code.putln(
- "else {")
+ "else {")
if del_entry:
code.putln(
- "return %s(o, i, j);" % (
- del_entry.func_cname))
+ "return %s(o, i, j);" % (
+ del_entry.func_cname))
else:
self.generate_guarded_basetype_call(
base_type, "tp_as_sequence", "sq_ass_slice", "o, i, j, v", code)
code.putln(
- "PyErr_Format(PyExc_NotImplementedError,")
+ "PyErr_Format(PyExc_NotImplementedError,")
code.putln(
- ' "2-element slice deletion not supported by %.200s", Py_TYPE(o)->tp_name);')
+ ' "2-element slice deletion not supported by %.200s", Py_TYPE(o)->tp_name);')
code.putln(
- "return -1;")
+ "return -1;")
code.putln(
- "}")
+ "}")
code.putln(
"}")
@@ -1935,12 +1935,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
getattribute_entry = lookup_here_or_base("__getattribute__")
code.putln("")
code.putln(
- "static PyObject *%s(PyObject *o, PyObject *n) {" % (
- scope.mangle_internal("tp_getattro")))
+ "static PyObject *%s(PyObject *o, PyObject *n) {" % (
+ scope.mangle_internal("tp_getattro")))
if getattribute_entry is not None:
code.putln(
- "PyObject *v = %s(o, n);" % (
- getattribute_entry.func_cname))
+ "PyObject *v = %s(o, n);" % (
+ getattribute_entry.func_cname))
else:
if not has_instance_dict and scope.parent_type.is_final_type:
# Final with no dict => use faster type attribute lookup.
@@ -1962,8 +1962,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln(
"PyErr_Clear();")
code.putln(
- "v = %s(o, n);" % (
- getattr_entry.func_cname))
+ "v = %s(o, n);" % (
+ getattr_entry.func_cname))
code.putln(
"}")
code.putln(
@@ -1980,34 +1980,34 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
del_entry = scope.lookup_here("__delattr__")
code.putln("")
code.putln(
- "static int %s(PyObject *o, PyObject *n, PyObject *v) {" % (
- scope.mangle_internal("tp_setattro")))
+ "static int %s(PyObject *o, PyObject *n, PyObject *v) {" % (
+ scope.mangle_internal("tp_setattro")))
code.putln(
- "if (v) {")
+ "if (v) {")
if set_entry:
code.putln(
- "return %s(o, n, v);" % (
- set_entry.func_cname))
+ "return %s(o, n, v);" % (
+ set_entry.func_cname))
else:
self.generate_guarded_basetype_call(
base_type, None, "tp_setattro", "o, n, v", code)
code.putln(
- "return PyObject_GenericSetAttr(o, n, v);")
+ "return PyObject_GenericSetAttr(o, n, v);")
code.putln(
- "}")
+ "}")
code.putln(
- "else {")
+ "else {")
if del_entry:
code.putln(
- "return %s(o, n);" % (
- del_entry.func_cname))
+ "return %s(o, n);" % (
+ del_entry.func_cname))
else:
self.generate_guarded_basetype_call(
base_type, None, "tp_setattro", "o, n, v", code)
code.putln(
- "return PyObject_GenericSetAttr(o, n, 0);")
+ "return PyObject_GenericSetAttr(o, n, 0);")
code.putln(
- "}")
+ "}")
code.putln(
"}")
@@ -2019,8 +2019,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
user_get_entry = scope.lookup_here("__get__")
code.putln("")
code.putln(
- "static PyObject *%s(PyObject *o, PyObject *i, PyObject *c) {" % (
- scope.mangle_internal("tp_descr_get")))
+ "static PyObject *%s(PyObject *o, PyObject *i, PyObject *c) {" % (
+ scope.mangle_internal("tp_descr_get")))
code.putln(
"PyObject *r = 0;")
code.putln(
@@ -2030,8 +2030,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
#code.put_incref("i", py_object_type)
#code.put_incref("c", py_object_type)
code.putln(
- "r = %s(o, i, c);" % (
- user_get_entry.func_cname))
+ "r = %s(o, i, c);" % (
+ user_get_entry.func_cname))
#code.put_decref("i", py_object_type)
#code.put_decref("c", py_object_type)
code.putln(
@@ -2048,38 +2048,38 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
user_del_entry = scope.lookup_here("__delete__")
code.putln("")
code.putln(
- "static int %s(PyObject *o, PyObject *i, PyObject *v) {" % (
- scope.mangle_internal("tp_descr_set")))
+ "static int %s(PyObject *o, PyObject *i, PyObject *v) {" % (
+ scope.mangle_internal("tp_descr_set")))
code.putln(
- "if (v) {")
+ "if (v) {")
if user_set_entry:
code.putln(
- "return %s(o, i, v);" % (
- user_set_entry.func_cname))
+ "return %s(o, i, v);" % (
+ user_set_entry.func_cname))
else:
self.generate_guarded_basetype_call(
base_type, None, "tp_descr_set", "o, i, v", code)
code.putln(
- 'PyErr_SetString(PyExc_NotImplementedError, "__set__");')
+ 'PyErr_SetString(PyExc_NotImplementedError, "__set__");')
code.putln(
- "return -1;")
+ "return -1;")
code.putln(
- "}")
+ "}")
code.putln(
- "else {")
+ "else {")
if user_del_entry:
code.putln(
- "return %s(o, i);" % (
- user_del_entry.func_cname))
+ "return %s(o, i);" % (
+ user_del_entry.func_cname))
else:
self.generate_guarded_basetype_call(
base_type, None, "tp_descr_set", "o, i, v", code)
code.putln(
- 'PyErr_SetString(PyExc_NotImplementedError, "__delete__");')
+ 'PyErr_SetString(PyExc_NotImplementedError, "__delete__");')
code.putln(
- "return -1;")
+ "return -1;")
code.putln(
- "}")
+ "}")
code.putln(
"}")
@@ -2098,11 +2098,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
get_entry = property_scope.lookup_here("__get__")
code.putln("")
code.putln(
- "static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {" % (
- property_entry.getter_cname))
+ "static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {" % (
+ property_entry.getter_cname))
code.putln(
- "return %s(o);" % (
- get_entry.func_cname))
+ "return %s(o);" % (
+ get_entry.func_cname))
code.putln(
"}")
@@ -2114,34 +2114,34 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
del_entry = property_scope.lookup_here("__del__")
code.putln("")
code.putln(
- "static int %s(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {" % (
- property_entry.setter_cname))
+ "static int %s(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {" % (
+ property_entry.setter_cname))
code.putln(
- "if (v) {")
+ "if (v) {")
if set_entry:
code.putln(
- "return %s(o, v);" % (
- set_entry.func_cname))
+ "return %s(o, v);" % (
+ set_entry.func_cname))
else:
code.putln(
- 'PyErr_SetString(PyExc_NotImplementedError, "__set__");')
+ 'PyErr_SetString(PyExc_NotImplementedError, "__set__");')
code.putln(
- "return -1;")
+ "return -1;")
code.putln(
- "}")
+ "}")
code.putln(
- "else {")
+ "else {")
if del_entry:
code.putln(
- "return %s(o);" % (
- del_entry.func_cname))
+ "return %s(o);" % (
+ del_entry.func_cname))
else:
code.putln(
- 'PyErr_SetString(PyExc_NotImplementedError, "__del__");')
+ 'PyErr_SetString(PyExc_NotImplementedError, "__del__");')
code.putln(
- "return -1;")
+ "return -1;")
code.putln(
- "}")
+ "}")
code.putln(
"}")
@@ -2167,7 +2167,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
else:
objstruct = "struct %s" % type.objstruct_cname
code.putln(
- "sizeof(%s), /*tp_basicsize*/" % objstruct)
+ "sizeof(%s), /*tp_basicsize*/" % objstruct)
code.putln(
"0, /*tp_itemsize*/")
for slot in TypeSlots.slot_table:
@@ -2178,88 +2178,88 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_method_table(self, env, code):
if env.is_c_class_scope and not env.pyfunc_entries:
return
- binding = env.directives['binding']
-
+ binding = env.directives['binding']
+
code.putln("")
- wrapper_code_writer = code.insertion_point()
-
+ wrapper_code_writer = code.insertion_point()
+
code.putln(
- "static PyMethodDef %s[] = {" % (
- env.method_table_cname))
+ "static PyMethodDef %s[] = {" % (
+ env.method_table_cname))
for entry in env.pyfunc_entries:
- if not entry.fused_cfunction and not (binding and entry.is_overridable):
- code.put_pymethoddef(entry, ",", wrapper_code_writer=wrapper_code_writer)
+ if not entry.fused_cfunction and not (binding and entry.is_overridable):
+ code.put_pymethoddef(entry, ",", wrapper_code_writer=wrapper_code_writer)
code.putln(
- "{0, 0, 0, 0}")
+ "{0, 0, 0, 0}")
code.putln(
"};")
- if wrapper_code_writer.getvalue():
- wrapper_code_writer.putln("")
-
- def generate_dict_getter_function(self, scope, code):
- dict_attr = scope.lookup_here("__dict__")
- if not dict_attr or not dict_attr.is_variable:
- return
- func_name = scope.mangle_internal("__dict__getter")
- dict_name = dict_attr.cname
- code.putln("")
- code.putln("static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {" % func_name)
- self.generate_self_cast(scope, code)
- code.putln("if (unlikely(!p->%s)){" % dict_name)
- code.putln("p->%s = PyDict_New();" % dict_name)
- code.putln("}")
- code.putln("Py_XINCREF(p->%s);" % dict_name)
- code.putln("return p->%s;" % dict_name)
- code.putln("}")
-
+ if wrapper_code_writer.getvalue():
+ wrapper_code_writer.putln("")
+
+ def generate_dict_getter_function(self, scope, code):
+ dict_attr = scope.lookup_here("__dict__")
+ if not dict_attr or not dict_attr.is_variable:
+ return
+ func_name = scope.mangle_internal("__dict__getter")
+ dict_name = dict_attr.cname
+ code.putln("")
+ code.putln("static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {" % func_name)
+ self.generate_self_cast(scope, code)
+ code.putln("if (unlikely(!p->%s)){" % dict_name)
+ code.putln("p->%s = PyDict_New();" % dict_name)
+ code.putln("}")
+ code.putln("Py_XINCREF(p->%s);" % dict_name)
+ code.putln("return p->%s;" % dict_name)
+ code.putln("}")
+
def generate_getset_table(self, env, code):
if env.property_entries:
code.putln("")
code.putln(
"static struct PyGetSetDef %s[] = {" %
- env.getset_table_cname)
+ env.getset_table_cname)
for entry in env.property_entries:
- doc = entry.doc
- if doc:
- if doc.is_unicode:
- doc = doc.as_utf8_string()
- doc_code = doc.as_c_string_literal()
+ doc = entry.doc
+ if doc:
+ if doc.is_unicode:
+ doc = doc.as_utf8_string()
+ doc_code = doc.as_c_string_literal()
else:
doc_code = "0"
code.putln(
- '{(char *)"%s", %s, %s, (char *)%s, 0},' % (
+ '{(char *)"%s", %s, %s, (char *)%s, 0},' % (
entry.name,
entry.getter_cname or "0",
entry.setter_cname or "0",
doc_code))
code.putln(
- "{0, 0, 0, 0, 0}")
+ "{0, 0, 0, 0, 0}")
code.putln(
"};")
- def create_import_star_conversion_utility_code(self, env):
- # Create all conversion helpers that are needed for "import *" assignments.
- # Must be done before code generation to support CythonUtilityCode.
- for name, entry in sorted(env.entries.items()):
- if entry.is_cglobal and entry.used:
- if not entry.type.is_pyobject:
- entry.type.create_from_py_utility_code(env)
-
+ def create_import_star_conversion_utility_code(self, env):
+ # Create all conversion helpers that are needed for "import *" assignments.
+ # Must be done before code generation to support CythonUtilityCode.
+ for name, entry in sorted(env.entries.items()):
+ if entry.is_cglobal and entry.used:
+ if not entry.type.is_pyobject:
+ entry.type.create_from_py_utility_code(env)
+
def generate_import_star(self, env, code):
- env.use_utility_code(UtilityCode.load_cached("CStringEquals", "StringTools.c"))
+ env.use_utility_code(UtilityCode.load_cached("CStringEquals", "StringTools.c"))
code.putln()
- code.enter_cfunc_scope() # as we need labels
- code.putln("static int %s(PyObject *o, PyObject* py_name, char *name) {" % Naming.import_star_set)
-
- code.putln("static const char* internal_type_names[] = {")
+ code.enter_cfunc_scope() # as we need labels
+ code.putln("static int %s(PyObject *o, PyObject* py_name, char *name) {" % Naming.import_star_set)
+
+ code.putln("static const char* internal_type_names[] = {")
for name, entry in sorted(env.entries.items()):
if entry.is_type:
code.putln('"%s",' % name)
code.putln("0")
code.putln("};")
-
- code.putln("const char** type_name = internal_type_names;")
+
+ code.putln("const char** type_name = internal_type_names;")
code.putln("while (*type_name) {")
code.putln("if (__Pyx_StrEq(name, *type_name)) {")
code.putln('PyErr_Format(PyExc_TypeError, "Cannot overwrite C type %s", name);')
@@ -2267,17 +2267,17 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("}")
code.putln("type_name++;")
code.putln("}")
-
+
old_error_label = code.new_error_label()
- code.putln("if (0);") # so the first one can be "else if"
- msvc_count = 0
- for name, entry in sorted(env.entries.items()):
- if entry.is_cglobal and entry.used and not entry.type.is_const:
- msvc_count += 1
- if msvc_count % 100 == 0:
- code.putln("#ifdef _MSC_VER")
- code.putln("if (0); /* Workaround for MSVC C1061. */")
- code.putln("#endif")
+ code.putln("if (0);") # so the first one can be "else if"
+ msvc_count = 0
+ for name, entry in sorted(env.entries.items()):
+ if entry.is_cglobal and entry.used and not entry.type.is_const:
+ msvc_count += 1
+ if msvc_count % 100 == 0:
+ code.putln("#ifdef _MSC_VER")
+ code.putln("if (0); /* Workaround for MSVC C1061. */")
+ code.putln("#endif")
code.putln('else if (__Pyx_StrEq(name, "%s")) {' % name)
if entry.type.is_pyobject:
if entry.type.is_extension_type or entry.type.is_builtin_type:
@@ -2289,13 +2289,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("%s = %s;" % (
entry.cname,
PyrexTypes.typecast(entry.type, py_object_type, "o")))
- elif entry.type.create_from_py_utility_code(env):
- # if available, utility code was already created in self.prepare_utility_code()
- code.putln(entry.type.from_py_call_code(
- 'o', entry.cname, entry.pos, code))
+ elif entry.type.create_from_py_utility_code(env):
+ # if available, utility code was already created in self.prepare_utility_code()
+ code.putln(entry.type.from_py_call_code(
+ 'o', entry.cname, entry.pos, code))
else:
- code.putln('PyErr_Format(PyExc_TypeError, "Cannot convert Python object %s to %s");' % (
- name, entry.type))
+ code.putln('PyErr_Format(PyExc_TypeError, "Cannot convert Python object %s to %s");' % (
+ name, entry.type))
code.putln(code.error_goto(entry.pos))
code.putln("}")
code.putln("else {")
@@ -2310,17 +2310,17 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("bad:")
code.putln("return -1;")
code.putln("}")
- code.putln("")
+ code.putln("")
code.putln(UtilityCode.load_as_string("ImportStar", "ImportExport.c")[1])
- code.exit_cfunc_scope() # done with labels
+ code.exit_cfunc_scope() # done with labels
- def generate_module_init_func(self, imported_modules, env, options, code):
+ def generate_module_init_func(self, imported_modules, env, options, code):
subfunction = self.mod_init_subfunction(self.pos, self.scope, code)
- code.enter_cfunc_scope(self.scope)
+ code.enter_cfunc_scope(self.scope)
code.putln("")
code.putln(UtilityCode.load_as_string("PyModInitFuncType", "ModuleSetupCode.c")[0])
- init_name = 'init' + (options.init_suffix or env.module_name)
+ init_name = 'init' + (options.init_suffix or env.module_name)
header2 = "__Pyx_PyMODINIT_FUNC %s(void)" % init_name
header3 = "__Pyx_PyMODINIT_FUNC %s(void)" % self.mod_init_func_cname('PyInit', env, options)
code.putln("#if PY_MAJOR_VERSION < 3")
@@ -2342,7 +2342,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("")
# main module init code lives in Py_mod_exec function, not in PyInit function
- code.putln("static CYTHON_SMALL_CODE int %s(PyObject *%s)" % (
+ code.putln("static CYTHON_SMALL_CODE int %s(PyObject *%s)" % (
self.mod_init_func_cname(Naming.pymodule_exec_func_cname, env),
Naming.pymodinit_module_arg))
code.putln("#endif") # PEP489
@@ -2354,26 +2354,26 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
tempdecl_code = code.insertion_point()
- profile = code.globalstate.directives['profile']
- linetrace = code.globalstate.directives['linetrace']
- if profile or linetrace:
- code.globalstate.use_utility_code(UtilityCode.load_cached("Profile", "Profile.c"))
-
+ profile = code.globalstate.directives['profile']
+ linetrace = code.globalstate.directives['linetrace']
+ if profile or linetrace:
+ code.globalstate.use_utility_code(UtilityCode.load_cached("Profile", "Profile.c"))
+
code.put_declare_refcount_context()
code.putln("#if CYTHON_PEP489_MULTI_PHASE_INIT")
- # Most extension modules simply can't deal with it, and Cython isn't ready either.
- # See issues listed here: https://docs.python.org/3/c-api/init.html#sub-interpreter-support
- code.putln("if (%s) {" % Naming.module_cname)
+ # Most extension modules simply can't deal with it, and Cython isn't ready either.
+ # See issues listed here: https://docs.python.org/3/c-api/init.html#sub-interpreter-support
+ code.putln("if (%s) {" % Naming.module_cname)
# Hack: enforce single initialisation.
- code.putln("if (%s == %s) return 0;" % (
+ code.putln("if (%s == %s) return 0;" % (
Naming.module_cname,
Naming.pymodinit_module_arg,
))
- code.putln('PyErr_SetString(PyExc_RuntimeError,'
- ' "Module \'%s\' has already been imported. Re-initialisation is not supported.");' %
- env.module_name)
- code.putln("return -1;")
- code.putln("}")
+ code.putln('PyErr_SetString(PyExc_RuntimeError,'
+ ' "Module \'%s\' has already been imported. Re-initialisation is not supported.");' %
+ env.module_name)
+ code.putln("return -1;")
+ code.putln("}")
code.putln("#elif PY_MAJOR_VERSION >= 3")
# Hack: enforce single initialisation also on reimports under different names on Python 3 (with PEP 3121/489).
code.putln("if (%s) return __Pyx_NewRef(%s);" % (
@@ -2382,31 +2382,31 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
))
code.putln("#endif")
- if profile or linetrace:
- tempdecl_code.put_trace_declarations()
- code.put_trace_frame_init()
-
+ if profile or linetrace:
+ tempdecl_code.put_trace_declarations()
+ code.put_trace_frame_init()
+
refnanny_import_code = UtilityCode.load_as_string("ImportRefnannyAPI", "ModuleSetupCode.c")[1]
code.putln(refnanny_import_code.rstrip())
code.put_setup_refcount_context(header3)
env.use_utility_code(UtilityCode.load("CheckBinaryVersion", "ModuleSetupCode.c"))
- code.put_error_if_neg(self.pos, "__Pyx_check_binary_version()")
-
- code.putln("#ifdef __Pxy_PyFrame_Initialize_Offsets")
- code.putln("__Pxy_PyFrame_Initialize_Offsets();")
- code.putln("#endif")
- code.putln("%s = PyTuple_New(0); %s" % (
- Naming.empty_tuple, code.error_goto_if_null(Naming.empty_tuple, self.pos)))
- code.putln("%s = PyBytes_FromStringAndSize(\"\", 0); %s" % (
- Naming.empty_bytes, code.error_goto_if_null(Naming.empty_bytes, self.pos)))
- code.putln("%s = PyUnicode_FromStringAndSize(\"\", 0); %s" % (
- Naming.empty_unicode, code.error_goto_if_null(Naming.empty_unicode, self.pos)))
+ code.put_error_if_neg(self.pos, "__Pyx_check_binary_version()")
+
+ code.putln("#ifdef __Pxy_PyFrame_Initialize_Offsets")
+ code.putln("__Pxy_PyFrame_Initialize_Offsets();")
+ code.putln("#endif")
+ code.putln("%s = PyTuple_New(0); %s" % (
+ Naming.empty_tuple, code.error_goto_if_null(Naming.empty_tuple, self.pos)))
+ code.putln("%s = PyBytes_FromStringAndSize(\"\", 0); %s" % (
+ Naming.empty_bytes, code.error_goto_if_null(Naming.empty_bytes, self.pos)))
+ code.putln("%s = PyUnicode_FromStringAndSize(\"\", 0); %s" % (
+ Naming.empty_unicode, code.error_goto_if_null(Naming.empty_unicode, self.pos)))
for ext_type in ('CyFunction', 'FusedFunction', 'Coroutine', 'Generator', 'AsyncGen', 'StopAsyncIteration'):
- code.putln("#ifdef __Pyx_%s_USED" % ext_type)
- code.put_error_if_neg(self.pos, "__pyx_%s_init()" % ext_type)
- code.putln("#endif")
+ code.putln("#ifdef __Pyx_%s_USED" % ext_type)
+ code.put_error_if_neg(self.pos, "__pyx_%s_init()" % ext_type)
+ code.putln("#endif")
code.putln("/*--- Library function declarations ---*/")
if env.directives['np_pythran']:
@@ -2419,21 +2419,21 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("#endif")
code.putln("/*--- Module creation code ---*/")
- self.generate_module_creation_code(env, options, code)
+ self.generate_module_creation_code(env, options, code)
code.putln("/*--- Initialize various global constants etc. ---*/")
- code.put_error_if_neg(self.pos, "__Pyx_InitGlobals()")
+ code.put_error_if_neg(self.pos, "__Pyx_InitGlobals()")
- code.putln("#if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || "
- "__PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)")
- code.put_error_if_neg(self.pos, "__Pyx_init_sys_getdefaultencoding_params()")
+ code.putln("#if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || "
+ "__PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)")
+ code.put_error_if_neg(self.pos, "__Pyx_init_sys_getdefaultencoding_params()")
code.putln("#endif")
code.putln("if (%s%s) {" % (Naming.module_is_main, self.full_module_name.replace('.', '__')))
- code.put_error_if_neg(self.pos, 'PyObject_SetAttr(%s, %s, %s)' % (
- env.module_cname,
- code.intern_identifier(EncodedString("__name__")),
- code.intern_identifier(EncodedString("__main__"))))
+ code.put_error_if_neg(self.pos, 'PyObject_SetAttr(%s, %s, %s)' % (
+ env.module_cname,
+ code.intern_identifier(EncodedString("__name__")),
+ code.intern_identifier(EncodedString("__main__"))))
code.putln("}")
# set up __file__ and __path__, then add the module to sys.modules
@@ -2476,20 +2476,20 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("/*--- Execution code ---*/")
code.mark_pos(None)
- code.putln("#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)")
- code.put_error_if_neg(self.pos, "__Pyx_patch_abc()")
- code.putln("#endif")
-
- if profile or linetrace:
- code.put_trace_call(header3, self.pos, nogil=not code.funcstate.gil_owned)
- code.funcstate.can_trace = True
-
+ code.putln("#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)")
+ code.put_error_if_neg(self.pos, "__Pyx_patch_abc()")
+ code.putln("#endif")
+
+ if profile or linetrace:
+ code.put_trace_call(header3, self.pos, nogil=not code.funcstate.gil_owned)
+ code.funcstate.can_trace = True
+
self.body.generate_execution_code(code)
- if profile or linetrace:
- code.funcstate.can_trace = False
- code.put_trace_return("Py_None", nogil=not code.funcstate.gil_owned)
-
+ if profile or linetrace:
+ code.funcstate.can_trace = False
+ code.put_trace_return("Py_None", nogil=not code.funcstate.gil_owned)
+
code.putln()
code.putln("/*--- Wrapped vars code ---*/")
self.generate_wrapped_entries_code(env, code)
@@ -2506,15 +2506,15 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.put_xdecref(cname, type)
code.putln('if (%s) {' % env.module_cname)
code.putln('if (%s) {' % env.module_dict_cname)
- code.put_add_traceback("init %s" % env.qualified_name)
+ code.put_add_traceback("init %s" % env.qualified_name)
code.globalstate.use_utility_code(Nodes.traceback_utility_code)
- # Module reference and module dict are in global variables which might still be needed
- # for cleanup, atexit code, etc., so leaking is better than crashing.
- # At least clearing the module dict here might be a good idea, but could still break
- # user code in atexit or other global registries.
- ##code.put_decref_clear(env.module_dict_cname, py_object_type, nanny=False)
+ # Module reference and module dict are in global variables which might still be needed
+ # for cleanup, atexit code, etc., so leaking is better than crashing.
+ # At least clearing the module dict here might be a good idea, but could still break
+ # user code in atexit or other global registries.
+ ##code.put_decref_clear(env.module_dict_cname, py_object_type, nanny=False)
code.putln('}')
- code.put_decref_clear(env.module_cname, py_object_type, nanny=False, clear_before_decref=True)
+ code.put_decref_clear(env.module_cname, py_object_type, nanny=False, clear_before_decref=True)
code.putln('} else if (!PyErr_Occurred()) {')
code.putln('PyErr_SetString(PyExc_ImportError, "init %s");' % env.qualified_name)
code.putln('}')
@@ -2562,7 +2562,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self.call_code = orig_code.insertion_point()
code = function_code
code.enter_cfunc_scope(scope)
- prototypes.putln("static CYTHON_SMALL_CODE int %s(void); /*proto*/" % self.cfunc_name)
+ prototypes.putln("static CYTHON_SMALL_CODE int %s(void); /*proto*/" % self.cfunc_name)
code.putln("static int %s(void) {" % self.cfunc_name)
code.put_declare_refcount_context()
self.tempdecl_code = code.insertion_point()
@@ -2730,11 +2730,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# if entry.type.is_pyobject and entry.used:
# code.putln("Py_DECREF(%s); %s = 0;" % (
# code.entry_as_pyobject(entry), entry.cname))
- if Options.pre_import is not None:
- code.put_decref_clear(Naming.preimport_cname, py_object_type,
- nanny=False, clear_before_decref=True)
- for cname in [env.module_dict_cname, Naming.cython_runtime_cname, Naming.builtins_cname]:
- code.put_decref_clear(cname, py_object_type, nanny=False, clear_before_decref=True)
+ if Options.pre_import is not None:
+ code.put_decref_clear(Naming.preimport_cname, py_object_type,
+ nanny=False, clear_before_decref=True)
+ for cname in [env.module_dict_cname, Naming.cython_runtime_cname, Naming.builtins_cname]:
+ code.put_decref_clear(cname, py_object_type, nanny=False, clear_before_decref=True)
def generate_main_method(self, env, code):
module_is_main = "%s%s" % (Naming.module_is_main, self.full_module_name.replace('.', '__'))
@@ -2742,18 +2742,18 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
wmain = "wmain"
else:
wmain = Options.embed
- main_method = UtilityCode.load_cached("MainFunction", "Embed.c")
+ main_method = UtilityCode.load_cached("MainFunction", "Embed.c")
code.globalstate.use_utility_code(
main_method.specialize(
- module_name=env.module_name,
- module_is_main=module_is_main,
- main_method=Options.embed,
- wmain_method=wmain))
+ module_name=env.module_name,
+ module_is_main=module_is_main,
+ main_method=Options.embed,
+ wmain_method=wmain))
def mod_init_func_cname(self, prefix, env, options=None):
- return '%s_%s' % (prefix, options and options.init_suffix or env.module_name)
+ return '%s_%s' % (prefix, options and options.init_suffix or env.module_name)
- def generate_pymoduledef_struct(self, env, options, code):
+ def generate_pymoduledef_struct(self, env, options, code):
if env.doc:
doc = "%s" % code.get_string_const(env.doc)
else:
@@ -2781,7 +2781,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("")
code.putln("static struct PyModuleDef %s = {" % Naming.pymoduledef_cname)
code.putln(" PyModuleDef_HEAD_INIT,")
- code.putln(' "%s",' % (options.module_name or env.module_name))
+ code.putln(' "%s",' % (options.module_name or env.module_name))
code.putln(" %s, /* m_doc */" % doc)
code.putln("#if CYTHON_PEP489_MULTI_PHASE_INIT")
code.putln(" 0, /* m_size */")
@@ -2800,7 +2800,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("};")
code.putln("#endif")
- def generate_module_creation_code(self, env, options, code):
+ def generate_module_creation_code(self, env, options, code):
# Generate code to create the module object and
# install the builtins.
if env.doc:
@@ -2818,7 +2818,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln(
'%s = Py_InitModule4("%s", %s, %s, 0, PYTHON_API_VERSION); Py_XINCREF(%s);' % (
env.module_cname,
- options.module_name or env.module_name,
+ options.module_name or env.module_name,
env.method_table_cname,
doc,
env.module_cname))
@@ -2841,12 +2841,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
'%s = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); %s' % (
Naming.builtins_cname,
code.error_goto_if_null(Naming.builtins_cname, self.pos)))
- code.put_incref(Naming.builtins_cname, py_object_type, nanny=False)
+ code.put_incref(Naming.builtins_cname, py_object_type, nanny=False)
code.putln(
'%s = PyImport_AddModule((char *) "cython_runtime"); %s' % (
Naming.cython_runtime_cname,
code.error_goto_if_null(Naming.cython_runtime_cname, self.pos)))
- code.put_incref(Naming.cython_runtime_cname, py_object_type, nanny=False)
+ code.put_incref(Naming.cython_runtime_cname, py_object_type, nanny=False)
code.putln(
'if (PyObject_SetAttrString(%s, "__builtins__", %s) < 0) %s;' % (
env.module_cname,
@@ -2858,7 +2858,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
Naming.preimport_cname,
Options.pre_import,
code.error_goto_if_null(Naming.preimport_cname, self.pos)))
- code.put_incref(Naming.preimport_cname, py_object_type, nanny=False)
+ code.put_incref(Naming.preimport_cname, py_object_type, nanny=False)
def generate_global_init_code(self, env, code):
# Generate code to initialise global PyObject *
@@ -2869,7 +2869,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
entry.type.global_init_code(entry, code)
def generate_wrapped_entries_code(self, env, code):
- for name, entry in sorted(env.entries.items()):
+ for name, entry in sorted(env.entries.items()):
if (entry.create_wrapper
and not entry.is_type
and entry.scope is env):
@@ -2892,13 +2892,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
entries = []
for entry in env.var_entries:
if (entry.api
- or entry.defined_in_pxd
- or (Options.cimport_from_pyx and not entry.visibility == 'extern')):
+ or entry.defined_in_pxd
+ or (Options.cimport_from_pyx and not entry.visibility == 'extern')):
entries.append(entry)
if entries:
env.use_utility_code(UtilityCode.load_cached("VoidPtrExport", "ImportExport.c"))
for entry in entries:
- signature = entry.type.empty_declaration_code()
+ signature = entry.type.empty_declaration_code()
name = code.intern_identifier(entry.name)
code.putln('if (__Pyx_ExportVoidPtr(%s, (void *)&%s, "%s") < 0) %s' % (
name, entry.cname, signature,
@@ -2909,14 +2909,14 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
entries = []
for entry in env.cfunc_entries:
if (entry.api
- or entry.defined_in_pxd
- or (Options.cimport_from_pyx and not entry.visibility == 'extern')):
+ or entry.defined_in_pxd
+ or (Options.cimport_from_pyx and not entry.visibility == 'extern')):
entries.append(entry)
if entries:
env.use_utility_code(
UtilityCode.load_cached("FunctionExport", "ImportExport.c"))
- # Note: while this looks like it could be more cheaply stored and read from a struct array,
- # investigation shows that the resulting binary is smaller with repeated functions calls.
+ # Note: while this looks like it could be more cheaply stored and read from a struct array,
+ # investigation shows that the resulting binary is smaller with repeated functions calls.
for entry in entries:
signature = entry.type.signature_string()
code.putln('if (__Pyx_ExportFunction("%s", (void (*)(void))%s, "%s") < 0) %s' % (
@@ -2929,10 +2929,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# Generate type import code for all exported extension types in
# an imported module.
#if module.c_class_entries:
- with ModuleImportGenerator(code) as import_generator:
- for entry in module.c_class_entries:
- if entry.defined_in_pxd:
- self.generate_type_import_code(env, entry.type, entry.pos, code, import_generator)
+ with ModuleImportGenerator(code) as import_generator:
+ for entry in module.c_class_entries:
+ if entry.defined_in_pxd:
+ self.generate_type_import_code(env, entry.type, entry.pos, code, import_generator)
def specialize_fused_types(self, pxd_env):
"""
@@ -2957,7 +2957,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
UtilityCode.load_cached("VoidPtrImport", "ImportExport.c"))
temp = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
code.putln(
- '%s = PyImport_ImportModule("%s"); if (!%s) %s' % (
+ '%s = PyImport_ImportModule("%s"); if (!%s) %s' % (
temp,
module.qualified_name,
temp,
@@ -2968,7 +2968,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
cname = entry.cname
else:
cname = module.mangle(Naming.varptr_prefix, entry.name)
- signature = entry.type.empty_declaration_code()
+ signature = entry.type.empty_declaration_code()
code.putln(
'if (__Pyx_ImportVoidPtr(%s, "%s", (void **)&%s, "%s") < 0) %s' % (
temp, entry.name, cname, signature,
@@ -2987,7 +2987,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
UtilityCode.load_cached("FunctionImport", "ImportExport.c"))
temp = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
code.putln(
- '%s = PyImport_ImportModule("%s"); if (!%s) %s' % (
+ '%s = PyImport_ImportModule("%s"); if (!%s) %s' % (
temp,
module.qualified_name,
temp,
@@ -3007,33 +3007,33 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_type_init_code(self, env, code):
# Generate type import code for extern extension types
# and type ready code for non-extern ones.
- with ModuleImportGenerator(code) as import_generator:
- for entry in env.c_class_entries:
- if entry.visibility == 'extern' and not entry.utility_code_definition:
- self.generate_type_import_code(env, entry.type, entry.pos, code, import_generator)
- else:
- self.generate_base_type_import_code(env, entry, code, import_generator)
- self.generate_exttype_vtable_init_code(entry, code)
- if entry.type.early_init:
- self.generate_type_ready_code(entry, code)
-
- def generate_base_type_import_code(self, env, entry, code, import_generator):
+ with ModuleImportGenerator(code) as import_generator:
+ for entry in env.c_class_entries:
+ if entry.visibility == 'extern' and not entry.utility_code_definition:
+ self.generate_type_import_code(env, entry.type, entry.pos, code, import_generator)
+ else:
+ self.generate_base_type_import_code(env, entry, code, import_generator)
+ self.generate_exttype_vtable_init_code(entry, code)
+ if entry.type.early_init:
+ self.generate_type_ready_code(entry, code)
+
+ def generate_base_type_import_code(self, env, entry, code, import_generator):
base_type = entry.type.base_type
if (base_type and base_type.module_name != env.qualified_name and not
- base_type.is_builtin_type and not entry.utility_code_definition):
- self.generate_type_import_code(env, base_type, self.pos, code, import_generator)
+ base_type.is_builtin_type and not entry.utility_code_definition):
+ self.generate_type_import_code(env, base_type, self.pos, code, import_generator)
- def generate_type_import_code(self, env, type, pos, code, import_generator):
+ def generate_type_import_code(self, env, type, pos, code, import_generator):
# If not already done, generate code to import the typeobject of an
# extension type defined in another module, and extract its C method
# table pointer if any.
if type in env.types_imported:
return
- if type.name not in Code.ctypedef_builtins_map:
- # see corresponding condition in generate_type_import_call() below!
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("TypeImport", "ImportExport.c"))
- self.generate_type_import_call(type, code, import_generator, error_pos=pos)
+ if type.name not in Code.ctypedef_builtins_map:
+ # see corresponding condition in generate_type_import_call() below!
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("TypeImport", "ImportExport.c"))
+ self.generate_type_import_call(type, code, import_generator, error_pos=pos)
if type.vtabptr_cname:
code.globalstate.use_utility_code(
UtilityCode.load_cached('GetVTable', 'ImportExport.c'))
@@ -3044,7 +3044,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.error_goto_if_null(type.vtabptr_cname, pos)))
env.types_imported.add(type)
- def generate_type_import_call(self, type, code, import_generator, error_code=None, error_pos=None):
+ def generate_type_import_call(self, type, code, import_generator, error_code=None, error_pos=None):
if type.typedef_flag:
objstruct = type.objstruct_cname
else:
@@ -3054,11 +3054,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
condition = replacement = None
if module_name not in ('__builtin__', 'builtins'):
module_name = '"%s"' % module_name
- elif type.name in Code.ctypedef_builtins_map:
- # Fast path for special builtins, don't actually import
- ctypename = Code.ctypedef_builtins_map[type.name]
- code.putln('%s = %s;' % (type.typeptr_cname, ctypename))
- return
+ elif type.name in Code.ctypedef_builtins_map:
+ # Fast path for special builtins, don't actually import
+ ctypename = Code.ctypedef_builtins_map[type.name]
+ code.putln('%s = %s;' % (type.typeptr_cname, ctypename))
+ return
else:
module_name = '__Pyx_BUILTIN_MODULE_NAME'
if type.name in Code.non_portable_builtins_map:
@@ -3067,14 +3067,14 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# Some builtin types have a tp_basicsize which differs from sizeof(...):
sizeof_objstruct = Code.basicsize_builtins_map[objstruct]
- if not error_code:
- assert error_pos is not None
- error_code = code.error_goto(error_pos)
-
- module = import_generator.imported_module(module_name, error_code)
- code.put('%s = __Pyx_ImportType(%s, %s,' % (
+ if not error_code:
+ assert error_pos is not None
+ error_code = code.error_goto(error_pos)
+
+ module = import_generator.imported_module(module_name, error_code)
+ code.put('%s = __Pyx_ImportType(%s, %s,' % (
type.typeptr_cname,
- module,
+ module,
module_name))
if condition and replacement:
@@ -3090,7 +3090,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if sizeof_objstruct != objstruct:
if not condition:
code.putln("") # start in new line
- code.putln("#if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000")
+ code.putln("#if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000")
code.putln('sizeof(%s),' % objstruct)
code.putln("#else")
code.putln('sizeof(%s),' % sizeof_objstruct)
@@ -3098,18 +3098,18 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
else:
code.put('sizeof(%s), ' % objstruct)
- # check_size
- if type.check_size and type.check_size in ('error', 'warn', 'ignore'):
- check_size = type.check_size
- elif not type.is_external or type.is_subclassed:
- check_size = 'error'
- else:
- raise RuntimeError("invalid value for check_size '%s' when compiling %s.%s" % (
- type.check_size, module_name, type.name))
- code.putln('__Pyx_ImportType_CheckSize_%s);' % check_size.title())
-
- code.putln(' if (!%s) %s' % (type.typeptr_cname, error_code))
-
+ # check_size
+ if type.check_size and type.check_size in ('error', 'warn', 'ignore'):
+ check_size = type.check_size
+ elif not type.is_external or type.is_subclassed:
+ check_size = 'error'
+ else:
+ raise RuntimeError("invalid value for check_size '%s' when compiling %s.%s" % (
+ type.check_size, module_name, type.name))
+ code.putln('__Pyx_ImportType_CheckSize_%s);' % check_size.title())
+
+ code.putln(' if (!%s) %s' % (type.typeptr_cname, error_code))
+
def generate_type_ready_code(self, entry, code):
Nodes.CClassDefNode.generate_type_ready_code(entry, code)
@@ -3131,7 +3131,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
c_method_entries = [
entry for entry in type.scope.cfunc_entries
- if entry.func_cname]
+ if entry.func_cname]
if c_method_entries:
for meth_entry in c_method_entries:
cast = meth_entry.type.signature_cast_string()
@@ -3142,47 +3142,47 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
cast,
meth_entry.func_cname))
-
-class ModuleImportGenerator(object):
- """
- Helper to generate module import while importing external types.
- This is used to avoid excessive re-imports of external modules when multiple types are looked up.
- """
- def __init__(self, code, imported_modules=None):
- self.code = code
- self.imported = {}
- if imported_modules:
- for name, cname in imported_modules.items():
- self.imported['"%s"' % name] = cname
- self.temps = [] # remember original import order for freeing
-
- def imported_module(self, module_name_string, error_code):
- if module_name_string in self.imported:
- return self.imported[module_name_string]
-
- code = self.code
- temp = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
- self.temps.append(temp)
- code.putln('%s = PyImport_ImportModule(%s); if (unlikely(!%s)) %s' % (
- temp, module_name_string, temp, error_code))
- code.put_gotref(temp)
- self.imported[module_name_string] = temp
- return temp
-
- def __enter__(self):
- return self
-
- def __exit__(self, *exc):
- code = self.code
- for temp in self.temps:
- code.put_decref_clear(temp, py_object_type)
- code.funcstate.release_temp(temp)
-
-
+
+class ModuleImportGenerator(object):
+ """
+ Helper to generate module import while importing external types.
+ This is used to avoid excessive re-imports of external modules when multiple types are looked up.
+ """
+ def __init__(self, code, imported_modules=None):
+ self.code = code
+ self.imported = {}
+ if imported_modules:
+ for name, cname in imported_modules.items():
+ self.imported['"%s"' % name] = cname
+ self.temps = [] # remember original import order for freeing
+
+ def imported_module(self, module_name_string, error_code):
+ if module_name_string in self.imported:
+ return self.imported[module_name_string]
+
+ code = self.code
+ temp = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
+ self.temps.append(temp)
+ code.putln('%s = PyImport_ImportModule(%s); if (unlikely(!%s)) %s' % (
+ temp, module_name_string, temp, error_code))
+ code.put_gotref(temp)
+ self.imported[module_name_string] = temp
+ return temp
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *exc):
+ code = self.code
+ for temp in self.temps:
+ code.put_decref_clear(temp, py_object_type)
+ code.funcstate.release_temp(temp)
+
+
def generate_cfunction_declaration(entry, env, code, definition):
from_cy_utility = entry.used and entry.utility_code_definition
- if entry.used and entry.inline_func_in_pxd or (not entry.in_cinclude and (
- definition or entry.defined_in_pxd or entry.visibility == 'extern' or from_cy_utility)):
+ if entry.used and entry.inline_func_in_pxd or (not entry.in_cinclude and (
+ definition or entry.defined_in_pxd or entry.visibility == 'extern' or from_cy_utility)):
if entry.visibility == 'extern':
storage_class = Naming.extern_c_macro
dll_linkage = "DL_IMPORT"
@@ -3203,7 +3203,7 @@ def generate_cfunction_declaration(entry, env, code, definition):
type = CPtrType(type)
header = type.declaration_code(
- entry.cname, dll_linkage=dll_linkage)
+ entry.cname, dll_linkage=dll_linkage)
modifiers = code.build_function_modifiers(entry.func_modifiers)
code.putln("%s %s%s; /*proto*/" % (
storage_class,
@@ -3216,7 +3216,7 @@ def generate_cfunction_declaration(entry, env, code, definition):
#
#------------------------------------------------------------------------------------
-refnanny_utility_code = UtilityCode.load("Refnanny", "ModuleSetupCode.c")
+refnanny_utility_code = UtilityCode.load("Refnanny", "ModuleSetupCode.c")
packed_struct_utility_code = UtilityCode(proto="""
#if defined(__GNUC__)
diff --git a/contrib/tools/cython/Cython/Compiler/Naming.py b/contrib/tools/cython/Cython/Compiler/Naming.py
index 2c9b620788..68afd2b21c 100644
--- a/contrib/tools/cython/Cython/Compiler/Naming.py
+++ b/contrib/tools/cython/Cython/Compiler/Naming.py
@@ -18,7 +18,7 @@ arg_prefix = pyrex_prefix + "arg_"
funcdoc_prefix = pyrex_prefix + "doc_"
enum_prefix = pyrex_prefix + "e_"
func_prefix = pyrex_prefix + "f_"
-func_prefix_api = pyrex_prefix + "api_f_"
+func_prefix_api = pyrex_prefix + "api_f_"
pyfunc_prefix = pyrex_prefix + "pf_"
pywrap_prefix = pyrex_prefix + "pw_"
genbody_prefix = pyrex_prefix + "gb_"
@@ -28,7 +28,7 @@ const_prefix = pyrex_prefix + "k_"
py_const_prefix = pyrex_prefix + "kp_"
label_prefix = pyrex_prefix + "L"
pymethdef_prefix = pyrex_prefix + "mdef_"
-method_wrapper_prefix = pyrex_prefix + "specialmethod_"
+method_wrapper_prefix = pyrex_prefix + "specialmethod_"
methtab_prefix = pyrex_prefix + "methods_"
memtab_prefix = pyrex_prefix + "members_"
objstruct_prefix = pyrex_prefix + "obj_"
@@ -38,7 +38,7 @@ type_prefix = pyrex_prefix + "t_"
typeobj_prefix = pyrex_prefix + "type_"
var_prefix = pyrex_prefix + "v_"
varptr_prefix = pyrex_prefix + "vp_"
-varptr_prefix_api = pyrex_prefix + "api_vp_"
+varptr_prefix_api = pyrex_prefix + "api_vp_"
wrapperbase_prefix= pyrex_prefix + "wrapperbase_"
pybuffernd_prefix = pyrex_prefix + "pybuffernd_"
pybufferstruct_prefix = pyrex_prefix + "pybuffer_"
@@ -62,10 +62,10 @@ interned_prefixes = {
'codeobj': pyrex_prefix + "codeobj_",
'slice': pyrex_prefix + "slice_",
'ustring': pyrex_prefix + "ustring_",
- 'umethod': pyrex_prefix + "umethod_",
+ 'umethod': pyrex_prefix + "umethod_",
}
-ctuple_type_prefix = pyrex_prefix + "ctuple_"
+ctuple_type_prefix = pyrex_prefix + "ctuple_"
args_cname = pyrex_prefix + "args"
generator_cname = pyrex_prefix + "generator"
sent_value_cname = pyrex_prefix + "sent_value"
@@ -83,7 +83,7 @@ kwds_cname = pyrex_prefix + "kwds"
lineno_cname = pyrex_prefix + "lineno"
clineno_cname = pyrex_prefix + "clineno"
cfilenm_cname = pyrex_prefix + "cfilenm"
-local_tstate_cname = pyrex_prefix + "tstate"
+local_tstate_cname = pyrex_prefix + "tstate"
module_cname = pyrex_prefix + "m"
moddoc_cname = pyrex_prefix + "mdoc"
methtable_cname = pyrex_prefix + "methods"
@@ -97,7 +97,7 @@ gilstate_cname = pyrex_prefix + "state"
skip_dispatch_cname = pyrex_prefix + "skip_dispatch"
empty_tuple = pyrex_prefix + "empty_tuple"
empty_bytes = pyrex_prefix + "empty_bytes"
-empty_unicode = pyrex_prefix + "empty_unicode"
+empty_unicode = pyrex_prefix + "empty_unicode"
print_function = pyrex_prefix + "print"
print_function_kwargs = pyrex_prefix + "print_kwargs"
cleanup_cname = pyrex_prefix + "module_cleanup"
@@ -117,9 +117,9 @@ frame_code_cname = pyrex_prefix + "frame_code"
binding_cfunc = pyrex_prefix + "binding_PyCFunctionType"
fused_func_prefix = pyrex_prefix + 'fuse_'
quick_temp_cname = pyrex_prefix + "temp" # temp variable for quick'n'dirty temping
-tp_dict_version_temp = pyrex_prefix + "tp_dict_version"
-obj_dict_version_temp = pyrex_prefix + "obj_dict_version"
-type_dict_guard_temp = pyrex_prefix + "type_dict_guard"
+tp_dict_version_temp = pyrex_prefix + "tp_dict_version"
+obj_dict_version_temp = pyrex_prefix + "obj_dict_version"
+type_dict_guard_temp = pyrex_prefix + "type_dict_guard"
cython_runtime_cname = pyrex_prefix + "cython_runtime"
global_code_object_cache_find = pyrex_prefix + 'find_code_object'
diff --git a/contrib/tools/cython/Cython/Compiler/Nodes.py b/contrib/tools/cython/Cython/Compiler/Nodes.py
index 6436c5002d..6fbad234c7 100644
--- a/contrib/tools/cython/Cython/Compiler/Nodes.py
+++ b/contrib/tools/cython/Cython/Compiler/Nodes.py
@@ -22,22 +22,22 @@ from . import PyrexTypes
from . import TypeSlots
from .PyrexTypes import py_object_type, error_type
from .Symtab import (ModuleScope, LocalScope, ClosureScope,
- StructOrUnionScope, PyClassScope, CppClassScope, TemplateScope)
+ StructOrUnionScope, PyClassScope, CppClassScope, TemplateScope)
from .Code import UtilityCode
-from .StringEncoding import EncodedString
-from . import Future
+from .StringEncoding import EncodedString
+from . import Future
from . import Options
from . import DebugFlags
from .Pythran import has_np_pythran, pythran_type, is_pythran_buffer
-from ..Utils import add_metaclass
+from ..Utils import add_metaclass
-if sys.version_info[0] >= 3:
- _py_int_types = int
-else:
- _py_int_types = (int, long)
-
+if sys.version_info[0] >= 3:
+ _py_int_types = int
+else:
+ _py_int_types = (int, long)
+
def relative_position(pos):
return (pos[0].get_filenametable_entry(), pos[1])
@@ -69,25 +69,25 @@ def embed_position(pos, docstring):
def analyse_type_annotation(annotation, env, assigned_value=None):
- base_type = None
+ base_type = None
is_ambiguous = False
- explicit_pytype = explicit_ctype = False
- if annotation.is_dict_literal:
+ explicit_pytype = explicit_ctype = False
+ if annotation.is_dict_literal:
warning(annotation.pos,
"Dicts should no longer be used as type annotations. Use 'cython.int' etc. directly.")
- for name, value in annotation.key_value_pairs:
- if not name.is_string_literal:
- continue
- if name.value in ('type', b'type'):
- explicit_pytype = True
- if not explicit_ctype:
- annotation = value
- elif name.value in ('ctype', b'ctype'):
- explicit_ctype = True
- annotation = value
- if explicit_pytype and explicit_ctype:
- warning(annotation.pos, "Duplicate type declarations found in signature annotation")
- arg_type = annotation.analyse_as_type(env)
+ for name, value in annotation.key_value_pairs:
+ if not name.is_string_literal:
+ continue
+ if name.value in ('type', b'type'):
+ explicit_pytype = True
+ if not explicit_ctype:
+ annotation = value
+ elif name.value in ('ctype', b'ctype'):
+ explicit_ctype = True
+ annotation = value
+ if explicit_pytype and explicit_ctype:
+ warning(annotation.pos, "Duplicate type declarations found in signature annotation")
+ arg_type = annotation.analyse_as_type(env)
if annotation.is_name and not annotation.cython_attribute and annotation.name in ('int', 'long', 'float'):
# Map builtin numeric Python types to C types in safe cases.
if assigned_value is not None and arg_type is not None and not arg_type.is_pyobject:
@@ -102,19 +102,19 @@ def analyse_type_annotation(annotation, env, assigned_value=None):
elif arg_type is not None and annotation.is_string_literal:
warning(annotation.pos,
"Strings should no longer be used for type declarations. Use 'cython.int' etc. directly.")
- if arg_type is not None:
- if explicit_pytype and not explicit_ctype and not arg_type.is_pyobject:
- warning(annotation.pos,
- "Python type declaration in signature annotation does not refer to a Python type")
- base_type = CAnalysedBaseTypeNode(
- annotation.pos, type=arg_type, is_arg=True)
+ if arg_type is not None:
+ if explicit_pytype and not explicit_ctype and not arg_type.is_pyobject:
+ warning(annotation.pos,
+ "Python type declaration in signature annotation does not refer to a Python type")
+ base_type = CAnalysedBaseTypeNode(
+ annotation.pos, type=arg_type, is_arg=True)
elif is_ambiguous:
warning(annotation.pos, "Ambiguous types in annotation, ignoring")
- else:
+ else:
warning(annotation.pos, "Unknown type declaration in annotation, ignoring")
- return base_type, arg_type
-
-
+ return base_type, arg_type
+
+
def write_func_call(func, codewriter_class):
def f(*args, **kwds):
if len(args) > 1 and isinstance(args[1], codewriter_class):
@@ -122,10 +122,10 @@ def write_func_call(func, codewriter_class):
# but only if new code is generated
node, code = args[:2]
marker = ' /* %s -> %s.%s %s */' % (
- ' ' * code.call_level,
- node.__class__.__name__,
- func.__name__,
- node.pos[1:])
+ ' ' * code.call_level,
+ node.__class__.__name__,
+ func.__name__,
+ node.pos[1:])
pristine = code.buffer.stream.tell()
code.putln(marker)
start = code.buffer.stream.tell()
@@ -133,10 +133,10 @@ def write_func_call(func, codewriter_class):
res = func(*args, **kwds)
code.call_level -= 4
if start == code.buffer.stream.tell():
- # no code written => undo writing marker
- code.buffer.stream.truncate(pristine)
+ # no code written => undo writing marker
+ code.buffer.stream.truncate(pristine)
else:
- marker = marker.replace('->', '<-', 1)
+ marker = marker.replace('->', '<-', 1)
code.putln(marker)
return res
else:
@@ -170,7 +170,7 @@ class CheckAnalysers(type):
def call(*args, **kwargs):
retval = func(*args, **kwargs)
if retval is None:
- print('%s %s %s' % (name, args, kwargs))
+ print('%s %s %s' % (name, args, kwargs))
return retval
return call
@@ -181,14 +181,14 @@ class CheckAnalysers(type):
return super(CheckAnalysers, cls).__new__(cls, name, bases, attrs)
-def _with_metaclass(cls):
- if DebugFlags.debug_trace_code_generation:
- return add_metaclass(VerboseCodeWriter)(cls)
- #return add_metaclass(CheckAnalysers)(cls)
- return cls
-
-
-@_with_metaclass
+def _with_metaclass(cls):
+ if DebugFlags.debug_trace_code_generation:
+ return add_metaclass(VerboseCodeWriter)(cls)
+ #return add_metaclass(CheckAnalysers)(cls)
+ return cls
+
+
+@_with_metaclass
class Node(object):
# pos (string, int, int) Source file position
# is_name boolean Is a NameNode
@@ -199,7 +199,7 @@ class Node(object):
is_nonecheck = 0
is_literal = 0
is_terminator = 0
- is_wrapper = False # is a DefNode wrapper for a C function
+ is_wrapper = False # is a DefNode wrapper for a C function
temps = None
# All descendants should set child_attrs to a list of the attributes
@@ -207,9 +207,9 @@ class Node(object):
# can either contain a single node or a list of nodes. See Visitor.py.
child_attrs = None
- # Subset of attributes that are evaluated in the outer scope (e.g. function default arguments).
- outer_attrs = None
-
+ # Subset of attributes that are evaluated in the outer scope (e.g. function default arguments).
+ outer_attrs = None
+
cf_state = None
# This may be an additional (or 'actual') type that will be checked when
@@ -225,7 +225,7 @@ class Node(object):
gil_message = "Operation"
nogil_check = None
- in_nogil_context = False # For use only during code generation.
+ in_nogil_context = False # For use only during code generation.
def gil_error(self, env=None):
error(self.pos, "%s not allowed without gil" % self.gil_message)
@@ -349,9 +349,9 @@ class Node(object):
if not self.pos:
return u''
source_desc, line, col = self.pos
- contents = source_desc.get_lines(encoding='ASCII', error_handling='ignore')
+ contents = source_desc.get_lines(encoding='ASCII', error_handling='ignore')
# line numbers start at 1
- lines = contents[max(0, line-3):line]
+ lines = contents[max(0, line-3):line]
current = lines[-1]
if mark_column:
current = current[:col] + marker + current[col:]
@@ -420,10 +420,10 @@ class StatListNode(Node):
child_attrs = ["stats"]
- @staticmethod
+ @staticmethod
def create_analysed(pos, env, *args, **kw):
node = StatListNode(pos, *args, **kw)
- return node # No node-specific analysis needed
+ return node # No node-specific analysis needed
def analyse_declarations(self, env):
#print "StatListNode.analyse_declarations" ###
@@ -432,8 +432,8 @@ class StatListNode(Node):
def analyse_expressions(self, env):
#print "StatListNode.analyse_expressions" ###
- self.stats = [stat.analyse_expressions(env)
- for stat in self.stats]
+ self.stats = [stat.analyse_expressions(env)
+ for stat in self.stats]
return self
def generate_function_definitions(self, env, code):
@@ -529,7 +529,7 @@ class CDeclaratorNode(Node):
# Only C++ functions have templates.
return None
-
+
class CNameDeclaratorNode(CDeclaratorNode):
# name string The Cython name being declared
# cname string or None C name, if specified
@@ -556,37 +556,37 @@ class CNameDeclaratorNode(CDeclaratorNode):
self.type = base_type
return self, base_type
-
+
class CPtrDeclaratorNode(CDeclaratorNode):
# base CDeclaratorNode
child_attrs = ["base"]
- def analyse_templates(self):
- return self.base.analyse_templates()
-
+ def analyse_templates(self):
+ return self.base.analyse_templates()
+
def analyse(self, base_type, env, nonempty=0, visibility=None, in_pxd=False):
if base_type.is_pyobject:
- error(self.pos, "Pointer base type cannot be a Python object")
+ error(self.pos, "Pointer base type cannot be a Python object")
ptr_type = PyrexTypes.c_ptr_type(base_type)
return self.base.analyse(ptr_type, env, nonempty=nonempty, visibility=visibility, in_pxd=in_pxd)
-
+
class CReferenceDeclaratorNode(CDeclaratorNode):
# base CDeclaratorNode
child_attrs = ["base"]
- def analyse_templates(self):
- return self.base.analyse_templates()
-
+ def analyse_templates(self):
+ return self.base.analyse_templates()
+
def analyse(self, base_type, env, nonempty=0, visibility=None, in_pxd=False):
if base_type.is_pyobject:
- error(self.pos, "Reference base type cannot be a Python object")
+ error(self.pos, "Reference base type cannot be a Python object")
ref_type = PyrexTypes.c_ref_type(base_type)
return self.base.analyse(ref_type, env, nonempty=nonempty, visibility=visibility, in_pxd=in_pxd)
-
+
class CArrayDeclaratorNode(CDeclaratorNode):
# base CDeclaratorNode
# dimension ExprNode
@@ -594,7 +594,7 @@ class CArrayDeclaratorNode(CDeclaratorNode):
child_attrs = ["base", "dimension"]
def analyse(self, base_type, env, nonempty=0, visibility=None, in_pxd=False):
- if (base_type.is_cpp_class and base_type.is_template_type()) or base_type.is_cfunction:
+ if (base_type.is_cpp_class and base_type.is_template_type()) or base_type.is_cfunction:
from .ExprNodes import TupleNode
if isinstance(self.dimension, TupleNode):
args = self.dimension.args
@@ -622,11 +622,11 @@ class CArrayDeclaratorNode(CDeclaratorNode):
else:
size = None
if not base_type.is_complete():
- error(self.pos, "Array element type '%s' is incomplete" % base_type)
+ error(self.pos, "Array element type '%s' is incomplete" % base_type)
if base_type.is_pyobject:
- error(self.pos, "Array element cannot be a Python object")
+ error(self.pos, "Array element cannot be a Python object")
if base_type.is_cfunction:
- error(self.pos, "Array element cannot be a function")
+ error(self.pos, "Array element cannot be a function")
array_type = PyrexTypes.c_array_type(base_type, size)
return self.base.analyse(array_type, env, nonempty=nonempty, visibility=visibility, in_pxd=in_pxd)
@@ -672,15 +672,15 @@ class CFuncDeclaratorNode(CDeclaratorNode):
return None
def analyse(self, return_type, env, nonempty=0, directive_locals=None, visibility=None, in_pxd=False):
- if directive_locals is None:
- directive_locals = {}
+ if directive_locals is None:
+ directive_locals = {}
if nonempty:
nonempty -= 1
func_type_args = []
for i, arg_node in enumerate(self.args):
name_declarator, type = arg_node.analyse(
- env, nonempty=nonempty,
- is_self_arg=(i == 0 and env.is_c_class_scope and 'staticmethod' not in env.directives))
+ env, nonempty=nonempty,
+ is_self_arg=(i == 0 and env.is_c_class_scope and 'staticmethod' not in env.directives))
name = name_declarator.name
if name in directive_locals:
type_node = directive_locals[name]
@@ -694,8 +694,8 @@ class CFuncDeclaratorNode(CDeclaratorNode):
else:
type = other_type
if name_declarator.cname:
- error(self.pos, "Function argument cannot have C name specification")
- if i == 0 and env.is_c_class_scope and type.is_unspecified:
+ error(self.pos, "Function argument cannot have C name specification")
+ if i == 0 and env.is_c_class_scope and type.is_unspecified:
# fix the type of self
type = env.parent_type
# Turn *[] argument into **
@@ -721,7 +721,7 @@ class CFuncDeclaratorNode(CDeclaratorNode):
if (return_type.is_pyobject
and (self.exception_value or self.exception_check)
and self.exception_check != '+'):
- error(self.pos, "Exception clause not allowed for function returning Python object")
+ error(self.pos, "Exception clause not allowed for function returning Python object")
else:
if self.exception_value is None and self.exception_check and self.exception_check != '+':
# Use an explicit exception return value to speed up exception checks.
@@ -741,11 +741,11 @@ class CFuncDeclaratorNode(CDeclaratorNode):
and not exc_val_type.is_pyobject
and not (exc_val_type.is_cfunction
and not exc_val_type.return_type.is_pyobject
- and not exc_val_type.args)
- and not (exc_val_type == PyrexTypes.c_char_type
- and self.exception_value.value == '*')):
+ and not exc_val_type.args)
+ and not (exc_val_type == PyrexTypes.c_char_type
+ and self.exception_value.value == '*')):
error(self.exception_value.pos,
- "Exception value must be a Python exception or cdef function with no arguments or *.")
+ "Exception value must be a Python exception or cdef function with no arguments or *.")
exc_val = self.exception_value
else:
self.exception_value = self.exception_value.coerce_to(
@@ -760,15 +760,15 @@ class CFuncDeclaratorNode(CDeclaratorNode):
"Exception value incompatible with function return type")
exc_check = self.exception_check
if return_type.is_cfunction:
- error(self.pos, "Function cannot return a function")
+ error(self.pos, "Function cannot return a function")
func_type = PyrexTypes.CFuncType(
return_type, func_type_args, self.has_varargs,
- optional_arg_count=self.optional_arg_count,
- exception_value=exc_val, exception_check=exc_check,
- calling_convention=self.base.calling_convention,
- nogil=self.nogil, with_gil=self.with_gil, is_overridable=self.overridable,
- is_const_method=self.is_const_method,
- templates=self.templates)
+ optional_arg_count=self.optional_arg_count,
+ exception_value=exc_val, exception_check=exc_check,
+ calling_convention=self.base.calling_convention,
+ nogil=self.nogil, with_gil=self.with_gil, is_overridable=self.overridable,
+ is_const_method=self.is_const_method,
+ templates=self.templates)
if self.optional_arg_count:
if func_type.is_fused:
@@ -802,7 +802,7 @@ class CFuncDeclaratorNode(CDeclaratorNode):
arg_count_member = '%sn' % Naming.pyrex_prefix
scope.declare_var(arg_count_member, PyrexTypes.c_int_type, self.pos)
- for arg in func_type.args[len(func_type.args) - self.optional_arg_count:]:
+ for arg in func_type.args[len(func_type.args) - self.optional_arg_count:]:
scope.declare_var(arg.name, arg.type, arg.pos, allow_pyobject=True, allow_memoryview=True)
struct_cname = env.mangle(Naming.opt_arg_prefix, self.base.name)
@@ -811,12 +811,12 @@ class CFuncDeclaratorNode(CDeclaratorNode):
struct_cname = PyrexTypes.get_fused_cname(fused_cname, struct_cname)
op_args_struct = env.global_scope().declare_struct_or_union(
- name=struct_cname,
- kind='struct',
- scope=scope,
- typedef_flag=0,
- pos=self.pos,
- cname=struct_cname)
+ name=struct_cname,
+ kind='struct',
+ scope=scope,
+ typedef_flag=0,
+ pos=self.pos,
+ cname=struct_cname)
op_args_struct.defined_in_pxd = 1
op_args_struct.used = 1
@@ -854,7 +854,7 @@ class CArgDeclNode(Node):
# is_dynamic boolean Non-literal arg stored inside CyFunction
child_attrs = ["base_type", "declarator", "default", "annotation"]
- outer_attrs = ["default", "annotation"]
+ outer_attrs = ["default", "annotation"]
is_self_arg = 0
is_type_arg = 0
@@ -868,7 +868,7 @@ class CArgDeclNode(Node):
annotation = None
is_dynamic = 0
- def analyse(self, env, nonempty=0, is_self_arg=False):
+ def analyse(self, env, nonempty=0, is_self_arg=False):
if is_self_arg:
self.base_type.is_self_arg = self.is_self_arg = True
if self.type is None:
@@ -878,7 +878,7 @@ class CArgDeclNode(Node):
if self.base_type.is_basic_c_type:
# char, short, long called "int"
type = self.base_type.analyse(env, could_be_name=True)
- arg_name = type.empty_declaration_code()
+ arg_name = type.empty_declaration_code()
else:
arg_name = self.base_type.name
self.declarator.name = EncodedString(arg_name)
@@ -919,8 +919,8 @@ class CArgDeclNode(Node):
if not annotation:
return None
base_type, arg_type = analyse_type_annotation(annotation, env, assigned_value=self.default)
- if base_type is not None:
- self.base_type = base_type
+ if base_type is not None:
+ self.base_type = base_type
return arg_type
def calculate_default_value_code(self, code):
@@ -937,7 +937,7 @@ class CArgDeclNode(Node):
if self.default:
self.default.annotate(code)
- def generate_assignment_code(self, code, target=None, overloaded_assignment=False):
+ def generate_assignment_code(self, code, target=None, overloaded_assignment=False):
default = self.default
if default is None or default.is_literal:
return
@@ -945,7 +945,7 @@ class CArgDeclNode(Node):
target = self.calculate_default_value_code(code)
default.generate_evaluation_code(code)
default.make_owned_reference(code)
- result = default.result() if overloaded_assignment else default.result_as(self.type)
+ result = default.result() if overloaded_assignment else default.result_as(self.type)
code.putln("%s = %s;" % (target, result))
if self.type.is_pyobject:
code.put_giveref(default.result())
@@ -964,16 +964,16 @@ class CBaseTypeNode(Node):
def analyse_as_type(self, env):
return self.analyse(env)
-
+
class CAnalysedBaseTypeNode(Node):
# type type
child_attrs = []
- def analyse(self, env, could_be_name=False):
+ def analyse(self, env, could_be_name=False):
return self.type
-
+
class CSimpleBaseTypeNode(CBaseTypeNode):
# name string
# module_path [string] Qualifying name components
@@ -990,7 +990,7 @@ class CSimpleBaseTypeNode(CBaseTypeNode):
is_basic_c_type = False
complex = False
- def analyse(self, env, could_be_name=False):
+ def analyse(self, env, could_be_name=False):
# Return type descriptor.
#print "CSimpleBaseTypeNode.analyse: is_self_arg =", self.is_self_arg ###
type = None
@@ -1073,7 +1073,7 @@ class MemoryViewSliceTypeNode(CBaseTypeNode):
name = 'memoryview'
child_attrs = ['base_type_node', 'axes']
- def analyse(self, env, could_be_name=False):
+ def analyse(self, env, could_be_name=False):
base_type = self.base_type_node.analyse(env)
if base_type.is_error: return base_type
@@ -1082,7 +1082,7 @@ class MemoryViewSliceTypeNode(CBaseTypeNode):
try:
axes_specs = MemoryView.get_axes_specs(env, self.axes)
- except CompileError as e:
+ except CompileError as e:
error(e.position, e.message_only)
self.type = PyrexTypes.ErrorType()
return self.type
@@ -1091,7 +1091,7 @@ class MemoryViewSliceTypeNode(CBaseTypeNode):
self.type = error_type
else:
self.type = PyrexTypes.MemoryViewSliceType(base_type, axes_specs)
- self.type.validate_memslice_dtype(self.pos)
+ self.type.validate_memslice_dtype(self.pos)
self.use_memview_utilities(env)
return self.type
@@ -1109,7 +1109,7 @@ class CNestedBaseTypeNode(CBaseTypeNode):
child_attrs = ['base_type']
- def analyse(self, env, could_be_name=None):
+ def analyse(self, env, could_be_name=None):
base_type = self.base_type.analyse(env)
if base_type is PyrexTypes.error_type:
return PyrexTypes.error_type
@@ -1139,12 +1139,12 @@ class TemplatedTypeNode(CBaseTypeNode):
name = None
- def analyse(self, env, could_be_name=False, base_type=None):
+ def analyse(self, env, could_be_name=False, base_type=None):
if base_type is None:
base_type = self.base_type_node.analyse(env)
if base_type.is_error: return base_type
- if base_type.is_cpp_class and base_type.is_template_type():
+ if base_type.is_cpp_class and base_type.is_template_type():
# Templated class
if self.keyword_args and self.keyword_args.key_value_pairs:
error(self.pos, "c++ templates cannot take keyword arguments")
@@ -1172,8 +1172,8 @@ class TemplatedTypeNode(CBaseTypeNode):
if sys.version_info[0] < 3:
# Py 2.x enforces byte strings as keyword arguments ...
- options = dict([(name.encode('ASCII'), value)
- for name, value in options.items()])
+ options = dict([(name.encode('ASCII'), value)
+ for name, value in options.items()])
self.type = PyrexTypes.BufferType(base_type, **options)
if has_np_pythran(env) and is_pythran_buffer(self.type):
@@ -1192,10 +1192,10 @@ class TemplatedTypeNode(CBaseTypeNode):
dimension = None
else:
dimension = self.positional_args[0]
- self.array_declarator = CArrayDeclaratorNode(
- self.pos,
- base=empty_declarator,
- dimension=dimension)
+ self.array_declarator = CArrayDeclaratorNode(
+ self.pos,
+ base=empty_declarator,
+ dimension=dimension)
self.type = self.array_declarator.analyse(base_type, env)[1]
if self.type.is_fused and env.fused_to_specific:
@@ -1203,37 +1203,37 @@ class TemplatedTypeNode(CBaseTypeNode):
return self.type
-
+
class CComplexBaseTypeNode(CBaseTypeNode):
# base_type CBaseTypeNode
# declarator CDeclaratorNode
child_attrs = ["base_type", "declarator"]
- def analyse(self, env, could_be_name=False):
+ def analyse(self, env, could_be_name=False):
base = self.base_type.analyse(env, could_be_name)
_, type = self.declarator.analyse(base, env)
return type
-class CTupleBaseTypeNode(CBaseTypeNode):
- # components [CBaseTypeNode]
-
- child_attrs = ["components"]
-
- def analyse(self, env, could_be_name=False):
- component_types = []
- for c in self.components:
- type = c.analyse(env)
- if type.is_pyobject:
- error(c.pos, "Tuple types can't (yet) contain Python objects.")
- return error_type
- component_types.append(type)
- entry = env.declare_tuple_type(self.pos, component_types)
- entry.used = True
- return entry.type
-
-
+class CTupleBaseTypeNode(CBaseTypeNode):
+ # components [CBaseTypeNode]
+
+ child_attrs = ["components"]
+
+ def analyse(self, env, could_be_name=False):
+ component_types = []
+ for c in self.components:
+ type = c.analyse(env)
+ if type.is_pyobject:
+ error(c.pos, "Tuple types can't (yet) contain Python objects.")
+ return error_type
+ component_types.append(type)
+ entry = env.declare_tuple_type(self.pos, component_types)
+ entry.used = True
+ return entry.type
+
+
class FusedTypeNode(CBaseTypeNode):
"""
Represents a fused type in a ctypedef statement:
@@ -1253,7 +1253,7 @@ class FusedTypeNode(CBaseTypeNode):
# Omit the typedef declaration that self.declarator would produce
entry.in_cinclude = True
- def analyse(self, env, could_be_name=False):
+ def analyse(self, env, could_be_name=False):
types = []
for type_node in self.types:
type = type_node.analyse_as_type(env)
@@ -1278,7 +1278,7 @@ class CConstTypeNode(CBaseTypeNode):
child_attrs = ["base_type"]
- def analyse(self, env, could_be_name=False):
+ def analyse(self, env, could_be_name=False):
base = self.base_type.analyse(env, could_be_name)
if base.is_pyobject:
error(self.pos,
@@ -1305,7 +1305,7 @@ class CVarDefNode(StatNode):
decorators = None
directive_locals = None
- def analyse_declarations(self, env, dest_scope=None):
+ def analyse_declarations(self, env, dest_scope=None):
if self.directive_locals is None:
self.directive_locals = {}
if not dest_scope:
@@ -1339,18 +1339,18 @@ class CVarDefNode(StatNode):
for declarator in self.declarators:
if (len(self.declarators) > 1
- and not isinstance(declarator, CNameDeclaratorNode)
- and env.directives['warn.multiple_declarators']):
- warning(
- declarator.pos,
- "Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). "
+ and not isinstance(declarator, CNameDeclaratorNode)
+ and env.directives['warn.multiple_declarators']):
+ warning(
+ declarator.pos,
+ "Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). "
"Each pointer declaration should be on its own line.", 1)
- create_extern_wrapper = (self.overridable
- and self.visibility == 'extern'
- and env.is_module_scope)
- if create_extern_wrapper:
- declarator.overridable = False
+ create_extern_wrapper = (self.overridable
+ and self.visibility == 'extern'
+ and env.is_module_scope)
+ if create_extern_wrapper:
+ declarator.overridable = False
if isinstance(declarator, CFuncDeclaratorNode):
name_declarator, type = declarator.analyse(
base_type, env, directive_locals=self.directive_locals, visibility=visibility, in_pxd=self.in_pxd)
@@ -1359,9 +1359,9 @@ class CVarDefNode(StatNode):
base_type, env, visibility=visibility, in_pxd=self.in_pxd)
if not type.is_complete():
if not (self.visibility == 'extern' and type.is_array or type.is_memoryviewslice):
- error(declarator.pos, "Variable type '%s' is incomplete" % type)
+ error(declarator.pos, "Variable type '%s' is incomplete" % type)
if self.visibility == 'extern' and type.is_pyobject:
- error(declarator.pos, "Python object cannot be declared extern")
+ error(declarator.pos, "Python object cannot be declared extern")
name = name_declarator.name
cname = name_declarator.cname
if name == '':
@@ -1370,27 +1370,27 @@ class CVarDefNode(StatNode):
if type.is_reference and self.visibility != 'extern':
error(declarator.pos, "C++ references cannot be declared; use a pointer instead")
if type.is_cfunction:
- if 'staticmethod' in env.directives:
- type.is_static_method = True
- self.entry = dest_scope.declare_cfunction(
- name, type, declarator.pos,
- cname=cname, visibility=self.visibility, in_pxd=self.in_pxd,
- api=self.api, modifiers=self.modifiers, overridable=self.overridable)
+ if 'staticmethod' in env.directives:
+ type.is_static_method = True
+ self.entry = dest_scope.declare_cfunction(
+ name, type, declarator.pos,
+ cname=cname, visibility=self.visibility, in_pxd=self.in_pxd,
+ api=self.api, modifiers=self.modifiers, overridable=self.overridable)
if self.entry is not None:
self.entry.directive_locals = copy.copy(self.directive_locals)
- if create_extern_wrapper:
- self.entry.type.create_to_py_utility_code(env)
- self.entry.create_wrapper = True
+ if create_extern_wrapper:
+ self.entry.type.create_to_py_utility_code(env)
+ self.entry.create_wrapper = True
else:
if self.overridable:
warning(self.pos, "cpdef variables will not be supported in Cython 3; "
"currently they are no different from cdef variables", 2)
if self.directive_locals:
error(self.pos, "Decorators can only be followed by functions")
- self.entry = dest_scope.declare_var(
- name, type, declarator.pos,
- cname=cname, visibility=visibility, in_pxd=self.in_pxd,
- api=self.api, is_cdef=1)
+ self.entry = dest_scope.declare_var(
+ name, type, declarator.pos,
+ cname=cname, visibility=visibility, in_pxd=self.in_pxd,
+ api=self.api, is_cdef=1)
if Options.docstrings:
self.entry.doc = embed_position(self.pos, self.doc)
@@ -1412,8 +1412,8 @@ class CStructOrUnionDefNode(StatNode):
def declare(self, env, scope=None):
self.entry = env.declare_struct_or_union(
self.name, self.kind, scope, self.typedef_flag, self.pos,
- self.cname, visibility=self.visibility, api=self.api,
- packed=self.packed)
+ self.cname, visibility=self.visibility, api=self.api,
+ packed=self.packed)
def analyse_declarations(self, env):
scope = None
@@ -1449,7 +1449,7 @@ class CppClassNode(CStructOrUnionDefNode, BlockNode):
# attributes [CVarDefNode] or None
# entry Entry
# base_classes [CBaseTypeNode]
- # templates [(string, bool)] or None
+ # templates [(string, bool)] or None
# decorators [DecoratorNode] or None
decorators = None
@@ -1458,25 +1458,25 @@ class CppClassNode(CStructOrUnionDefNode, BlockNode):
if self.templates is None:
template_types = None
else:
- template_types = [PyrexTypes.TemplatePlaceholderType(template_name, not required)
- for template_name, required in self.templates]
- num_optional_templates = sum(not required for _, required in self.templates)
- if num_optional_templates and not all(required for _, required in self.templates[:-num_optional_templates]):
- error(self.pos, "Required template parameters must precede optional template parameters.")
+ template_types = [PyrexTypes.TemplatePlaceholderType(template_name, not required)
+ for template_name, required in self.templates]
+ num_optional_templates = sum(not required for _, required in self.templates)
+ if num_optional_templates and not all(required for _, required in self.templates[:-num_optional_templates]):
+ error(self.pos, "Required template parameters must precede optional template parameters.")
self.entry = env.declare_cpp_class(
- self.name, None, self.pos, self.cname,
- base_classes=[], visibility=self.visibility, templates=template_types)
+ self.name, None, self.pos, self.cname,
+ base_classes=[], visibility=self.visibility, templates=template_types)
def analyse_declarations(self, env):
- if self.templates is None:
- template_types = template_names = None
- else:
- template_names = [template_name for template_name, _ in self.templates]
- template_types = [PyrexTypes.TemplatePlaceholderType(template_name, not required)
- for template_name, required in self.templates]
+ if self.templates is None:
+ template_types = template_names = None
+ else:
+ template_names = [template_name for template_name, _ in self.templates]
+ template_types = [PyrexTypes.TemplatePlaceholderType(template_name, not required)
+ for template_name, required in self.templates]
scope = None
if self.attributes is not None:
- scope = CppClassScope(self.name, env, templates=template_names)
+ scope = CppClassScope(self.name, env, templates=template_names)
def base_ok(base_class):
if base_class.is_cpp_class or base_class.is_struct:
return True
@@ -1485,7 +1485,7 @@ class CppClassNode(CStructOrUnionDefNode, BlockNode):
base_class_types = filter(base_ok, [b.analyse(scope or env) for b in self.base_classes])
self.entry = env.declare_cpp_class(
self.name, scope, self.pos,
- self.cname, base_class_types, visibility=self.visibility, templates=template_types)
+ self.cname, base_class_types, visibility=self.visibility, templates=template_types)
if self.entry is None:
return
self.entry.is_cpp_class = 1
@@ -1503,14 +1503,14 @@ class CppClassNode(CStructOrUnionDefNode, BlockNode):
if self.in_pxd and not env.in_cinclude:
self.entry.defined_in_pxd = 1
for attr in self.attributes:
- declare = getattr(attr, 'declare', None)
- if declare:
- attr.declare(scope)
+ declare = getattr(attr, 'declare', None)
+ if declare:
+ attr.declare(scope)
attr.analyse_declarations(scope)
for func in func_attributes(self.attributes):
defined_funcs.append(func)
if self.templates is not None:
- func.template_declaration = "template <typename %s>" % ", typename ".join(template_names)
+ func.template_declaration = "template <typename %s>" % ", typename ".join(template_names)
self.body = StatListNode(self.pos, stats=defined_funcs)
self.scope = scope
@@ -1542,11 +1542,11 @@ class CEnumDefNode(StatNode):
child_attrs = ["items"]
def declare(self, env):
- self.entry = env.declare_enum(
- self.name, self.pos,
- cname=self.cname, typedef_flag=self.typedef_flag,
- visibility=self.visibility, api=self.api,
- create_wrapper=self.create_wrapper)
+ self.entry = env.declare_enum(
+ self.name, self.pos,
+ cname=self.cname, typedef_flag=self.typedef_flag,
+ visibility=self.visibility, api=self.api,
+ create_wrapper=self.create_wrapper)
def analyse_declarations(self, env):
if self.items is not None:
@@ -1560,19 +1560,19 @@ class CEnumDefNode(StatNode):
def generate_execution_code(self, code):
if self.visibility == 'public' or self.api:
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
temp = code.funcstate.allocate_temp(PyrexTypes.py_object_type, manage_ref=True)
for item in self.entry.enum_values:
code.putln("%s = PyInt_FromLong(%s); %s" % (
- temp,
- item.cname,
- code.error_goto_if_null(temp, item.pos)))
+ temp,
+ item.cname,
+ code.error_goto_if_null(temp, item.pos)))
code.put_gotref(temp)
code.putln('if (PyDict_SetItemString(%s, "%s", %s) < 0) %s' % (
- Naming.moddict_cname,
- item.name,
- temp,
- code.error_goto(item.pos)))
+ Naming.moddict_cname,
+ item.name,
+ temp,
+ code.error_goto(item.pos)))
code.put_decref_clear(temp, PyrexTypes.py_object_type)
code.funcstate.release_temp(temp)
@@ -1590,14 +1590,14 @@ class CEnumDefItemNode(StatNode):
if not self.value.type.is_int:
self.value = self.value.coerce_to(PyrexTypes.c_int_type, env)
self.value = self.value.analyse_const_expression(env)
- entry = env.declare_const(
- self.name, enum_entry.type,
- self.value, self.pos, cname=self.cname,
- visibility=enum_entry.visibility, api=enum_entry.api,
- create_wrapper=enum_entry.create_wrapper and enum_entry.name is None)
+ entry = env.declare_const(
+ self.name, enum_entry.type,
+ self.value, self.pos, cname=self.cname,
+ visibility=enum_entry.visibility, api=enum_entry.api,
+ create_wrapper=enum_entry.create_wrapper and enum_entry.name is None)
enum_entry.enum_values.append(entry)
- if enum_entry.name:
- enum_entry.type.values.append(entry.name)
+ if enum_entry.name:
+ enum_entry.type.values.append(entry.name)
class CTypeDefNode(StatNode):
@@ -1616,9 +1616,9 @@ class CTypeDefNode(StatNode):
name = name_declarator.name
cname = name_declarator.cname
- entry = env.declare_typedef(
- name, type, self.pos,
- cname=cname, visibility=self.visibility, api=self.api)
+ entry = env.declare_typedef(
+ name, type, self.pos,
+ cname=cname, visibility=self.visibility, api=self.api)
if type.is_fused:
entry.in_cinclude = True
@@ -1644,11 +1644,11 @@ class FuncDefNode(StatNode, BlockNode):
# pymethdef_required boolean Force Python method struct generation
# directive_locals { string : ExprNode } locals defined by cython.locals(...)
# directive_returns [ExprNode] type defined by cython.returns(...)
- # star_arg PyArgDeclNode or None * argument
- # starstar_arg PyArgDeclNode or None ** argument
- #
- # is_async_def boolean is a Coroutine function
- #
+ # star_arg PyArgDeclNode or None * argument
+ # starstar_arg PyArgDeclNode or None ** argument
+ #
+ # is_async_def boolean is a Coroutine function
+ #
# has_fused_arguments boolean
# Whether this cdef function has fused parameters. This is needed
# by AnalyseDeclarationsTransform, so it can replace CFuncDefNodes
@@ -1660,13 +1660,13 @@ class FuncDefNode(StatNode, BlockNode):
pymethdef_required = False
is_generator = False
is_generator_body = False
- is_async_def = False
+ is_async_def = False
modifiers = []
has_fused_arguments = False
star_arg = None
starstar_arg = None
is_cyfunction = False
- code_object = None
+ code_object = None
def analyse_default_values(self, env):
default_seen = 0
@@ -1677,7 +1677,7 @@ class FuncDefNode(StatNode, BlockNode):
arg.default = arg.default.analyse_types(env)
arg.default = arg.default.coerce_to(arg.type, env)
else:
- error(arg.pos, "This argument cannot have a default value")
+ error(arg.pos, "This argument cannot have a default value")
arg.default = None
elif arg.kw_only:
default_seen = 1
@@ -1692,11 +1692,11 @@ class FuncDefNode(StatNode, BlockNode):
annotation = annotation.analyse_types(env)
return annotation
- def analyse_annotations(self, env):
- for arg in self.args:
- if arg.annotation:
+ def analyse_annotations(self, env):
+ for arg in self.args:
+ if arg.annotation:
arg.annotation = self.analyse_annotation(env, arg.annotation)
-
+
def align_argument_type(self, env, arg):
# @cython.locals()
directive_locals = self.directive_locals
@@ -1704,7 +1704,7 @@ class FuncDefNode(StatNode, BlockNode):
if arg.name in directive_locals:
type_node = directive_locals[arg.name]
other_type = type_node.analyse_as_type(env)
- elif isinstance(arg, CArgDeclNode) and arg.annotation and env.directives['annotation_typing']:
+ elif isinstance(arg, CArgDeclNode) and arg.annotation and env.directives['annotation_typing']:
type_node = arg.annotation
other_type = arg.inject_type_from_annotations(env)
if other_type is None:
@@ -1713,7 +1713,7 @@ class FuncDefNode(StatNode, BlockNode):
return arg
if other_type is None:
error(type_node.pos, "Not a type")
- elif orig_type is not py_object_type and not orig_type.same_as(other_type):
+ elif orig_type is not py_object_type and not orig_type.same_as(other_type):
error(arg.base_type.pos, "Signature does not agree with previous declaration")
error(type_node.pos, "Previous declaration here")
else:
@@ -1729,8 +1729,8 @@ class FuncDefNode(StatNode, BlockNode):
genv = genv.outer_scope
if self.needs_closure:
lenv = ClosureScope(name=self.entry.name,
- outer_scope=genv,
- parent_scope=env,
+ outer_scope=genv,
+ parent_scope=env,
scope_name=self.entry.cname)
else:
lenv = LocalScope(name=self.entry.name,
@@ -1782,9 +1782,9 @@ class FuncDefNode(StatNode, BlockNode):
UtilityCode.load_cached("Profile", "Profile.c"))
# Generate C code for header and body of function
- code.enter_cfunc_scope(lenv)
+ code.enter_cfunc_scope(lenv)
code.return_from_error_cleanup_label = code.new_label()
- code.funcstate.gil_owned = not lenv.nogil
+ code.funcstate.gil_owned = not lenv.nogil
# ----- Top-level constants used by this function
code.mark_pos(self.pos)
@@ -1798,9 +1798,9 @@ class FuncDefNode(StatNode, BlockNode):
with_pymethdef = (self.needs_assignment_synthesis(env, code) or
self.pymethdef_required)
if self.py_func:
- self.py_func.generate_function_header(
- code, with_pymethdef=with_pymethdef, proto_only=True)
- self.generate_function_header(code, with_pymethdef=with_pymethdef)
+ self.py_func.generate_function_header(
+ code, with_pymethdef=with_pymethdef, proto_only=True)
+ self.generate_function_header(code, with_pymethdef=with_pymethdef)
# ----- Local variable declarations
# Find function scope
cenv = env
@@ -1829,9 +1829,9 @@ class FuncDefNode(StatNode, BlockNode):
elif self.return_type.is_memoryviewslice:
init = ' = ' + MemoryView.memslice_entry_init
- code.putln("%s%s;" % (
- self.return_type.declaration_code(Naming.retval_cname),
- init))
+ code.putln("%s%s;" % (
+ self.return_type.declaration_code(Naming.retval_cname),
+ init))
tempvardecl_code = code.insertion_point()
self.generate_keyword_list(code)
@@ -1842,39 +1842,39 @@ class FuncDefNode(StatNode, BlockNode):
# See if we need to acquire the GIL for variable declarations, or for
# refnanny only
- # Closures are not currently possible for cdef nogil functions,
- # but check them anyway
- have_object_args = self.needs_closure or self.needs_outer_scope
+ # Closures are not currently possible for cdef nogil functions,
+ # but check them anyway
+ have_object_args = self.needs_closure or self.needs_outer_scope
for arg in lenv.arg_entries:
if arg.type.is_pyobject:
have_object_args = True
break
- used_buffer_entries = [entry for entry in lenv.buffer_entries if entry.used]
-
+ used_buffer_entries = [entry for entry in lenv.buffer_entries if entry.used]
+
acquire_gil_for_var_decls_only = (
- lenv.nogil and lenv.has_with_gil_block and
- (have_object_args or used_buffer_entries))
+ lenv.nogil and lenv.has_with_gil_block and
+ (have_object_args or used_buffer_entries))
acquire_gil_for_refnanny_only = (
- lenv.nogil and lenv.has_with_gil_block and not
- acquire_gil_for_var_decls_only)
+ lenv.nogil and lenv.has_with_gil_block and not
+ acquire_gil_for_var_decls_only)
use_refnanny = not lenv.nogil or lenv.has_with_gil_block
if acquire_gil or acquire_gil_for_var_decls_only:
code.put_ensure_gil()
- code.funcstate.gil_owned = True
+ code.funcstate.gil_owned = True
elif lenv.nogil and lenv.has_with_gil_block:
code.declare_gilstate()
- if profile or linetrace:
+ if profile or linetrace:
if not self.is_generator:
# generators are traced when iterated, not at creation
tempvardecl_code.put_trace_declarations()
code_object = self.code_object.calculate_result_code(code) if self.code_object else None
code.put_trace_frame_init(code_object)
-
+
# ----- Special check for getbuffer
if is_getbuffer_slot:
self.getbuffer_check(code)
@@ -1896,31 +1896,31 @@ class FuncDefNode(StatNode, BlockNode):
slot_func_cname = '%s->tp_new' % lenv.scope_class.type.typeptr_cname
code.putln("%s = (%s)%s(%s, %s, NULL);" % (
Naming.cur_scope_cname,
- lenv.scope_class.type.empty_declaration_code(),
+ lenv.scope_class.type.empty_declaration_code(),
slot_func_cname,
lenv.scope_class.type.typeptr_cname,
Naming.empty_tuple))
code.putln("if (unlikely(!%s)) {" % Naming.cur_scope_cname)
- # Scope unconditionally DECREFed on return.
- code.putln("%s = %s;" % (
- Naming.cur_scope_cname,
+ # Scope unconditionally DECREFed on return.
+ code.putln("%s = %s;" % (
+ Naming.cur_scope_cname,
lenv.scope_class.type.cast_code("Py_None")))
code.put_incref("Py_None", py_object_type)
- code.putln(code.error_goto(self.pos))
- code.putln("} else {")
- code.put_gotref(Naming.cur_scope_cname)
+ code.putln(code.error_goto(self.pos))
+ code.putln("} else {")
+ code.put_gotref(Naming.cur_scope_cname)
code.putln("}")
# Note that it is unsafe to decref the scope at this point.
if self.needs_outer_scope:
if self.is_cyfunction:
code.putln("%s = (%s) __Pyx_CyFunction_GetClosure(%s);" % (
outer_scope_cname,
- cenv.scope_class.type.empty_declaration_code(),
+ cenv.scope_class.type.empty_declaration_code(),
Naming.self_cname))
else:
code.putln("%s = (%s) %s;" % (
outer_scope_cname,
- cenv.scope_class.type.empty_declaration_code(),
+ cenv.scope_class.type.empty_declaration_code(),
Naming.self_cname))
if lenv.is_passthrough:
code.putln("%s = %s;" % (Naming.cur_scope_cname, outer_scope_cname))
@@ -1948,21 +1948,21 @@ class FuncDefNode(StatNode, BlockNode):
is_cdef = isinstance(self, CFuncDefNode)
for entry in lenv.arg_entries:
if entry.type.is_pyobject:
- if (acquire_gil or len(entry.cf_assignments) > 1) and not entry.in_closure:
+ if (acquire_gil or len(entry.cf_assignments) > 1) and not entry.in_closure:
code.put_var_incref(entry)
# Note: defaults are always incref-ed. For def functions, we
# we acquire arguments from object conversion, so we have
# new references. If we are a cdef function, we need to
# incref our arguments
- elif is_cdef and entry.type.is_memoryviewslice and len(entry.cf_assignments) > 1:
- code.put_incref_memoryviewslice(entry.cname, have_gil=code.funcstate.gil_owned)
+ elif is_cdef and entry.type.is_memoryviewslice and len(entry.cf_assignments) > 1:
+ code.put_incref_memoryviewslice(entry.cname, have_gil=code.funcstate.gil_owned)
for entry in lenv.var_entries:
- if entry.is_arg and len(entry.cf_assignments) > 1 and not entry.in_closure:
- if entry.xdecref_cleanup:
- code.put_var_xincref(entry)
- else:
- code.put_var_incref(entry)
+ if entry.is_arg and len(entry.cf_assignments) > 1 and not entry.in_closure:
+ if entry.xdecref_cleanup:
+ code.put_var_xincref(entry)
+ else:
+ code.put_var_incref(entry)
# ----- Initialise local buffer auxiliary variables
for entry in lenv.var_entries + lenv.arg_entries:
@@ -1978,14 +1978,14 @@ class FuncDefNode(StatNode, BlockNode):
if acquire_gil_for_var_decls_only:
code.put_release_ensured_gil()
- code.funcstate.gil_owned = False
+ code.funcstate.gil_owned = False
# -------------------------
# ----- Function body -----
# -------------------------
self.generate_function_body(env, code)
- code.mark_pos(self.pos, trace=False)
+ code.mark_pos(self.pos, trace=False)
code.putln("")
code.putln("/* function exit code */")
@@ -2013,16 +2013,16 @@ class FuncDefNode(StatNode, BlockNode):
# Clean up buffers -- this calls a Python function
# so need to save and restore error state
- buffers_present = len(used_buffer_entries) > 0
- #memslice_entries = [e for e in lenv.entries.values() if e.type.is_memoryviewslice]
+ buffers_present = len(used_buffer_entries) > 0
+ #memslice_entries = [e for e in lenv.entries.values() if e.type.is_memoryviewslice]
if buffers_present:
code.globalstate.use_utility_code(restore_exception_utility_code)
code.putln("{ PyObject *__pyx_type, *__pyx_value, *__pyx_tb;")
- code.putln("__Pyx_PyThreadState_declare")
- code.putln("__Pyx_PyThreadState_assign")
+ code.putln("__Pyx_PyThreadState_declare")
+ code.putln("__Pyx_PyThreadState_assign")
code.putln("__Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);")
- for entry in used_buffer_entries:
- Buffer.put_release_buffer_code(code, entry)
+ for entry in used_buffer_entries:
+ Buffer.put_release_buffer_code(code, entry)
#code.putln("%s = 0;" % entry.cname)
code.putln("__Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}")
@@ -2051,13 +2051,13 @@ class FuncDefNode(StatNode, BlockNode):
warning(self.entry.pos,
"Unraisable exception in function '%s'." %
self.entry.qualified_name, 0)
- code.put_unraisable(self.entry.qualified_name, lenv.nogil)
+ code.put_unraisable(self.entry.qualified_name, lenv.nogil)
default_retval = self.return_type.default_value
if err_val is None and default_retval:
err_val = default_retval
if err_val is not None:
- if err_val != Naming.retval_cname:
- code.putln("%s = %s;" % (Naming.retval_cname, err_val))
+ if err_val != Naming.retval_cname:
+ code.putln("%s = %s;" % (Naming.retval_cname, err_val))
elif not self.return_type.is_void:
code.putln("__Pyx_pretend_to_initialize(&%s);" % Naming.retval_cname)
@@ -2072,8 +2072,8 @@ class FuncDefNode(StatNode, BlockNode):
# ----- Non-error return cleanup
code.put_label(code.return_label)
- for entry in used_buffer_entries:
- Buffer.put_release_buffer_code(code, entry)
+ for entry in used_buffer_entries:
+ Buffer.put_release_buffer_code(code, entry)
if is_getbuffer_slot:
self.getbuffer_normal_cleanup(code)
@@ -2081,13 +2081,13 @@ class FuncDefNode(StatNode, BlockNode):
# See if our return value is uninitialized on non-error return
# from . import MemoryView
# MemoryView.err_if_nogil_initialized_check(self.pos, env)
- cond = code.unlikely(self.return_type.error_condition(Naming.retval_cname))
+ cond = code.unlikely(self.return_type.error_condition(Naming.retval_cname))
code.putln(
'if (%s) {' % cond)
if env.nogil:
code.put_ensure_gil()
code.putln(
- 'PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");')
+ 'PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");')
if env.nogil:
code.put_release_ensured_gil()
code.putln(
@@ -2101,18 +2101,18 @@ class FuncDefNode(StatNode, BlockNode):
continue
if entry.type.is_memoryviewslice:
- code.put_xdecref_memoryviewslice(entry.cname, have_gil=not lenv.nogil)
+ code.put_xdecref_memoryviewslice(entry.cname, have_gil=not lenv.nogil)
elif entry.type.is_pyobject:
if not entry.is_arg or len(entry.cf_assignments) > 1:
- if entry.xdecref_cleanup:
- code.put_var_xdecref(entry)
- else:
- code.put_var_decref(entry)
+ if entry.xdecref_cleanup:
+ code.put_var_xdecref(entry)
+ else:
+ code.put_var_decref(entry)
# Decref any increfed args
for entry in lenv.arg_entries:
if entry.type.is_pyobject:
- if (acquire_gil or len(entry.cf_assignments) > 1) and not entry.in_closure:
+ if (acquire_gil or len(entry.cf_assignments) > 1) and not entry.in_closure:
code.put_var_decref(entry)
elif (entry.type.is_memoryviewslice and
(not is_cdef or len(entry.cf_assignments) > 1)):
@@ -2137,7 +2137,7 @@ class FuncDefNode(StatNode, BlockNode):
# Returning -1 for __hash__ is supposed to signal an error
# We do as Python instances and coerce -1 into -2.
code.putln("if (unlikely(%s == -1) && !PyErr_Occurred()) %s = -2;" % (
- Naming.retval_cname, Naming.retval_cname))
+ Naming.retval_cname, Naming.retval_cname))
if profile or linetrace:
code.funcstate.can_trace = False
@@ -2157,7 +2157,7 @@ class FuncDefNode(StatNode, BlockNode):
if acquire_gil or (lenv.nogil and lenv.has_with_gil_block):
# release the GIL (note that with-gil blocks acquire it on exit in their EnsureGILNode)
code.put_release_ensured_gil()
- code.funcstate.gil_owned = False
+ code.funcstate.gil_owned = False
if not self.return_type.is_void:
code.putln("return %s;" % Naming.retval_cname)
@@ -2180,7 +2180,7 @@ class FuncDefNode(StatNode, BlockNode):
if arg.type.is_void:
error(arg.pos, "Invalid use of 'void'")
elif not arg.type.is_complete() and not (arg.type.is_array or arg.type.is_memoryviewslice):
- error(arg.pos, "Argument type '%s' is incomplete" % arg.type)
+ error(arg.pos, "Argument type '%s' is incomplete" % arg.type)
entry = env.declare_arg(arg.name, arg.type, arg.pos)
if arg.annotation:
entry.annotation = arg.annotation
@@ -2199,10 +2199,10 @@ class FuncDefNode(StatNode, BlockNode):
typeptr_cname,
arg.accept_none,
arg.name,
- arg.type.is_builtin_type and arg.type.require_exact,
+ arg.type.is_builtin_type and arg.type.require_exact,
code.error_goto(arg.pos)))
else:
- error(arg.pos, "Cannot test type of extern C class without type object name specification")
+ error(arg.pos, "Cannot test type of extern C class without type object name specification")
def generate_arg_none_check(self, arg, code):
# Generate None check for one argument.
@@ -2221,7 +2221,7 @@ class FuncDefNode(StatNode, BlockNode):
pass
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
# Evaluate and store argument default values
for arg in self.args:
if not arg.is_dynamic:
@@ -2336,16 +2336,16 @@ class CFuncDefNode(FuncDefNode):
def unqualified_name(self):
return self.entry.name
- @property
- def code_object(self):
- # share the CodeObject with the cpdef wrapper (if available)
- return self.py_func.code_object if self.py_func else None
-
+ @property
+ def code_object(self):
+ # share the CodeObject with the cpdef wrapper (if available)
+ return self.py_func.code_object if self.py_func else None
+
def analyse_declarations(self, env):
self.is_c_class_method = env.is_c_class_scope
if self.directive_locals is None:
self.directive_locals = {}
- self.directive_locals.update(env.directives.get('locals', {}))
+ self.directive_locals.update(env.directives.get('locals', {}))
if self.directive_returns is not None:
base_type = self.directive_returns.analyse_as_type(env)
if base_type is None:
@@ -2356,14 +2356,14 @@ class CFuncDefNode(FuncDefNode):
self.is_static_method = 'staticmethod' in env.directives and not env.lookup_here('staticmethod')
# The 2 here is because we need both function and argument names.
if isinstance(self.declarator, CFuncDeclaratorNode):
- name_declarator, type = self.declarator.analyse(
- base_type, env, nonempty=2 * (self.body is not None),
+ name_declarator, type = self.declarator.analyse(
+ base_type, env, nonempty=2 * (self.body is not None),
directive_locals=self.directive_locals, visibility=self.visibility)
else:
- name_declarator, type = self.declarator.analyse(
+ name_declarator, type = self.declarator.analyse(
base_type, env, nonempty=2 * (self.body is not None), visibility=self.visibility)
if not type.is_cfunction:
- error(self.pos, "Suite attached to non-function declaration")
+ error(self.pos, "Suite attached to non-function declaration")
# Remember the actual type according to the function header
# written here, because the type in the symbol table entry
# may be different if we're overriding a C method inherited
@@ -2380,9 +2380,9 @@ class CFuncDefNode(FuncDefNode):
opt_arg_count = self.cfunc_declarator.optional_arg_count
if (self.visibility == 'public' or self.api) and opt_arg_count:
error(self.cfunc_declarator.pos,
- "Function with optional arguments may not be declared public or api")
+ "Function with optional arguments may not be declared public or api")
- if type.exception_check == '+' and self.visibility != 'extern':
+ if type.exception_check == '+' and self.visibility != 'extern':
warning(self.cfunc_declarator.pos,
"Only extern functions can throw C++ exceptions.")
@@ -2403,7 +2403,7 @@ class CFuncDefNode(FuncDefNode):
if type_arg.type.is_buffer or type_arg.type.is_pythran_expr:
if self.type.nogil:
error(formal_arg.pos,
- "Buffer may not be acquired without the GIL. Consider using memoryview slices instead.")
+ "Buffer may not be acquired without the GIL. Consider using memoryview slices instead.")
elif 'inline' in self.modifiers:
warning(formal_arg.pos, "Buffer unpacking not optimized away.", 1)
@@ -2416,13 +2416,13 @@ class CFuncDefNode(FuncDefNode):
type.is_static_method = self.is_static_method
self.entry = env.declare_cfunction(
name, type, self.pos,
- cname=cname, visibility=self.visibility, api=self.api,
- defining=self.body is not None, modifiers=self.modifiers,
- overridable=self.overridable)
+ cname=cname, visibility=self.visibility, api=self.api,
+ defining=self.body is not None, modifiers=self.modifiers,
+ overridable=self.overridable)
self.entry.inline_func_in_pxd = self.inline_in_pxd
self.return_type = type.return_type
if self.return_type.is_array and self.visibility != 'extern':
- error(self.pos, "Function cannot return an array")
+ error(self.pos, "Function cannot return an array")
if self.return_type.is_cpp_class:
self.return_type.check_nullary_constructor(self.pos, "used as a return value")
@@ -2440,34 +2440,34 @@ class CFuncDefNode(FuncDefNode):
# TODO(robertwb): Finish this up, perhaps via more function refactoring.
error(self.pos, "static cpdef methods not yet supported")
name = self.entry.name
- py_func_body = self.call_self_node(is_module_scope=env.is_module_scope)
+ py_func_body = self.call_self_node(is_module_scope=env.is_module_scope)
if self.is_static_method:
from .ExprNodes import NameNode
decorators = [DecoratorNode(self.pos, decorator=NameNode(self.pos, name='staticmethod'))]
decorators[0].decorator.analyse_types(env)
else:
decorators = []
- self.py_func = DefNode(pos=self.pos,
- name=self.entry.name,
- args=self.args,
- star_arg=None,
- starstar_arg=None,
- doc=self.doc,
- body=py_func_body,
- decorators=decorators,
- is_wrapper=1)
+ self.py_func = DefNode(pos=self.pos,
+ name=self.entry.name,
+ args=self.args,
+ star_arg=None,
+ starstar_arg=None,
+ doc=self.doc,
+ body=py_func_body,
+ decorators=decorators,
+ is_wrapper=1)
self.py_func.is_module_scope = env.is_module_scope
self.py_func.analyse_declarations(env)
- self.py_func.entry.is_overridable = True
- self.py_func_stat = StatListNode(self.pos, stats=[self.py_func])
+ self.py_func.entry.is_overridable = True
+ self.py_func_stat = StatListNode(self.pos, stats=[self.py_func])
self.py_func.type = PyrexTypes.py_object_type
self.entry.as_variable = self.py_func.entry
self.entry.used = self.entry.as_variable.used = True
# Reset scope entry the above cfunction
env.entries[name] = self.entry
if (not self.entry.is_final_cmethod and
- (not env.is_module_scope or Options.lookup_module_cpdef)):
- self.override = OverrideCheckNode(self.pos, py_func=self.py_func)
+ (not env.is_module_scope or Options.lookup_module_cpdef)):
+ self.override = OverrideCheckNode(self.pos, py_func=self.py_func)
self.body = StatListNode(self.pos, stats=[self.override, self.body])
def _validate_type_visibility(self, type, pos, env):
@@ -2480,7 +2480,7 @@ class CFuncDefNode(FuncDefNode):
if public_or_api and entry and env.is_module_scope:
if not (entry.visibility in ('public', 'extern') or
entry.api or entry.in_cinclude):
- error(pos, "Function declared public or api may not have private types")
+ error(pos, "Function declared public or api may not have private types")
def call_self_node(self, omit_optional_args=0, is_module_scope=0):
from . import ExprNodes
@@ -2535,22 +2535,22 @@ class CFuncDefNode(FuncDefNode):
def analyse_expressions(self, env):
self.local_scope.directives = env.directives
- if self.py_func_stat is not None:
- # this will also analyse the default values and the function name assignment
- self.py_func_stat = self.py_func_stat.analyse_expressions(env)
- elif self.py_func is not None:
+ if self.py_func_stat is not None:
+ # this will also analyse the default values and the function name assignment
+ self.py_func_stat = self.py_func_stat.analyse_expressions(env)
+ elif self.py_func is not None:
# this will also analyse the default values
self.py_func = self.py_func.analyse_expressions(env)
else:
self.analyse_default_values(env)
- self.analyse_annotations(env)
+ self.analyse_annotations(env)
self.acquire_gil = self.need_gil_acquisition(self.local_scope)
return self
def needs_assignment_synthesis(self, env, code=None):
return False
- def generate_function_header(self, code, with_pymethdef, with_opt_args=1, with_dispatch=1, cname=None):
+ def generate_function_header(self, code, with_pymethdef, with_opt_args=1, with_dispatch=1, cname=None):
scope = self.local_scope
arg_decls = []
type = self.type
@@ -2591,8 +2591,8 @@ class CFuncDefNode(FuncDefNode):
code.globalstate.parts['module_declarations'].putln(self.template_declaration)
code.putln(self.template_declaration)
if needs_proto:
- code.globalstate.parts['module_declarations'].putln(
- "%s%s%s; /* proto*/" % (storage_class, modifiers, header))
+ code.globalstate.parts['module_declarations'].putln(
+ "%s%s%s; /* proto*/" % (storage_class, modifiers, header))
code.putln("%s%s%s {" % (storage_class, modifiers, header))
def generate_argument_declarations(self, env, code):
@@ -2656,9 +2656,9 @@ class CFuncDefNode(FuncDefNode):
self.generate_arg_none_check(arg, code)
def generate_execution_code(self, code):
- if code.globalstate.directives['linetrace']:
- code.mark_pos(self.pos)
- code.putln("") # generate line tracing code
+ if code.globalstate.directives['linetrace']:
+ code.mark_pos(self.pos)
+ code.putln("") # generate line tracing code
super(CFuncDefNode, self).generate_execution_code(code)
if self.py_func_stat:
self.py_func_stat.generate_execution_code(code)
@@ -2684,11 +2684,11 @@ class CFuncDefNode(FuncDefNode):
entry = entry.prev_entry
entry.func_cname = "%s%swrap_%s" % (self.entry.func_cname, Naming.pyrex_prefix, k)
code.putln()
- self.generate_function_header(
- code, 0,
- with_dispatch=entry.type.is_overridable,
- with_opt_args=entry.type.optional_arg_count,
- cname=entry.func_cname)
+ self.generate_function_header(
+ code, 0,
+ with_dispatch=entry.type.is_overridable,
+ with_opt_args=entry.type.optional_arg_count,
+ cname=entry.func_cname)
if not self.return_type.is_void:
code.put('return ')
args = self.type.args
@@ -2719,7 +2719,7 @@ class PyArgDeclNode(Node):
def generate_function_definitions(self, env, code):
self.entry.generate_function_definitions(env, code)
-
+
class DecoratorNode(Node):
# A decorator
#
@@ -2749,8 +2749,8 @@ class DefNode(FuncDefNode):
#
# decorator_indirection IndirectionNode Used to remove __Pyx_Method_ClassMethod for fused functions
- child_attrs = ["args", "star_arg", "starstar_arg", "body", "decorators", "return_type_annotation"]
- outer_attrs = ["decorators", "return_type_annotation"]
+ child_attrs = ["args", "star_arg", "starstar_arg", "body", "decorators", "return_type_annotation"]
+ outer_attrs = ["decorators", "return_type_annotation"]
is_staticmethod = False
is_classmethod = False
@@ -2791,8 +2791,8 @@ class DefNode(FuncDefNode):
self.num_required_kw_args = rk
self.num_required_args = r
- def as_cfunction(self, cfunc=None, scope=None, overridable=True, returns=None, except_val=None, modifiers=None,
- nogil=False, with_gil=False):
+ def as_cfunction(self, cfunc=None, scope=None, overridable=True, returns=None, except_val=None, modifiers=None,
+ nogil=False, with_gil=False):
if self.star_arg:
error(self.star_arg.pos, "cdef function cannot have star argument")
if self.starstar_arg:
@@ -2803,19 +2803,19 @@ class DefNode(FuncDefNode):
cfunc_args = []
for formal_arg in self.args:
name_declarator, type = formal_arg.analyse(scope, nonempty=1)
- cfunc_args.append(PyrexTypes.CFuncTypeArg(name=name_declarator.name,
- cname=None,
+ cfunc_args.append(PyrexTypes.CFuncTypeArg(name=name_declarator.name,
+ cname=None,
annotation=formal_arg.annotation,
- type=py_object_type,
- pos=formal_arg.pos))
- cfunc_type = PyrexTypes.CFuncType(return_type=py_object_type,
- args=cfunc_args,
- has_varargs=False,
- exception_value=None,
+ type=py_object_type,
+ pos=formal_arg.pos))
+ cfunc_type = PyrexTypes.CFuncType(return_type=py_object_type,
+ args=cfunc_args,
+ has_varargs=False,
+ exception_value=None,
exception_check=exception_check,
- nogil=nogil,
- with_gil=with_gil,
- is_overridable=overridable)
+ nogil=nogil,
+ with_gil=with_gil,
+ is_overridable=overridable)
cfunc = CVarDefNode(self.pos, type=cfunc_type)
else:
if scope is None:
@@ -2826,7 +2826,7 @@ class DefNode(FuncDefNode):
error(cfunc.pos, "previous declaration here")
for i, (formal_arg, type_arg) in enumerate(zip(self.args, cfunc_type.args)):
name_declarator, type = formal_arg.analyse(scope, nonempty=1,
- is_self_arg=(i == 0 and scope.is_c_class_scope))
+ is_self_arg=(i == 0 and scope.is_c_class_scope))
if type is None or type is PyrexTypes.py_object_type:
formal_arg.type = type_arg.type
formal_arg.name_declarator = name_declarator
@@ -2834,29 +2834,29 @@ class DefNode(FuncDefNode):
if exception_value is None and cfunc_type.exception_value is not None:
from .ExprNodes import ConstNode
exception_value = ConstNode(
- self.pos, value=cfunc_type.exception_value, type=cfunc_type.return_type)
+ self.pos, value=cfunc_type.exception_value, type=cfunc_type.return_type)
declarator = CFuncDeclaratorNode(self.pos,
- base=CNameDeclaratorNode(self.pos, name=self.name, cname=None),
- args=self.args,
- has_varargs=False,
- exception_check=cfunc_type.exception_check,
- exception_value=exception_value,
- with_gil=cfunc_type.with_gil,
- nogil=cfunc_type.nogil)
+ base=CNameDeclaratorNode(self.pos, name=self.name, cname=None),
+ args=self.args,
+ has_varargs=False,
+ exception_check=cfunc_type.exception_check,
+ exception_value=exception_value,
+ with_gil=cfunc_type.with_gil,
+ nogil=cfunc_type.nogil)
return CFuncDefNode(self.pos,
- modifiers=modifiers or [],
- base_type=CAnalysedBaseTypeNode(self.pos, type=cfunc_type.return_type),
- declarator=declarator,
- body=self.body,
- doc=self.doc,
- overridable=cfunc_type.is_overridable,
- type=cfunc_type,
- with_gil=cfunc_type.with_gil,
- nogil=cfunc_type.nogil,
- visibility='private',
- api=False,
- directive_locals=getattr(cfunc, 'directive_locals', {}),
- directive_returns=returns)
+ modifiers=modifiers or [],
+ base_type=CAnalysedBaseTypeNode(self.pos, type=cfunc_type.return_type),
+ declarator=declarator,
+ body=self.body,
+ doc=self.doc,
+ overridable=cfunc_type.is_overridable,
+ type=cfunc_type,
+ with_gil=cfunc_type.with_gil,
+ nogil=cfunc_type.nogil,
+ visibility='private',
+ api=False,
+ directive_locals=getattr(cfunc, 'directive_locals', {}),
+ directive_returns=returns)
def is_cdef_func_compatible(self):
"""Determines if the function's signature is compatible with a
@@ -2895,13 +2895,13 @@ class DefNode(FuncDefNode):
self.analyse_signature(env)
self.return_type = self.entry.signature.return_type()
- # if a signature annotation provides a more specific return object type, use it
- if self.return_type is py_object_type and self.return_type_annotation:
- if env.directives['annotation_typing'] and not self.entry.is_special:
+ # if a signature annotation provides a more specific return object type, use it
+ if self.return_type is py_object_type and self.return_type_annotation:
+ if env.directives['annotation_typing'] and not self.entry.is_special:
_, return_type = analyse_type_annotation(self.return_type_annotation, env)
- if return_type and return_type.is_pyobject:
- self.return_type = return_type
-
+ if return_type and return_type.is_pyobject:
+ self.return_type = return_type
+
self.create_local_scope(env)
self.py_wrapper = DefNodeWrapper(
@@ -2915,7 +2915,7 @@ class DefNode(FuncDefNode):
self.py_wrapper.analyse_declarations(env)
def analyse_argument_types(self, env):
- self.directive_locals = env.directives.get('locals', {})
+ self.directive_locals = env.directives.get('locals', {})
allow_none_for_extension_args = env.directives['allow_none_for_extension_args']
f2s = env.fused_to_specific
@@ -2943,7 +2943,7 @@ class DefNode(FuncDefNode):
self.align_argument_type(env, arg)
if name_declarator and name_declarator.cname:
- error(self.pos, "Python function argument cannot have C name specification")
+ error(self.pos, "Python function argument cannot have C name specification")
arg.type = arg.type.as_argument_type()
arg.hdr_type = None
arg.needs_conversion = 0
@@ -2955,7 +2955,7 @@ class DefNode(FuncDefNode):
elif arg.not_none:
arg.accept_none = False
elif (arg.type.is_extension_type or arg.type.is_builtin_type
- or arg.type.is_buffer or arg.type.is_memoryviewslice):
+ or arg.type.is_buffer or arg.type.is_memoryviewslice):
if arg.default and arg.default.constant_result is None:
# special case: def func(MyType obj = None)
arg.accept_none = True
@@ -3000,8 +3000,8 @@ class DefNode(FuncDefNode):
sig = self.entry.signature
nfixed = sig.num_fixed_args()
- if (sig is TypeSlots.pymethod_signature and nfixed == 1
- and len(self.args) == 0 and self.star_arg):
+ if (sig is TypeSlots.pymethod_signature and nfixed == 1
+ and len(self.args) == 0 and self.star_arg):
# this is the only case where a diverging number of
# arguments is not an error - when we have no explicit
# 'self' parameter as in method(*args)
@@ -3019,7 +3019,7 @@ class DefNode(FuncDefNode):
sig.has_generic_args = True
if ((self.is_classmethod or self.is_staticmethod) and
- self.has_fused_arguments and env.is_c_class_scope):
+ self.has_fused_arguments and env.is_c_class_scope):
del self.decorator_indirection.stats[:]
for i in range(min(nfixed, len(self.args))):
@@ -3052,7 +3052,7 @@ class DefNode(FuncDefNode):
if not sig.has_generic_args:
self.bad_signature()
for arg in self.args:
- if arg.is_generic and (arg.type.is_extension_type or arg.type.is_builtin_type):
+ if arg.is_generic and (arg.type.is_extension_type or arg.type.is_builtin_type):
arg.needs_type_test = 1
def bad_signature(self):
@@ -3065,8 +3065,8 @@ class DefNode(FuncDefNode):
desc = "Special method"
else:
desc = "Method"
- error(self.pos, "%s %s has wrong number of arguments (%d declared, %s expected)" % (
- desc, self.name, len(self.args), expected_str))
+ error(self.pos, "%s %s has wrong number of arguments (%d declared, %s expected)" % (
+ desc, self.name, len(self.args), expected_str))
def declare_pyfunction(self, env):
#print "DefNode.declare_pyfunction:", self.name, "in", env ###
@@ -3075,7 +3075,7 @@ class DefNode(FuncDefNode):
if entry:
if entry.is_final_cmethod and not env.parent_type.is_final_type:
error(self.pos, "Only final types can have final Python (def/cpdef) methods")
- if entry.type.is_cfunction and not entry.is_builtin_cmethod and not self.is_wrapper:
+ if entry.type.is_cfunction and not entry.is_builtin_cmethod and not self.is_wrapper:
warning(self.pos, "Overriding cdef method with def method.", 5)
entry = env.declare_pyfunction(name, self.pos, allow_redefine=not self.is_wrapper)
self.entry = entry
@@ -3085,8 +3085,8 @@ class DefNode(FuncDefNode):
entry.doc = embed_position(self.pos, self.doc)
entry.doc_cname = Naming.funcdoc_prefix + prefix + name
if entry.is_special:
- if entry.name in TypeSlots.invisible or not entry.doc or (
- entry.name in '__getattr__' and env.directives['fast_getattr']):
+ if entry.name in TypeSlots.invisible or not entry.doc or (
+ entry.name in '__getattr__' and env.directives['fast_getattr']):
entry.wrapperbase_cname = None
else:
entry.wrapperbase_cname = Naming.wrapperbase_prefix + prefix + name
@@ -3131,8 +3131,8 @@ class DefNode(FuncDefNode):
def analyse_expressions(self, env):
self.local_scope.directives = env.directives
self.analyse_default_values(env)
- self.analyse_annotations(env)
- if self.return_type_annotation:
+ self.analyse_annotations(env)
+ if self.return_type_annotation:
self.return_type_annotation = self.analyse_annotation(env, self.return_type_annotation)
if not self.needs_assignment_synthesis(env) and self.decorators:
@@ -3145,17 +3145,17 @@ class DefNode(FuncDefNode):
def needs_assignment_synthesis(self, env, code=None):
if self.is_staticmethod:
return True
- if self.specialized_cpdefs or self.entry.is_fused_specialized:
+ if self.specialized_cpdefs or self.entry.is_fused_specialized:
return False
if self.no_assignment_synthesis:
return False
- if self.entry.is_special:
- return False
+ if self.entry.is_special:
+ return False
if self.entry.is_anonymous:
return True
- if env.is_module_scope or env.is_c_class_scope:
+ if env.is_module_scope or env.is_c_class_scope:
if code is None:
- return self.local_scope.directives['binding']
+ return self.local_scope.directives['binding']
else:
return code.globalstate.directives['binding']
return env.is_py_class_scope or env.is_closure_scope
@@ -3168,8 +3168,8 @@ class DefNode(FuncDefNode):
def generate_function_definitions(self, env, code):
if self.defaults_getter:
- # defaults getter must never live in class scopes, it's always a module function
- self.defaults_getter.generate_function_definitions(env.global_scope(), code)
+ # defaults getter must never live in class scopes, it's always a module function
+ self.defaults_getter.generate_function_definitions(env.global_scope(), code)
# Before closure cnames are mangled
if self.py_wrapper_required:
@@ -3291,15 +3291,15 @@ class DefNodeWrapper(FuncDefNode):
if not arg.hdr_type.create_to_py_utility_code(env):
pass # will fail later
- if self.starstar_arg and not self.starstar_arg.entry.cf_used:
- # we will set the kwargs argument to NULL instead of a new dict
- # and must therefore correct the control flow state
- entry = self.starstar_arg.entry
- entry.xdecref_cleanup = 1
- for ass in entry.cf_assignments:
- if not ass.is_arg and ass.lhs.is_name:
- ass.lhs.cf_maybe_null = True
-
+ if self.starstar_arg and not self.starstar_arg.entry.cf_used:
+ # we will set the kwargs argument to NULL instead of a new dict
+ # and must therefore correct the control flow state
+ entry = self.starstar_arg.entry
+ entry.xdecref_cleanup = 1
+ for ass in entry.cf_assignments:
+ if not ass.is_arg and ass.lhs.is_name:
+ ass.lhs.cf_maybe_null = True
+
def signature_has_nongeneric_args(self):
argcount = len(self.args)
if argcount == 0 or (
@@ -3342,7 +3342,7 @@ class DefNodeWrapper(FuncDefNode):
if preprocessor_guard:
code.putln(preprocessor_guard)
- code.enter_cfunc_scope(lenv)
+ code.enter_cfunc_scope(lenv)
code.return_from_error_cleanup_label = code.new_label()
with_pymethdef = (self.target.needs_assignment_synthesis(env, code) or
@@ -3421,14 +3421,14 @@ class DefNodeWrapper(FuncDefNode):
arg_code_list.append("CYTHON_UNUSED PyObject *unused")
if sig.has_generic_args:
arg_code_list.append(
- "PyObject *%s, PyObject *%s" % (
- Naming.args_cname, Naming.kwds_cname))
+ "PyObject *%s, PyObject *%s" % (
+ Naming.args_cname, Naming.kwds_cname))
arg_code = ", ".join(arg_code_list)
# Prevent warning: unused function '__pyx_pw_5numpy_7ndarray_1__getbuffer__'
mf = ""
if (entry.name in ("__getbuffer__", "__releasebuffer__")
- and entry.scope.is_c_class_scope):
+ and entry.scope.is_c_class_scope):
mf = "CYTHON_UNUSED "
with_pymethdef = False
@@ -3442,7 +3442,7 @@ class DefNodeWrapper(FuncDefNode):
# want the prototype for the "fused cpdef", in case we're
# checking to see if our method was overridden in Python
self.target.fused_py_func.generate_function_header(
- code, with_pymethdef, proto_only=True)
+ code, with_pymethdef, proto_only=True)
return
if (Options.docstrings and entry.doc and
@@ -3453,12 +3453,12 @@ class DefNodeWrapper(FuncDefNode):
docstr = entry.doc
if docstr.is_unicode:
- docstr = docstr.as_utf8_string()
+ docstr = docstr.as_utf8_string()
- if not (entry.is_special and entry.name in ('__getbuffer__', '__releasebuffer__')):
- code.putln('static char %s[] = %s;' % (
+ if not (entry.is_special and entry.name in ('__getbuffer__', '__releasebuffer__')):
+ code.putln('static char %s[] = %s;' % (
entry.doc_cname,
- docstr.as_c_string_literal()))
+ docstr.as_c_string_literal()))
if entry.is_special:
code.putln('#if CYTHON_COMPILING_IN_CPYTHON')
@@ -3468,7 +3468,7 @@ class DefNodeWrapper(FuncDefNode):
if with_pymethdef or self.target.fused_py_func:
code.put(
- "static PyMethodDef %s = " % entry.pymethdef_cname)
+ "static PyMethodDef %s = " % entry.pymethdef_cname)
code.put_pymethoddef(self.target.entry, ";", allow_skip=False)
code.putln("%s {" % header)
@@ -3497,7 +3497,7 @@ class DefNodeWrapper(FuncDefNode):
for arg in self.args:
if not arg.type.is_pyobject:
if not arg.type.create_from_py_utility_code(env):
- pass # will fail later
+ pass # will fail later
if not self.signature_has_generic_args():
if has_star_or_kw_args:
@@ -3544,11 +3544,11 @@ class DefNodeWrapper(FuncDefNode):
code.putln("if (unlikely(PyTuple_GET_SIZE(%s) > 0)) {" %
Naming.args_cname)
code.put('__Pyx_RaiseArgtupleInvalid("%s", 1, 0, 0, PyTuple_GET_SIZE(%s)); return %s;' % (
- self.name, Naming.args_cname, self.error_value()))
+ self.name, Naming.args_cname, self.error_value()))
code.putln("}")
if self.starstar_arg:
- if self.star_arg or not self.starstar_arg.entry.cf_used:
+ if self.star_arg or not self.starstar_arg.entry.cf_used:
kwarg_check = "unlikely(%s)" % Naming.kwds_cname
else:
kwarg_check = "%s" % Naming.kwds_cname
@@ -3562,38 +3562,38 @@ class DefNodeWrapper(FuncDefNode):
kwarg_check, Naming.kwds_cname, self.name,
bool(self.starstar_arg), self.error_value()))
- if self.starstar_arg and self.starstar_arg.entry.cf_used:
- if all(ref.node.allow_null for ref in self.starstar_arg.entry.cf_references):
- code.putln("if (%s) {" % kwarg_check)
- code.putln("%s = PyDict_Copy(%s); if (unlikely(!%s)) return %s;" % (
- self.starstar_arg.entry.cname,
- Naming.kwds_cname,
- self.starstar_arg.entry.cname,
- self.error_value()))
- code.put_gotref(self.starstar_arg.entry.cname)
- code.putln("} else {")
- code.putln("%s = NULL;" % (self.starstar_arg.entry.cname,))
- code.putln("}")
- self.starstar_arg.entry.xdecref_cleanup = 1
- else:
- code.put("%s = (%s) ? PyDict_Copy(%s) : PyDict_New(); " % (
- self.starstar_arg.entry.cname,
- Naming.kwds_cname,
- Naming.kwds_cname))
- code.putln("if (unlikely(!%s)) return %s;" % (
- self.starstar_arg.entry.cname, self.error_value()))
- self.starstar_arg.entry.xdecref_cleanup = 0
- code.put_gotref(self.starstar_arg.entry.cname)
+ if self.starstar_arg and self.starstar_arg.entry.cf_used:
+ if all(ref.node.allow_null for ref in self.starstar_arg.entry.cf_references):
+ code.putln("if (%s) {" % kwarg_check)
+ code.putln("%s = PyDict_Copy(%s); if (unlikely(!%s)) return %s;" % (
+ self.starstar_arg.entry.cname,
+ Naming.kwds_cname,
+ self.starstar_arg.entry.cname,
+ self.error_value()))
+ code.put_gotref(self.starstar_arg.entry.cname)
+ code.putln("} else {")
+ code.putln("%s = NULL;" % (self.starstar_arg.entry.cname,))
+ code.putln("}")
+ self.starstar_arg.entry.xdecref_cleanup = 1
+ else:
+ code.put("%s = (%s) ? PyDict_Copy(%s) : PyDict_New(); " % (
+ self.starstar_arg.entry.cname,
+ Naming.kwds_cname,
+ Naming.kwds_cname))
+ code.putln("if (unlikely(!%s)) return %s;" % (
+ self.starstar_arg.entry.cname, self.error_value()))
+ self.starstar_arg.entry.xdecref_cleanup = 0
+ code.put_gotref(self.starstar_arg.entry.cname)
if self.self_in_stararg and not self.target.is_staticmethod:
# need to create a new tuple with 'self' inserted as first item
code.put("%s = PyTuple_New(PyTuple_GET_SIZE(%s)+1); if (unlikely(!%s)) " % (
- self.star_arg.entry.cname,
- Naming.args_cname,
- self.star_arg.entry.cname))
- if self.starstar_arg and self.starstar_arg.entry.cf_used:
+ self.star_arg.entry.cname,
+ Naming.args_cname,
+ self.star_arg.entry.cname))
+ if self.starstar_arg and self.starstar_arg.entry.cf_used:
code.putln("{")
- code.put_xdecref_clear(self.starstar_arg.entry.cname, py_object_type)
+ code.put_xdecref_clear(self.starstar_arg.entry.cname, py_object_type)
code.putln("return %s;" % self.error_value())
code.putln("}")
else:
@@ -3618,8 +3618,8 @@ class DefNodeWrapper(FuncDefNode):
elif self.star_arg:
code.put_incref(Naming.args_cname, py_object_type)
code.putln("%s = %s;" % (
- self.star_arg.entry.cname,
- Naming.args_cname))
+ self.star_arg.entry.cname,
+ Naming.args_cname))
self.star_arg.entry.xdecref_cleanup = 0
def generate_tuple_and_keyword_parsing_code(self, args, success_label, code):
@@ -3660,8 +3660,8 @@ class DefNodeWrapper(FuncDefNode):
all_args = tuple(positional_args) + tuple(kw_only_args)
code.putln("static PyObject **%s[] = {%s,0};" % (
Naming.pykwdlist_cname,
- ','.join(['&%s' % code.intern_identifier(arg.name)
- for arg in all_args])))
+ ','.join(['&%s' % code.intern_identifier(arg.name)
+ for arg in all_args])))
# Before being converted and assigned to the target variables,
# borrowed references to all unpacked argument values are
@@ -3691,14 +3691,14 @@ class DefNodeWrapper(FuncDefNode):
else:
compare = '<'
code.putln('} else if (PyTuple_GET_SIZE(%s) %s %d) {' % (
- Naming.args_cname, compare, min_positional_args))
+ Naming.args_cname, compare, min_positional_args))
code.put_goto(argtuple_error_label)
if self.num_required_kw_args:
# pure error case: keywords required but not passed
if max_positional_args > min_positional_args and not self.star_arg:
code.putln('} else if (PyTuple_GET_SIZE(%s) > %d) {' % (
- Naming.args_cname, max_positional_args))
+ Naming.args_cname, max_positional_args))
code.put_goto(argtuple_error_label)
code.putln('} else {')
for i, arg in enumerate(kw_only_args):
@@ -3708,8 +3708,8 @@ class DefNodeWrapper(FuncDefNode):
code.globalstate.use_utility_code(
UtilityCode.load_cached("RaiseKeywordRequired", "FunctionArguments.c"))
code.put('__Pyx_RaiseKeywordRequired("%s", %s); ' % (
- self.name,
- pystring_cname))
+ self.name,
+ pystring_cname))
code.putln(code.error_goto(self.pos))
break
@@ -3764,9 +3764,9 @@ class DefNodeWrapper(FuncDefNode):
code.globalstate.use_utility_code(
UtilityCode.load_cached("RaiseArgTupleInvalid", "FunctionArguments.c"))
code.put('__Pyx_RaiseArgtupleInvalid("%s", %d, %d, %d, PyTuple_GET_SIZE(%s)); ' % (
- self.name, has_fixed_positional_count,
- min_positional_args, max_positional_args,
- Naming.args_cname))
+ self.name, has_fixed_positional_count,
+ min_positional_args, max_positional_args,
+ Naming.args_cname))
code.putln(code.error_goto(self.pos))
def generate_arg_assignment(self, arg, item, code):
@@ -3785,9 +3785,9 @@ class DefNodeWrapper(FuncDefNode):
item, arg.entry.cname, arg.pos, code))
if arg.default:
code.putln('} else {')
- code.putln("%s = %s;" % (
- arg.entry.cname,
- arg.calculate_default_value_code(code)))
+ code.putln("%s = %s;" % (
+ arg.entry.cname,
+ arg.calculate_default_value_code(code)))
if arg.type.is_memoryviewslice:
code.put_incref_memoryviewslice(arg.entry.cname,
have_gil=True)
@@ -3799,18 +3799,18 @@ class DefNodeWrapper(FuncDefNode):
if self.starstar_arg:
self.starstar_arg.entry.xdecref_cleanup = 0
code.putln('%s = PyDict_New(); if (unlikely(!%s)) return %s;' % (
- self.starstar_arg.entry.cname,
- self.starstar_arg.entry.cname,
- self.error_value()))
+ self.starstar_arg.entry.cname,
+ self.starstar_arg.entry.cname,
+ self.error_value()))
code.put_gotref(self.starstar_arg.entry.cname)
if self.star_arg:
self.star_arg.entry.xdecref_cleanup = 0
code.putln('if (PyTuple_GET_SIZE(%s) > %d) {' % (
- Naming.args_cname,
- max_positional_args))
+ Naming.args_cname,
+ max_positional_args))
code.putln('%s = PyTuple_GetSlice(%s, %d, PyTuple_GET_SIZE(%s));' % (
- self.star_arg.entry.cname, Naming.args_cname,
- max_positional_args, Naming.args_cname))
+ self.star_arg.entry.cname, Naming.args_cname,
+ max_positional_args, Naming.args_cname))
code.putln("if (unlikely(!%s)) {" % self.star_arg.entry.cname)
if self.starstar_arg:
code.put_decref_clear(self.starstar_arg.entry.cname, py_object_type)
@@ -3854,7 +3854,7 @@ class DefNodeWrapper(FuncDefNode):
for i in range(max_positional_args-1, -1, -1):
code.put('case %2d: ' % (i+1))
code.putln("values[%d] = PyTuple_GET_ITEM(%s, %d);" % (
- i, Naming.args_cname, i))
+ i, Naming.args_cname, i))
code.putln('CYTHON_FALLTHROUGH;')
code.putln('case 0: break;')
if not self.star_arg:
@@ -3916,16 +3916,16 @@ class DefNodeWrapper(FuncDefNode):
code.globalstate.use_utility_code(
UtilityCode.load_cached("RaiseArgTupleInvalid", "FunctionArguments.c"))
code.put('__Pyx_RaiseArgtupleInvalid("%s", %d, %d, %d, %d); ' % (
- self.name, has_fixed_positional_count,
- min_positional_args, max_positional_args, i))
+ self.name, has_fixed_positional_count,
+ min_positional_args, max_positional_args, i))
code.putln(code.error_goto(self.pos))
code.putln('}')
elif arg.kw_only:
code.putln('else {')
code.globalstate.use_utility_code(
UtilityCode.load_cached("RaiseKeywordRequired", "FunctionArguments.c"))
- code.put('__Pyx_RaiseKeywordRequired("%s", %s); ' % (
- self.name, pystring_cname))
+ code.put('__Pyx_RaiseKeywordRequired("%s", %s); ' % (
+ self.name, pystring_cname))
code.putln(code.error_goto(self.pos))
code.putln('}')
if max_positional_args > 0:
@@ -3948,19 +3948,19 @@ class DefNodeWrapper(FuncDefNode):
pos_arg_count = "0"
elif self.star_arg:
code.putln("const Py_ssize_t used_pos_args = (pos_args < %d) ? pos_args : %d;" % (
- max_positional_args, max_positional_args))
+ max_positional_args, max_positional_args))
pos_arg_count = "used_pos_args"
else:
pos_arg_count = "pos_args"
code.globalstate.use_utility_code(
UtilityCode.load_cached("ParseKeywords", "FunctionArguments.c"))
- code.putln('if (unlikely(__Pyx_ParseOptionalKeywords(%s, %s, %s, values, %s, "%s") < 0)) %s' % (
- Naming.kwds_cname,
- Naming.pykwdlist_cname,
- self.starstar_arg and self.starstar_arg.entry.cname or '0',
- pos_arg_count,
- self.name,
- code.error_goto(self.pos)))
+ code.putln('if (unlikely(__Pyx_ParseOptionalKeywords(%s, %s, %s, values, %s, "%s") < 0)) %s' % (
+ Naming.kwds_cname,
+ Naming.pykwdlist_cname,
+ self.starstar_arg and self.starstar_arg.entry.cname or '0',
+ pos_arg_count,
+ self.name,
+ code.error_goto(self.pos)))
code.putln('}')
def generate_optional_kwonly_args_unpacking_code(self, all_args, code):
@@ -4017,9 +4017,9 @@ class DefNodeWrapper(FuncDefNode):
self.generate_arg_conversion_to_pyobject(arg, code)
else:
if new_type.assignable_from(old_type):
- code.putln("%s = %s;" % (arg.entry.cname, arg.hdr_cname))
+ code.putln("%s = %s;" % (arg.entry.cname, arg.hdr_cname))
else:
- error(arg.pos, "Cannot convert 1 argument from '%s' to '%s'" % (old_type, new_type))
+ error(arg.pos, "Cannot convert 1 argument from '%s' to '%s'" % (old_type, new_type))
def generate_arg_conversion_from_pyobject(self, arg, code):
new_type = arg.type
@@ -4032,7 +4032,7 @@ class DefNodeWrapper(FuncDefNode):
code,
))
else:
- error(arg.pos, "Cannot convert Python object argument to type '%s'" % new_type)
+ error(arg.pos, "Cannot convert Python object argument to type '%s'" % new_type)
def generate_arg_conversion_to_pyobject(self, arg, code):
old_type = arg.hdr_type
@@ -4045,7 +4045,7 @@ class DefNodeWrapper(FuncDefNode):
code.error_goto_if_null(arg.entry.cname, arg.pos)))
code.put_var_gotref(arg.entry)
else:
- error(arg.pos, "Cannot convert argument of type '%s' to Python object" % old_type)
+ error(arg.pos, "Cannot convert argument of type '%s' to Python object" % old_type)
def generate_argument_type_tests(self, code):
# Generate type tests for args whose signature
@@ -4070,7 +4070,7 @@ class GeneratorDefNode(DefNode):
#
is_generator = True
- is_coroutine = False
+ is_coroutine = False
is_iterable_coroutine = False
is_asyncgen = False
gen_type_name = 'Generator'
@@ -4092,10 +4092,10 @@ class GeneratorDefNode(DefNode):
body_cname = self.gbody.entry.func_cname
name = code.intern_identifier(self.name)
qualname = code.intern_identifier(self.qualname)
- module_name = code.intern_identifier(self.module_name)
+ module_name = code.intern_identifier(self.module_name)
code.putln('{')
- code.putln('__pyx_CoroutineObject *gen = __Pyx_%s_New('
+ code.putln('__pyx_CoroutineObject *gen = __Pyx_%s_New('
'(__pyx_coroutine_body_t) %s, %s, (PyObject *) %s, %s, %s, %s); %s' % (
self.gen_type_name,
body_cname, self.code_object.calculate_result_code(code) if self.code_object else 'NULL',
@@ -4119,11 +4119,11 @@ class GeneratorDefNode(DefNode):
self.gbody.generate_function_definitions(env, code)
-class AsyncDefNode(GeneratorDefNode):
+class AsyncDefNode(GeneratorDefNode):
gen_type_name = 'Coroutine'
- is_coroutine = True
-
-
+ is_coroutine = True
+
+
class IterableAsyncDefNode(AsyncDefNode):
gen_type_name = 'IterableCoroutine'
is_iterable_coroutine = True
@@ -4139,9 +4139,9 @@ class GeneratorBodyDefNode(DefNode):
#
is_generator_body = True
- is_inlined = False
+ is_inlined = False
is_async_gen_body = False
- inlined_comprehension_type = None # container type for inlined comprehensions
+ inlined_comprehension_type = None # container type for inlined comprehensions
def __init__(self, pos=None, name=None, body=None, is_async_gen_body=False):
super(GeneratorBodyDefNode, self).__init__(
@@ -4184,7 +4184,7 @@ class GeneratorBodyDefNode(DefNode):
self.body.generate_function_definitions(lenv, code)
# Generate C code for header and body of function
- code.enter_cfunc_scope(lenv)
+ code.enter_cfunc_scope(lenv)
code.return_from_error_cleanup_label = code.new_label()
# ----- Top-level constants used by this function
@@ -4217,23 +4217,23 @@ class GeneratorBodyDefNode(DefNode):
code.putln('%s' %
(code.error_goto_if_null(Naming.sent_value_cname, self.pos)))
- # ----- prepare target container for inlined comprehension
- if self.is_inlined and self.inlined_comprehension_type is not None:
- target_type = self.inlined_comprehension_type
- if target_type is Builtin.list_type:
- comp_init = 'PyList_New(0)'
- elif target_type is Builtin.set_type:
- comp_init = 'PySet_New(NULL)'
- elif target_type is Builtin.dict_type:
- comp_init = 'PyDict_New()'
- else:
- raise InternalError(
- "invalid type of inlined comprehension: %s" % target_type)
- code.putln("%s = %s; %s" % (
- Naming.retval_cname, comp_init,
- code.error_goto_if_null(Naming.retval_cname, self.pos)))
- code.put_gotref(Naming.retval_cname)
-
+ # ----- prepare target container for inlined comprehension
+ if self.is_inlined and self.inlined_comprehension_type is not None:
+ target_type = self.inlined_comprehension_type
+ if target_type is Builtin.list_type:
+ comp_init = 'PyList_New(0)'
+ elif target_type is Builtin.set_type:
+ comp_init = 'PySet_New(NULL)'
+ elif target_type is Builtin.dict_type:
+ comp_init = 'PyDict_New()'
+ else:
+ raise InternalError(
+ "invalid type of inlined comprehension: %s" % target_type)
+ code.putln("%s = %s; %s" % (
+ Naming.retval_cname, comp_init,
+ code.error_goto_if_null(Naming.retval_cname, self.pos)))
+ code.put_gotref(Naming.retval_cname)
+
# ----- Function body
self.generate_function_body(env, code)
# ----- Closure initialization
@@ -4242,8 +4242,8 @@ class GeneratorBodyDefNode(DefNode):
lenv.scope_class.type.declaration_code(Naming.cur_scope_cname),
lenv.scope_class.type.cast_code('%s->closure' %
Naming.generator_cname)))
- # FIXME: this silences a potential "unused" warning => try to avoid unused closures in more cases
- code.putln("CYTHON_MAYBE_UNUSED_VAR(%s);" % Naming.cur_scope_cname)
+ # FIXME: this silences a potential "unused" warning => try to avoid unused closures in more cases
+ code.putln("CYTHON_MAYBE_UNUSED_VAR(%s);" % Naming.cur_scope_cname)
if profile or linetrace:
code.funcstate.can_trace = False
@@ -4254,7 +4254,7 @@ class GeneratorBodyDefNode(DefNode):
# on normal generator termination, we do not take the exception propagation
# path: no traceback info is required and not creating it is much faster
- if not self.is_inlined and not self.body.is_terminator:
+ if not self.is_inlined and not self.body.is_terminator:
if self.is_async_gen_body:
code.globalstate.use_utility_code(
UtilityCode.load_cached("StopAsyncIteration", "Coroutine.c"))
@@ -4265,11 +4265,11 @@ class GeneratorBodyDefNode(DefNode):
if not self.body.is_terminator:
code.put_goto(code.return_label)
code.put_label(code.error_label)
- if self.is_inlined and self.inlined_comprehension_type is not None:
- code.put_xdecref_clear(Naming.retval_cname, py_object_type)
- if Future.generator_stop in env.global_scope().context.future_directives:
- # PEP 479: turn accidental StopIteration exceptions into a RuntimeError
- code.globalstate.use_utility_code(UtilityCode.load_cached("pep479", "Coroutine.c"))
+ if self.is_inlined and self.inlined_comprehension_type is not None:
+ code.put_xdecref_clear(Naming.retval_cname, py_object_type)
+ if Future.generator_stop in env.global_scope().context.future_directives:
+ # PEP 479: turn accidental StopIteration exceptions into a RuntimeError
+ code.globalstate.use_utility_code(UtilityCode.load_cached("pep479", "Coroutine.c"))
code.putln("__Pyx_Generator_Replace_StopIteration(%d);" % bool(self.is_async_gen_body))
for cname, type in code.funcstate.all_managed_temps():
code.put_xdecref(cname, type)
@@ -4277,22 +4277,22 @@ class GeneratorBodyDefNode(DefNode):
# ----- Non-error return cleanup
code.put_label(code.return_label)
- if self.is_inlined:
- code.put_xgiveref(Naming.retval_cname)
- else:
- code.put_xdecref_clear(Naming.retval_cname, py_object_type)
- # For Py3.7, clearing is already done below.
- code.putln("#if !CYTHON_USE_EXC_INFO_STACK")
+ if self.is_inlined:
+ code.put_xgiveref(Naming.retval_cname)
+ else:
+ code.put_xdecref_clear(Naming.retval_cname, py_object_type)
+ # For Py3.7, clearing is already done below.
+ code.putln("#if !CYTHON_USE_EXC_INFO_STACK")
code.putln("__Pyx_Coroutine_ResetAndClearException(%s);" % Naming.generator_cname)
- code.putln("#endif")
+ code.putln("#endif")
code.putln('%s->resume_label = -1;' % Naming.generator_cname)
# clean up as early as possible to help breaking any reference cycles
- code.putln('__Pyx_Coroutine_clear((PyObject*)%s);' % Naming.generator_cname)
+ code.putln('__Pyx_Coroutine_clear((PyObject*)%s);' % Naming.generator_cname)
if profile or linetrace:
code.put_trace_return(Naming.retval_cname,
nogil=not code.funcstate.gil_owned)
code.put_finish_refcount_context()
- code.putln("return %s;" % Naming.retval_cname)
+ code.putln("return %s;" % Naming.retval_cname)
code.putln("}")
# ----- Go back and insert temp variable declarations
@@ -4343,14 +4343,14 @@ class OverrideCheckNode(StatNode):
self.func_node = ExprNodes.RawCNameExprNode(self.pos, py_object_type)
call_node = ExprNodes.SimpleCallNode(
self.pos, function=self.func_node,
- args=[ExprNodes.NameNode(self.pos, name=arg.name)
- for arg in self.args[first_arg:]])
- if env.return_type.is_void or env.return_type.is_returncode:
- self.body = StatListNode(self.pos, stats=[
- ExprStatNode(self.pos, expr=call_node),
- ReturnStatNode(self.pos, value=None)])
- else:
- self.body = ReturnStatNode(self.pos, value=call_node)
+ args=[ExprNodes.NameNode(self.pos, name=arg.name)
+ for arg in self.args[first_arg:]])
+ if env.return_type.is_void or env.return_type.is_returncode:
+ self.body = StatListNode(self.pos, stats=[
+ ExprStatNode(self.pos, expr=call_node),
+ ReturnStatNode(self.pos, value=None)])
+ else:
+ self.body = ReturnStatNode(self.pos, value=call_node)
self.body = self.body.analyse_expressions(env)
return self
@@ -4367,25 +4367,25 @@ class OverrideCheckNode(StatNode):
if self.py_func.is_module_scope:
code.putln("else {")
else:
- code.putln("else if (unlikely((Py_TYPE(%s)->tp_dictoffset != 0)"
- " || (Py_TYPE(%s)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {" % (
- self_arg, self_arg))
-
- code.putln("#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS")
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("PyDictVersioning", "ObjectHandling.c"))
- # TODO: remove the object dict version check by 'inlining' the getattr implementation for methods.
- # This would allow checking the dict versions around _PyType_Lookup() if it returns a descriptor,
- # and would (tada!) make this check a pure type based thing instead of supporting only a single
- # instance at a time.
- code.putln("static PY_UINT64_T %s = __PYX_DICT_VERSION_INIT, %s = __PYX_DICT_VERSION_INIT;" % (
- Naming.tp_dict_version_temp, Naming.obj_dict_version_temp))
- code.putln("if (unlikely(!__Pyx_object_dict_version_matches(%s, %s, %s))) {" % (
- self_arg, Naming.tp_dict_version_temp, Naming.obj_dict_version_temp))
- code.putln("PY_UINT64_T %s = __Pyx_get_tp_dict_version(%s);" % (
- Naming.type_dict_guard_temp, self_arg))
- code.putln("#endif")
-
+ code.putln("else if (unlikely((Py_TYPE(%s)->tp_dictoffset != 0)"
+ " || (Py_TYPE(%s)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {" % (
+ self_arg, self_arg))
+
+ code.putln("#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS")
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("PyDictVersioning", "ObjectHandling.c"))
+ # TODO: remove the object dict version check by 'inlining' the getattr implementation for methods.
+ # This would allow checking the dict versions around _PyType_Lookup() if it returns a descriptor,
+ # and would (tada!) make this check a pure type based thing instead of supporting only a single
+ # instance at a time.
+ code.putln("static PY_UINT64_T %s = __PYX_DICT_VERSION_INIT, %s = __PYX_DICT_VERSION_INIT;" % (
+ Naming.tp_dict_version_temp, Naming.obj_dict_version_temp))
+ code.putln("if (unlikely(!__Pyx_object_dict_version_matches(%s, %s, %s))) {" % (
+ self_arg, Naming.tp_dict_version_temp, Naming.obj_dict_version_temp))
+ code.putln("PY_UINT64_T %s = __Pyx_get_tp_dict_version(%s);" % (
+ Naming.type_dict_guard_temp, self_arg))
+ code.putln("#endif")
+
func_node_temp = code.funcstate.allocate_temp(py_object_type, manage_ref=True)
self.func_node.set_cname(func_node_temp)
# need to get attribute manually--scope would return cdef method
@@ -4395,48 +4395,48 @@ class OverrideCheckNode(StatNode):
code.putln("%s = __Pyx_PyObject_GetAttrStr(%s, %s); %s" % (
func_node_temp, self_arg, interned_attr_cname, err))
code.put_gotref(func_node_temp)
-
+
is_builtin_function_or_method = "PyCFunction_Check(%s)" % func_node_temp
- is_overridden = "(PyCFunction_GET_FUNCTION(%s) != (PyCFunction)(void*)%s)" % (
+ is_overridden = "(PyCFunction_GET_FUNCTION(%s) != (PyCFunction)(void*)%s)" % (
func_node_temp, self.py_func.entry.func_cname)
code.putln("if (!%s || %s) {" % (is_builtin_function_or_method, is_overridden))
self.body.generate_execution_code(code)
code.putln("}")
-
- # NOTE: it's not 100% sure that we catch the exact versions here that were used for the lookup,
- # but it is very unlikely that the versions change during lookup, and the type dict safe guard
- # should increase the chance of detecting such a case.
- code.putln("#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS")
- code.putln("%s = __Pyx_get_tp_dict_version(%s);" % (
- Naming.tp_dict_version_temp, self_arg))
- code.putln("%s = __Pyx_get_object_dict_version(%s);" % (
- Naming.obj_dict_version_temp, self_arg))
- # Safety check that the type dict didn't change during the lookup. Since CPython looks up the
- # attribute (descriptor) first in the type dict and then in the instance dict or through the
- # descriptor, the only really far-away lookup when we get here is one in the type dict. So we
- # double check the type dict version before and afterwards to guard against later changes of
- # the type dict during the lookup process.
- code.putln("if (unlikely(%s != %s)) {" % (
- Naming.type_dict_guard_temp, Naming.tp_dict_version_temp))
- code.putln("%s = %s = __PYX_DICT_VERSION_INIT;" % (
- Naming.tp_dict_version_temp, Naming.obj_dict_version_temp))
- code.putln("}")
- code.putln("#endif")
-
+
+ # NOTE: it's not 100% sure that we catch the exact versions here that were used for the lookup,
+ # but it is very unlikely that the versions change during lookup, and the type dict safe guard
+ # should increase the chance of detecting such a case.
+ code.putln("#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS")
+ code.putln("%s = __Pyx_get_tp_dict_version(%s);" % (
+ Naming.tp_dict_version_temp, self_arg))
+ code.putln("%s = __Pyx_get_object_dict_version(%s);" % (
+ Naming.obj_dict_version_temp, self_arg))
+ # Safety check that the type dict didn't change during the lookup. Since CPython looks up the
+ # attribute (descriptor) first in the type dict and then in the instance dict or through the
+ # descriptor, the only really far-away lookup when we get here is one in the type dict. So we
+ # double check the type dict version before and afterwards to guard against later changes of
+ # the type dict during the lookup process.
+ code.putln("if (unlikely(%s != %s)) {" % (
+ Naming.type_dict_guard_temp, Naming.tp_dict_version_temp))
+ code.putln("%s = %s = __PYX_DICT_VERSION_INIT;" % (
+ Naming.tp_dict_version_temp, Naming.obj_dict_version_temp))
+ code.putln("}")
+ code.putln("#endif")
+
code.put_decref_clear(func_node_temp, PyrexTypes.py_object_type)
code.funcstate.release_temp(func_node_temp)
-
- code.putln("#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS")
- code.putln("}")
- code.putln("#endif")
-
+
+ code.putln("#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS")
code.putln("}")
+ code.putln("#endif")
-
+ code.putln("}")
+
+
class ClassDefNode(StatNode, BlockNode):
pass
-
+
class PyClassDefNode(ClassDefNode):
# A Python class definition.
#
@@ -4462,7 +4462,7 @@ class PyClassDefNode(ClassDefNode):
mkw = None
def __init__(self, pos, name, bases, doc, body, decorators=None,
- keyword_args=None, force_py3_semantics=False):
+ keyword_args=None, force_py3_semantics=False):
StatNode.__init__(self, pos)
self.name = name
self.doc = doc
@@ -4477,30 +4477,30 @@ class PyClassDefNode(ClassDefNode):
doc_node = None
allow_py2_metaclass = not force_py3_semantics
- if keyword_args:
+ if keyword_args:
allow_py2_metaclass = False
self.is_py3_style_class = True
- if keyword_args.is_dict_literal:
- if keyword_args.key_value_pairs:
- for i, item in list(enumerate(keyword_args.key_value_pairs))[::-1]:
- if item.key.value == 'metaclass':
- if self.metaclass is not None:
- error(item.pos, "keyword argument 'metaclass' passed multiple times")
- # special case: we already know the metaclass,
- # so we don't need to do the "build kwargs,
- # find metaclass" dance at runtime
- self.metaclass = item.value
- del keyword_args.key_value_pairs[i]
- self.mkw = keyword_args
- else:
- assert self.metaclass is not None
+ if keyword_args.is_dict_literal:
+ if keyword_args.key_value_pairs:
+ for i, item in list(enumerate(keyword_args.key_value_pairs))[::-1]:
+ if item.key.value == 'metaclass':
+ if self.metaclass is not None:
+ error(item.pos, "keyword argument 'metaclass' passed multiple times")
+ # special case: we already know the metaclass,
+ # so we don't need to do the "build kwargs,
+ # find metaclass" dance at runtime
+ self.metaclass = item.value
+ del keyword_args.key_value_pairs[i]
+ self.mkw = keyword_args
+ else:
+ assert self.metaclass is not None
else:
- # MergedDictNode
- self.mkw = ExprNodes.ProxyNode(keyword_args)
+ # MergedDictNode
+ self.mkw = ExprNodes.ProxyNode(keyword_args)
if force_py3_semantics or self.bases or self.mkw or self.metaclass:
if self.metaclass is None:
- if keyword_args and not keyword_args.is_dict_literal:
+ if keyword_args and not keyword_args.is_dict_literal:
# **kwargs may contain 'metaclass' arg
mkdict = self.mkw
else:
@@ -4541,20 +4541,20 @@ class PyClassDefNode(ClassDefNode):
from . import ExprNodes
return CClassDefNode(self.pos,
- visibility='private',
- module_name=None,
- class_name=self.name,
+ visibility='private',
+ module_name=None,
+ class_name=self.name,
bases=self.bases or ExprNodes.TupleNode(self.pos, args=[]),
- decorators=self.decorators,
- body=self.body,
- in_pxd=False,
- doc=self.doc)
+ decorators=self.decorators,
+ body=self.body,
+ in_pxd=False,
+ doc=self.doc)
def create_scope(self, env):
genv = env
while genv.is_py_class_scope or genv.is_c_class_scope:
genv = genv.outer_scope
- cenv = self.scope = PyClassScope(name=self.name, outer_scope=genv)
+ cenv = self.scope = PyClassScope(name=self.name, outer_scope=genv)
return cenv
def analyse_declarations(self, env):
@@ -4564,8 +4564,8 @@ class PyClassDefNode(ClassDefNode):
for decorator in self.decorators[::-1]:
class_result = SimpleCallNode(
decorator.pos,
- function=decorator.decorator,
- args=[class_result])
+ function=decorator.decorator,
+ args=[class_result])
self.decorators = None
self.class_result = class_result
if self.bases:
@@ -4599,7 +4599,7 @@ class PyClassDefNode(ClassDefNode):
self.body.generate_function_definitions(self.scope, code)
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
code.pyclass_stack.append(self)
cenv = self.scope
if self.bases:
@@ -4641,7 +4641,7 @@ class PyClassDefNode(ClassDefNode):
self.bases.free_temps(code)
code.pyclass_stack.pop()
-
+
class CClassDefNode(ClassDefNode):
# An extension type definition.
#
@@ -4654,7 +4654,7 @@ class CClassDefNode(ClassDefNode):
# bases TupleNode Base class(es)
# objstruct_name string or None Specified C name of object struct
# typeobj_name string or None Specified C name of type object
- # check_size 'warn', 'error', 'ignore' What to do if tp_basicsize does not match
+ # check_size 'warn', 'error', 'ignore' What to do if tp_basicsize does not match
# in_pxd boolean Is in a .pxd file
# decorators [DecoratorNode] list of decorators or None
# doc string or None
@@ -4671,7 +4671,7 @@ class CClassDefNode(ClassDefNode):
api = False
objstruct_name = None
typeobj_name = None
- check_size = None
+ check_size = None
decorators = None
shadow = False
@@ -4697,20 +4697,20 @@ class CClassDefNode(ClassDefNode):
home_scope = env
self.entry = home_scope.declare_c_class(
- name=self.class_name,
- pos=self.pos,
- defining=0,
- implementing=0,
- module_name=self.module_name,
- base_type=None,
- objstruct_cname=self.objstruct_name,
- typeobj_cname=self.typeobj_name,
- visibility=self.visibility,
- typedef_flag=self.typedef_flag,
- check_size = self.check_size,
- api=self.api,
- buffer_defaults=self.buffer_defaults(env),
- shadow=self.shadow)
+ name=self.class_name,
+ pos=self.pos,
+ defining=0,
+ implementing=0,
+ module_name=self.module_name,
+ base_type=None,
+ objstruct_cname=self.objstruct_name,
+ typeobj_cname=self.typeobj_name,
+ visibility=self.visibility,
+ typedef_flag=self.typedef_flag,
+ check_size = self.check_size,
+ api=self.api,
+ buffer_defaults=self.buffer_defaults(env),
+ shadow=self.shadow)
def analyse_declarations(self, env):
#print "CClassDefNode.analyse_declarations:", self.class_name
@@ -4718,9 +4718,9 @@ class CClassDefNode(ClassDefNode):
#print "...module_name =", self.module_name
if env.in_cinclude and not self.objstruct_name:
- error(self.pos, "Object struct name specification required for C class defined in 'extern from' block")
+ error(self.pos, "Object struct name specification required for C class defined in 'extern from' block")
if self.decorators:
- error(self.pos, "Decorators not allowed on cdef classes (used on type '%s')" % self.class_name)
+ error(self.pos, "Decorators not allowed on cdef classes (used on type '%s')" % self.class_name)
self.base_type = None
# Now that module imports are cached, we need to
# import the modules for extern classes.
@@ -4780,25 +4780,25 @@ class CClassDefNode(ClassDefNode):
if self.visibility == 'extern':
if (self.module_name == '__builtin__' and
- self.class_name in Builtin.builtin_types and
- env.qualified_name[:8] != 'cpython.'): # allow overloaded names for cimporting from cpython
+ self.class_name in Builtin.builtin_types and
+ env.qualified_name[:8] != 'cpython.'): # allow overloaded names for cimporting from cpython
warning(self.pos, "%s already a builtin Cython type" % self.class_name, 1)
self.entry = home_scope.declare_c_class(
- name=self.class_name,
- pos=self.pos,
- defining=has_body and self.in_pxd,
- implementing=has_body and not self.in_pxd,
- module_name=self.module_name,
- base_type=self.base_type,
- objstruct_cname=self.objstruct_name,
- typeobj_cname=self.typeobj_name,
- check_size=self.check_size,
- visibility=self.visibility,
- typedef_flag=self.typedef_flag,
- api=self.api,
- buffer_defaults=self.buffer_defaults(env),
- shadow=self.shadow)
+ name=self.class_name,
+ pos=self.pos,
+ defining=has_body and self.in_pxd,
+ implementing=has_body and not self.in_pxd,
+ module_name=self.module_name,
+ base_type=self.base_type,
+ objstruct_cname=self.objstruct_name,
+ typeobj_cname=self.typeobj_name,
+ check_size=self.check_size,
+ visibility=self.visibility,
+ typedef_flag=self.typedef_flag,
+ api=self.api,
+ buffer_defaults=self.buffer_defaults(env),
+ shadow=self.shadow)
if self.shadow:
home_scope.lookup(self.class_name).as_variable = self.entry
@@ -4813,15 +4813,15 @@ class CClassDefNode(ClassDefNode):
if has_body:
self.body.analyse_declarations(scope)
- dict_entry = self.scope.lookup_here("__dict__")
- if dict_entry and dict_entry.is_variable and (not scope.defined and not scope.implemented):
- dict_entry.getter_cname = self.scope.mangle_internal("__dict__getter")
- self.scope.declare_property("__dict__", dict_entry.doc, dict_entry.pos)
+ dict_entry = self.scope.lookup_here("__dict__")
+ if dict_entry and dict_entry.is_variable and (not scope.defined and not scope.implemented):
+ dict_entry.getter_cname = self.scope.mangle_internal("__dict__getter")
+ self.scope.declare_property("__dict__", dict_entry.doc, dict_entry.pos)
if self.in_pxd:
scope.defined = 1
else:
scope.implemented = 1
-
+
if len(self.bases.args) > 1:
if not has_body or self.in_pxd:
error(self.bases.args[1].pos, "Only declare first base in declaration.")
@@ -4865,7 +4865,7 @@ class CClassDefNode(ClassDefNode):
def generate_execution_code(self, code):
# This is needed to generate evaluation code for
# default values of method arguments.
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
if self.body:
self.body.generate_execution_code(code)
if not self.entry.type.early_init:
@@ -4922,10 +4922,10 @@ class CClassDefNode(ClassDefNode):
code.error_goto(entry.pos)))
# Don't inherit tp_print from builtin types, restoring the
# behavior of using tp_repr or tp_str instead.
- # ("tp_print" was renamed to "tp_vectorcall_offset" in Py3.8b1)
- code.putln("#if PY_VERSION_HEX < 0x030800B1")
+ # ("tp_print" was renamed to "tp_vectorcall_offset" in Py3.8b1)
+ code.putln("#if PY_VERSION_HEX < 0x030800B1")
code.putln("%s.tp_print = 0;" % typeobj_cname)
- code.putln("#endif")
+ code.putln("#endif")
# Use specialised attribute lookup for types with generic lookup but no instance dict.
getattr_slot_func = TypeSlots.get_slot_code_by_name(scope, 'tp_getattro')
@@ -4993,14 +4993,14 @@ class CClassDefNode(ClassDefNode):
code.putln("if (__Pyx_MergeVtables(&%s) < 0) %s" % (
typeobj_cname,
code.error_goto(entry.pos)))
- if not type.scope.is_internal and not type.scope.directives.get('internal'):
+ if not type.scope.is_internal and not type.scope.directives.get('internal'):
# scope.is_internal is set for types defined by
# Cython (such as closures), the 'internal'
# directive is set by users
code.putln(
- 'if (PyObject_SetAttr(%s, %s, (PyObject *)&%s) < 0) %s' % (
+ 'if (PyObject_SetAttr(%s, %s, (PyObject *)&%s) < 0) %s' % (
Naming.module_cname,
- code.intern_identifier(scope.class_name),
+ code.intern_identifier(scope.class_name),
typeobj_cname,
code.error_goto(entry.pos)))
weakref_entry = scope.lookup_here("__weakref__") if not scope.is_closure_class_scope else None
@@ -5127,7 +5127,7 @@ class ExprStatNode(StatNode):
if type is None:
error(type_node.pos, "Unknown type")
else:
- env.declare_var(var.value, type, var.pos, is_cdef=True)
+ env.declare_var(var.value, type, var.pos, is_cdef=True)
self.__class__ = PassStatNode
elif getattr(expr, 'annotation', None) is not None:
if expr.is_name:
@@ -5139,7 +5139,7 @@ class ExprStatNode(StatNode):
self.__class__ = PassStatNode
def analyse_expressions(self, env):
- self.expr.result_is_used = False # hint that .result() may safely be left empty
+ self.expr.result_is_used = False # hint that .result() may safely be left empty
self.expr = self.expr.analyse_expressions(env)
# Repeat in case of node replacement.
self.expr.result_is_used = False # hint that .result() may safely be left empty
@@ -5152,7 +5152,7 @@ class ExprStatNode(StatNode):
gil_message = "Discarding owned Python object"
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
self.expr.result_is_used = False # hint that .result() may safely be left empty
self.expr.generate_evaluation_code(code)
if not self.expr.is_temp and self.expr.result():
@@ -5181,7 +5181,7 @@ class AssignmentNode(StatNode):
def analyse_expressions(self, env):
node = self.analyse_types(env)
- if isinstance(node, AssignmentNode) and not isinstance(node, ParallelAssignmentNode):
+ if isinstance(node, AssignmentNode) and not isinstance(node, ParallelAssignmentNode):
if node.rhs.type.is_ptr and node.rhs.is_ephemeral():
error(self.pos, "Storing unsafe C derivative of temporary Python reference")
return node
@@ -5191,7 +5191,7 @@ class AssignmentNode(StatNode):
# self.analyse_expressions_2(env)
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
self.generate_rhs_evaluation_code(code)
self.generate_assignment_code(code)
@@ -5201,16 +5201,16 @@ class SingleAssignmentNode(AssignmentNode):
#
# a = b
#
- # lhs ExprNode Left hand side
- # rhs ExprNode Right hand side
- # first bool Is this guaranteed the first assignment to lhs?
- # is_overloaded_assignment bool Is this assignment done via an overloaded operator=
- # exception_check
- # exception_value
+ # lhs ExprNode Left hand side
+ # rhs ExprNode Right hand side
+ # first bool Is this guaranteed the first assignment to lhs?
+ # is_overloaded_assignment bool Is this assignment done via an overloaded operator=
+ # exception_check
+ # exception_value
child_attrs = ["lhs", "rhs"]
first = False
- is_overloaded_assignment = False
+ is_overloaded_assignment = False
declaration_only = False
def analyse_declarations(self, env):
@@ -5222,17 +5222,17 @@ class SingleAssignmentNode(AssignmentNode):
if func_name:
args, kwds = self.rhs.explicit_args_kwds()
if func_name in ['declare', 'typedef']:
- if len(args) > 2:
- error(args[2].pos, "Invalid positional argument.")
+ if len(args) > 2:
+ error(args[2].pos, "Invalid positional argument.")
return
- if kwds is not None:
- kwdict = kwds.compile_time_value(None)
- if func_name == 'typedef' or 'visibility' not in kwdict:
- error(kwds.pos, "Invalid keyword argument.")
- return
- visibility = kwdict['visibility']
- else:
- visibility = 'private'
+ if kwds is not None:
+ kwdict = kwds.compile_time_value(None)
+ if func_name == 'typedef' or 'visibility' not in kwdict:
+ error(kwds.pos, "Invalid keyword argument.")
+ return
+ visibility = kwdict['visibility']
+ else:
+ visibility = 'private'
type = args[0].analyse_as_type(env)
if type is None:
error(args[0].pos, "Unknown type")
@@ -5247,7 +5247,7 @@ class SingleAssignmentNode(AssignmentNode):
error(lhs.pos, "Invalid declaration")
return
for var, pos in vars:
- env.declare_var(var, type, pos, is_cdef=True, visibility=visibility)
+ env.declare_var(var, type, pos, is_cdef=True, visibility=visibility)
if len(args) == 2:
# we have a value
self.rhs = args[1]
@@ -5289,7 +5289,7 @@ class SingleAssignmentNode(AssignmentNode):
"fused_type does not take keyword arguments")
fusednode = FusedTypeNode(self.rhs.pos,
- name=self.lhs.name, types=args)
+ name=self.lhs.name, types=args)
fusednode.analyse_declarations(env)
if self.declaration_only:
@@ -5297,44 +5297,44 @@ class SingleAssignmentNode(AssignmentNode):
else:
self.lhs.analyse_target_declaration(env)
- def analyse_types(self, env, use_temp=0):
+ def analyse_types(self, env, use_temp=0):
from . import ExprNodes
self.rhs = self.rhs.analyse_types(env)
-
- unrolled_assignment = self.unroll_rhs(env)
- if unrolled_assignment:
- return unrolled_assignment
-
+
+ unrolled_assignment = self.unroll_rhs(env)
+ if unrolled_assignment:
+ return unrolled_assignment
+
self.lhs = self.lhs.analyse_target_types(env)
self.lhs.gil_assignment_check(env)
- unrolled_assignment = self.unroll_lhs(env)
- if unrolled_assignment:
- return unrolled_assignment
-
- if isinstance(self.lhs, ExprNodes.MemoryViewIndexNode):
- self.lhs.analyse_broadcast_operation(self.rhs)
- self.lhs = self.lhs.analyse_as_memview_scalar_assignment(self.rhs)
- elif self.lhs.type.is_array:
- if not isinstance(self.lhs, ExprNodes.SliceIndexNode):
- # cannot assign to C array, only to its full slice
- self.lhs = ExprNodes.SliceIndexNode(self.lhs.pos, base=self.lhs, start=None, stop=None)
- self.lhs = self.lhs.analyse_target_types(env)
-
- if self.lhs.type.is_cpp_class:
- op = env.lookup_operator_for_types(self.pos, '=', [self.lhs.type, self.rhs.type])
- if op:
- rhs = self.rhs
- self.is_overloaded_assignment = True
- self.exception_check = op.type.exception_check
- self.exception_value = op.type.exception_value
- if self.exception_check == '+' and self.exception_value is None:
- env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
- else:
- rhs = self.rhs.coerce_to(self.lhs.type, env)
- else:
- rhs = self.rhs.coerce_to(self.lhs.type, env)
-
+ unrolled_assignment = self.unroll_lhs(env)
+ if unrolled_assignment:
+ return unrolled_assignment
+
+ if isinstance(self.lhs, ExprNodes.MemoryViewIndexNode):
+ self.lhs.analyse_broadcast_operation(self.rhs)
+ self.lhs = self.lhs.analyse_as_memview_scalar_assignment(self.rhs)
+ elif self.lhs.type.is_array:
+ if not isinstance(self.lhs, ExprNodes.SliceIndexNode):
+ # cannot assign to C array, only to its full slice
+ self.lhs = ExprNodes.SliceIndexNode(self.lhs.pos, base=self.lhs, start=None, stop=None)
+ self.lhs = self.lhs.analyse_target_types(env)
+
+ if self.lhs.type.is_cpp_class:
+ op = env.lookup_operator_for_types(self.pos, '=', [self.lhs.type, self.rhs.type])
+ if op:
+ rhs = self.rhs
+ self.is_overloaded_assignment = True
+ self.exception_check = op.type.exception_check
+ self.exception_value = op.type.exception_value
+ if self.exception_check == '+' and self.exception_value is None:
+ env.use_utility_code(UtilityCode.load_cached("CppExceptionConversion", "CppSupport.cpp"))
+ else:
+ rhs = self.rhs.coerce_to(self.lhs.type, env)
+ else:
+ rhs = self.rhs.coerce_to(self.lhs.type, env)
+
if use_temp or rhs.is_attribute or (
not rhs.is_name and not rhs.is_literal and
rhs.type.is_pyobject):
@@ -5345,152 +5345,152 @@ class SingleAssignmentNode(AssignmentNode):
self.rhs = rhs
return self
- def unroll(self, node, target_size, env):
- from . import ExprNodes, UtilNodes
-
- base = node
- start_node = stop_node = step_node = check_node = None
-
- if node.type.is_ctuple:
- slice_size = node.type.size
-
- elif node.type.is_ptr or node.type.is_array:
- while isinstance(node, ExprNodes.SliceIndexNode) and not (node.start or node.stop):
- base = node = node.base
- if isinstance(node, ExprNodes.SliceIndexNode):
- base = node.base
- start_node = node.start
- if start_node:
- start_node = start_node.coerce_to(PyrexTypes.c_py_ssize_t_type, env)
- stop_node = node.stop
- if stop_node:
- stop_node = stop_node.coerce_to(PyrexTypes.c_py_ssize_t_type, env)
- else:
- if node.type.is_array and node.type.size:
- stop_node = ExprNodes.IntNode(
- self.pos, value=str(node.type.size),
- constant_result=(node.type.size if isinstance(node.type.size, _py_int_types)
- else ExprNodes.constant_value_not_set))
- else:
- error(self.pos, "C array iteration requires known end index")
- return
- step_node = None #node.step
- if step_node:
- step_node = step_node.coerce_to(PyrexTypes.c_py_ssize_t_type, env)
-
- # TODO: Factor out SliceIndexNode.generate_slice_guard_code() for use here.
- def get_const(node, none_value):
- if node is None:
- return none_value
- elif node.has_constant_result():
- return node.constant_result
- else:
- raise ValueError("Not a constant.")
-
- try:
- slice_size = (get_const(stop_node, None) - get_const(start_node, 0)) / get_const(step_node, 1)
- except ValueError:
- error(self.pos, "C array assignment currently requires known endpoints")
- return
-
- elif node.type.is_array:
- slice_size = node.type.size
- if not isinstance(slice_size, _py_int_types):
- return # might still work when coercing to Python
- else:
- return
-
- else:
- return
-
- if slice_size != target_size:
- error(self.pos, "Assignment to/from slice of wrong length, expected %s, got %s" % (
- slice_size, target_size))
- return
-
- items = []
- base = UtilNodes.LetRefNode(base)
- refs = [base]
- if start_node and not start_node.is_literal:
- start_node = UtilNodes.LetRefNode(start_node)
- refs.append(start_node)
- if stop_node and not stop_node.is_literal:
- stop_node = UtilNodes.LetRefNode(stop_node)
- refs.append(stop_node)
- if step_node and not step_node.is_literal:
- step_node = UtilNodes.LetRefNode(step_node)
- refs.append(step_node)
-
- for ix in range(target_size):
- ix_node = ExprNodes.IntNode(self.pos, value=str(ix), constant_result=ix, type=PyrexTypes.c_py_ssize_t_type)
- if step_node is not None:
- if step_node.has_constant_result():
- step_value = ix_node.constant_result * step_node.constant_result
- ix_node = ExprNodes.IntNode(self.pos, value=str(step_value), constant_result=step_value)
- else:
- ix_node = ExprNodes.MulNode(self.pos, operator='*', operand1=step_node, operand2=ix_node)
- if start_node is not None:
- if start_node.has_constant_result() and ix_node.has_constant_result():
- index_value = ix_node.constant_result + start_node.constant_result
- ix_node = ExprNodes.IntNode(self.pos, value=str(index_value), constant_result=index_value)
- else:
- ix_node = ExprNodes.AddNode(
- self.pos, operator='+', operand1=start_node, operand2=ix_node)
- items.append(ExprNodes.IndexNode(self.pos, base=base, index=ix_node.analyse_types(env)))
- return check_node, refs, items
-
- def unroll_assignments(self, refs, check_node, lhs_list, rhs_list, env):
- from . import UtilNodes
- assignments = []
- for lhs, rhs in zip(lhs_list, rhs_list):
- assignments.append(SingleAssignmentNode(self.pos, lhs=lhs, rhs=rhs, first=self.first))
- node = ParallelAssignmentNode(pos=self.pos, stats=assignments).analyse_expressions(env)
- if check_node:
- node = StatListNode(pos=self.pos, stats=[check_node, node])
- for ref in refs[::-1]:
- node = UtilNodes.LetNode(ref, node)
- return node
-
- def unroll_rhs(self, env):
- from . import ExprNodes
- if not isinstance(self.lhs, ExprNodes.TupleNode):
- return
- if any(arg.is_starred for arg in self.lhs.args):
- return
-
- unrolled = self.unroll(self.rhs, len(self.lhs.args), env)
- if not unrolled:
- return
- check_node, refs, rhs = unrolled
- return self.unroll_assignments(refs, check_node, self.lhs.args, rhs, env)
-
- def unroll_lhs(self, env):
- if self.lhs.type.is_ctuple:
- # Handled directly.
- return
- from . import ExprNodes
- if not isinstance(self.rhs, ExprNodes.TupleNode):
- return
-
- unrolled = self.unroll(self.lhs, len(self.rhs.args), env)
- if not unrolled:
- return
- check_node, refs, lhs = unrolled
- return self.unroll_assignments(refs, check_node, lhs, self.rhs.args, env)
-
+ def unroll(self, node, target_size, env):
+ from . import ExprNodes, UtilNodes
+
+ base = node
+ start_node = stop_node = step_node = check_node = None
+
+ if node.type.is_ctuple:
+ slice_size = node.type.size
+
+ elif node.type.is_ptr or node.type.is_array:
+ while isinstance(node, ExprNodes.SliceIndexNode) and not (node.start or node.stop):
+ base = node = node.base
+ if isinstance(node, ExprNodes.SliceIndexNode):
+ base = node.base
+ start_node = node.start
+ if start_node:
+ start_node = start_node.coerce_to(PyrexTypes.c_py_ssize_t_type, env)
+ stop_node = node.stop
+ if stop_node:
+ stop_node = stop_node.coerce_to(PyrexTypes.c_py_ssize_t_type, env)
+ else:
+ if node.type.is_array and node.type.size:
+ stop_node = ExprNodes.IntNode(
+ self.pos, value=str(node.type.size),
+ constant_result=(node.type.size if isinstance(node.type.size, _py_int_types)
+ else ExprNodes.constant_value_not_set))
+ else:
+ error(self.pos, "C array iteration requires known end index")
+ return
+ step_node = None #node.step
+ if step_node:
+ step_node = step_node.coerce_to(PyrexTypes.c_py_ssize_t_type, env)
+
+ # TODO: Factor out SliceIndexNode.generate_slice_guard_code() for use here.
+ def get_const(node, none_value):
+ if node is None:
+ return none_value
+ elif node.has_constant_result():
+ return node.constant_result
+ else:
+ raise ValueError("Not a constant.")
+
+ try:
+ slice_size = (get_const(stop_node, None) - get_const(start_node, 0)) / get_const(step_node, 1)
+ except ValueError:
+ error(self.pos, "C array assignment currently requires known endpoints")
+ return
+
+ elif node.type.is_array:
+ slice_size = node.type.size
+ if not isinstance(slice_size, _py_int_types):
+ return # might still work when coercing to Python
+ else:
+ return
+
+ else:
+ return
+
+ if slice_size != target_size:
+ error(self.pos, "Assignment to/from slice of wrong length, expected %s, got %s" % (
+ slice_size, target_size))
+ return
+
+ items = []
+ base = UtilNodes.LetRefNode(base)
+ refs = [base]
+ if start_node and not start_node.is_literal:
+ start_node = UtilNodes.LetRefNode(start_node)
+ refs.append(start_node)
+ if stop_node and not stop_node.is_literal:
+ stop_node = UtilNodes.LetRefNode(stop_node)
+ refs.append(stop_node)
+ if step_node and not step_node.is_literal:
+ step_node = UtilNodes.LetRefNode(step_node)
+ refs.append(step_node)
+
+ for ix in range(target_size):
+ ix_node = ExprNodes.IntNode(self.pos, value=str(ix), constant_result=ix, type=PyrexTypes.c_py_ssize_t_type)
+ if step_node is not None:
+ if step_node.has_constant_result():
+ step_value = ix_node.constant_result * step_node.constant_result
+ ix_node = ExprNodes.IntNode(self.pos, value=str(step_value), constant_result=step_value)
+ else:
+ ix_node = ExprNodes.MulNode(self.pos, operator='*', operand1=step_node, operand2=ix_node)
+ if start_node is not None:
+ if start_node.has_constant_result() and ix_node.has_constant_result():
+ index_value = ix_node.constant_result + start_node.constant_result
+ ix_node = ExprNodes.IntNode(self.pos, value=str(index_value), constant_result=index_value)
+ else:
+ ix_node = ExprNodes.AddNode(
+ self.pos, operator='+', operand1=start_node, operand2=ix_node)
+ items.append(ExprNodes.IndexNode(self.pos, base=base, index=ix_node.analyse_types(env)))
+ return check_node, refs, items
+
+ def unroll_assignments(self, refs, check_node, lhs_list, rhs_list, env):
+ from . import UtilNodes
+ assignments = []
+ for lhs, rhs in zip(lhs_list, rhs_list):
+ assignments.append(SingleAssignmentNode(self.pos, lhs=lhs, rhs=rhs, first=self.first))
+ node = ParallelAssignmentNode(pos=self.pos, stats=assignments).analyse_expressions(env)
+ if check_node:
+ node = StatListNode(pos=self.pos, stats=[check_node, node])
+ for ref in refs[::-1]:
+ node = UtilNodes.LetNode(ref, node)
+ return node
+
+ def unroll_rhs(self, env):
+ from . import ExprNodes
+ if not isinstance(self.lhs, ExprNodes.TupleNode):
+ return
+ if any(arg.is_starred for arg in self.lhs.args):
+ return
+
+ unrolled = self.unroll(self.rhs, len(self.lhs.args), env)
+ if not unrolled:
+ return
+ check_node, refs, rhs = unrolled
+ return self.unroll_assignments(refs, check_node, self.lhs.args, rhs, env)
+
+ def unroll_lhs(self, env):
+ if self.lhs.type.is_ctuple:
+ # Handled directly.
+ return
+ from . import ExprNodes
+ if not isinstance(self.rhs, ExprNodes.TupleNode):
+ return
+
+ unrolled = self.unroll(self.lhs, len(self.rhs.args), env)
+ if not unrolled:
+ return
+ check_node, refs, lhs = unrolled
+ return self.unroll_assignments(refs, check_node, lhs, self.rhs.args, env)
+
def generate_rhs_evaluation_code(self, code):
self.rhs.generate_evaluation_code(code)
- def generate_assignment_code(self, code, overloaded_assignment=False):
- if self.is_overloaded_assignment:
- self.lhs.generate_assignment_code(
- self.rhs,
- code,
- overloaded_assignment=self.is_overloaded_assignment,
- exception_check=self.exception_check,
- exception_value=self.exception_value)
- else:
- self.lhs.generate_assignment_code(self.rhs, code)
+ def generate_assignment_code(self, code, overloaded_assignment=False):
+ if self.is_overloaded_assignment:
+ self.lhs.generate_assignment_code(
+ self.rhs,
+ code,
+ overloaded_assignment=self.is_overloaded_assignment,
+ exception_check=self.exception_check,
+ exception_value=self.exception_value)
+ else:
+ self.lhs.generate_assignment_code(self.rhs, code)
def generate_function_definitions(self, env, code):
self.rhs.generate_function_definitions(env, code)
@@ -5510,14 +5510,14 @@ class CascadedAssignmentNode(AssignmentNode):
#
# Used internally:
#
- # coerced_values [ExprNode] RHS coerced to all distinct LHS types
- # cloned_values [ExprNode] cloned RHS value for each LHS
- # assignment_overloads [Bool] If each assignment uses a C++ operator=
+ # coerced_values [ExprNode] RHS coerced to all distinct LHS types
+ # cloned_values [ExprNode] cloned RHS value for each LHS
+ # assignment_overloads [Bool] If each assignment uses a C++ operator=
- child_attrs = ["lhs_list", "rhs", "coerced_values", "cloned_values"]
- cloned_values = None
+ child_attrs = ["lhs_list", "rhs", "coerced_values", "cloned_values"]
+ cloned_values = None
coerced_values = None
- assignment_overloads = None
+ assignment_overloads = None
def analyse_declarations(self, env):
for lhs in self.lhs_list:
@@ -5526,23 +5526,23 @@ class CascadedAssignmentNode(AssignmentNode):
def analyse_types(self, env, use_temp=0):
from .ExprNodes import CloneNode, ProxyNode
- # collect distinct types used on the LHS
+ # collect distinct types used on the LHS
lhs_types = set()
- for i, lhs in enumerate(self.lhs_list):
- lhs = self.lhs_list[i] = lhs.analyse_target_types(env)
+ for i, lhs in enumerate(self.lhs_list):
+ lhs = self.lhs_list[i] = lhs.analyse_target_types(env)
lhs.gil_assignment_check(env)
lhs_types.add(lhs.type)
rhs = self.rhs.analyse_types(env)
- # common special case: only one type needed on the LHS => coerce only once
+ # common special case: only one type needed on the LHS => coerce only once
if len(lhs_types) == 1:
- # Avoid coercion for overloaded assignment operators.
- if next(iter(lhs_types)).is_cpp_class:
- op = env.lookup_operator('=', [lhs, self.rhs])
- if not op:
- rhs = rhs.coerce_to(lhs_types.pop(), env)
- else:
- rhs = rhs.coerce_to(lhs_types.pop(), env)
+ # Avoid coercion for overloaded assignment operators.
+ if next(iter(lhs_types)).is_cpp_class:
+ op = env.lookup_operator('=', [lhs, self.rhs])
+ if not op:
+ rhs = rhs.coerce_to(lhs_types.pop(), env)
+ else:
+ rhs = rhs.coerce_to(lhs_types.pop(), env)
if not rhs.is_name and not rhs.is_literal and (
use_temp or rhs.is_attribute or rhs.type.is_pyobject):
@@ -5551,42 +5551,42 @@ class CascadedAssignmentNode(AssignmentNode):
rhs = rhs.coerce_to_simple(env)
self.rhs = ProxyNode(rhs) if rhs.is_temp else rhs
- # clone RHS and coerce it to all distinct LHS types
+ # clone RHS and coerce it to all distinct LHS types
self.coerced_values = []
coerced_values = {}
- self.assignment_overloads = []
+ self.assignment_overloads = []
for lhs in self.lhs_list:
- overloaded = lhs.type.is_cpp_class and env.lookup_operator('=', [lhs, self.rhs])
- self.assignment_overloads.append(overloaded)
+ overloaded = lhs.type.is_cpp_class and env.lookup_operator('=', [lhs, self.rhs])
+ self.assignment_overloads.append(overloaded)
if lhs.type not in coerced_values and lhs.type != rhs.type:
- rhs = CloneNode(self.rhs)
- if not overloaded:
- rhs = rhs.coerce_to(lhs.type, env)
+ rhs = CloneNode(self.rhs)
+ if not overloaded:
+ rhs = rhs.coerce_to(lhs.type, env)
self.coerced_values.append(rhs)
coerced_values[lhs.type] = rhs
- # clone coerced values for all LHS assignments
- self.cloned_values = []
+ # clone coerced values for all LHS assignments
+ self.cloned_values = []
for lhs in self.lhs_list:
rhs = coerced_values.get(lhs.type, self.rhs)
- self.cloned_values.append(CloneNode(rhs))
+ self.cloned_values.append(CloneNode(rhs))
return self
def generate_rhs_evaluation_code(self, code):
self.rhs.generate_evaluation_code(code)
- def generate_assignment_code(self, code, overloaded_assignment=False):
- # prepare all coercions
+ def generate_assignment_code(self, code, overloaded_assignment=False):
+ # prepare all coercions
for rhs in self.coerced_values:
rhs.generate_evaluation_code(code)
- # assign clones to LHS
- for lhs, rhs, overload in zip(self.lhs_list, self.cloned_values, self.assignment_overloads):
+ # assign clones to LHS
+ for lhs, rhs, overload in zip(self.lhs_list, self.cloned_values, self.assignment_overloads):
rhs.generate_evaluation_code(code)
- lhs.generate_assignment_code(rhs, code, overloaded_assignment=overload)
- # dispose of coerced values and original RHS
- for rhs_value in self.coerced_values:
- rhs_value.generate_disposal_code(code)
- rhs_value.free_temps(code)
+ lhs.generate_assignment_code(rhs, code, overloaded_assignment=overload)
+ # dispose of coerced values and original RHS
+ for rhs_value in self.coerced_values:
+ rhs_value.generate_disposal_code(code)
+ rhs_value.free_temps(code)
self.rhs.generate_disposal_code(code)
self.rhs.free_temps(code)
@@ -5596,7 +5596,7 @@ class CascadedAssignmentNode(AssignmentNode):
def annotate(self, code):
for rhs in self.coerced_values:
rhs.annotate(code)
- for lhs, rhs in zip(self.lhs_list, self.cloned_values):
+ for lhs, rhs in zip(self.lhs_list, self.cloned_values):
lhs.annotate(code)
rhs.annotate(code)
self.rhs.annotate(code)
@@ -5623,18 +5623,18 @@ class ParallelAssignmentNode(AssignmentNode):
stat.analyse_declarations(env)
def analyse_expressions(self, env):
- self.stats = [stat.analyse_types(env, use_temp=1)
- for stat in self.stats]
+ self.stats = [stat.analyse_types(env, use_temp=1)
+ for stat in self.stats]
return self
# def analyse_expressions(self, env):
# for stat in self.stats:
-# stat.analyse_expressions_1(env, use_temp=1)
+# stat.analyse_expressions_1(env, use_temp=1)
# for stat in self.stats:
# stat.analyse_expressions_2(env)
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
for stat in self.stats:
stat.generate_rhs_evaluation_code(code)
for stat in self.stats:
@@ -5677,7 +5677,7 @@ class InPlaceAssignmentNode(AssignmentNode):
self.lhs = self.lhs.analyse_target_types(env)
# When assigning to a fully indexed buffer or memoryview, coerce the rhs
- if self.lhs.is_memview_index or self.lhs.is_buffer_access:
+ if self.lhs.is_memview_index or self.lhs.is_buffer_access:
self.rhs = self.rhs.coerce_to(self.lhs.type, env)
elif self.lhs.type.is_string and self.operator in '+-':
# use pointer arithmetic for char* LHS instead of string concat
@@ -5685,31 +5685,31 @@ class InPlaceAssignmentNode(AssignmentNode):
return self
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
- lhs, rhs = self.lhs, self.rhs
- rhs.generate_evaluation_code(code)
- lhs.generate_subexpr_evaluation_code(code)
+ code.mark_pos(self.pos)
+ lhs, rhs = self.lhs, self.rhs
+ rhs.generate_evaluation_code(code)
+ lhs.generate_subexpr_evaluation_code(code)
c_op = self.operator
if c_op == "//":
c_op = "/"
elif c_op == "**":
error(self.pos, "No C inplace power operator")
- if lhs.is_buffer_access or lhs.is_memview_index:
- if lhs.type.is_pyobject:
+ if lhs.is_buffer_access or lhs.is_memview_index:
+ if lhs.type.is_pyobject:
error(self.pos, "In-place operators not allowed on object buffers in this release.")
- if c_op in ('/', '%') and lhs.type.is_int and not code.globalstate.directives['cdivision']:
+ if c_op in ('/', '%') and lhs.type.is_int and not code.globalstate.directives['cdivision']:
error(self.pos, "In-place non-c divide operators not allowed on int buffers.")
- lhs.generate_buffer_setitem_code(rhs, code, c_op)
- elif lhs.is_memview_slice:
- error(self.pos, "Inplace operators not supported on memoryview slices")
+ lhs.generate_buffer_setitem_code(rhs, code, c_op)
+ elif lhs.is_memview_slice:
+ error(self.pos, "Inplace operators not supported on memoryview slices")
else:
# C++
# TODO: make sure overload is declared
- code.putln("%s %s= %s;" % (lhs.result(), c_op, rhs.result()))
- lhs.generate_subexpr_disposal_code(code)
- lhs.free_subexpr_temps(code)
- rhs.generate_disposal_code(code)
- rhs.free_temps(code)
+ code.putln("%s %s= %s;" % (lhs.result(), c_op, rhs.result()))
+ lhs.generate_subexpr_disposal_code(code)
+ lhs.free_subexpr_temps(code)
+ rhs.generate_disposal_code(code)
+ rhs.free_temps(code)
def annotate(self, code):
self.lhs.annotate(code)
@@ -5744,7 +5744,7 @@ class PrintStatNode(StatNode):
gil_message = "Python print statement"
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
if self.stream:
self.stream.generate_evaluation_code(code)
stream_result = self.stream.py_result()
@@ -5806,14 +5806,14 @@ class ExecStatNode(StatNode):
gil_message = "Python exec statement"
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
args = []
for arg in self.args:
arg.generate_evaluation_code(code)
- args.append(arg.py_result())
+ args.append(arg.py_result())
args = tuple(args + ['0', '0'][:3-len(args)])
temp_result = code.funcstate.allocate_temp(PyrexTypes.py_object_type, manage_ref=True)
- code.putln("%s = __Pyx_PyExec3(%s, %s, %s);" % ((temp_result,) + args))
+ code.putln("%s = __Pyx_PyExec3(%s, %s, %s);" % ((temp_result,) + args))
for arg in self.args:
arg.generate_disposal_code(code)
arg.free_temps(code)
@@ -5843,7 +5843,7 @@ class DelStatNode(StatNode):
def analyse_expressions(self, env):
for i, arg in enumerate(self.args):
arg = self.args[i] = arg.analyse_target_expression(env, None)
- if arg.type.is_pyobject or (arg.is_name and arg.type.is_memoryviewslice):
+ if arg.type.is_pyobject or (arg.is_name and arg.type.is_memoryviewslice):
if arg.is_name and arg.entry.is_cglobal:
error(arg.pos, "Deletion of global C variable")
elif arg.type.is_ptr and arg.type.base_type.is_cpp_class:
@@ -5865,7 +5865,7 @@ class DelStatNode(StatNode):
gil_message = "Deleting Python object"
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
for arg in self.args:
if (arg.type.is_pyobject or
arg.type.is_memoryviewslice or
@@ -5915,7 +5915,7 @@ class BreakStatNode(StatNode):
return self
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
if not code.break_label:
error(self.pos, "break statement not inside loop")
else:
@@ -5931,11 +5931,11 @@ class ContinueStatNode(StatNode):
return self
def generate_execution_code(self, code):
- if not code.continue_label:
- error(self.pos, "continue statement not inside loop")
- return
- code.mark_pos(self.pos)
- code.put_goto(code.continue_label)
+ if not code.continue_label:
+ error(self.pos, "continue statement not inside loop")
+ return
+ code.mark_pos(self.pos)
+ code.put_goto(code.continue_label)
class ReturnStatNode(StatNode):
@@ -5965,14 +5965,14 @@ class ReturnStatNode(StatNode):
error(self.pos, "Return with value in async generator")
self.value = self.value.analyse_types(env)
if return_type.is_void or return_type.is_returncode:
- error(self.value.pos, "Return with value in void function")
+ error(self.value.pos, "Return with value in void function")
else:
self.value = self.value.coerce_to(env.return_type, env)
else:
if (not return_type.is_void
- and not return_type.is_pyobject
- and not return_type.is_returncode):
- error(self.pos, "Return value required")
+ and not return_type.is_pyobject
+ and not return_type.is_returncode):
+ error(self.pos, "Return value required")
return self
def nogil_check(self, env):
@@ -5999,38 +5999,38 @@ class ReturnStatNode(StatNode):
if self.return_type.is_memoryviewslice:
from . import MemoryView
MemoryView.put_acquire_memoryviewslice(
- lhs_cname=Naming.retval_cname,
- lhs_type=self.return_type,
+ lhs_cname=Naming.retval_cname,
+ lhs_type=self.return_type,
lhs_pos=value.pos,
rhs=value,
- code=code,
- have_gil=self.in_nogil_context)
+ code=code,
+ have_gil=self.in_nogil_context)
value.generate_post_assignment_code(code)
elif self.in_generator:
# return value == raise StopIteration(value), but uncatchable
- code.globalstate.use_utility_code(
- UtilityCode.load_cached("ReturnWithStopIteration", "Coroutine.c"))
- code.putln("%s = NULL; __Pyx_ReturnWithStopIteration(%s);" % (
- Naming.retval_cname,
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached("ReturnWithStopIteration", "Coroutine.c"))
+ code.putln("%s = NULL; __Pyx_ReturnWithStopIteration(%s);" % (
+ Naming.retval_cname,
value.py_result()))
value.generate_disposal_code(code)
else:
value.make_owned_reference(code)
- code.putln("%s = %s;" % (
- Naming.retval_cname,
+ code.putln("%s = %s;" % (
+ Naming.retval_cname,
value.result_as(self.return_type)))
value.generate_post_assignment_code(code)
value.free_temps(code)
else:
if self.return_type.is_pyobject:
- if self.in_generator:
+ if self.in_generator:
if self.in_async_gen:
code.globalstate.use_utility_code(
UtilityCode.load_cached("StopAsyncIteration", "Coroutine.c"))
code.put("PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration); ")
- code.putln("%s = NULL;" % Naming.retval_cname)
- else:
- code.put_init_to_py_none(Naming.retval_cname, self.return_type)
+ code.putln("%s = NULL;" % Naming.retval_cname)
+ else:
+ code.put_init_to_py_none(Naming.retval_cname, self.return_type)
elif self.return_type.is_returncode:
self.put_return(code, self.return_type.default_value)
@@ -6083,8 +6083,8 @@ class RaiseStatNode(StatNode):
exc = self.exc_type
from . import ExprNodes
if (isinstance(exc, ExprNodes.SimpleCallNode) and
- not (exc.args or (exc.arg_tuple is not None and exc.arg_tuple.args))):
- exc = exc.function # extract the exception type
+ not (exc.args or (exc.arg_tuple is not None and exc.arg_tuple.args))):
+ exc = exc.function # extract the exception type
if exc.is_name and exc.entry.is_builtin:
self.builtin_exc_name = exc.name
if self.builtin_exc_name == 'MemoryError':
@@ -6095,7 +6095,7 @@ class RaiseStatNode(StatNode):
gil_message = "Raising exception"
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
if self.builtin_exc_name == 'MemoryError':
code.putln('PyErr_NoMemory(); %s' % code.error_goto(self.pos))
return
@@ -6169,7 +6169,7 @@ class ReraiseStatNode(StatNode):
gil_message = "Raising exception"
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
vars = code.funcstate.exc_vars
if vars:
code.globalstate.use_utility_code(restore_exception_utility_code)
@@ -6177,7 +6177,7 @@ class ReraiseStatNode(StatNode):
code.put_giveref(vars[1])
# fresh exceptions may not have a traceback yet (-> finally!)
code.put_xgiveref(vars[2])
- code.putln("__Pyx_ErrRestoreWithState(%s, %s, %s);" % tuple(vars))
+ code.putln("__Pyx_ErrRestoreWithState(%s, %s, %s);" % tuple(vars))
for varname in vars:
code.put("%s = 0; " % varname)
code.putln()
@@ -6203,7 +6203,7 @@ class AssertStatNode(StatNode):
# prevent tuple values from being interpreted as argument value tuples
from .ExprNodes import TupleNode
value = TupleNode(value.pos, args=[value], slow=True)
- self.value = value.analyse_types(env, skip_children=True).coerce_to_pyobject(env)
+ self.value = value.analyse_types(env, skip_children=True).coerce_to_pyobject(env)
else:
self.value = value.coerce_to_pyobject(env)
return self
@@ -6214,21 +6214,21 @@ class AssertStatNode(StatNode):
def generate_execution_code(self, code):
code.putln("#ifndef CYTHON_WITHOUT_ASSERTIONS")
code.putln("if (unlikely(!Py_OptimizeFlag)) {")
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
self.cond.generate_evaluation_code(code)
code.putln(
- "if (unlikely(!%s)) {" % self.cond.result())
+ "if (unlikely(!%s)) {" % self.cond.result())
if self.value:
self.value.generate_evaluation_code(code)
code.putln(
- "PyErr_SetObject(PyExc_AssertionError, %s);" % self.value.py_result())
+ "PyErr_SetObject(PyExc_AssertionError, %s);" % self.value.py_result())
self.value.generate_disposal_code(code)
self.value.free_temps(code)
else:
code.putln(
"PyErr_SetNone(PyExc_AssertionError);")
code.putln(
- code.error_goto(self.pos))
+ code.error_goto(self.pos))
code.putln(
"}")
self.cond.generate_disposal_code(code)
@@ -6263,7 +6263,7 @@ class IfStatNode(StatNode):
self.else_clause.analyse_declarations(env)
def analyse_expressions(self, env):
- self.if_clauses = [if_clause.analyse_expressions(env) for if_clause in self.if_clauses]
+ self.if_clauses = [if_clause.analyse_expressions(env) for if_clause in self.if_clauses]
if self.else_clause:
self.else_clause = self.else_clause.analyse_expressions(env)
return self
@@ -6271,17 +6271,17 @@ class IfStatNode(StatNode):
def generate_execution_code(self, code):
code.mark_pos(self.pos)
end_label = code.new_label()
- last = len(self.if_clauses)
+ last = len(self.if_clauses)
if self.else_clause:
# If the 'else' clause is 'unlikely', then set the preceding 'if' clause to 'likely' to reflect that.
self._set_branch_hint(self.if_clauses[-1], self.else_clause, inverse=True)
else:
- last -= 1 # avoid redundant goto at end of last if-clause
- for i, if_clause in enumerate(self.if_clauses):
+ last -= 1 # avoid redundant goto at end of last if-clause
+ for i, if_clause in enumerate(self.if_clauses):
self._set_branch_hint(if_clause, if_clause.body)
- if_clause.generate_execution_code(code, end_label, is_last=i == last)
+ if_clause.generate_execution_code(code, end_label, is_last=i == last)
if self.else_clause:
- code.mark_pos(self.else_clause.pos)
+ code.mark_pos(self.else_clause.pos)
code.putln("/*else*/ {")
self.else_clause.generate_execution_code(code)
code.putln("}")
@@ -6328,13 +6328,13 @@ class IfClauseNode(Node):
self.body.analyse_declarations(env)
def analyse_expressions(self, env):
- self.condition = self.condition.analyse_temp_boolean_expression(env)
+ self.condition = self.condition.analyse_temp_boolean_expression(env)
self.body = self.body.analyse_expressions(env)
return self
- def generate_execution_code(self, code, end_label, is_last):
+ def generate_execution_code(self, code, end_label, is_last):
self.condition.generate_evaluation_code(code)
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
condition = self.condition.result()
if self.branch_hint:
condition = '%s(%s)' % (self.branch_hint, condition)
@@ -6342,8 +6342,8 @@ class IfClauseNode(Node):
self.condition.generate_disposal_code(code)
self.condition.free_temps(code)
self.body.generate_execution_code(code)
- code.mark_pos(self.pos, trace=False)
- if not (is_last or self.body.is_terminator):
+ code.mark_pos(self.pos, trace=False)
+ if not (is_last or self.body.is_terminator):
code.put_goto(end_label)
code.putln("}")
@@ -6364,21 +6364,21 @@ class SwitchCaseNode(StatNode):
child_attrs = ['conditions', 'body']
- def generate_condition_evaluation_code(self, code):
+ def generate_condition_evaluation_code(self, code):
for cond in self.conditions:
cond.generate_evaluation_code(code)
-
- def generate_execution_code(self, code):
- num_conditions = len(self.conditions)
- line_tracing_enabled = code.globalstate.directives['linetrace']
- for i, cond in enumerate(self.conditions, 1):
+
+ def generate_execution_code(self, code):
+ num_conditions = len(self.conditions)
+ line_tracing_enabled = code.globalstate.directives['linetrace']
+ for i, cond in enumerate(self.conditions, 1):
code.putln("case %s:" % cond.result())
- code.mark_pos(cond.pos) # Tracing code must appear *after* the 'case' statement.
- if line_tracing_enabled and i < num_conditions:
- # Allow fall-through after the line tracing code.
- code.putln('CYTHON_FALLTHROUGH;')
+ code.mark_pos(cond.pos) # Tracing code must appear *after* the 'case' statement.
+ if line_tracing_enabled and i < num_conditions:
+ # Allow fall-through after the line tracing code.
+ code.putln('CYTHON_FALLTHROUGH;')
self.body.generate_execution_code(code)
- code.mark_pos(self.pos, trace=False)
+ code.mark_pos(self.pos, trace=False)
code.putln("break;")
def generate_function_definitions(self, env, code):
@@ -6391,7 +6391,7 @@ class SwitchCaseNode(StatNode):
cond.annotate(code)
self.body.annotate(code)
-
+
class SwitchStatNode(StatNode):
# Generated in the optimization of an if-elif-else node
#
@@ -6403,11 +6403,11 @@ class SwitchStatNode(StatNode):
def generate_execution_code(self, code):
self.test.generate_evaluation_code(code)
- # Make sure all conditions are evaluated before going into the switch() statement.
- # This is required in order to prevent any execution code from leaking into the space between the cases.
- for case in self.cases:
- case.generate_condition_evaluation_code(code)
- code.mark_pos(self.pos)
+ # Make sure all conditions are evaluated before going into the switch() statement.
+ # This is required in order to prevent any execution code from leaking into the space between the cases.
+ for case in self.cases:
+ case.generate_condition_evaluation_code(code)
+ code.mark_pos(self.pos)
code.putln("switch (%s) {" % self.test.result())
for case in self.cases:
case.generate_execution_code(code)
@@ -6438,7 +6438,7 @@ class SwitchStatNode(StatNode):
if self.else_clause is not None:
self.else_clause.annotate(code)
-
+
class LoopNode(object):
pass
@@ -6466,7 +6466,7 @@ class WhileStatNode(LoopNode, StatNode):
return self
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
old_loop_labels = code.new_loop_labels()
code.putln(
"while (1) {")
@@ -6474,7 +6474,7 @@ class WhileStatNode(LoopNode, StatNode):
self.condition.generate_evaluation_code(code)
self.condition.generate_disposal_code(code)
code.putln(
- "if (!%s) break;" % self.condition.result())
+ "if (!%s) break;" % self.condition.result())
self.condition.free_temps(code)
self.body.generate_execution_code(code)
code.put_label(code.continue_label)
@@ -6519,15 +6519,15 @@ class DictIterationNextNode(Node):
key_target, value_target, tuple_target, is_dict_flag):
Node.__init__(
self, dict_obj.pos,
- dict_obj=dict_obj,
- expected_size=expected_size,
- pos_index_var=pos_index_var,
- key_target=key_target,
- value_target=value_target,
- tuple_target=tuple_target,
- is_dict_flag=is_dict_flag,
- is_temp=True,
- type=PyrexTypes.c_bint_type)
+ dict_obj=dict_obj,
+ expected_size=expected_size,
+ pos_index_var=pos_index_var,
+ key_target=key_target,
+ value_target=value_target,
+ tuple_target=tuple_target,
+ is_dict_flag=is_dict_flag,
+ is_temp=True,
+ type=PyrexTypes.c_bint_type)
def analyse_expressions(self, env):
from . import ExprNodes
@@ -6594,7 +6594,7 @@ class DictIterationNextNode(Node):
target.generate_assignment_code(result, code)
var.release(code)
-
+
class SetIterationNextNode(Node):
# Helper node for calling _PySet_NextEntry() inside of a WhileStatNode
# and checking the set size for changes. Created in Optimize.py.
@@ -6657,46 +6657,46 @@ class SetIterationNextNode(Node):
def ForStatNode(pos, **kw):
if 'iterator' in kw:
- if kw['iterator'].is_async:
- return AsyncForStatNode(pos, **kw)
- else:
- return ForInStatNode(pos, **kw)
+ if kw['iterator'].is_async:
+ return AsyncForStatNode(pos, **kw)
+ else:
+ return ForInStatNode(pos, **kw)
else:
return ForFromStatNode(pos, **kw)
-
-class _ForInStatNode(LoopNode, StatNode):
- # Base class of 'for-in' statements.
+
+class _ForInStatNode(LoopNode, StatNode):
+ # Base class of 'for-in' statements.
#
# target ExprNode
- # iterator IteratorNode | AIterAwaitExprNode(AsyncIteratorNode)
+ # iterator IteratorNode | AIterAwaitExprNode(AsyncIteratorNode)
# body StatNode
# else_clause StatNode
- # item NextNode | AwaitExprNode(AsyncNextNode)
- # is_async boolean true for 'async for' statements
+ # item NextNode | AwaitExprNode(AsyncNextNode)
+ # is_async boolean true for 'async for' statements
- child_attrs = ["target", "item", "iterator", "body", "else_clause"]
+ child_attrs = ["target", "item", "iterator", "body", "else_clause"]
item = None
- is_async = False
-
- def _create_item_node(self):
- raise NotImplementedError("must be implemented by subclasses")
+ is_async = False
+ def _create_item_node(self):
+ raise NotImplementedError("must be implemented by subclasses")
+
def analyse_declarations(self, env):
self.target.analyse_target_declaration(env)
self.body.analyse_declarations(env)
if self.else_clause:
self.else_clause.analyse_declarations(env)
- self._create_item_node()
+ self._create_item_node()
def analyse_expressions(self, env):
self.target = self.target.analyse_target_types(env)
self.iterator = self.iterator.analyse_expressions(env)
- self._create_item_node() # must rewrap self.item after analysis
+ self._create_item_node() # must rewrap self.item after analysis
self.item = self.item.analyse_expressions(env)
- if (not self.is_async and
- (self.iterator.type.is_ptr or self.iterator.type.is_array) and
- self.target.type.assignable_from(self.iterator.type)):
+ if (not self.is_async and
+ (self.iterator.type.is_ptr or self.iterator.type.is_array) and
+ self.target.type.assignable_from(self.iterator.type)):
# C array slice optimization.
pass
else:
@@ -6707,7 +6707,7 @@ class _ForInStatNode(LoopNode, StatNode):
return self
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
old_loop_labels = code.new_loop_labels()
self.iterator.generate_evaluation_code(code)
code.putln("for (;;) {")
@@ -6762,36 +6762,36 @@ class _ForInStatNode(LoopNode, StatNode):
self.item.annotate(code)
-class ForInStatNode(_ForInStatNode):
- # 'for' statement
-
- is_async = False
-
- def _create_item_node(self):
- from .ExprNodes import NextNode
- self.item = NextNode(self.iterator)
-
-
-class AsyncForStatNode(_ForInStatNode):
- # 'async for' statement
- #
- # iterator AIterAwaitExprNode(AsyncIteratorNode)
- # item AwaitIterNextExprNode(AsyncIteratorNode)
-
- is_async = True
-
+class ForInStatNode(_ForInStatNode):
+ # 'for' statement
+
+ is_async = False
+
+ def _create_item_node(self):
+ from .ExprNodes import NextNode
+ self.item = NextNode(self.iterator)
+
+
+class AsyncForStatNode(_ForInStatNode):
+ # 'async for' statement
+ #
+ # iterator AIterAwaitExprNode(AsyncIteratorNode)
+ # item AwaitIterNextExprNode(AsyncIteratorNode)
+
+ is_async = True
+
def __init__(self, pos, **kw):
- assert 'item' not in kw
- from . import ExprNodes
- # AwaitExprNodes must appear before running MarkClosureVisitor
+ assert 'item' not in kw
+ from . import ExprNodes
+ # AwaitExprNodes must appear before running MarkClosureVisitor
kw['item'] = ExprNodes.AwaitIterNextExprNode(kw['iterator'].pos, arg=None)
- _ForInStatNode.__init__(self, pos, **kw)
-
- def _create_item_node(self):
- from . import ExprNodes
- self.item.arg = ExprNodes.AsyncNextNode(self.iterator)
-
-
+ _ForInStatNode.__init__(self, pos, **kw)
+
+ def _create_item_node(self):
+ from . import ExprNodes
+ self.item.arg = ExprNodes.AsyncNextNode(self.iterator)
+
+
class ForFromStatNode(LoopNode, StatNode):
# for name from expr rel name rel expr
#
@@ -6837,8 +6837,8 @@ class ForFromStatNode(LoopNode, StatNode):
self.bound2 = self.bound2.analyse_types(env)
if self.step is not None:
if isinstance(self.step, ExprNodes.UnaryMinusNode):
- warning(self.step.pos, "Probable infinite loop in for-from-by statement. "
- "Consider switching the directions of the relations.", 2)
+ warning(self.step.pos, "Probable infinite loop in for-from-by statement. "
+ "Consider switching the directions of the relations.", 2)
self.step = self.step.analyse_types(env)
self.set_up_loop(env)
@@ -6879,8 +6879,8 @@ class ForFromStatNode(LoopNode, StatNode):
if target_type.is_numeric or target_type.is_enum:
self.is_py_target = False
- if isinstance(self.target, ExprNodes.BufferIndexNode):
- raise error(self.pos, "Buffer or memoryview slicing/indexing not allowed as for-loop target.")
+ if isinstance(self.target, ExprNodes.BufferIndexNode):
+ raise error(self.pos, "Buffer or memoryview slicing/indexing not allowed as for-loop target.")
self.loopvar_node = self.target
self.py_loopvar_node = None
else:
@@ -6890,7 +6890,7 @@ class ForFromStatNode(LoopNode, StatNode):
self.py_loopvar_node = ExprNodes.CloneNode(c_loopvar_node).coerce_to_pyobject(env)
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
old_loop_labels = code.new_loop_labels()
from_range = self.from_range
self.bound1.generate_evaluation_code(code)
@@ -6916,19 +6916,19 @@ class ForFromStatNode(LoopNode, StatNode):
else:
loopvar_name = self.loopvar_node.result()
if loopvar_type.is_int and not loopvar_type.signed and self.relation2[0] == '>':
- # Handle the case where the endpoint of an unsigned int iteration
- # is within step of 0.
- code.putln("for (%s = %s%s + %s; %s %s %s + %s; ) { %s%s;" % (
- loopvar_name,
- self.bound1.result(), offset, step,
- loopvar_name, self.relation2, self.bound2.result(), step,
- loopvar_name, incop))
- else:
- code.putln("for (%s = %s%s; %s %s %s; %s%s) {" % (
- loopvar_name,
- self.bound1.result(), offset,
- loopvar_name, self.relation2, self.bound2.result(),
- loopvar_name, incop))
+ # Handle the case where the endpoint of an unsigned int iteration
+ # is within step of 0.
+ code.putln("for (%s = %s%s + %s; %s %s %s + %s; ) { %s%s;" % (
+ loopvar_name,
+ self.bound1.result(), offset, step,
+ loopvar_name, self.relation2, self.bound2.result(), step,
+ loopvar_name, incop))
+ else:
+ code.putln("for (%s = %s%s; %s %s %s; %s%s) {" % (
+ loopvar_name,
+ self.bound1.result(), offset,
+ loopvar_name, self.relation2, self.bound2.result(),
+ loopvar_name, incop))
coerced_loopvar_node = self.py_loopvar_node
if coerced_loopvar_node is None and from_range:
@@ -6952,15 +6952,15 @@ class ForFromStatNode(LoopNode, StatNode):
if self.target.entry.scope.is_module_scope:
code.globalstate.use_utility_code(
UtilityCode.load_cached("GetModuleGlobalName", "ObjectHandling.c"))
- lookup_func = '__Pyx_GetModuleGlobalName(%s, %s); %s'
+ lookup_func = '__Pyx_GetModuleGlobalName(%s, %s); %s'
else:
code.globalstate.use_utility_code(
UtilityCode.load_cached("GetNameInClass", "ObjectHandling.c"))
- lookup_func = '__Pyx_GetNameInClass(%s, {}, %s); %s'.format(
+ lookup_func = '__Pyx_GetNameInClass(%s, {}, %s); %s'.format(
self.target.entry.scope.namespace_cname)
- code.putln(lookup_func % (
+ code.putln(lookup_func % (
target_node.result(),
- interned_cname,
+ interned_cname,
code.error_goto_if_null(target_node.result(), self.target.pos)))
code.put_gotref(target_node.result())
else:
@@ -7007,7 +7007,7 @@ class ForFromStatNode(LoopNode, StatNode):
'<=': ("", "++"),
'<' : ("+1", "++"),
'>=': ("", "--"),
- '>' : ("-1", "--"),
+ '>' : ("-1", "--"),
}
def generate_function_definitions(self, env, code):
@@ -7086,7 +7086,7 @@ class WithStatNode(StatNode):
self.body.generate_function_definitions(env, code)
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
code.putln("/*with:*/ {")
self.manager.generate_evaluation_code(code)
self.exit_var = code.funcstate.allocate_temp(py_object_type, manage_ref=False)
@@ -7095,7 +7095,7 @@ class WithStatNode(StatNode):
code.putln("%s = __Pyx_PyObject_LookupSpecial(%s, %s); %s" % (
self.exit_var,
self.manager.py_result(),
- code.intern_identifier(EncodedString('__aexit__' if self.is_async else '__exit__')),
+ code.intern_identifier(EncodedString('__aexit__' if self.is_async else '__exit__')),
code.error_goto_if_null(self.exit_var, self.pos),
))
code.put_gotref(self.exit_var)
@@ -7202,9 +7202,9 @@ class TryExceptStatNode(StatNode):
gil_message = "Try-except statement"
def generate_execution_code(self, code):
- code.mark_pos(self.pos) # before changing the error label, in case of tracing errors
- code.putln("{")
-
+ code.mark_pos(self.pos) # before changing the error label, in case of tracing errors
+ code.putln("{")
+
old_return_label = code.return_label
old_break_label = code.break_label
old_continue_label = code.continue_label
@@ -7219,7 +7219,7 @@ class TryExceptStatNode(StatNode):
try_end_label = code.new_label('try_end')
exc_save_vars = [code.funcstate.allocate_temp(py_object_type, False)
- for _ in range(3)]
+ for _ in range(3)]
save_exc = code.insertion_point()
code.putln(
"/*try:*/ {")
@@ -7227,7 +7227,7 @@ class TryExceptStatNode(StatNode):
code.break_label = try_break_label
code.continue_label = try_continue_label
self.body.generate_execution_code(code)
- code.mark_pos(self.pos, trace=False)
+ code.mark_pos(self.pos, trace=False)
code.putln(
"}")
temps_to_clean_up = code.funcstate.all_free_managed_temps()
@@ -7239,8 +7239,8 @@ class TryExceptStatNode(StatNode):
if not self.in_generator:
save_exc.putln("__Pyx_PyThreadState_declare")
save_exc.putln("__Pyx_PyThreadState_assign")
- save_exc.putln("__Pyx_ExceptionSave(%s);" % (
- ', '.join(['&%s' % var for var in exc_save_vars])))
+ save_exc.putln("__Pyx_ExceptionSave(%s);" % (
+ ', '.join(['&%s' % var for var in exc_save_vars])))
for var in exc_save_vars:
save_exc.put_xgotref(var)
@@ -7262,7 +7262,7 @@ class TryExceptStatNode(StatNode):
code.return_label = except_return_label
normal_case_terminates = self.body.is_terminator
if self.else_clause:
- code.mark_pos(self.else_clause.pos)
+ code.mark_pos(self.else_clause.pos)
code.putln(
"/*else:*/ {")
self.else_clause.generate_execution_code(code)
@@ -7299,17 +7299,17 @@ class TryExceptStatNode(StatNode):
if not normal_case_terminates and not code.label_used(try_end_label):
code.put_goto(try_end_label)
code.put_label(exit_label)
- code.mark_pos(self.pos, trace=False)
- if can_raise:
- restore_saved_exception()
+ code.mark_pos(self.pos, trace=False)
+ if can_raise:
+ restore_saved_exception()
code.put_goto(old_label)
if code.label_used(except_end_label):
if not normal_case_terminates and not code.label_used(try_end_label):
code.put_goto(try_end_label)
code.put_label(except_end_label)
- if can_raise:
- restore_saved_exception()
+ if can_raise:
+ restore_saved_exception()
if code.label_used(try_end_label):
code.put_label(try_end_label)
code.putln("}")
@@ -7431,22 +7431,22 @@ class ExceptClauseNode(Node):
and self.target is None):
# most simple case: no exception variable, empty body (pass)
# => reset the exception state, done
- code.globalstate.use_utility_code(UtilityCode.load_cached("PyErrFetchRestore", "Exceptions.c"))
- code.putln("__Pyx_ErrRestore(0,0,0);")
+ code.globalstate.use_utility_code(UtilityCode.load_cached("PyErrFetchRestore", "Exceptions.c"))
+ code.putln("__Pyx_ErrRestore(0,0,0);")
code.put_goto(end_label)
code.putln("}")
return
exc_vars = [code.funcstate.allocate_temp(py_object_type, manage_ref=True)
- for _ in range(3)]
+ for _ in range(3)]
code.put_add_traceback(self.function_name)
# We always have to fetch the exception value even if
# there is no target, because this also normalises the
# exception and stores it in the thread state.
code.globalstate.use_utility_code(get_exception_utility_code)
exc_args = "&%s, &%s, &%s" % tuple(exc_vars)
- code.putln("if (__Pyx_GetException(%s) < 0) %s" % (
- exc_args, code.error_goto(self.pos)))
+ code.putln("if (__Pyx_GetException(%s) < 0) %s" % (
+ exc_args, code.error_goto(self.pos)))
for var in exc_vars:
code.put_gotref(var)
if self.target:
@@ -7468,9 +7468,9 @@ class ExceptClauseNode(Node):
if not self.body.is_terminator:
for var in exc_vars:
- # FIXME: XDECREF() is needed to allow re-raising (which clears the exc_vars),
- # but I don't think it's the right solution.
- code.put_xdecref_clear(var, py_object_type)
+ # FIXME: XDECREF() is needed to allow re-raising (which clears the exc_vars),
+ # but I don't think it's the right solution.
+ code.put_xdecref_clear(var, py_object_type)
code.put_goto(end_label)
for new_label, old_label in [(code.break_label, old_break_label),
@@ -7508,42 +7508,42 @@ class TryFinallyStatNode(StatNode):
#
# body StatNode
# finally_clause StatNode
- # finally_except_clause deep-copy of finally_clause for exception case
+ # finally_except_clause deep-copy of finally_clause for exception case
# in_generator inside of generator => must store away current exception also in return case
#
- # Each of the continue, break, return and error gotos runs
- # into its own deep-copy of the finally block code.
+ # Each of the continue, break, return and error gotos runs
+ # into its own deep-copy of the finally block code.
# In addition, if we're doing an error, we save the
# exception on entry to the finally block and restore
# it on exit.
- child_attrs = ["body", "finally_clause", "finally_except_clause"]
+ child_attrs = ["body", "finally_clause", "finally_except_clause"]
preserve_exception = 1
# handle exception case, in addition to return/break/continue
handle_error_case = True
func_return_type = None
- finally_except_clause = None
+ finally_except_clause = None
is_try_finally_in_nogil = False
in_generator = False
- @staticmethod
+ @staticmethod
def create_analysed(pos, env, body, finally_clause):
node = TryFinallyStatNode(pos, body=body, finally_clause=finally_clause)
return node
def analyse_declarations(self, env):
self.body.analyse_declarations(env)
- self.finally_except_clause = copy.deepcopy(self.finally_clause)
- self.finally_except_clause.analyse_declarations(env)
+ self.finally_except_clause = copy.deepcopy(self.finally_clause)
+ self.finally_except_clause.analyse_declarations(env)
self.finally_clause.analyse_declarations(env)
def analyse_expressions(self, env):
self.body = self.body.analyse_expressions(env)
self.finally_clause = self.finally_clause.analyse_expressions(env)
- self.finally_except_clause = self.finally_except_clause.analyse_expressions(env)
+ self.finally_except_clause = self.finally_except_clause.analyse_expressions(env)
if env.return_type and not env.return_type.is_void:
self.func_return_type = env.return_type
return self
@@ -7552,9 +7552,9 @@ class TryFinallyStatNode(StatNode):
gil_message = "Try-finally statement"
def generate_execution_code(self, code):
- code.mark_pos(self.pos) # before changing the error label, in case of tracing errors
- code.putln("/*try:*/ {")
-
+ code.mark_pos(self.pos) # before changing the error label, in case of tracing errors
+ code.putln("/*try:*/ {")
+
old_error_label = code.error_label
old_labels = code.all_new_labels()
new_labels = code.get_all_labels()
@@ -7563,21 +7563,21 @@ class TryFinallyStatNode(StatNode):
code.error_label = old_error_label
catch_label = code.new_label()
- was_in_try_finally = code.funcstate.in_try_finally
- code.funcstate.in_try_finally = 1
+ was_in_try_finally = code.funcstate.in_try_finally
+ code.funcstate.in_try_finally = 1
self.body.generate_execution_code(code)
- code.funcstate.in_try_finally = was_in_try_finally
+ code.funcstate.in_try_finally = was_in_try_finally
code.putln("}")
temps_to_clean_up = code.funcstate.all_free_managed_temps()
code.mark_pos(self.finally_clause.pos)
code.putln("/*finally:*/ {")
- # Reset labels only after writing out a potential line trace call for correct nogil error handling.
- code.set_all_labels(old_labels)
-
+ # Reset labels only after writing out a potential line trace call for correct nogil error handling.
+ code.set_all_labels(old_labels)
+
def fresh_finally_clause(_next=[self.finally_clause]):
# generate the original subtree once and always keep a fresh copy
node = _next[0]
@@ -7624,7 +7624,7 @@ class TryFinallyStatNode(StatNode):
code.putln('{')
old_exc_vars = code.funcstate.exc_vars
code.funcstate.exc_vars = exc_vars[:3]
- self.finally_except_clause.generate_execution_code(code)
+ self.finally_except_clause.generate_execution_code(code)
code.funcstate.exc_vars = old_exc_vars
code.putln('}')
@@ -7712,7 +7712,7 @@ class TryFinallyStatNode(StatNode):
if self.is_try_finally_in_nogil:
code.put_ensure_gil(declare_gilstate=False)
- code.putln("__Pyx_PyThreadState_assign")
+ code.putln("__Pyx_PyThreadState_assign")
code.putln(' '.join(["%s = 0;" % var for var in exc_vars]))
for temp_name, type in temps_to_clean_up:
@@ -7770,7 +7770,7 @@ class TryFinallyStatNode(StatNode):
code.globalstate.use_utility_code(reset_exception_utility_code)
if self.is_try_finally_in_nogil:
code.put_ensure_gil(declare_gilstate=False)
-
+
# not using preprocessor here to avoid warnings about
# unused utility functions and/or temps
code.putln("if (PY_MAJOR_VERSION >= 3) {")
@@ -7808,8 +7808,8 @@ class GILStatNode(NogilTryFinallyStatNode):
def __init__(self, pos, state, body):
self.state = state
self.create_state_temp_if_needed(pos, state, body)
- TryFinallyStatNode.__init__(
- self, pos,
+ TryFinallyStatNode.__init__(
+ self, pos,
body=body,
finally_clause=GILExitNode(
pos, state=state, state_temp=self.state_temp))
@@ -7853,20 +7853,20 @@ class GILStatNode(NogilTryFinallyStatNode):
else:
variable = None
- old_gil_config = code.funcstate.gil_owned
+ old_gil_config = code.funcstate.gil_owned
if self.state == 'gil':
code.put_ensure_gil(variable=variable)
- code.funcstate.gil_owned = True
+ code.funcstate.gil_owned = True
else:
code.put_release_gil(variable=variable)
- code.funcstate.gil_owned = False
+ code.funcstate.gil_owned = False
TryFinallyStatNode.generate_execution_code(self, code)
if self.state_temp:
self.state_temp.release(code)
- code.funcstate.gil_owned = old_gil_config
+ code.funcstate.gil_owned = old_gil_config
code.end_block()
@@ -7903,44 +7903,44 @@ class EnsureGILNode(GILExitNode):
def generate_execution_code(self, code):
code.put_ensure_gil(declare_gilstate=False)
-
-def cython_view_utility_code():
- from . import MemoryView
- return MemoryView.view_utility_code
-
-
+
+def cython_view_utility_code():
+ from . import MemoryView
+ return MemoryView.view_utility_code
+
+
utility_code_for_cimports = {
# utility code (or inlining c) in a pxd (or pyx) file.
# TODO: Consider a generic user-level mechanism for importing
- 'cpython.array' : lambda : UtilityCode.load_cached("ArrayAPI", "arrayarray.h"),
- 'cpython.array.array' : lambda : UtilityCode.load_cached("ArrayAPI", "arrayarray.h"),
- 'cython.view' : cython_view_utility_code,
-}
-
-utility_code_for_imports = {
- # utility code used when special modules are imported.
- # TODO: Consider a generic user-level mechanism for importing
- 'asyncio': ("__Pyx_patch_asyncio", "PatchAsyncIO", "Coroutine.c"),
- 'inspect': ("__Pyx_patch_inspect", "PatchInspect", "Coroutine.c"),
+ 'cpython.array' : lambda : UtilityCode.load_cached("ArrayAPI", "arrayarray.h"),
+ 'cpython.array.array' : lambda : UtilityCode.load_cached("ArrayAPI", "arrayarray.h"),
+ 'cython.view' : cython_view_utility_code,
}
-
+utility_code_for_imports = {
+ # utility code used when special modules are imported.
+ # TODO: Consider a generic user-level mechanism for importing
+ 'asyncio': ("__Pyx_patch_asyncio", "PatchAsyncIO", "Coroutine.c"),
+ 'inspect': ("__Pyx_patch_inspect", "PatchInspect", "Coroutine.c"),
+}
+
+
class CImportStatNode(StatNode):
# cimport statement
#
# module_name string Qualified name of module being imported
# as_name string or None Name specified in "as" clause, if any
- # is_absolute bool True for absolute imports, False otherwise
+ # is_absolute bool True for absolute imports, False otherwise
child_attrs = []
- is_absolute = False
+ is_absolute = False
def analyse_declarations(self, env):
if not env.is_module_scope:
error(self.pos, "cimport only allowed at module level")
return
- module_scope = env.find_module(
- self.module_name, self.pos, relative_level=0 if self.is_absolute else -1)
+ module_scope = env.find_module(
+ self.module_name, self.pos, relative_level=0 if self.is_absolute else -1)
if "." in self.module_name:
names = [EncodedString(name) for name in self.module_name.split(".")]
top_name = names[0]
@@ -7959,7 +7959,7 @@ class CImportStatNode(StatNode):
name = self.as_name or self.module_name
env.declare_module(name, module_scope, self.pos)
if self.module_name in utility_code_for_cimports:
- env.use_utility_code(utility_code_for_cimports[self.module_name]())
+ env.use_utility_code(utility_code_for_cimports[self.module_name]())
def analyse_expressions(self, env):
return self
@@ -7986,13 +7986,13 @@ class FromCImportStatNode(StatNode):
return
if self.relative_level and self.relative_level > env.qualified_name.count('.'):
error(self.pos, "relative cimport beyond main package is not allowed")
- return
+ return
module_scope = env.find_module(self.module_name, self.pos, relative_level=self.relative_level)
module_name = module_scope.qualified_name
env.add_imported_module(module_scope)
for pos, name, as_name, kind in self.imported_names:
if name == "*":
- for local_name, entry in list(module_scope.entries.items()):
+ for local_name, entry in list(module_scope.entries.items()):
env.add_imported_entry(local_name, entry, pos)
else:
entry = module_scope.lookup(name)
@@ -8007,8 +8007,8 @@ class FromCImportStatNode(StatNode):
elif kind == 'class':
entry = module_scope.declare_c_class(name, pos=pos, module_name=module_name)
else:
- submodule_scope = env.context.find_module(
- name, relative_to=module_scope, pos=self.pos, absolute_fallback=False)
+ submodule_scope = env.context.find_module(
+ name, relative_to=module_scope, pos=self.pos, absolute_fallback=False)
if submodule_scope.parent_module is module_scope:
env.declare_module(as_name or name, submodule_scope, self.pos)
else:
@@ -8018,13 +8018,13 @@ class FromCImportStatNode(StatNode):
local_name = as_name or name
env.add_imported_entry(local_name, entry, pos)
- if module_name.startswith('cpython') or module_name.startswith('cython'): # enough for now
+ if module_name.startswith('cpython') or module_name.startswith('cython'): # enough for now
if module_name in utility_code_for_cimports:
- env.use_utility_code(utility_code_for_cimports[module_name]())
+ env.use_utility_code(utility_code_for_cimports[module_name]())
for _, name, _, _ in self.imported_names:
fqname = '%s.%s' % (module_name, name)
if fqname in utility_code_for_cimports:
- env.use_utility_code(utility_code_for_cimports[fqname]())
+ env.use_utility_code(utility_code_for_cimports[fqname]())
def declaration_matches(self, entry, kind):
if not entry.is_type:
@@ -8106,7 +8106,7 @@ class FromImportStatNode(StatNode):
return self
def generate_execution_code(self, code):
- code.mark_pos(self.pos)
+ code.mark_pos(self.pos)
self.module.generate_evaluation_code(code)
if self.import_star:
code.putln(
@@ -8253,13 +8253,13 @@ class ParallelStatNode(StatNode, ParallelNode):
try:
self.kwargs = self.kwargs.compile_time_value(env)
- except Exception as e:
+ except Exception as e:
error(self.kwargs.pos, "Only compile-time values may be "
"supplied as keyword arguments")
else:
self.kwargs = {}
- for kw, val in self.kwargs.items():
+ for kw, val in self.kwargs.items():
if kw not in self.valid_keyword_arguments:
error(self.pos, "Invalid keyword argument: %s" % kw)
else:
@@ -8276,14 +8276,14 @@ class ParallelStatNode(StatNode, ParallelNode):
self.analyse_sharing_attributes(env)
if self.num_threads is not None:
- if self.parent and self.parent.num_threads is not None and not self.parent.is_prange:
- error(self.pos, "num_threads already declared in outer section")
+ if self.parent and self.parent.num_threads is not None and not self.parent.is_prange:
+ error(self.pos, "num_threads already declared in outer section")
elif self.parent and not self.parent.is_prange:
- error(self.pos, "num_threads must be declared in the parent parallel section")
+ error(self.pos, "num_threads must be declared in the parent parallel section")
elif (self.num_threads.type.is_int and
- self.num_threads.is_literal and
- self.num_threads.compile_time_value(env) <= 0):
- error(self.pos, "argument to num_threads must be greater than 0")
+ self.num_threads.is_literal and
+ self.num_threads.compile_time_value(env) <= 0):
+ error(self.pos, "argument to num_threads must be greater than 0")
if not self.num_threads.is_simple() or self.num_threads.type.is_pyobject:
self.num_threads = self.num_threads.coerce_to(
@@ -8296,14 +8296,14 @@ class ParallelStatNode(StatNode, ParallelNode):
This should be called in a post-order fashion during the
analyse_expressions phase
"""
- for entry, (pos, op) in self.assignments.items():
+ for entry, (pos, op) in self.assignments.items():
if self.is_prange and not self.is_parallel:
# closely nested prange in a with parallel block, disallow
# assigning to privates in the with parallel block (we
# consider it too implicit and magicky for users)
if entry in self.parent.assignments:
- error(pos, "Cannot assign to private of outer parallel block")
+ error(pos, "Cannot assign to private of outer parallel block")
continue
if not self.is_prange and op:
@@ -8412,7 +8412,7 @@ class ParallelStatNode(StatNode, ParallelNode):
def initialize_privates_to_nan(self, code, exclude=None):
first = True
- for entry, (op, lastprivate) in sorted(self.privates.items()):
+ for entry, (op, lastprivate) in sorted(self.privates.items()):
if not op and (not exclude or entry != exclude):
invalid_value = entry.type.invalid_value()
@@ -8441,7 +8441,7 @@ class ParallelStatNode(StatNode, ParallelNode):
Write self.num_threads if set as the num_threads OpenMP directive
"""
if self.num_threads is not None:
- code.put(" num_threads(%s)" % self.evaluate_before_block(code, self.num_threads))
+ code.put(" num_threads(%s)" % self.evaluate_before_block(code, self.num_threads))
def declare_closure_privates(self, code):
@@ -8453,7 +8453,7 @@ class ParallelStatNode(StatNode, ParallelNode):
"""
self.modified_entries = []
- for entry in sorted(self.assignments):
+ for entry in sorted(self.assignments):
if entry.from_closure or entry.in_closure:
self._allocate_closure_temp(code, entry)
@@ -8473,13 +8473,13 @@ class ParallelStatNode(StatNode, ParallelNode):
Make any used temporaries private. Before the relevant code block
code.start_collecting_temps() should have been called.
"""
- c = self.privatization_insertion_point
- self.privatization_insertion_point = None
-
+ c = self.privatization_insertion_point
+ self.privatization_insertion_point = None
+
if self.is_parallel:
self.temps = temps = code.funcstate.stop_collecting_temps()
privates, firstprivates = [], []
- for temp, type in sorted(temps):
+ for temp, type in sorted(temps):
if type.is_pyobject or type.is_memoryviewslice:
firstprivates.append(temp)
else:
@@ -8502,7 +8502,7 @@ class ParallelStatNode(StatNode, ParallelNode):
# Now clean up any memoryview slice and object temporaries
if self.is_parallel and not self.is_nested_prange:
code.putln("/* Clean up any temporaries */")
- for temp, type in sorted(self.temps):
+ for temp, type in sorted(self.temps):
if type.is_memoryviewslice:
code.put_xdecref_memoryviewslice(temp, have_gil=False)
elif type.is_pyobject:
@@ -8567,9 +8567,9 @@ class ParallelStatNode(StatNode, ParallelNode):
If compiled without OpenMP support (at the C level), then we still have
to acquire the GIL to decref any object temporaries.
"""
- begin_code = self.begin_of_parallel_block
- self.begin_of_parallel_block = None
-
+ begin_code = self.begin_of_parallel_block
+ self.begin_of_parallel_block = None
+
if self.error_label_used:
end_code = code
@@ -8666,7 +8666,7 @@ class ParallelStatNode(StatNode, ParallelNode):
that the breaking thread has well-defined values of the lastprivate
variables, so we keep those values.
"""
- section_name = "__pyx_parallel_lastprivates%d" % self.critical_section_counter
+ section_name = "__pyx_parallel_lastprivates%d" % self.critical_section_counter
code.putln_openmp("#pragma omp critical(%s)" % section_name)
ParallelStatNode.critical_section_counter += 1
@@ -8675,11 +8675,11 @@ class ParallelStatNode(StatNode, ParallelNode):
c = self.begin_of_parallel_control_block_point
temp_count = 0
- for entry, (op, lastprivate) in sorted(self.privates.items()):
+ for entry, (op, lastprivate) in sorted(self.privates.items()):
if not lastprivate or entry.type.is_pyobject:
continue
- type_decl = entry.type.empty_declaration_code()
+ type_decl = entry.type.empty_declaration_code()
temp_cname = "__pyx_parallel_temp%d" % temp_count
private_cname = entry.cname
@@ -8734,7 +8734,7 @@ class ParallelStatNode(StatNode, ParallelNode):
code.putln(
"if (!%s) {" % Naming.parallel_exc_type)
- code.putln("__Pyx_ErrFetchWithState(&%s, &%s, &%s);" % self.parallel_exc)
+ code.putln("__Pyx_ErrFetchWithState(&%s, &%s, &%s);" % self.parallel_exc)
pos_info = chain(*zip(self.parallel_pos_info, self.pos_info))
code.funcstate.uses_error_indicator = True
code.putln("%s = %s; %s = %s; %s = %s;" % tuple(pos_info))
@@ -8752,7 +8752,7 @@ class ParallelStatNode(StatNode, ParallelNode):
code.put_ensure_gil(declare_gilstate=True)
code.put_giveref(Naming.parallel_exc_type)
- code.putln("__Pyx_ErrRestoreWithState(%s, %s, %s);" % self.parallel_exc)
+ code.putln("__Pyx_ErrRestoreWithState(%s, %s, %s);" % self.parallel_exc)
pos_info = chain(*zip(self.pos_info, self.parallel_pos_info))
code.putln("%s = %s; %s = %s; %s = %s;" % tuple(pos_info))
@@ -8767,8 +8767,8 @@ class ParallelStatNode(StatNode, ParallelNode):
code.set_all_labels(self.old_loop_labels + (self.old_return_label,
self.old_error_label))
- def end_parallel_control_flow_block(
- self, code, break_=False, continue_=False, return_=False):
+ def end_parallel_control_flow_block(
+ self, code, break_=False, continue_=False, return_=False):
"""
This ends the parallel control flow block and based on how the parallel
section was exited, takes the corresponding action. The break_ and
@@ -8783,8 +8783,8 @@ class ParallelStatNode(StatNode, ParallelNode):
the for loop.
"""
c = self.begin_of_parallel_control_block_point
- self.begin_of_parallel_control_block_point = None
- self.begin_of_parallel_control_block_point_after_decls = None
+ self.begin_of_parallel_control_block_point = None
+ self.begin_of_parallel_control_block_point_after_decls = None
if self.num_threads is not None:
# FIXME: is it the right place? should not normally produce code.
@@ -8793,8 +8793,8 @@ class ParallelStatNode(StatNode, ParallelNode):
# Firstly, always prefer errors over returning, continue or break
if self.error_label_used:
- c.putln("const char *%s = NULL; int %s = 0, %s = 0;" % self.parallel_pos_info)
- c.putln("PyObject *%s = NULL, *%s = NULL, *%s = NULL;" % self.parallel_exc)
+ c.putln("const char *%s = NULL; int %s = 0, %s = 0;" % self.parallel_pos_info)
+ c.putln("PyObject *%s = NULL, *%s = NULL, *%s = NULL;" % self.parallel_exc)
code.putln(
"if (%s) {" % Naming.parallel_exc_type)
@@ -8829,9 +8829,9 @@ class ParallelStatNode(StatNode, ParallelNode):
code.put(" case 2: ")
code.put_goto(code.break_label)
- if return_:
- code.put(" case 3: ")
- code.put_goto(code.return_label)
+ if return_:
+ code.put(" case 3: ")
+ code.put_goto(code.return_label)
if self.error_label_used:
code.globalstate.use_utility_code(restore_exception_utility_code)
@@ -8888,8 +8888,8 @@ class ParallelWithBlockNode(ParallelStatNode):
if self.privates:
privates = [e.cname for e in self.privates
- if not e.type.is_pyobject]
- code.put('private(%s)' % ', '.join(sorted(privates)))
+ if not e.type.is_pyobject]
+ code.put('private(%s)' % ', '.join(sorted(privates)))
self.privatization_insertion_point = code.insertion_point()
self.put_num_threads(code)
@@ -8897,7 +8897,7 @@ class ParallelWithBlockNode(ParallelStatNode):
code.putln("#endif /* _OPENMP */")
- code.begin_block() # parallel block
+ code.begin_block() # parallel block
self.begin_parallel_block(code)
self.initialize_privates_to_nan(code)
code.funcstate.start_collecting_temps()
@@ -8905,16 +8905,16 @@ class ParallelWithBlockNode(ParallelStatNode):
self.trap_parallel_exit(code)
self.privatize_temps(code)
self.end_parallel_block(code)
- code.end_block() # end parallel block
+ code.end_block() # end parallel block
continue_ = code.label_used(code.continue_label)
break_ = code.label_used(code.break_label)
- return_ = code.label_used(code.return_label)
+ return_ = code.label_used(code.return_label)
self.restore_labels(code)
self.end_parallel_control_flow_block(code, break_=break_,
- continue_=continue_,
- return_=return_)
+ continue_=continue_,
+ return_=return_)
self.release_closure_privates(code)
@@ -8965,8 +8965,8 @@ class ParallelRangeNode(ParallelStatNode):
if hasattr(self.schedule, 'decode'):
self.schedule = self.schedule.decode('ascii')
- if self.schedule not in (None, 'static', 'dynamic', 'guided', 'runtime'):
- error(self.pos, "Invalid schedule argument to prange: %s" % (self.schedule,))
+ if self.schedule not in (None, 'static', 'dynamic', 'guided', 'runtime'):
+ error(self.pos, "Invalid schedule argument to prange: %s" % (self.schedule,))
def analyse_expressions(self, env):
was_nogil = env.nogil
@@ -9009,7 +9009,7 @@ class ParallelRangeNode(ParallelStatNode):
# As we range from 0 to nsteps, computing the index along the
# way, we need a fitting type for 'i' and 'nsteps'
self.index_type = PyrexTypes.widest_numeric_type(
- self.index_type, node.type)
+ self.index_type, node.type)
if self.else_clause is not None:
self.else_clause = self.else_clause.analyse_expressions(env)
@@ -9110,7 +9110,7 @@ class ParallelRangeNode(ParallelStatNode):
# the start, stop , step, temps and target cnames
fmt_dict = {
'target': target_index_cname,
- 'target_type': self.target.type.empty_declaration_code()
+ 'target_type': self.target.type.empty_declaration_code()
}
# Setup start, stop and step, allocating temps if needed
@@ -9137,7 +9137,7 @@ class ParallelRangeNode(ParallelStatNode):
self.setup_parallel_control_flow_block(code) # parallel control flow block
# Note: nsteps is private in an outer scope if present
- code.putln("%(nsteps)s = (%(stop)s - %(start)s + %(step)s - %(step)s/abs(%(step)s)) / %(step)s;" % fmt_dict)
+ code.putln("%(nsteps)s = (%(stop)s - %(start)s + %(step)s - %(step)s/abs(%(step)s)) / %(step)s;" % fmt_dict)
# The target iteration variable might not be initialized, do it only if
# we are executing at least 1 iteration, otherwise we should leave the
@@ -9204,7 +9204,7 @@ class ParallelRangeNode(ParallelStatNode):
code.putln("#ifdef _OPENMP")
code.put("#pragma omp for")
- for entry, (op, lastprivate) in sorted(self.privates.items()):
+ for entry, (op, lastprivate) in sorted(self.privates.items()):
# Don't declare the index variable as a reduction
if op and op in "+*-&^|" and entry != self.target.entry:
if entry.type.is_pyobject:
@@ -9230,7 +9230,7 @@ class ParallelRangeNode(ParallelStatNode):
if self.schedule:
if self.chunksize:
- chunksize = ", %s" % self.evaluate_before_block(code, self.chunksize)
+ chunksize = ", %s" % self.evaluate_before_block(code, self.chunksize)
else:
chunksize = ""
@@ -9242,7 +9242,7 @@ class ParallelRangeNode(ParallelStatNode):
code.putln("#endif /* _OPENMP */")
code.put("for (%(i)s = 0; %(i)s < %(nsteps)s; %(i)s++)" % fmt_dict)
- code.begin_block() # for loop block
+ code.begin_block() # for loop block
guard_around_body_codepoint = code.insertion_point()
@@ -9250,7 +9250,7 @@ class ParallelRangeNode(ParallelStatNode):
# at least it doesn't spoil indentation
code.begin_block()
- code.putln("%(target)s = (%(target_type)s)(%(start)s + %(step)s * %(i)s);" % fmt_dict)
+ code.putln("%(target)s = (%(target_type)s)(%(start)s + %(step)s * %(i)s);" % fmt_dict)
self.initialize_privates_to_nan(code, exclude=self.target.entry)
if self.is_parallel and not self.is_nested_prange:
@@ -9268,13 +9268,13 @@ class ParallelRangeNode(ParallelStatNode):
# exceptions might be used
guard_around_body_codepoint.putln("if (%s < 2)" % Naming.parallel_why)
- code.end_block() # end guard around loop body
- code.end_block() # end for loop block
+ code.end_block() # end guard around loop body
+ code.end_block() # end for loop block
if self.is_parallel:
# Release the GIL and deallocate the thread state
self.end_parallel_block(code)
- code.end_block() # pragma omp parallel end block
+ code.end_block() # pragma omp parallel end block
class CnameDecoratorNode(StatNode):
@@ -9301,7 +9301,7 @@ class CnameDecoratorNode(StatNode):
node = node.body.stats[0]
self.is_function = isinstance(node, FuncDefNode)
- is_struct_or_enum = isinstance(node, (CStructOrUnionDefNode, CEnumDefNode))
+ is_struct_or_enum = isinstance(node, (CStructOrUnionDefNode, CEnumDefNode))
e = node.entry
if self.is_function:
@@ -9321,11 +9321,11 @@ class CnameDecoratorNode(StatNode):
e.type.typeptr_cname = self.cname + '_type'
e.type.scope.namespace_cname = e.type.typeptr_cname
- e.as_variable.cname = e.type.typeptr_cname
+ e.as_variable.cname = e.type.typeptr_cname
scope.scope_prefix = self.cname + "_"
- for name, entry in scope.entries.items():
+ for name, entry in scope.entries.items():
if entry.func_cname:
entry.func_cname = self.mangle(entry.cname)
if entry.pyfunc_cname:
@@ -9349,7 +9349,7 @@ class CnameDecoratorNode(StatNode):
if isinstance(self.node, DefNode):
self.node.generate_function_header(
- h_code, with_pymethdef=False, proto_only=True)
+ h_code, with_pymethdef=False, proto_only=True)
else:
from . import ModuleNode
entry = self.node.entry
@@ -9357,10 +9357,10 @@ class CnameDecoratorNode(StatNode):
entry.cname = entry.func_cname
ModuleNode.generate_cfunction_declaration(
- entry,
- env.global_scope(),
- h_code,
- definition=True)
+ entry,
+ env.global_scope(),
+ h_code,
+ definition=True)
entry.cname = cname
@@ -9417,16 +9417,16 @@ traceback_utility_code = UtilityCode.load_cached("AddTraceback", "Exceptions.c")
#------------------------------------------------------------------------------------
-get_exception_tuple_utility_code = UtilityCode(
- proto="""
-static PyObject *__Pyx_GetExceptionTuple(PyThreadState *__pyx_tstate); /*proto*/
+get_exception_tuple_utility_code = UtilityCode(
+ proto="""
+static PyObject *__Pyx_GetExceptionTuple(PyThreadState *__pyx_tstate); /*proto*/
""",
- # I doubt that calling __Pyx_GetException() here is correct as it moves
- # the exception from tstate->curexc_* to tstate->exc_*, which prevents
- # exception handlers later on from receiving it.
- # NOTE: "__pyx_tstate" may be used by __Pyx_GetException() macro
- impl = """
-static PyObject *__Pyx_GetExceptionTuple(CYTHON_UNUSED PyThreadState *__pyx_tstate) {
+ # I doubt that calling __Pyx_GetException() here is correct as it moves
+ # the exception from tstate->curexc_* to tstate->exc_*, which prevents
+ # exception handlers later on from receiving it.
+ # NOTE: "__pyx_tstate" may be used by __Pyx_GetException() macro
+ impl = """
+static PyObject *__Pyx_GetExceptionTuple(CYTHON_UNUSED PyThreadState *__pyx_tstate) {
PyObject *type = NULL, *value = NULL, *tb = NULL;
if (__Pyx_GetException(&type, &value, &tb) == 0) {
PyObject* exc_info = PyTuple_New(3);
@@ -9443,4 +9443,4 @@ static PyObject *__Pyx_GetExceptionTuple(CYTHON_UNUSED PyThreadState *__pyx_tsta
return NULL;
}
""",
- requires=[get_exception_utility_code])
+ requires=[get_exception_utility_code])
diff --git a/contrib/tools/cython/Cython/Compiler/Optimize.py b/contrib/tools/cython/Cython/Compiler/Optimize.py
index 3cb77efe2c..da4556a9f6 100644
--- a/contrib/tools/cython/Cython/Compiler/Optimize.py
+++ b/contrib/tools/cython/Cython/Compiler/Optimize.py
@@ -1,25 +1,25 @@
from __future__ import absolute_import
import re
-import sys
-import copy
-import codecs
-import itertools
-
+import sys
+import copy
+import codecs
+import itertools
+
from . import TypeSlots
from .ExprNodes import not_a_constant
import cython
cython.declare(UtilityCode=object, EncodedString=object, bytes_literal=object, encoded_string=object,
Nodes=object, ExprNodes=object, PyrexTypes=object, Builtin=object,
- UtilNodes=object, _py_int_types=object)
+ UtilNodes=object, _py_int_types=object)
-if sys.version_info[0] >= 3:
- _py_int_types = int
+if sys.version_info[0] >= 3:
+ _py_int_types = int
_py_string_types = (bytes, str)
-else:
- _py_int_types = (int, long)
+else:
+ _py_int_types = (int, long)
_py_string_types = (bytes, unicode)
-
+
from . import Nodes
from . import ExprNodes
from . import PyrexTypes
@@ -28,7 +28,7 @@ from . import Builtin
from . import UtilNodes
from . import Options
-from .Code import UtilityCode, TempitaUtilityCode
+from .Code import UtilityCode, TempitaUtilityCode
from .StringEncoding import EncodedString, bytes_literal, encoded_string
from .Errors import error, warning
from .ParseTreeTransforms import SkipDeclarations
@@ -43,23 +43,23 @@ try:
except ImportError:
basestring = str # Python 3
-
+
def load_c_utility(name):
return UtilityCode.load_cached(name, "Optimize.c")
-
+
def unwrap_coerced_node(node, coercion_nodes=(ExprNodes.CoerceToPyTypeNode, ExprNodes.CoerceFromPyTypeNode)):
if isinstance(node, coercion_nodes):
return node.arg
return node
-
+
def unwrap_node(node):
while isinstance(node, UtilNodes.ResultRefNode):
node = node.expression
return node
-
+
def is_common_value(a, b):
a = unwrap_node(a)
b = unwrap_node(b)
@@ -69,66 +69,66 @@ def is_common_value(a, b):
return not a.is_py_attr and is_common_value(a.obj, b.obj) and a.attribute == b.attribute
return False
-
+
def filter_none_node(node):
if node is not None and node.constant_result is None:
return None
return node
-
-class _YieldNodeCollector(Visitor.TreeVisitor):
- """
- YieldExprNode finder for generator expressions.
- """
- def __init__(self):
- Visitor.TreeVisitor.__init__(self)
- self.yield_stat_nodes = {}
- self.yield_nodes = []
-
- visit_Node = Visitor.TreeVisitor.visitchildren
-
- def visit_YieldExprNode(self, node):
- self.yield_nodes.append(node)
- self.visitchildren(node)
-
- def visit_ExprStatNode(self, node):
- self.visitchildren(node)
- if node.expr in self.yield_nodes:
- self.yield_stat_nodes[node.expr] = node
-
- # everything below these nodes is out of scope:
-
- def visit_GeneratorExpressionNode(self, node):
- pass
-
- def visit_LambdaNode(self, node):
- pass
-
- def visit_FuncDefNode(self, node):
- pass
-
-
-def _find_single_yield_expression(node):
- yield_statements = _find_yield_statements(node)
- if len(yield_statements) != 1:
- return None, None
- return yield_statements[0]
-
-
-def _find_yield_statements(node):
- collector = _YieldNodeCollector()
- collector.visitchildren(node)
- try:
- yield_statements = [
- (yield_node.arg, collector.yield_stat_nodes[yield_node])
- for yield_node in collector.yield_nodes
- ]
- except KeyError:
- # found YieldExprNode without ExprStatNode (i.e. a non-statement usage of 'yield')
- yield_statements = []
- return yield_statements
-
-
+
+class _YieldNodeCollector(Visitor.TreeVisitor):
+ """
+ YieldExprNode finder for generator expressions.
+ """
+ def __init__(self):
+ Visitor.TreeVisitor.__init__(self)
+ self.yield_stat_nodes = {}
+ self.yield_nodes = []
+
+ visit_Node = Visitor.TreeVisitor.visitchildren
+
+ def visit_YieldExprNode(self, node):
+ self.yield_nodes.append(node)
+ self.visitchildren(node)
+
+ def visit_ExprStatNode(self, node):
+ self.visitchildren(node)
+ if node.expr in self.yield_nodes:
+ self.yield_stat_nodes[node.expr] = node
+
+ # everything below these nodes is out of scope:
+
+ def visit_GeneratorExpressionNode(self, node):
+ pass
+
+ def visit_LambdaNode(self, node):
+ pass
+
+ def visit_FuncDefNode(self, node):
+ pass
+
+
+def _find_single_yield_expression(node):
+ yield_statements = _find_yield_statements(node)
+ if len(yield_statements) != 1:
+ return None, None
+ return yield_statements[0]
+
+
+def _find_yield_statements(node):
+ collector = _YieldNodeCollector()
+ collector.visitchildren(node)
+ try:
+ yield_statements = [
+ (yield_node.arg, collector.yield_stat_nodes[yield_node])
+ for yield_node in collector.yield_nodes
+ ]
+ except KeyError:
+ # found YieldExprNode without ExprStatNode (i.e. a non-statement usage of 'yield')
+ yield_statements = []
+ return yield_statements
+
+
class IterationTransform(Visitor.EnvTransform):
"""Transform some common for-in loop patterns into efficient C loops:
@@ -148,7 +148,7 @@ class IterationTransform(Visitor.EnvTransform):
pos = node.pos
result_ref = UtilNodes.ResultRefNode(node)
- if node.operand2.is_subscript:
+ if node.operand2.is_subscript:
base_type = node.operand2.base.type.base_type
else:
base_type = node.operand2.type.base_type
@@ -250,7 +250,7 @@ class IterationTransform(Visitor.EnvTransform):
if not is_safe_iter and method in ('keys', 'values', 'items'):
# try to reduce this to the corresponding .iter*() methods
- if isinstance(base_obj, ExprNodes.CallNode):
+ if isinstance(base_obj, ExprNodes.CallNode):
inner_function = base_obj.function
if (inner_function.is_name and inner_function.name == 'dict'
and inner_function.entry
@@ -391,7 +391,7 @@ class IterationTransform(Visitor.EnvTransform):
if slice_node.is_literal:
# try to reduce to byte iteration for plain Latin-1 strings
try:
- bytes_value = bytes_literal(slice_node.value.encode('latin1'), 'iso8859-1')
+ bytes_value = bytes_literal(slice_node.value.encode('latin1'), 'iso8859-1')
except UnicodeEncodeError:
pass
else:
@@ -400,8 +400,8 @@ class IterationTransform(Visitor.EnvTransform):
base=ExprNodes.BytesNode(
slice_node.pos, value=bytes_value,
constant_result=bytes_value,
- type=PyrexTypes.c_const_char_ptr_type).coerce_to(
- PyrexTypes.c_const_uchar_ptr_type, self.current_env()),
+ type=PyrexTypes.c_const_char_ptr_type).coerce_to(
+ PyrexTypes.c_const_uchar_ptr_type, self.current_env()),
start=None,
stop=ExprNodes.IntNode(
slice_node.pos, value=str(len(bytes_value)),
@@ -491,7 +491,7 @@ class IterationTransform(Visitor.EnvTransform):
error(slice_node.pos, "C array iteration requires known end index")
return node
- elif slice_node.is_subscript:
+ elif slice_node.is_subscript:
assert isinstance(slice_node.index, ExprNodes.SliceNode)
slice_base = slice_node.base
index = slice_node.index
@@ -499,7 +499,7 @@ class IterationTransform(Visitor.EnvTransform):
stop = filter_none_node(index.stop)
step = filter_none_node(index.step)
if step:
- if not isinstance(step.constant_result, _py_int_types) \
+ if not isinstance(step.constant_result, _py_int_types) \
or step.constant_result == 0 \
or step.constant_result > 0 and not stop \
or step.constant_result < 0 and not start:
@@ -733,19 +733,19 @@ class IterationTransform(Visitor.EnvTransform):
if len(args) < 3:
step_pos = range_function.pos
step_value = 1
- step = ExprNodes.IntNode(step_pos, value='1', constant_result=1)
+ step = ExprNodes.IntNode(step_pos, value='1', constant_result=1)
else:
step = args[2]
step_pos = step.pos
- if not isinstance(step.constant_result, _py_int_types):
+ if not isinstance(step.constant_result, _py_int_types):
# cannot determine step direction
return node
step_value = step.constant_result
if step_value == 0:
# will lead to an error elsewhere
return node
- step = ExprNodes.IntNode(step_pos, value=str(step_value),
- constant_result=step_value)
+ step = ExprNodes.IntNode(step_pos, value=str(step_value),
+ constant_result=step_value)
if len(args) == 1:
bound1 = ExprNodes.IntNode(range_function.pos, value='0',
@@ -757,34 +757,34 @@ class IterationTransform(Visitor.EnvTransform):
relation1, relation2 = self._find_for_from_node_relations(step_value < 0, reversed)
- bound2_ref_node = None
+ bound2_ref_node = None
if reversed:
bound1, bound2 = bound2, bound1
- abs_step = abs(step_value)
- if abs_step != 1:
- if (isinstance(bound1.constant_result, _py_int_types) and
- isinstance(bound2.constant_result, _py_int_types)):
- # calculate final bounds now
- if step_value < 0:
- begin_value = bound2.constant_result
- end_value = bound1.constant_result
- bound1_value = begin_value - abs_step * ((begin_value - end_value - 1) // abs_step) - 1
- else:
- begin_value = bound1.constant_result
- end_value = bound2.constant_result
- bound1_value = end_value + abs_step * ((begin_value - end_value - 1) // abs_step) + 1
-
- bound1 = ExprNodes.IntNode(
- bound1.pos, value=str(bound1_value), constant_result=bound1_value,
- type=PyrexTypes.spanning_type(bound1.type, bound2.type))
- else:
- # evaluate the same expression as above at runtime
- bound2_ref_node = UtilNodes.LetRefNode(bound2)
- bound1 = self._build_range_step_calculation(
- bound1, bound2_ref_node, step, step_value)
-
- if step_value < 0:
- step_value = -step_value
+ abs_step = abs(step_value)
+ if abs_step != 1:
+ if (isinstance(bound1.constant_result, _py_int_types) and
+ isinstance(bound2.constant_result, _py_int_types)):
+ # calculate final bounds now
+ if step_value < 0:
+ begin_value = bound2.constant_result
+ end_value = bound1.constant_result
+ bound1_value = begin_value - abs_step * ((begin_value - end_value - 1) // abs_step) - 1
+ else:
+ begin_value = bound1.constant_result
+ end_value = bound2.constant_result
+ bound1_value = end_value + abs_step * ((begin_value - end_value - 1) // abs_step) + 1
+
+ bound1 = ExprNodes.IntNode(
+ bound1.pos, value=str(bound1_value), constant_result=bound1_value,
+ type=PyrexTypes.spanning_type(bound1.type, bound2.type))
+ else:
+ # evaluate the same expression as above at runtime
+ bound2_ref_node = UtilNodes.LetRefNode(bound2)
+ bound1 = self._build_range_step_calculation(
+ bound1, bound2_ref_node, step, step_value)
+
+ if step_value < 0:
+ step_value = -step_value
step.value = str(step_value)
step.constant_result = step_value
step = step.coerce_to_integer(self.current_env())
@@ -792,7 +792,7 @@ class IterationTransform(Visitor.EnvTransform):
if not bound2.is_literal:
# stop bound must be immutable => keep it in a temp var
bound2_is_temp = True
- bound2 = bound2_ref_node or UtilNodes.LetRefNode(bound2)
+ bound2 = bound2_ref_node or UtilNodes.LetRefNode(bound2)
else:
bound2_is_temp = False
@@ -811,70 +811,70 @@ class IterationTransform(Visitor.EnvTransform):
return for_node
- def _build_range_step_calculation(self, bound1, bound2_ref_node, step, step_value):
- abs_step = abs(step_value)
- spanning_type = PyrexTypes.spanning_type(bound1.type, bound2_ref_node.type)
- if step.type.is_int and abs_step < 0x7FFF:
- # Avoid loss of integer precision warnings.
- spanning_step_type = PyrexTypes.spanning_type(spanning_type, PyrexTypes.c_int_type)
- else:
- spanning_step_type = PyrexTypes.spanning_type(spanning_type, step.type)
- if step_value < 0:
- begin_value = bound2_ref_node
- end_value = bound1
- final_op = '-'
- else:
- begin_value = bound1
- end_value = bound2_ref_node
- final_op = '+'
-
- step_calculation_node = ExprNodes.binop_node(
- bound1.pos,
- operand1=ExprNodes.binop_node(
- bound1.pos,
- operand1=bound2_ref_node,
- operator=final_op, # +/-
- operand2=ExprNodes.MulNode(
- bound1.pos,
- operand1=ExprNodes.IntNode(
- bound1.pos,
- value=str(abs_step),
- constant_result=abs_step,
- type=spanning_step_type),
- operator='*',
- operand2=ExprNodes.DivNode(
- bound1.pos,
- operand1=ExprNodes.SubNode(
- bound1.pos,
- operand1=ExprNodes.SubNode(
- bound1.pos,
- operand1=begin_value,
- operator='-',
- operand2=end_value,
- type=spanning_type),
- operator='-',
- operand2=ExprNodes.IntNode(
- bound1.pos,
- value='1',
- constant_result=1),
- type=spanning_step_type),
- operator='//',
- operand2=ExprNodes.IntNode(
- bound1.pos,
- value=str(abs_step),
- constant_result=abs_step,
- type=spanning_step_type),
- type=spanning_step_type),
- type=spanning_step_type),
- type=spanning_step_type),
- operator=final_op, # +/-
- operand2=ExprNodes.IntNode(
- bound1.pos,
- value='1',
- constant_result=1),
- type=spanning_type)
- return step_calculation_node
-
+ def _build_range_step_calculation(self, bound1, bound2_ref_node, step, step_value):
+ abs_step = abs(step_value)
+ spanning_type = PyrexTypes.spanning_type(bound1.type, bound2_ref_node.type)
+ if step.type.is_int and abs_step < 0x7FFF:
+ # Avoid loss of integer precision warnings.
+ spanning_step_type = PyrexTypes.spanning_type(spanning_type, PyrexTypes.c_int_type)
+ else:
+ spanning_step_type = PyrexTypes.spanning_type(spanning_type, step.type)
+ if step_value < 0:
+ begin_value = bound2_ref_node
+ end_value = bound1
+ final_op = '-'
+ else:
+ begin_value = bound1
+ end_value = bound2_ref_node
+ final_op = '+'
+
+ step_calculation_node = ExprNodes.binop_node(
+ bound1.pos,
+ operand1=ExprNodes.binop_node(
+ bound1.pos,
+ operand1=bound2_ref_node,
+ operator=final_op, # +/-
+ operand2=ExprNodes.MulNode(
+ bound1.pos,
+ operand1=ExprNodes.IntNode(
+ bound1.pos,
+ value=str(abs_step),
+ constant_result=abs_step,
+ type=spanning_step_type),
+ operator='*',
+ operand2=ExprNodes.DivNode(
+ bound1.pos,
+ operand1=ExprNodes.SubNode(
+ bound1.pos,
+ operand1=ExprNodes.SubNode(
+ bound1.pos,
+ operand1=begin_value,
+ operator='-',
+ operand2=end_value,
+ type=spanning_type),
+ operator='-',
+ operand2=ExprNodes.IntNode(
+ bound1.pos,
+ value='1',
+ constant_result=1),
+ type=spanning_step_type),
+ operator='//',
+ operand2=ExprNodes.IntNode(
+ bound1.pos,
+ value=str(abs_step),
+ constant_result=abs_step,
+ type=spanning_step_type),
+ type=spanning_step_type),
+ type=spanning_step_type),
+ type=spanning_step_type),
+ operator=final_op, # +/-
+ operand2=ExprNodes.IntNode(
+ bound1.pos,
+ value='1',
+ constant_result=1),
+ type=spanning_type)
+ return step_calculation_node
+
def _transform_dict_iteration(self, node, dict_obj, method, keys, values):
temps = []
temp = UtilNodes.TempHandle(PyrexTypes.py_object_type)
@@ -1192,9 +1192,9 @@ class SwitchTransform(Visitor.EnvTransform):
if common_var is None:
self.visitchildren(node)
return node
- cases.append(Nodes.SwitchCaseNode(pos=if_clause.pos,
- conditions=conditions,
- body=if_clause.body))
+ cases.append(Nodes.SwitchCaseNode(pos=if_clause.pos,
+ conditions=conditions,
+ body=if_clause.body))
condition_values = [
cond for case in cases for cond in case.conditions]
@@ -1205,16 +1205,16 @@ class SwitchTransform(Visitor.EnvTransform):
self.visitchildren(node)
return node
- # Recurse into body subtrees that we left untouched so far.
- self.visitchildren(node, 'else_clause')
- for case in cases:
- self.visitchildren(case, 'body')
-
+ # Recurse into body subtrees that we left untouched so far.
+ self.visitchildren(node, 'else_clause')
+ for case in cases:
+ self.visitchildren(case, 'body')
+
common_var = unwrap_node(common_var)
- switch_node = Nodes.SwitchStatNode(pos=node.pos,
- test=common_var,
- cases=cases,
- else_clause=node.else_clause)
+ switch_node = Nodes.SwitchStatNode(pos=node.pos,
+ test=common_var,
+ cases=cases,
+ else_clause=node.else_clause)
return switch_node
def visit_CondExprNode(self, node):
@@ -1225,11 +1225,11 @@ class SwitchTransform(Visitor.EnvTransform):
not_in, common_var, conditions = self.extract_common_conditions(
None, node.test, True)
if common_var is None \
- or len(conditions) < 2 \
- or self.has_duplicate_values(conditions):
+ or len(conditions) < 2 \
+ or self.has_duplicate_values(conditions):
self.visitchildren(node)
return node
-
+
return self.build_simple_switch_statement(
node, common_var, conditions, not_in,
node.true_val, node.false_val)
@@ -1242,8 +1242,8 @@ class SwitchTransform(Visitor.EnvTransform):
not_in, common_var, conditions = self.extract_common_conditions(
None, node, True)
if common_var is None \
- or len(conditions) < 2 \
- or self.has_duplicate_values(conditions):
+ or len(conditions) < 2 \
+ or self.has_duplicate_values(conditions):
self.visitchildren(node)
node.wrap_operands(self.current_env()) # in case we changed the operands
return node
@@ -1261,8 +1261,8 @@ class SwitchTransform(Visitor.EnvTransform):
not_in, common_var, conditions = self.extract_common_conditions(
None, node, True)
if common_var is None \
- or len(conditions) < 2 \
- or self.has_duplicate_values(conditions):
+ or len(conditions) < 2 \
+ or self.has_duplicate_values(conditions):
self.visitchildren(node)
return node
@@ -1477,20 +1477,20 @@ class DropRefcountingTransform(Visitor.VisitorTransform):
node = node.arg
name_path = []
obj_node = node
- while obj_node.is_attribute:
+ while obj_node.is_attribute:
if obj_node.is_py_attr:
return False
name_path.append(obj_node.member)
obj_node = obj_node.obj
- if obj_node.is_name:
+ if obj_node.is_name:
name_path.append(obj_node.name)
names.append( ('.'.join(name_path[::-1]), node) )
- elif node.is_subscript:
+ elif node.is_subscript:
if node.base.type != Builtin.list_type:
return False
if not node.index.type.is_int:
return False
- if not node.base.is_name:
+ if not node.base.is_name:
return False
indices.append(node)
else:
@@ -1618,60 +1618,60 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
stop=stop,
step=step or ExprNodes.NoneNode(node.pos))
- def _handle_simple_function_ord(self, node, pos_args):
- """Unpack ord('X').
- """
- if len(pos_args) != 1:
- return node
- arg = pos_args[0]
- if isinstance(arg, (ExprNodes.UnicodeNode, ExprNodes.BytesNode)):
- if len(arg.value) == 1:
- return ExprNodes.IntNode(
- arg.pos, type=PyrexTypes.c_long_type,
- value=str(ord(arg.value)),
- constant_result=ord(arg.value)
- )
- elif isinstance(arg, ExprNodes.StringNode):
- if arg.unicode_value and len(arg.unicode_value) == 1 \
- and ord(arg.unicode_value) <= 255: # Py2/3 portability
- return ExprNodes.IntNode(
- arg.pos, type=PyrexTypes.c_int_type,
- value=str(ord(arg.unicode_value)),
- constant_result=ord(arg.unicode_value)
- )
- return node
-
- # sequence processing
+ def _handle_simple_function_ord(self, node, pos_args):
+ """Unpack ord('X').
+ """
+ if len(pos_args) != 1:
+ return node
+ arg = pos_args[0]
+ if isinstance(arg, (ExprNodes.UnicodeNode, ExprNodes.BytesNode)):
+ if len(arg.value) == 1:
+ return ExprNodes.IntNode(
+ arg.pos, type=PyrexTypes.c_long_type,
+ value=str(ord(arg.value)),
+ constant_result=ord(arg.value)
+ )
+ elif isinstance(arg, ExprNodes.StringNode):
+ if arg.unicode_value and len(arg.unicode_value) == 1 \
+ and ord(arg.unicode_value) <= 255: # Py2/3 portability
+ return ExprNodes.IntNode(
+ arg.pos, type=PyrexTypes.c_int_type,
+ value=str(ord(arg.unicode_value)),
+ constant_result=ord(arg.unicode_value)
+ )
+ return node
+
+ # sequence processing
def _handle_simple_function_all(self, node, pos_args):
"""Transform
- _result = all(p(x) for L in LL for x in L)
+ _result = all(p(x) for L in LL for x in L)
into
for L in LL:
for x in L:
- if not p(x):
- return False
+ if not p(x):
+ return False
else:
- return True
+ return True
"""
return self._transform_any_all(node, pos_args, False)
def _handle_simple_function_any(self, node, pos_args):
"""Transform
- _result = any(p(x) for L in LL for x in L)
+ _result = any(p(x) for L in LL for x in L)
into
for L in LL:
for x in L:
- if p(x):
- return True
+ if p(x):
+ return True
else:
- return False
+ return False
"""
return self._transform_any_all(node, pos_args, True)
@@ -1681,40 +1681,40 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
if not isinstance(pos_args[0], ExprNodes.GeneratorExpressionNode):
return node
gen_expr_node = pos_args[0]
- generator_body = gen_expr_node.def_node.gbody
- loop_node = generator_body.body
- yield_expression, yield_stat_node = _find_single_yield_expression(loop_node)
+ generator_body = gen_expr_node.def_node.gbody
+ loop_node = generator_body.body
+ yield_expression, yield_stat_node = _find_single_yield_expression(loop_node)
if yield_expression is None:
return node
if is_any:
condition = yield_expression
else:
- condition = ExprNodes.NotNode(yield_expression.pos, operand=yield_expression)
+ condition = ExprNodes.NotNode(yield_expression.pos, operand=yield_expression)
test_node = Nodes.IfStatNode(
- yield_expression.pos, else_clause=None, if_clauses=[
- Nodes.IfClauseNode(
- yield_expression.pos,
- condition=condition,
- body=Nodes.ReturnStatNode(
- node.pos,
- value=ExprNodes.BoolNode(yield_expression.pos, value=is_any, constant_result=is_any))
- )]
- )
- loop_node.else_clause = Nodes.ReturnStatNode(
+ yield_expression.pos, else_clause=None, if_clauses=[
+ Nodes.IfClauseNode(
+ yield_expression.pos,
+ condition=condition,
+ body=Nodes.ReturnStatNode(
+ node.pos,
+ value=ExprNodes.BoolNode(yield_expression.pos, value=is_any, constant_result=is_any))
+ )]
+ )
+ loop_node.else_clause = Nodes.ReturnStatNode(
node.pos,
- value=ExprNodes.BoolNode(yield_expression.pos, value=not is_any, constant_result=not is_any))
+ value=ExprNodes.BoolNode(yield_expression.pos, value=not is_any, constant_result=not is_any))
- Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, test_node)
+ Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, test_node)
return ExprNodes.InlinedGeneratorExpressionNode(
- gen_expr_node.pos, gen=gen_expr_node, orig_func='any' if is_any else 'all')
-
- PySequence_List_func_type = PyrexTypes.CFuncType(
- Builtin.list_type,
- [PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None)])
+ gen_expr_node.pos, gen=gen_expr_node, orig_func='any' if is_any else 'all')
+ PySequence_List_func_type = PyrexTypes.CFuncType(
+ Builtin.list_type,
+ [PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None)])
+
def _handle_simple_function_sorted(self, node, pos_args):
"""Transform sorted(genexpr) and sorted([listcomp]) into
[listcomp].sort(). CPython just reads the iterable into a
@@ -1724,62 +1724,62 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
"""
if len(pos_args) != 1:
return node
-
- arg = pos_args[0]
- if isinstance(arg, ExprNodes.ComprehensionNode) and arg.type is Builtin.list_type:
- list_node = pos_args[0]
- loop_node = list_node.loop
-
- elif isinstance(arg, ExprNodes.GeneratorExpressionNode):
- gen_expr_node = arg
+
+ arg = pos_args[0]
+ if isinstance(arg, ExprNodes.ComprehensionNode) and arg.type is Builtin.list_type:
+ list_node = pos_args[0]
+ loop_node = list_node.loop
+
+ elif isinstance(arg, ExprNodes.GeneratorExpressionNode):
+ gen_expr_node = arg
loop_node = gen_expr_node.loop
- yield_statements = _find_yield_statements(loop_node)
- if not yield_statements:
+ yield_statements = _find_yield_statements(loop_node)
+ if not yield_statements:
return node
- list_node = ExprNodes.InlinedGeneratorExpressionNode(
- node.pos, gen_expr_node, orig_func='sorted',
- comprehension_type=Builtin.list_type)
-
- for yield_expression, yield_stat_node in yield_statements:
- append_node = ExprNodes.ComprehensionAppendNode(
- yield_expression.pos,
- expr=yield_expression,
- target=list_node.target)
- Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, append_node)
-
- elif arg.is_sequence_constructor:
- # sorted([a, b, c]) or sorted((a, b, c)). The result is always a list,
- # so starting off with a fresh one is more efficient.
- list_node = loop_node = arg.as_list()
-
+ list_node = ExprNodes.InlinedGeneratorExpressionNode(
+ node.pos, gen_expr_node, orig_func='sorted',
+ comprehension_type=Builtin.list_type)
+
+ for yield_expression, yield_stat_node in yield_statements:
+ append_node = ExprNodes.ComprehensionAppendNode(
+ yield_expression.pos,
+ expr=yield_expression,
+ target=list_node.target)
+ Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, append_node)
+
+ elif arg.is_sequence_constructor:
+ # sorted([a, b, c]) or sorted((a, b, c)). The result is always a list,
+ # so starting off with a fresh one is more efficient.
+ list_node = loop_node = arg.as_list()
+
else:
- # Interestingly, PySequence_List works on a lot of non-sequence
- # things as well.
- list_node = loop_node = ExprNodes.PythonCapiCallNode(
- node.pos, "PySequence_List", self.PySequence_List_func_type,
- args=pos_args, is_temp=True)
+ # Interestingly, PySequence_List works on a lot of non-sequence
+ # things as well.
+ list_node = loop_node = ExprNodes.PythonCapiCallNode(
+ node.pos, "PySequence_List", self.PySequence_List_func_type,
+ args=pos_args, is_temp=True)
result_node = UtilNodes.ResultRefNode(
- pos=loop_node.pos, type=Builtin.list_type, may_hold_none=False)
- list_assign_node = Nodes.SingleAssignmentNode(
- node.pos, lhs=result_node, rhs=list_node, first=True)
+ pos=loop_node.pos, type=Builtin.list_type, may_hold_none=False)
+ list_assign_node = Nodes.SingleAssignmentNode(
+ node.pos, lhs=result_node, rhs=list_node, first=True)
sort_method = ExprNodes.AttributeNode(
- node.pos, obj=result_node, attribute=EncodedString('sort'),
+ node.pos, obj=result_node, attribute=EncodedString('sort'),
# entry ? type ?
- needs_none_check=False)
+ needs_none_check=False)
sort_node = Nodes.ExprStatNode(
- node.pos, expr=ExprNodes.SimpleCallNode(
- node.pos, function=sort_method, args=[]))
+ node.pos, expr=ExprNodes.SimpleCallNode(
+ node.pos, function=sort_method, args=[]))
sort_node.analyse_declarations(self.current_env())
return UtilNodes.TempResultFromStatNode(
result_node,
- Nodes.StatListNode(node.pos, stats=[list_assign_node, sort_node]))
+ Nodes.StatListNode(node.pos, stats=[list_assign_node, sort_node]))
- def __handle_simple_function_sum(self, node, pos_args):
+ def __handle_simple_function_sum(self, node, pos_args):
"""Transform sum(genexpr) into an equivalent inlined aggregation loop.
"""
if len(pos_args) not in (1,2):
@@ -1791,12 +1791,12 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
loop_node = gen_expr_node.loop
if isinstance(gen_expr_node, ExprNodes.GeneratorExpressionNode):
- yield_expression, yield_stat_node = _find_single_yield_expression(loop_node)
- # FIXME: currently nonfunctional
- yield_expression = None
+ yield_expression, yield_stat_node = _find_single_yield_expression(loop_node)
+ # FIXME: currently nonfunctional
+ yield_expression = None
if yield_expression is None:
return node
- else: # ComprehensionNode
+ else: # ComprehensionNode
yield_stat_node = gen_expr_node.append
yield_expression = yield_stat_node.expr
try:
@@ -1819,7 +1819,7 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
rhs = ExprNodes.binop_node(node.pos, '+', result_ref, yield_expression)
)
- Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, add_node)
+ Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, add_node)
exec_code = Nodes.StatListNode(
node.pos,
@@ -1849,7 +1849,7 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
if len(args) <= 1:
if len(args) == 1 and args[0].is_sequence_constructor:
args = args[0].args
- if len(args) <= 1:
+ if len(args) <= 1:
# leave this to Python
return node
@@ -1876,8 +1876,8 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
return last_result
- # builtin type creation
-
+ # builtin type creation
+
def _DISABLED_handle_simple_function_tuple(self, node, pos_args):
if not pos_args:
return ExprNodes.TupleNode(node.pos, args=[], constant_result=())
@@ -1915,7 +1915,7 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
return self._transform_list_set_genexpr(node, pos_args, Builtin.set_type)
def _transform_list_set_genexpr(self, node, pos_args, target_type):
- """Replace set(genexpr) and list(genexpr) by an inlined comprehension.
+ """Replace set(genexpr) and list(genexpr) by an inlined comprehension.
"""
if len(pos_args) > 1:
return node
@@ -1924,26 +1924,26 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
gen_expr_node = pos_args[0]
loop_node = gen_expr_node.loop
- yield_statements = _find_yield_statements(loop_node)
- if not yield_statements:
+ yield_statements = _find_yield_statements(loop_node)
+ if not yield_statements:
return node
- result_node = ExprNodes.InlinedGeneratorExpressionNode(
- node.pos, gen_expr_node,
- orig_func='set' if target_type is Builtin.set_type else 'list',
- comprehension_type=target_type)
+ result_node = ExprNodes.InlinedGeneratorExpressionNode(
+ node.pos, gen_expr_node,
+ orig_func='set' if target_type is Builtin.set_type else 'list',
+ comprehension_type=target_type)
+
+ for yield_expression, yield_stat_node in yield_statements:
+ append_node = ExprNodes.ComprehensionAppendNode(
+ yield_expression.pos,
+ expr=yield_expression,
+ target=result_node.target)
+ Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, append_node)
- for yield_expression, yield_stat_node in yield_statements:
- append_node = ExprNodes.ComprehensionAppendNode(
- yield_expression.pos,
- expr=yield_expression,
- target=result_node.target)
- Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, append_node)
-
- return result_node
+ return result_node
def _handle_simple_function_dict(self, node, pos_args):
- """Replace dict( (a,b) for ... ) by an inlined { a:b for ... }
+ """Replace dict( (a,b) for ... ) by an inlined { a:b for ... }
"""
if len(pos_args) == 0:
return ExprNodes.DictNode(node.pos, key_value_pairs=[], constant_result={})
@@ -1954,29 +1954,29 @@ class EarlyReplaceBuiltinCalls(Visitor.EnvTransform):
gen_expr_node = pos_args[0]
loop_node = gen_expr_node.loop
- yield_statements = _find_yield_statements(loop_node)
- if not yield_statements:
+ yield_statements = _find_yield_statements(loop_node)
+ if not yield_statements:
return node
- for yield_expression, _ in yield_statements:
- if not isinstance(yield_expression, ExprNodes.TupleNode):
- return node
- if len(yield_expression.args) != 2:
- return node
-
- result_node = ExprNodes.InlinedGeneratorExpressionNode(
- node.pos, gen_expr_node, orig_func='dict',
- comprehension_type=Builtin.dict_type)
+ for yield_expression, _ in yield_statements:
+ if not isinstance(yield_expression, ExprNodes.TupleNode):
+ return node
+ if len(yield_expression.args) != 2:
+ return node
- for yield_expression, yield_stat_node in yield_statements:
- append_node = ExprNodes.DictComprehensionAppendNode(
- yield_expression.pos,
- key_expr=yield_expression.args[0],
- value_expr=yield_expression.args[1],
- target=result_node.target)
- Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, append_node)
+ result_node = ExprNodes.InlinedGeneratorExpressionNode(
+ node.pos, gen_expr_node, orig_func='dict',
+ comprehension_type=Builtin.dict_type)
+
+ for yield_expression, yield_stat_node in yield_statements:
+ append_node = ExprNodes.DictComprehensionAppendNode(
+ yield_expression.pos,
+ key_expr=yield_expression.args[0],
+ value_expr=yield_expression.args[1],
+ target=result_node.target)
+ Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, append_node)
- return result_node
+ return result_node
# specific handlers for general call nodes
@@ -2024,8 +2024,8 @@ class InlineDefNodeCalls(Visitor.NodeRefCleanupMixin, Visitor.EnvTransform):
return node
-class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
- Visitor.MethodDispatcherTransform):
+class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
+ Visitor.MethodDispatcherTransform):
"""Optimize some common methods calls and instantiation patterns
for builtin types *after* the type analysis phase.
@@ -2080,33 +2080,33 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
return arg.arg.coerce_to_boolean(self.current_env())
return node
- PyNumber_Float_func_type = PyrexTypes.CFuncType(
- PyrexTypes.py_object_type, [
- PyrexTypes.CFuncTypeArg("o", PyrexTypes.py_object_type, None)
- ])
-
- def visit_CoerceToPyTypeNode(self, node):
- """Drop redundant conversion nodes after tree changes."""
- self.visitchildren(node)
- arg = node.arg
- if isinstance(arg, ExprNodes.CoerceFromPyTypeNode):
- arg = arg.arg
- if isinstance(arg, ExprNodes.PythonCapiCallNode):
- if arg.function.name == 'float' and len(arg.args) == 1:
- # undo redundant Py->C->Py coercion
- func_arg = arg.args[0]
- if func_arg.type is Builtin.float_type:
- return func_arg.as_none_safe_node("float() argument must be a string or a number, not 'NoneType'")
- elif func_arg.type.is_pyobject:
- return ExprNodes.PythonCapiCallNode(
- node.pos, '__Pyx_PyNumber_Float', self.PyNumber_Float_func_type,
- args=[func_arg],
- py_name='float',
- is_temp=node.is_temp,
- result_is_used=node.result_is_used,
- ).coerce_to(node.type, self.current_env())
- return node
-
+ PyNumber_Float_func_type = PyrexTypes.CFuncType(
+ PyrexTypes.py_object_type, [
+ PyrexTypes.CFuncTypeArg("o", PyrexTypes.py_object_type, None)
+ ])
+
+ def visit_CoerceToPyTypeNode(self, node):
+ """Drop redundant conversion nodes after tree changes."""
+ self.visitchildren(node)
+ arg = node.arg
+ if isinstance(arg, ExprNodes.CoerceFromPyTypeNode):
+ arg = arg.arg
+ if isinstance(arg, ExprNodes.PythonCapiCallNode):
+ if arg.function.name == 'float' and len(arg.args) == 1:
+ # undo redundant Py->C->Py coercion
+ func_arg = arg.args[0]
+ if func_arg.type is Builtin.float_type:
+ return func_arg.as_none_safe_node("float() argument must be a string or a number, not 'NoneType'")
+ elif func_arg.type.is_pyobject:
+ return ExprNodes.PythonCapiCallNode(
+ node.pos, '__Pyx_PyNumber_Float', self.PyNumber_Float_func_type,
+ args=[func_arg],
+ py_name='float',
+ is_temp=node.is_temp,
+ result_is_used=node.result_is_used,
+ ).coerce_to(node.type, self.current_env())
+ return node
+
def visit_CoerceFromPyTypeNode(self, node):
"""Drop redundant conversion nodes after tree changes.
@@ -2118,9 +2118,9 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
arg = node.arg
if not arg.type.is_pyobject:
# no Python conversion left at all, just do a C coercion instead
- if node.type != arg.type:
- arg = arg.coerce_to(node.type, self.current_env())
- return arg
+ if node.type != arg.type:
+ arg = arg.coerce_to(node.type, self.current_env())
+ return arg
if isinstance(arg, ExprNodes.PyTypeTestNode):
arg = arg.arg
if arg.is_literal:
@@ -2133,13 +2133,13 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
if node.type.assignable_from(arg.arg.type):
# completely redundant C->Py->C coercion
return arg.arg.coerce_to(node.type, self.current_env())
- elif arg.type is Builtin.unicode_type:
- if arg.arg.type.is_unicode_char and node.type.is_unicode_char:
- return arg.arg.coerce_to(node.type, self.current_env())
+ elif arg.type is Builtin.unicode_type:
+ if arg.arg.type.is_unicode_char and node.type.is_unicode_char:
+ return arg.arg.coerce_to(node.type, self.current_env())
elif isinstance(arg, ExprNodes.SimpleCallNode):
if node.type.is_int or node.type.is_float:
return self._optimise_numeric_cast_call(node, arg)
- elif arg.is_subscript:
+ elif arg.is_subscript:
index_node = arg.index
if isinstance(index_node, ExprNodes.CoerceToPyTypeNode):
index_node = index_node.arg
@@ -2181,51 +2181,51 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
return node
return coerce_node
- float_float_func_types = dict(
- (float_type, PyrexTypes.CFuncType(
- float_type, [
- PyrexTypes.CFuncTypeArg("arg", float_type, None)
- ]))
- for float_type in (PyrexTypes.c_float_type, PyrexTypes.c_double_type, PyrexTypes.c_longdouble_type))
-
+ float_float_func_types = dict(
+ (float_type, PyrexTypes.CFuncType(
+ float_type, [
+ PyrexTypes.CFuncTypeArg("arg", float_type, None)
+ ]))
+ for float_type in (PyrexTypes.c_float_type, PyrexTypes.c_double_type, PyrexTypes.c_longdouble_type))
+
def _optimise_numeric_cast_call(self, node, arg):
function = arg.function
- args = None
- if isinstance(arg, ExprNodes.PythonCapiCallNode):
- args = arg.args
- elif isinstance(function, ExprNodes.NameNode):
- if function.type.is_builtin_type and isinstance(arg.arg_tuple, ExprNodes.TupleNode):
- args = arg.arg_tuple.args
-
- if args is None or len(args) != 1:
+ args = None
+ if isinstance(arg, ExprNodes.PythonCapiCallNode):
+ args = arg.args
+ elif isinstance(function, ExprNodes.NameNode):
+ if function.type.is_builtin_type and isinstance(arg.arg_tuple, ExprNodes.TupleNode):
+ args = arg.arg_tuple.args
+
+ if args is None or len(args) != 1:
return node
func_arg = args[0]
if isinstance(func_arg, ExprNodes.CoerceToPyTypeNode):
func_arg = func_arg.arg
elif func_arg.type.is_pyobject:
- # play it safe: Python conversion might work on all sorts of things
+ # play it safe: Python conversion might work on all sorts of things
return node
-
+
if function.name == 'int':
if func_arg.type.is_int or node.type.is_int:
if func_arg.type == node.type:
return func_arg
elif node.type.assignable_from(func_arg.type) or func_arg.type.is_float:
- return ExprNodes.TypecastNode(node.pos, operand=func_arg, type=node.type)
- elif func_arg.type.is_float and node.type.is_numeric:
- if func_arg.type.math_h_modifier == 'l':
- # Work around missing Cygwin definition.
- truncl = '__Pyx_truncl'
- else:
- truncl = 'trunc' + func_arg.type.math_h_modifier
- return ExprNodes.PythonCapiCallNode(
- node.pos, truncl,
- func_type=self.float_float_func_types[func_arg.type],
- args=[func_arg],
- py_name='int',
- is_temp=node.is_temp,
- result_is_used=node.result_is_used,
- ).coerce_to(node.type, self.current_env())
+ return ExprNodes.TypecastNode(node.pos, operand=func_arg, type=node.type)
+ elif func_arg.type.is_float and node.type.is_numeric:
+ if func_arg.type.math_h_modifier == 'l':
+ # Work around missing Cygwin definition.
+ truncl = '__Pyx_truncl'
+ else:
+ truncl = 'trunc' + func_arg.type.math_h_modifier
+ return ExprNodes.PythonCapiCallNode(
+ node.pos, truncl,
+ func_type=self.float_float_func_types[func_arg.type],
+ args=[func_arg],
+ py_name='int',
+ is_temp=node.is_temp,
+ result_is_used=node.result_is_used,
+ ).coerce_to(node.type, self.current_env())
elif function.name == 'float':
if func_arg.type.is_float or node.type.is_float:
if func_arg.type == node.type:
@@ -2281,7 +2281,7 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
entry=type_entry,
type=type_entry.type),
attribute=attr_name,
- is_called=True).analyse_as_type_attribute(self.current_env())
+ is_called=True).analyse_as_type_attribute(self.current_env())
if method is None:
return self._optimise_generic_builtin_method_call(
node, attr_name, function, arg_list, is_unbound_method)
@@ -2376,41 +2376,41 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
)
return node
- PySequence_List_func_type = PyrexTypes.CFuncType(
- Builtin.list_type,
- [PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None)])
-
- def _handle_simple_function_list(self, node, function, pos_args):
- """Turn list(ob) into PySequence_List(ob).
- """
- if len(pos_args) != 1:
- return node
- arg = pos_args[0]
- return ExprNodes.PythonCapiCallNode(
- node.pos, "PySequence_List", self.PySequence_List_func_type,
- args=pos_args, is_temp=node.is_temp)
-
+ PySequence_List_func_type = PyrexTypes.CFuncType(
+ Builtin.list_type,
+ [PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None)])
+
+ def _handle_simple_function_list(self, node, function, pos_args):
+ """Turn list(ob) into PySequence_List(ob).
+ """
+ if len(pos_args) != 1:
+ return node
+ arg = pos_args[0]
+ return ExprNodes.PythonCapiCallNode(
+ node.pos, "PySequence_List", self.PySequence_List_func_type,
+ args=pos_args, is_temp=node.is_temp)
+
PyList_AsTuple_func_type = PyrexTypes.CFuncType(
Builtin.tuple_type, [
PyrexTypes.CFuncTypeArg("list", Builtin.list_type, None)
])
def _handle_simple_function_tuple(self, node, function, pos_args):
- """Replace tuple([...]) by PyList_AsTuple or PySequence_Tuple.
+ """Replace tuple([...]) by PyList_AsTuple or PySequence_Tuple.
"""
if len(pos_args) != 1 or not node.is_temp:
return node
arg = pos_args[0]
if arg.type is Builtin.tuple_type and not arg.may_be_none():
return arg
- if arg.type is Builtin.list_type:
- pos_args[0] = arg.as_none_safe_node(
- "'NoneType' object is not iterable")
-
- return ExprNodes.PythonCapiCallNode(
- node.pos, "PyList_AsTuple", self.PyList_AsTuple_func_type,
- args=pos_args, is_temp=node.is_temp)
- else:
+ if arg.type is Builtin.list_type:
+ pos_args[0] = arg.as_none_safe_node(
+ "'NoneType' object is not iterable")
+
+ return ExprNodes.PythonCapiCallNode(
+ node.pos, "PyList_AsTuple", self.PyList_AsTuple_func_type,
+ args=pos_args, is_temp=node.is_temp)
+ else:
return ExprNodes.AsTupleNode(node.pos, arg=arg, type=Builtin.tuple_type)
PySet_New_func_type = PyrexTypes.CFuncType(
@@ -2435,18 +2435,18 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
temps.append(arg)
args.append(arg)
result = ExprNodes.SetNode(node.pos, is_temp=1, args=args)
- self.replace(node, result)
+ self.replace(node, result)
for temp in temps[::-1]:
result = UtilNodes.EvalWithTempExprNode(temp, result)
return result
else:
# PySet_New(it) is better than a generic Python call to set(it)
- return self.replace(node, ExprNodes.PythonCapiCallNode(
+ return self.replace(node, ExprNodes.PythonCapiCallNode(
node.pos, "PySet_New",
self.PySet_New_func_type,
args=pos_args,
is_temp=node.is_temp,
- py_name="set"))
+ py_name="set"))
PyFrozenSet_New_func_type = PyrexTypes.CFuncType(
Builtin.frozenset_type, [
@@ -2510,11 +2510,11 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
PyrexTypes.CFuncTypeArg("o", PyrexTypes.py_object_type, None)
])
- PyInt_FromDouble_func_type = PyrexTypes.CFuncType(
- PyrexTypes.py_object_type, [
- PyrexTypes.CFuncTypeArg("value", PyrexTypes.c_double_type, None)
- ])
-
+ PyInt_FromDouble_func_type = PyrexTypes.CFuncType(
+ PyrexTypes.py_object_type, [
+ PyrexTypes.CFuncTypeArg("value", PyrexTypes.c_double_type, None)
+ ])
+
def _handle_simple_function_int(self, node, function, pos_args):
"""Transform int() into a faster C function call.
"""
@@ -2525,17 +2525,17 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
return node # int(x, base)
func_arg = pos_args[0]
if isinstance(func_arg, ExprNodes.CoerceToPyTypeNode):
- if func_arg.arg.type.is_float:
- return ExprNodes.PythonCapiCallNode(
- node.pos, "__Pyx_PyInt_FromDouble", self.PyInt_FromDouble_func_type,
- args=[func_arg.arg], is_temp=True, py_name='int',
- utility_code=UtilityCode.load_cached("PyIntFromDouble", "TypeConversion.c"))
- else:
- return node # handled in visit_CoerceFromPyTypeNode()
+ if func_arg.arg.type.is_float:
+ return ExprNodes.PythonCapiCallNode(
+ node.pos, "__Pyx_PyInt_FromDouble", self.PyInt_FromDouble_func_type,
+ args=[func_arg.arg], is_temp=True, py_name='int',
+ utility_code=UtilityCode.load_cached("PyIntFromDouble", "TypeConversion.c"))
+ else:
+ return node # handled in visit_CoerceFromPyTypeNode()
if func_arg.type.is_pyobject and node.type.is_pyobject:
return ExprNodes.PythonCapiCallNode(
- node.pos, "__Pyx_PyNumber_Int", self.PyNumber_Int_func_type,
- args=pos_args, is_temp=True, py_name='int')
+ node.pos, "__Pyx_PyNumber_Int", self.PyNumber_Int_func_type,
+ args=pos_args, is_temp=True, py_name='int')
return node
def _handle_simple_function_bool(self, node, function, pos_args):
@@ -2560,30 +2560,30 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
Pyx_strlen_func_type = PyrexTypes.CFuncType(
PyrexTypes.c_size_t_type, [
- PyrexTypes.CFuncTypeArg("bytes", PyrexTypes.c_const_char_ptr_type, None)
- ])
+ PyrexTypes.CFuncTypeArg("bytes", PyrexTypes.c_const_char_ptr_type, None)
+ ])
Pyx_Py_UNICODE_strlen_func_type = PyrexTypes.CFuncType(
PyrexTypes.c_size_t_type, [
- PyrexTypes.CFuncTypeArg("unicode", PyrexTypes.c_const_py_unicode_ptr_type, None)
- ])
+ PyrexTypes.CFuncTypeArg("unicode", PyrexTypes.c_const_py_unicode_ptr_type, None)
+ ])
PyObject_Size_func_type = PyrexTypes.CFuncType(
PyrexTypes.c_py_ssize_t_type, [
PyrexTypes.CFuncTypeArg("obj", PyrexTypes.py_object_type, None)
- ],
+ ],
exception_value="-1")
_map_to_capi_len_function = {
- Builtin.unicode_type: "__Pyx_PyUnicode_GET_LENGTH",
- Builtin.bytes_type: "PyBytes_GET_SIZE",
+ Builtin.unicode_type: "__Pyx_PyUnicode_GET_LENGTH",
+ Builtin.bytes_type: "PyBytes_GET_SIZE",
Builtin.bytearray_type: 'PyByteArray_GET_SIZE',
- Builtin.list_type: "PyList_GET_SIZE",
- Builtin.tuple_type: "PyTuple_GET_SIZE",
- Builtin.set_type: "PySet_GET_SIZE",
- Builtin.frozenset_type: "PySet_GET_SIZE",
- Builtin.dict_type: "PyDict_Size",
- }.get
+ Builtin.list_type: "PyList_GET_SIZE",
+ Builtin.tuple_type: "PyTuple_GET_SIZE",
+ Builtin.set_type: "PySet_GET_SIZE",
+ Builtin.frozenset_type: "PySet_GET_SIZE",
+ Builtin.dict_type: "PyDict_Size",
+ }.get
_ext_types_with_pysize = set(["cpython.array.array"])
@@ -2668,14 +2668,14 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
if len(pos_args) != 2:
return node
arg, types = pos_args
- temps = []
+ temps = []
if isinstance(types, ExprNodes.TupleNode):
types = types.args
- if len(types) == 1 and not types[0].type is Builtin.type_type:
- return node # nothing to improve here
+ if len(types) == 1 and not types[0].type is Builtin.type_type:
+ return node # nothing to improve here
if arg.is_attribute or not arg.is_simple():
- arg = UtilNodes.ResultRefNode(arg)
- temps.append(arg)
+ arg = UtilNodes.ResultRefNode(arg)
+ temps.append(arg)
elif types.type is Builtin.type_type:
types = [types]
else:
@@ -2706,17 +2706,17 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
type_check_function = '__Pyx_TypeCheck'
type_check_args = [arg, test_type_node]
else:
- if not test_type_node.is_literal:
- test_type_node = UtilNodes.ResultRefNode(test_type_node)
- temps.append(test_type_node)
- type_check_function = 'PyObject_IsInstance'
- type_check_args = [arg, test_type_node]
+ if not test_type_node.is_literal:
+ test_type_node = UtilNodes.ResultRefNode(test_type_node)
+ temps.append(test_type_node)
+ type_check_function = 'PyObject_IsInstance'
+ type_check_args = [arg, test_type_node]
test_nodes.append(
ExprNodes.PythonCapiCallNode(
test_type_node.pos, type_check_function, self.Py_type_check_func_type,
- args=type_check_args,
- is_temp=True,
- ))
+ args=type_check_args,
+ is_temp=True,
+ ))
def join_with_or(a, b, make_binop_node=ExprNodes.binop_node):
or_node = make_binop_node(node.pos, 'or', a, b)
@@ -2725,7 +2725,7 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
return or_node
test_node = reduce(join_with_or, test_nodes).coerce_to(node.type, env)
- for temp in temps[::-1]:
+ for temp in temps[::-1]:
test_node = UtilNodes.EvalWithTempExprNode(temp, test_node)
return test_node
@@ -2738,7 +2738,7 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
if isinstance(arg, ExprNodes.CoerceToPyTypeNode):
if arg.arg.type.is_unicode_char:
return ExprNodes.TypecastNode(
- arg.pos, operand=arg.arg, type=PyrexTypes.c_long_type
+ arg.pos, operand=arg.arg, type=PyrexTypes.c_long_type
).coerce_to(node.type, self.current_env())
elif isinstance(arg, ExprNodes.UnicodeNode):
if len(arg.value) == 1:
@@ -2990,8 +2990,8 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
PyObject_PopIndex_func_type = PyrexTypes.CFuncType(
PyrexTypes.py_object_type, [
PyrexTypes.CFuncTypeArg("list", PyrexTypes.py_object_type, None),
- PyrexTypes.CFuncTypeArg("py_index", PyrexTypes.py_object_type, None),
- PyrexTypes.CFuncTypeArg("c_index", PyrexTypes.c_py_ssize_t_type, None),
+ PyrexTypes.CFuncTypeArg("py_index", PyrexTypes.py_object_type, None),
+ PyrexTypes.CFuncTypeArg("c_index", PyrexTypes.c_py_ssize_t_type, None),
PyrexTypes.CFuncTypeArg("is_signed", PyrexTypes.c_int_type, None),
],
has_varargs=True) # to fake the additional macro args that lack a proper C type
@@ -3026,23 +3026,23 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
)
elif len(args) == 2:
index = unwrap_coerced_node(args[1])
- py_index = ExprNodes.NoneNode(index.pos)
+ py_index = ExprNodes.NoneNode(index.pos)
orig_index_type = index.type
if not index.type.is_int:
- if isinstance(index, ExprNodes.IntNode):
- py_index = index.coerce_to_pyobject(self.current_env())
- index = index.coerce_to(PyrexTypes.c_py_ssize_t_type, self.current_env())
- elif is_list:
- if index.type.is_pyobject:
- py_index = index.coerce_to_simple(self.current_env())
- index = ExprNodes.CloneNode(py_index)
+ if isinstance(index, ExprNodes.IntNode):
+ py_index = index.coerce_to_pyobject(self.current_env())
index = index.coerce_to(PyrexTypes.c_py_ssize_t_type, self.current_env())
+ elif is_list:
+ if index.type.is_pyobject:
+ py_index = index.coerce_to_simple(self.current_env())
+ index = ExprNodes.CloneNode(py_index)
+ index = index.coerce_to(PyrexTypes.c_py_ssize_t_type, self.current_env())
else:
return node
elif not PyrexTypes.numeric_type_fits(index.type, PyrexTypes.c_py_ssize_t_type):
return node
- elif isinstance(index, ExprNodes.IntNode):
- py_index = index.coerce_to_pyobject(self.current_env())
+ elif isinstance(index, ExprNodes.IntNode):
+ py_index = index.coerce_to_pyobject(self.current_env())
# real type might still be larger at runtime
if not orig_index_type.is_int:
orig_index_type = index.type
@@ -3054,12 +3054,12 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
return ExprNodes.PythonCapiCallNode(
node.pos, "__Pyx_Py%s_PopIndex" % type_name,
self.PyObject_PopIndex_func_type,
- args=[obj, py_index, index,
+ args=[obj, py_index, index,
ExprNodes.IntNode(index.pos, value=str(orig_index_type.signed and 1 or 0),
constant_result=orig_index_type.signed and 1 or 0,
type=PyrexTypes.c_int_type),
ExprNodes.RawCNameExprNode(index.pos, PyrexTypes.c_void_type,
- orig_index_type.empty_declaration_code()),
+ orig_index_type.empty_declaration_code()),
ExprNodes.RawCNameExprNode(index.pos, conversion_type, convert_func)],
may_return_none=True,
is_temp=node.is_temp,
@@ -3163,184 +3163,184 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
may_return_none=True,
utility_code=load_c_utility('py_dict_pop'))
- Pyx_BinopInt_func_types = dict(
- ((ctype, ret_type), PyrexTypes.CFuncType(
- ret_type, [
- PyrexTypes.CFuncTypeArg("op1", PyrexTypes.py_object_type, None),
- PyrexTypes.CFuncTypeArg("op2", PyrexTypes.py_object_type, None),
- PyrexTypes.CFuncTypeArg("cval", ctype, None),
- PyrexTypes.CFuncTypeArg("inplace", PyrexTypes.c_bint_type, None),
- PyrexTypes.CFuncTypeArg("zerodiv_check", PyrexTypes.c_bint_type, None),
- ], exception_value=None if ret_type.is_pyobject else ret_type.exception_value))
- for ctype in (PyrexTypes.c_long_type, PyrexTypes.c_double_type)
- for ret_type in (PyrexTypes.py_object_type, PyrexTypes.c_bint_type)
- )
-
- def _handle_simple_method_object___add__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Add', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___sub__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Subtract', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___eq__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Eq', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___ne__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Ne', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___and__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('And', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___or__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Or', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___xor__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Xor', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___rshift__(self, node, function, args, is_unbound_method):
- if len(args) != 2 or not isinstance(args[1], ExprNodes.IntNode):
- return node
- if not args[1].has_constant_result() or not (1 <= args[1].constant_result <= 63):
- return node
- return self._optimise_num_binop('Rshift', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___lshift__(self, node, function, args, is_unbound_method):
- if len(args) != 2 or not isinstance(args[1], ExprNodes.IntNode):
- return node
- if not args[1].has_constant_result() or not (1 <= args[1].constant_result <= 63):
- return node
- return self._optimise_num_binop('Lshift', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___mod__(self, node, function, args, is_unbound_method):
- return self._optimise_num_div('Remainder', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___floordiv__(self, node, function, args, is_unbound_method):
- return self._optimise_num_div('FloorDivide', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___truediv__(self, node, function, args, is_unbound_method):
- return self._optimise_num_div('TrueDivide', node, function, args, is_unbound_method)
-
- def _handle_simple_method_object___div__(self, node, function, args, is_unbound_method):
- return self._optimise_num_div('Divide', node, function, args, is_unbound_method)
-
- def _optimise_num_div(self, operator, node, function, args, is_unbound_method):
- if len(args) != 2 or not args[1].has_constant_result() or args[1].constant_result == 0:
- return node
- if isinstance(args[1], ExprNodes.IntNode):
- if not (-2**30 <= args[1].constant_result <= 2**30):
- return node
- elif isinstance(args[1], ExprNodes.FloatNode):
- if not (-2**53 <= args[1].constant_result <= 2**53):
- return node
- else:
- return node
- return self._optimise_num_binop(operator, node, function, args, is_unbound_method)
-
- def _handle_simple_method_float___add__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Add', node, function, args, is_unbound_method)
-
- def _handle_simple_method_float___sub__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Subtract', node, function, args, is_unbound_method)
-
- def _handle_simple_method_float___truediv__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('TrueDivide', node, function, args, is_unbound_method)
-
- def _handle_simple_method_float___div__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Divide', node, function, args, is_unbound_method)
-
- def _handle_simple_method_float___mod__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Remainder', node, function, args, is_unbound_method)
-
- def _handle_simple_method_float___eq__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Eq', node, function, args, is_unbound_method)
-
- def _handle_simple_method_float___ne__(self, node, function, args, is_unbound_method):
- return self._optimise_num_binop('Ne', node, function, args, is_unbound_method)
-
- def _optimise_num_binop(self, operator, node, function, args, is_unbound_method):
- """
- Optimise math operators for (likely) float or small integer operations.
- """
- if len(args) != 2:
- return node
-
- if node.type.is_pyobject:
- ret_type = PyrexTypes.py_object_type
- elif node.type is PyrexTypes.c_bint_type and operator in ('Eq', 'Ne'):
- ret_type = PyrexTypes.c_bint_type
- else:
- return node
-
- # When adding IntNode/FloatNode to something else, assume other operand is also numeric.
- # Prefer constants on RHS as they allows better size control for some operators.
- num_nodes = (ExprNodes.IntNode, ExprNodes.FloatNode)
- if isinstance(args[1], num_nodes):
- if args[0].type is not PyrexTypes.py_object_type:
- return node
- numval = args[1]
- arg_order = 'ObjC'
- elif isinstance(args[0], num_nodes):
- if args[1].type is not PyrexTypes.py_object_type:
- return node
- numval = args[0]
- arg_order = 'CObj'
- else:
- return node
-
- if not numval.has_constant_result():
- return node
-
- is_float = isinstance(numval, ExprNodes.FloatNode)
- num_type = PyrexTypes.c_double_type if is_float else PyrexTypes.c_long_type
- if is_float:
- if operator not in ('Add', 'Subtract', 'Remainder', 'TrueDivide', 'Divide', 'Eq', 'Ne'):
- return node
- elif operator == 'Divide':
- # mixed old-/new-style division is not currently optimised for integers
- return node
- elif abs(numval.constant_result) > 2**30:
- # Cut off at an integer border that is still safe for all operations.
- return node
-
- if operator in ('TrueDivide', 'FloorDivide', 'Divide', 'Remainder'):
- if args[1].constant_result == 0:
- # Don't optimise division by 0. :)
- return node
-
- args = list(args)
- args.append((ExprNodes.FloatNode if is_float else ExprNodes.IntNode)(
- numval.pos, value=numval.value, constant_result=numval.constant_result,
- type=num_type))
- inplace = node.inplace if isinstance(node, ExprNodes.NumBinopNode) else False
- args.append(ExprNodes.BoolNode(node.pos, value=inplace, constant_result=inplace))
- if is_float or operator not in ('Eq', 'Ne'):
- # "PyFloatBinop" and "PyIntBinop" take an additional "check for zero division" argument.
- zerodivision_check = arg_order == 'CObj' and (
- not node.cdivision if isinstance(node, ExprNodes.DivNode) else False)
- args.append(ExprNodes.BoolNode(node.pos, value=zerodivision_check, constant_result=zerodivision_check))
-
- utility_code = TempitaUtilityCode.load_cached(
- "PyFloatBinop" if is_float else "PyIntCompare" if operator in ('Eq', 'Ne') else "PyIntBinop",
- "Optimize.c",
- context=dict(op=operator, order=arg_order, ret_type=ret_type))
-
- call_node = self._substitute_method_call(
- node, function,
- "__Pyx_Py%s_%s%s%s" % (
- 'Float' if is_float else 'Int',
- '' if ret_type.is_pyobject else 'Bool',
- operator,
- arg_order),
- self.Pyx_BinopInt_func_types[(num_type, ret_type)],
- '__%s__' % operator[:3].lower(), is_unbound_method, args,
- may_return_none=True,
- with_none_check=False,
- utility_code=utility_code)
-
- if node.type.is_pyobject and not ret_type.is_pyobject:
- call_node = ExprNodes.CoerceToPyTypeNode(call_node, self.current_env(), node.type)
- return call_node
-
+ Pyx_BinopInt_func_types = dict(
+ ((ctype, ret_type), PyrexTypes.CFuncType(
+ ret_type, [
+ PyrexTypes.CFuncTypeArg("op1", PyrexTypes.py_object_type, None),
+ PyrexTypes.CFuncTypeArg("op2", PyrexTypes.py_object_type, None),
+ PyrexTypes.CFuncTypeArg("cval", ctype, None),
+ PyrexTypes.CFuncTypeArg("inplace", PyrexTypes.c_bint_type, None),
+ PyrexTypes.CFuncTypeArg("zerodiv_check", PyrexTypes.c_bint_type, None),
+ ], exception_value=None if ret_type.is_pyobject else ret_type.exception_value))
+ for ctype in (PyrexTypes.c_long_type, PyrexTypes.c_double_type)
+ for ret_type in (PyrexTypes.py_object_type, PyrexTypes.c_bint_type)
+ )
+
+ def _handle_simple_method_object___add__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Add', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___sub__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Subtract', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___eq__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Eq', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___ne__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Ne', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___and__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('And', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___or__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Or', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___xor__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Xor', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___rshift__(self, node, function, args, is_unbound_method):
+ if len(args) != 2 or not isinstance(args[1], ExprNodes.IntNode):
+ return node
+ if not args[1].has_constant_result() or not (1 <= args[1].constant_result <= 63):
+ return node
+ return self._optimise_num_binop('Rshift', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___lshift__(self, node, function, args, is_unbound_method):
+ if len(args) != 2 or not isinstance(args[1], ExprNodes.IntNode):
+ return node
+ if not args[1].has_constant_result() or not (1 <= args[1].constant_result <= 63):
+ return node
+ return self._optimise_num_binop('Lshift', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___mod__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_div('Remainder', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___floordiv__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_div('FloorDivide', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___truediv__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_div('TrueDivide', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_object___div__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_div('Divide', node, function, args, is_unbound_method)
+
+ def _optimise_num_div(self, operator, node, function, args, is_unbound_method):
+ if len(args) != 2 or not args[1].has_constant_result() or args[1].constant_result == 0:
+ return node
+ if isinstance(args[1], ExprNodes.IntNode):
+ if not (-2**30 <= args[1].constant_result <= 2**30):
+ return node
+ elif isinstance(args[1], ExprNodes.FloatNode):
+ if not (-2**53 <= args[1].constant_result <= 2**53):
+ return node
+ else:
+ return node
+ return self._optimise_num_binop(operator, node, function, args, is_unbound_method)
+
+ def _handle_simple_method_float___add__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Add', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_float___sub__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Subtract', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_float___truediv__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('TrueDivide', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_float___div__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Divide', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_float___mod__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Remainder', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_float___eq__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Eq', node, function, args, is_unbound_method)
+
+ def _handle_simple_method_float___ne__(self, node, function, args, is_unbound_method):
+ return self._optimise_num_binop('Ne', node, function, args, is_unbound_method)
+
+ def _optimise_num_binop(self, operator, node, function, args, is_unbound_method):
+ """
+ Optimise math operators for (likely) float or small integer operations.
+ """
+ if len(args) != 2:
+ return node
+
+ if node.type.is_pyobject:
+ ret_type = PyrexTypes.py_object_type
+ elif node.type is PyrexTypes.c_bint_type and operator in ('Eq', 'Ne'):
+ ret_type = PyrexTypes.c_bint_type
+ else:
+ return node
+
+ # When adding IntNode/FloatNode to something else, assume other operand is also numeric.
+ # Prefer constants on RHS as they allows better size control for some operators.
+ num_nodes = (ExprNodes.IntNode, ExprNodes.FloatNode)
+ if isinstance(args[1], num_nodes):
+ if args[0].type is not PyrexTypes.py_object_type:
+ return node
+ numval = args[1]
+ arg_order = 'ObjC'
+ elif isinstance(args[0], num_nodes):
+ if args[1].type is not PyrexTypes.py_object_type:
+ return node
+ numval = args[0]
+ arg_order = 'CObj'
+ else:
+ return node
+
+ if not numval.has_constant_result():
+ return node
+
+ is_float = isinstance(numval, ExprNodes.FloatNode)
+ num_type = PyrexTypes.c_double_type if is_float else PyrexTypes.c_long_type
+ if is_float:
+ if operator not in ('Add', 'Subtract', 'Remainder', 'TrueDivide', 'Divide', 'Eq', 'Ne'):
+ return node
+ elif operator == 'Divide':
+ # mixed old-/new-style division is not currently optimised for integers
+ return node
+ elif abs(numval.constant_result) > 2**30:
+ # Cut off at an integer border that is still safe for all operations.
+ return node
+
+ if operator in ('TrueDivide', 'FloorDivide', 'Divide', 'Remainder'):
+ if args[1].constant_result == 0:
+ # Don't optimise division by 0. :)
+ return node
+
+ args = list(args)
+ args.append((ExprNodes.FloatNode if is_float else ExprNodes.IntNode)(
+ numval.pos, value=numval.value, constant_result=numval.constant_result,
+ type=num_type))
+ inplace = node.inplace if isinstance(node, ExprNodes.NumBinopNode) else False
+ args.append(ExprNodes.BoolNode(node.pos, value=inplace, constant_result=inplace))
+ if is_float or operator not in ('Eq', 'Ne'):
+ # "PyFloatBinop" and "PyIntBinop" take an additional "check for zero division" argument.
+ zerodivision_check = arg_order == 'CObj' and (
+ not node.cdivision if isinstance(node, ExprNodes.DivNode) else False)
+ args.append(ExprNodes.BoolNode(node.pos, value=zerodivision_check, constant_result=zerodivision_check))
+
+ utility_code = TempitaUtilityCode.load_cached(
+ "PyFloatBinop" if is_float else "PyIntCompare" if operator in ('Eq', 'Ne') else "PyIntBinop",
+ "Optimize.c",
+ context=dict(op=operator, order=arg_order, ret_type=ret_type))
+
+ call_node = self._substitute_method_call(
+ node, function,
+ "__Pyx_Py%s_%s%s%s" % (
+ 'Float' if is_float else 'Int',
+ '' if ret_type.is_pyobject else 'Bool',
+ operator,
+ arg_order),
+ self.Pyx_BinopInt_func_types[(num_type, ret_type)],
+ '__%s__' % operator[:3].lower(), is_unbound_method, args,
+ may_return_none=True,
+ with_none_check=False,
+ utility_code=utility_code)
+
+ if node.type.is_pyobject and not ret_type.is_pyobject:
+ call_node = ExprNodes.CoerceToPyTypeNode(call_node, self.current_env(), node.type)
+ return call_node
+
### unicode type methods
PyUnicode_uchar_predicate_func_type = PyrexTypes.CFuncType(
@@ -3456,44 +3456,44 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
"PyUnicode_Split", self.PyUnicode_Split_func_type,
'split', is_unbound_method, args)
- PyUnicode_Join_func_type = PyrexTypes.CFuncType(
- Builtin.unicode_type, [
- PyrexTypes.CFuncTypeArg("str", Builtin.unicode_type, None),
- PyrexTypes.CFuncTypeArg("seq", PyrexTypes.py_object_type, None),
- ])
-
- def _handle_simple_method_unicode_join(self, node, function, args, is_unbound_method):
- """
- unicode.join() builds a list first => see if we can do this more efficiently
- """
- if len(args) != 2:
- self._error_wrong_arg_count('unicode.join', node, args, "2")
- return node
- if isinstance(args[1], ExprNodes.GeneratorExpressionNode):
- gen_expr_node = args[1]
- loop_node = gen_expr_node.loop
-
- yield_statements = _find_yield_statements(loop_node)
- if yield_statements:
- inlined_genexpr = ExprNodes.InlinedGeneratorExpressionNode(
- node.pos, gen_expr_node, orig_func='list',
- comprehension_type=Builtin.list_type)
-
- for yield_expression, yield_stat_node in yield_statements:
- append_node = ExprNodes.ComprehensionAppendNode(
- yield_expression.pos,
- expr=yield_expression,
- target=inlined_genexpr.target)
-
- Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, append_node)
-
- args[1] = inlined_genexpr
-
- return self._substitute_method_call(
- node, function,
- "PyUnicode_Join", self.PyUnicode_Join_func_type,
- 'join', is_unbound_method, args)
-
+ PyUnicode_Join_func_type = PyrexTypes.CFuncType(
+ Builtin.unicode_type, [
+ PyrexTypes.CFuncTypeArg("str", Builtin.unicode_type, None),
+ PyrexTypes.CFuncTypeArg("seq", PyrexTypes.py_object_type, None),
+ ])
+
+ def _handle_simple_method_unicode_join(self, node, function, args, is_unbound_method):
+ """
+ unicode.join() builds a list first => see if we can do this more efficiently
+ """
+ if len(args) != 2:
+ self._error_wrong_arg_count('unicode.join', node, args, "2")
+ return node
+ if isinstance(args[1], ExprNodes.GeneratorExpressionNode):
+ gen_expr_node = args[1]
+ loop_node = gen_expr_node.loop
+
+ yield_statements = _find_yield_statements(loop_node)
+ if yield_statements:
+ inlined_genexpr = ExprNodes.InlinedGeneratorExpressionNode(
+ node.pos, gen_expr_node, orig_func='list',
+ comprehension_type=Builtin.list_type)
+
+ for yield_expression, yield_stat_node in yield_statements:
+ append_node = ExprNodes.ComprehensionAppendNode(
+ yield_expression.pos,
+ expr=yield_expression,
+ target=inlined_genexpr.target)
+
+ Visitor.recursively_replace_node(gen_expr_node, yield_stat_node, append_node)
+
+ args[1] = inlined_genexpr
+
+ return self._substitute_method_call(
+ node, function,
+ "PyUnicode_Join", self.PyUnicode_Join_func_type,
+ 'join', is_unbound_method, args)
+
PyString_Tailmatch_func_type = PyrexTypes.CFuncType(
PyrexTypes.c_bint_type, [
PyrexTypes.CFuncTypeArg("str", PyrexTypes.py_object_type, None), # bytes/str/unicode
@@ -3626,8 +3626,8 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
PyUnicode_AsEncodedString_func_type = PyrexTypes.CFuncType(
Builtin.bytes_type, [
PyrexTypes.CFuncTypeArg("obj", Builtin.unicode_type, None),
- PyrexTypes.CFuncTypeArg("encoding", PyrexTypes.c_const_char_ptr_type, None),
- PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("encoding", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
])
PyUnicode_AsXyzString_func_type = PyrexTypes.CFuncType(
@@ -3671,8 +3671,8 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
# well, looks like we can't
pass
else:
- value = bytes_literal(value, encoding)
- return ExprNodes.BytesNode(string_node.pos, value=value, type=Builtin.bytes_type)
+ value = bytes_literal(value, encoding)
+ return ExprNodes.BytesNode(string_node.pos, value=value, type=Builtin.bytes_type)
if encoding and error_handling == 'strict':
# try to find a specific encoder function
@@ -3692,30 +3692,30 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
PyUnicode_DecodeXyz_func_ptr_type = PyrexTypes.CPtrType(PyrexTypes.CFuncType(
Builtin.unicode_type, [
- PyrexTypes.CFuncTypeArg("string", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("string", PyrexTypes.c_const_char_ptr_type, None),
PyrexTypes.CFuncTypeArg("size", PyrexTypes.c_py_ssize_t_type, None),
- PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
- ]))
+ PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
+ ]))
_decode_c_string_func_type = PyrexTypes.CFuncType(
Builtin.unicode_type, [
- PyrexTypes.CFuncTypeArg("string", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("string", PyrexTypes.c_const_char_ptr_type, None),
PyrexTypes.CFuncTypeArg("start", PyrexTypes.c_py_ssize_t_type, None),
PyrexTypes.CFuncTypeArg("stop", PyrexTypes.c_py_ssize_t_type, None),
- PyrexTypes.CFuncTypeArg("encoding", PyrexTypes.c_const_char_ptr_type, None),
- PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("encoding", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
PyrexTypes.CFuncTypeArg("decode_func", PyUnicode_DecodeXyz_func_ptr_type, None),
- ])
+ ])
_decode_bytes_func_type = PyrexTypes.CFuncType(
Builtin.unicode_type, [
PyrexTypes.CFuncTypeArg("string", PyrexTypes.py_object_type, None),
PyrexTypes.CFuncTypeArg("start", PyrexTypes.c_py_ssize_t_type, None),
PyrexTypes.CFuncTypeArg("stop", PyrexTypes.c_py_ssize_t_type, None),
- PyrexTypes.CFuncTypeArg("encoding", PyrexTypes.c_const_char_ptr_type, None),
- PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("encoding", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
PyrexTypes.CFuncTypeArg("decode_func", PyUnicode_DecodeXyz_func_ptr_type, None),
- ])
+ ])
_decode_cpp_string_func_type = None # lazy init
@@ -3810,8 +3810,8 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
PyrexTypes.CFuncTypeArg("string", string_type, None),
PyrexTypes.CFuncTypeArg("start", PyrexTypes.c_py_ssize_t_type, None),
PyrexTypes.CFuncTypeArg("stop", PyrexTypes.c_py_ssize_t_type, None),
- PyrexTypes.CFuncTypeArg("encoding", PyrexTypes.c_const_char_ptr_type, None),
- PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("encoding", PyrexTypes.c_const_char_ptr_type, None),
+ PyrexTypes.CFuncTypeArg("errors", PyrexTypes.c_const_char_ptr_type, None),
PyrexTypes.CFuncTypeArg("decode_func", self.PyUnicode_DecodeXyz_func_ptr_type, None),
])
helper_func_type = self._decode_cpp_string_func_type
@@ -3882,14 +3882,14 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
if isinstance(node, ExprNodes.UnicodeNode):
encoding = node.value
node = ExprNodes.BytesNode(
- node.pos, value=encoding.as_utf8_string(), type=PyrexTypes.c_const_char_ptr_type)
+ node.pos, value=encoding.as_utf8_string(), type=PyrexTypes.c_const_char_ptr_type)
elif isinstance(node, (ExprNodes.StringNode, ExprNodes.BytesNode)):
encoding = node.value.decode('ISO-8859-1')
node = ExprNodes.BytesNode(
- node.pos, value=node.value, type=PyrexTypes.c_const_char_ptr_type)
+ node.pos, value=node.value, type=PyrexTypes.c_const_char_ptr_type)
elif node.type is Builtin.bytes_type:
encoding = None
- node = node.coerce_to(PyrexTypes.c_const_char_ptr_type, self.current_env())
+ node = node.coerce_to(PyrexTypes.c_const_char_ptr_type, self.current_env())
elif node.type.is_string:
encoding = None
else:
@@ -3933,8 +3933,8 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
def _substitute_method_call(self, node, function, name, func_type,
attr_name, is_unbound_method, args=(),
utility_code=None, is_temp=None,
- may_return_none=ExprNodes.PythonCapiCallNode.may_return_none,
- with_none_check=True):
+ may_return_none=ExprNodes.PythonCapiCallNode.may_return_none,
+ with_none_check=True):
args = list(args)
if with_none_check and args:
args[0] = self._wrap_self_arg(args[0], function, is_unbound_method, attr_name)
@@ -4210,15 +4210,15 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
bytes_value = None
if str1.bytes_value is not None and str2.bytes_value is not None:
if str1.bytes_value.encoding == str2.bytes_value.encoding:
- bytes_value = bytes_literal(
- str1.bytes_value + str2.bytes_value,
- str1.bytes_value.encoding)
+ bytes_value = bytes_literal(
+ str1.bytes_value + str2.bytes_value,
+ str1.bytes_value.encoding)
string_value = EncodedString(node.constant_result)
return ExprNodes.UnicodeNode(
str1.pos, value=string_value, constant_result=node.constant_result, bytes_value=bytes_value)
elif isinstance(str1, ExprNodes.BytesNode) and isinstance(str2, ExprNodes.BytesNode):
if str1.value.encoding == str2.value.encoding:
- bytes_value = bytes_literal(node.constant_result, str1.value.encoding)
+ bytes_value = bytes_literal(node.constant_result, str1.value.encoding)
return ExprNodes.BytesNode(str1.pos, value=bytes_value, constant_result=node.constant_result)
# all other combinations are rather complicated
# to get right in Py2/3: encodings, unicode escapes, ...
@@ -4275,12 +4275,12 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
def _calculate_constant_seq(self, node, sequence_node, factor):
if factor.constant_result != 1 and sequence_node.args:
- if isinstance(factor.constant_result, _py_int_types) and factor.constant_result <= 0:
+ if isinstance(factor.constant_result, _py_int_types) and factor.constant_result <= 0:
del sequence_node.args[:]
sequence_node.mult_factor = None
elif sequence_node.mult_factor is not None:
- if (isinstance(factor.constant_result, _py_int_types) and
- isinstance(sequence_node.mult_factor.constant_result, _py_int_types)):
+ if (isinstance(factor.constant_result, _py_int_types) and
+ isinstance(sequence_node.mult_factor.constant_result, _py_int_types)):
value = sequence_node.mult_factor.constant_result * factor.constant_result
sequence_node.mult_factor = ExprNodes.IntNode(
sequence_node.mult_factor.pos,
@@ -4332,16 +4332,16 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
warning(pos, "Too few arguments for format placeholders", level=1)
can_be_optimised = False
break
- if arg.is_starred:
- can_be_optimised = False
- break
- if format_type in u'asrfdoxX':
+ if arg.is_starred:
+ can_be_optimised = False
+ break
+ if format_type in u'asrfdoxX':
format_spec = s[1:]
conversion_char = None
if format_type in u'doxX' and u'.' in format_spec:
# Precision is not allowed for integers in format(), but ok in %-formatting.
can_be_optimised = False
- elif format_type in u'ars':
+ elif format_type in u'ars':
format_spec = format_spec[:-1]
conversion_char = format_type
if format_spec.startswith('0'):
@@ -4363,7 +4363,7 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
else:
# keep it simple for now ...
can_be_optimised = False
- break
+ break
if not can_be_optimised:
# Print all warnings we can find before finally giving up here.
@@ -4379,11 +4379,11 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
node = ExprNodes.JoinedStrNode(pos, values=substrings)
return self.visit_JoinedStrNode(node)
- def visit_FormattedValueNode(self, node):
- self.visitchildren(node)
+ def visit_FormattedValueNode(self, node):
+ self.visitchildren(node)
conversion_char = node.conversion_char or 's'
- if isinstance(node.format_spec, ExprNodes.UnicodeNode) and not node.format_spec.value:
- node.format_spec = None
+ if isinstance(node.format_spec, ExprNodes.UnicodeNode) and not node.format_spec.value:
+ node.format_spec = None
if node.format_spec is None and isinstance(node.value, ExprNodes.IntNode):
value = EncodedString(node.value.value)
if value.isdigit():
@@ -4396,130 +4396,130 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
value = node.value.unicode_value
if value is not None:
return ExprNodes.UnicodeNode(node.value.pos, value=value, constant_result=value)
- return node
-
- def visit_JoinedStrNode(self, node):
- """
- Clean up after the parser by discarding empty Unicode strings and merging
- substring sequences. Empty or single-value join lists are not uncommon
- because f-string format specs are always parsed into JoinedStrNodes.
- """
- self.visitchildren(node)
- unicode_node = ExprNodes.UnicodeNode
-
- values = []
- for is_unode_group, substrings in itertools.groupby(node.values, lambda v: isinstance(v, unicode_node)):
- if is_unode_group:
- substrings = list(substrings)
- unode = substrings[0]
- if len(substrings) > 1:
+ return node
+
+ def visit_JoinedStrNode(self, node):
+ """
+ Clean up after the parser by discarding empty Unicode strings and merging
+ substring sequences. Empty or single-value join lists are not uncommon
+ because f-string format specs are always parsed into JoinedStrNodes.
+ """
+ self.visitchildren(node)
+ unicode_node = ExprNodes.UnicodeNode
+
+ values = []
+ for is_unode_group, substrings in itertools.groupby(node.values, lambda v: isinstance(v, unicode_node)):
+ if is_unode_group:
+ substrings = list(substrings)
+ unode = substrings[0]
+ if len(substrings) > 1:
value = EncodedString(u''.join(value.value for value in substrings))
unode = ExprNodes.UnicodeNode(unode.pos, value=value, constant_result=value)
- # ignore empty Unicode strings
- if unode.value:
- values.append(unode)
- else:
- values.extend(substrings)
-
- if not values:
+ # ignore empty Unicode strings
+ if unode.value:
+ values.append(unode)
+ else:
+ values.extend(substrings)
+
+ if not values:
value = EncodedString('')
node = ExprNodes.UnicodeNode(node.pos, value=value, constant_result=value)
- elif len(values) == 1:
- node = values[0]
- elif len(values) == 2:
- # reduce to string concatenation
- node = ExprNodes.binop_node(node.pos, '+', *values)
- else:
- node.values = values
- return node
-
- def visit_MergedDictNode(self, node):
- """Unpack **args in place if we can."""
- self.visitchildren(node)
- args = []
- items = []
-
- def add(arg):
- if arg.is_dict_literal:
- if items:
- items[0].key_value_pairs.extend(arg.key_value_pairs)
- else:
- items.append(arg)
- elif isinstance(arg, ExprNodes.MergedDictNode):
- for child_arg in arg.keyword_args:
- add(child_arg)
- else:
- if items:
- args.append(items[0])
- del items[:]
- args.append(arg)
-
- for arg in node.keyword_args:
- add(arg)
- if items:
- args.append(items[0])
-
- if len(args) == 1:
- arg = args[0]
- if arg.is_dict_literal or isinstance(arg, ExprNodes.MergedDictNode):
- return arg
- node.keyword_args[:] = args
- self._calculate_const(node)
- return node
-
- def visit_MergedSequenceNode(self, node):
- """Unpack *args in place if we can."""
- self.visitchildren(node)
-
- is_set = node.type is Builtin.set_type
- args = []
- values = []
-
- def add(arg):
- if (is_set and arg.is_set_literal) or (arg.is_sequence_constructor and not arg.mult_factor):
- if values:
- values[0].args.extend(arg.args)
- else:
- values.append(arg)
- elif isinstance(arg, ExprNodes.MergedSequenceNode):
- for child_arg in arg.args:
- add(child_arg)
- else:
- if values:
- args.append(values[0])
- del values[:]
- args.append(arg)
-
- for arg in node.args:
- add(arg)
- if values:
- args.append(values[0])
-
- if len(args) == 1:
- arg = args[0]
- if ((is_set and arg.is_set_literal) or
- (arg.is_sequence_constructor and arg.type is node.type) or
- isinstance(arg, ExprNodes.MergedSequenceNode)):
- return arg
- node.args[:] = args
- self._calculate_const(node)
- return node
-
- def visit_SequenceNode(self, node):
- """Unpack *args in place if we can."""
- self.visitchildren(node)
- args = []
- for arg in node.args:
- if not arg.is_starred:
- args.append(arg)
- elif arg.target.is_sequence_constructor and not arg.target.mult_factor:
- args.extend(arg.target.args)
- else:
- args.append(arg)
- node.args[:] = args
- self._calculate_const(node)
- return node
-
+ elif len(values) == 1:
+ node = values[0]
+ elif len(values) == 2:
+ # reduce to string concatenation
+ node = ExprNodes.binop_node(node.pos, '+', *values)
+ else:
+ node.values = values
+ return node
+
+ def visit_MergedDictNode(self, node):
+ """Unpack **args in place if we can."""
+ self.visitchildren(node)
+ args = []
+ items = []
+
+ def add(arg):
+ if arg.is_dict_literal:
+ if items:
+ items[0].key_value_pairs.extend(arg.key_value_pairs)
+ else:
+ items.append(arg)
+ elif isinstance(arg, ExprNodes.MergedDictNode):
+ for child_arg in arg.keyword_args:
+ add(child_arg)
+ else:
+ if items:
+ args.append(items[0])
+ del items[:]
+ args.append(arg)
+
+ for arg in node.keyword_args:
+ add(arg)
+ if items:
+ args.append(items[0])
+
+ if len(args) == 1:
+ arg = args[0]
+ if arg.is_dict_literal or isinstance(arg, ExprNodes.MergedDictNode):
+ return arg
+ node.keyword_args[:] = args
+ self._calculate_const(node)
+ return node
+
+ def visit_MergedSequenceNode(self, node):
+ """Unpack *args in place if we can."""
+ self.visitchildren(node)
+
+ is_set = node.type is Builtin.set_type
+ args = []
+ values = []
+
+ def add(arg):
+ if (is_set and arg.is_set_literal) or (arg.is_sequence_constructor and not arg.mult_factor):
+ if values:
+ values[0].args.extend(arg.args)
+ else:
+ values.append(arg)
+ elif isinstance(arg, ExprNodes.MergedSequenceNode):
+ for child_arg in arg.args:
+ add(child_arg)
+ else:
+ if values:
+ args.append(values[0])
+ del values[:]
+ args.append(arg)
+
+ for arg in node.args:
+ add(arg)
+ if values:
+ args.append(values[0])
+
+ if len(args) == 1:
+ arg = args[0]
+ if ((is_set and arg.is_set_literal) or
+ (arg.is_sequence_constructor and arg.type is node.type) or
+ isinstance(arg, ExprNodes.MergedSequenceNode)):
+ return arg
+ node.args[:] = args
+ self._calculate_const(node)
+ return node
+
+ def visit_SequenceNode(self, node):
+ """Unpack *args in place if we can."""
+ self.visitchildren(node)
+ args = []
+ for arg in node.args:
+ if not arg.is_starred:
+ args.append(arg)
+ elif arg.target.is_sequence_constructor and not arg.target.mult_factor:
+ args.extend(arg.target.args)
+ else:
+ args.append(arg)
+ node.args[:] = args
+ self._calculate_const(node)
+ return node
+
def visit_PrimaryCmpNode(self, node):
# calculate constant partial results in the comparison cascade
self.visitchildren(node, ['operand1'])
@@ -4759,30 +4759,30 @@ class FinalOptimizePhase(Visitor.EnvTransform, Visitor.NodeRefCleanupMixin):
else "optimize.unpack_method_calls")):
# optimise simple Python methods calls
if isinstance(node.arg_tuple, ExprNodes.TupleNode) and not (
- node.arg_tuple.mult_factor or (node.arg_tuple.is_literal and len(node.arg_tuple.args) > 1)):
+ node.arg_tuple.mult_factor or (node.arg_tuple.is_literal and len(node.arg_tuple.args) > 1)):
# simple call, now exclude calls to objects that are definitely not methods
may_be_a_method = True
if function.type is Builtin.type_type:
may_be_a_method = False
- elif function.is_attribute:
- if function.entry and function.entry.type.is_cfunction:
- # optimised builtin method
- may_be_a_method = False
+ elif function.is_attribute:
+ if function.entry and function.entry.type.is_cfunction:
+ # optimised builtin method
+ may_be_a_method = False
elif function.is_name:
- entry = function.entry
- if entry.is_builtin or entry.type.is_cfunction:
+ entry = function.entry
+ if entry.is_builtin or entry.type.is_cfunction:
may_be_a_method = False
- elif entry.cf_assignments:
+ elif entry.cf_assignments:
# local functions/classes are definitely not methods
non_method_nodes = (ExprNodes.PyCFunctionNode, ExprNodes.ClassNode, ExprNodes.Py3ClassNode)
may_be_a_method = any(
assignment.rhs and not isinstance(assignment.rhs, non_method_nodes)
- for assignment in entry.cf_assignments)
+ for assignment in entry.cf_assignments)
if may_be_a_method:
- if (node.self and function.is_attribute and
- isinstance(function.obj, ExprNodes.CloneNode) and function.obj.arg is node.self):
- # function self object was moved into a CloneNode => undo
- function.obj = function.obj.arg
+ if (node.self and function.is_attribute and
+ isinstance(function.obj, ExprNodes.CloneNode) and function.obj.arg is node.self):
+ # function self object was moved into a CloneNode => undo
+ function.obj = function.obj.arg
node = self.replace(node, ExprNodes.PyMethodCallNode.from_node(
node, function=function, arg_tuple=node.arg_tuple, type=node.type))
return node
diff --git a/contrib/tools/cython/Cython/Compiler/Options.py b/contrib/tools/cython/Cython/Compiler/Options.py
index b3ffbcd927..a90813e954 100644
--- a/contrib/tools/cython/Cython/Compiler/Options.py
+++ b/contrib/tools/cython/Cython/Compiler/Options.py
@@ -4,182 +4,182 @@
from __future__ import absolute_import
+
+class ShouldBeFromDirective(object):
-class ShouldBeFromDirective(object):
-
- known_directives = []
+ known_directives = []
def __init__(self, options_name, directive_name=None, disallow=False):
- self.options_name = options_name
- self.directive_name = directive_name or options_name
+ self.options_name = options_name
+ self.directive_name = directive_name or options_name
self.disallow = disallow
- self.known_directives.append(self)
-
- def __nonzero__(self):
- self._bad_access()
-
- def __int__(self):
- self._bad_access()
-
- def _bad_access(self):
- raise RuntimeError(repr(self))
-
- def __repr__(self):
- return (
- "Illegal access of '%s' from Options module rather than directive '%s'"
- % (self.options_name, self.directive_name))
-
-
-"""
-The members of this module are documented using autodata in
-Cython/docs/src/reference/compilation.rst.
-See http://www.sphinx-doc.org/en/master/ext/autodoc.html#directive-autoattribute
-for how autodata works.
-Descriptions of those members should start with a #:
-Donc forget to keep the docs in sync by removing and adding
-the members in both this file and the .rst file.
-"""
-
-#: Whether or not to include docstring in the Python extension. If False, the binary size
-#: will be smaller, but the ``__doc__`` attribute of any class or function will be an
-#: empty string.
+ self.known_directives.append(self)
+
+ def __nonzero__(self):
+ self._bad_access()
+
+ def __int__(self):
+ self._bad_access()
+
+ def _bad_access(self):
+ raise RuntimeError(repr(self))
+
+ def __repr__(self):
+ return (
+ "Illegal access of '%s' from Options module rather than directive '%s'"
+ % (self.options_name, self.directive_name))
+
+
+"""
+The members of this module are documented using autodata in
+Cython/docs/src/reference/compilation.rst.
+See http://www.sphinx-doc.org/en/master/ext/autodoc.html#directive-autoattribute
+for how autodata works.
+Descriptions of those members should start with a #:
+Donc forget to keep the docs in sync by removing and adding
+the members in both this file and the .rst file.
+"""
+
+#: Whether or not to include docstring in the Python extension. If False, the binary size
+#: will be smaller, but the ``__doc__`` attribute of any class or function will be an
+#: empty string.
docstrings = True
-#: Embed the source code position in the docstrings of functions and classes.
-embed_pos_in_docstring = False
-
-#: Copy the original source code line by line into C code comments
-#: in the generated code file to help with understanding the output.
-#: This is also required for coverage analysis.
-emit_code_comments = True
-
-# undocumented
-pre_import = None
-
-#: Decref global variables in each module on exit for garbage collection.
-#: 0: None, 1+: interned objects, 2+: cdef globals, 3+: types objects
-#: Mostly for reducing noise in Valgrind as it typically executes at process exit
-#: (when all memory will be reclaimed anyways).
-#: Note that directly or indirectly executed cleanup code that makes use of global
-#: variables or types may no longer be safe when enabling the respective level since
-#: there is no guaranteed order in which the (reference counted) objects will
-#: be cleaned up. The order can change due to live references and reference cycles.
+#: Embed the source code position in the docstrings of functions and classes.
+embed_pos_in_docstring = False
+
+#: Copy the original source code line by line into C code comments
+#: in the generated code file to help with understanding the output.
+#: This is also required for coverage analysis.
+emit_code_comments = True
+
+# undocumented
+pre_import = None
+
+#: Decref global variables in each module on exit for garbage collection.
+#: 0: None, 1+: interned objects, 2+: cdef globals, 3+: types objects
+#: Mostly for reducing noise in Valgrind as it typically executes at process exit
+#: (when all memory will be reclaimed anyways).
+#: Note that directly or indirectly executed cleanup code that makes use of global
+#: variables or types may no longer be safe when enabling the respective level since
+#: there is no guaranteed order in which the (reference counted) objects will
+#: be cleaned up. The order can change due to live references and reference cycles.
generate_cleanup_code = False
-#: Should tp_clear() set object fields to None instead of clearing them to NULL?
-clear_to_none = True
-
-#: Generate an annotated HTML version of the input source files for debugging and optimisation purposes.
-#: This has the same effect as the ``annotate`` argument in :func:`cythonize`.
+#: Should tp_clear() set object fields to None instead of clearing them to NULL?
+clear_to_none = True
+
+#: Generate an annotated HTML version of the input source files for debugging and optimisation purposes.
+#: This has the same effect as the ``annotate`` argument in :func:`cythonize`.
annotate = False
-# When annotating source files in HTML, include coverage information from
-# this file.
-annotate_coverage_xml = None
-
-#: This will abort the compilation on the first error occurred rather than trying
-#: to keep going and printing further error messages.
+# When annotating source files in HTML, include coverage information from
+# this file.
+annotate_coverage_xml = None
+
+#: This will abort the compilation on the first error occurred rather than trying
+#: to keep going and printing further error messages.
fast_fail = False
-#: Turn all warnings into errors.
+#: Turn all warnings into errors.
warning_errors = False
-#: Make unknown names an error. Python raises a NameError when
-#: encountering unknown names at runtime, whereas this option makes
-#: them a compile time error. If you want full Python compatibility,
-#: you should disable this option and also 'cache_builtins'.
+#: Make unknown names an error. Python raises a NameError when
+#: encountering unknown names at runtime, whereas this option makes
+#: them a compile time error. If you want full Python compatibility,
+#: you should disable this option and also 'cache_builtins'.
error_on_unknown_names = True
-#: Make uninitialized local variable reference a compile time error.
-#: Python raises UnboundLocalError at runtime, whereas this option makes
-#: them a compile time error. Note that this option affects only variables
-#: of "python object" type.
+#: Make uninitialized local variable reference a compile time error.
+#: Python raises UnboundLocalError at runtime, whereas this option makes
+#: them a compile time error. Note that this option affects only variables
+#: of "python object" type.
error_on_uninitialized = True
-#: This will convert statements of the form ``for i in range(...)``
-#: to ``for i from ...`` when ``i`` is a C integer type, and the direction
-#: (i.e. sign of step) can be determined.
-#: WARNING: This may change the semantics if the range causes assignment to
-#: i to overflow. Specifically, if this option is set, an error will be
-#: raised before the loop is entered, whereas without this option the loop
-#: will execute until an overflowing value is encountered.
+#: This will convert statements of the form ``for i in range(...)``
+#: to ``for i from ...`` when ``i`` is a C integer type, and the direction
+#: (i.e. sign of step) can be determined.
+#: WARNING: This may change the semantics if the range causes assignment to
+#: i to overflow. Specifically, if this option is set, an error will be
+#: raised before the loop is entered, whereas without this option the loop
+#: will execute until an overflowing value is encountered.
convert_range = True
-#: Perform lookups on builtin names only once, at module initialisation
-#: time. This will prevent the module from getting imported if a
-#: builtin name that it uses cannot be found during initialisation.
-#: Default is True.
-#: Note that some legacy builtins are automatically remapped
-#: from their Python 2 names to their Python 3 names by Cython
-#: when building in Python 3.x,
-#: so that they do not get in the way even if this option is enabled.
-cache_builtins = True
-
-#: Generate branch prediction hints to speed up error handling etc.
-gcc_branch_hints = True
-
-#: Enable this to allow one to write ``your_module.foo = ...`` to overwrite the
-#: definition if the cpdef function foo, at the cost of an extra dictionary
-#: lookup on every call.
-#: If this is false it generates only the Python wrapper and no override check.
+#: Perform lookups on builtin names only once, at module initialisation
+#: time. This will prevent the module from getting imported if a
+#: builtin name that it uses cannot be found during initialisation.
+#: Default is True.
+#: Note that some legacy builtins are automatically remapped
+#: from their Python 2 names to their Python 3 names by Cython
+#: when building in Python 3.x,
+#: so that they do not get in the way even if this option is enabled.
+cache_builtins = True
+
+#: Generate branch prediction hints to speed up error handling etc.
+gcc_branch_hints = True
+
+#: Enable this to allow one to write ``your_module.foo = ...`` to overwrite the
+#: definition if the cpdef function foo, at the cost of an extra dictionary
+#: lookup on every call.
+#: If this is false it generates only the Python wrapper and no override check.
lookup_module_cpdef = False
-#: Whether or not to embed the Python interpreter, for use in making a
-#: standalone executable or calling from external libraries.
-#: This will provide a C function which initialises the interpreter and
-#: executes the body of this module.
-#: See `this demo <https://github.com/cython/cython/tree/master/Demos/embed>`_
-#: for a concrete example.
-#: If true, the initialisation function is the C main() function, but
-#: this option can also be set to a non-empty string to provide a function name explicitly.
-#: Default is False.
+#: Whether or not to embed the Python interpreter, for use in making a
+#: standalone executable or calling from external libraries.
+#: This will provide a C function which initialises the interpreter and
+#: executes the body of this module.
+#: See `this demo <https://github.com/cython/cython/tree/master/Demos/embed>`_
+#: for a concrete example.
+#: If true, the initialisation function is the C main() function, but
+#: this option can also be set to a non-empty string to provide a function name explicitly.
+#: Default is False.
embed = None
# In previous iterations of Cython, globals() gave the first non-Cython module
# globals in the call stack. Sage relies on this behavior for variable injection.
-old_style_globals = ShouldBeFromDirective('old_style_globals')
+old_style_globals = ShouldBeFromDirective('old_style_globals')
-#: Allows cimporting from a pyx file without a pxd file.
+#: Allows cimporting from a pyx file without a pxd file.
cimport_from_pyx = False
-#: Maximum number of dimensions for buffers -- set lower than number of
-#: dimensions in numpy, as
-#: slices are passed by value and involve a lot of copying.
+#: Maximum number of dimensions for buffers -- set lower than number of
+#: dimensions in numpy, as
+#: slices are passed by value and involve a lot of copying.
buffer_max_dims = 8
-#: Number of function closure instances to keep in a freelist (0: no freelists)
+#: Number of function closure instances to keep in a freelist (0: no freelists)
closure_freelist_size = 8
# Arcadia specific
source_root = None
-def get_directive_defaults():
- # To add an item to this list, all accesses should be changed to use the new
- # directive, and the global option itself should be set to an instance of
- # ShouldBeFromDirective.
- for old_option in ShouldBeFromDirective.known_directives:
- value = globals().get(old_option.options_name)
- assert old_option.directive_name in _directive_defaults
- if not isinstance(value, ShouldBeFromDirective):
- if old_option.disallow:
- raise RuntimeError(
- "Option '%s' must be set from directive '%s'" % (
- old_option.option_name, old_option.directive_name))
- else:
- # Warn?
- _directive_defaults[old_option.directive_name] = value
- return _directive_defaults
+def get_directive_defaults():
+ # To add an item to this list, all accesses should be changed to use the new
+ # directive, and the global option itself should be set to an instance of
+ # ShouldBeFromDirective.
+ for old_option in ShouldBeFromDirective.known_directives:
+ value = globals().get(old_option.options_name)
+ assert old_option.directive_name in _directive_defaults
+ if not isinstance(value, ShouldBeFromDirective):
+ if old_option.disallow:
+ raise RuntimeError(
+ "Option '%s' must be set from directive '%s'" % (
+ old_option.option_name, old_option.directive_name))
+ else:
+ # Warn?
+ _directive_defaults[old_option.directive_name] = value
+ return _directive_defaults
# Declare compiler directives
-_directive_defaults = {
+_directive_defaults = {
'boundscheck' : True,
'nonecheck' : False,
'initializedcheck' : True,
'embedsignature' : False,
'auto_cpdef': False,
'auto_pickle': None,
- 'cdivision': False, # was True before 0.12
+ 'cdivision': False, # was True before 0.12
'cdivision_warnings': False,
'c_api_binop_methods': True,
'overflowcheck': False,
@@ -187,28 +187,28 @@ _directive_defaults = {
'always_allow_keywords': False,
'allow_none_for_extension_args': True,
'wraparound' : True,
- 'ccomplex' : False, # use C99/C++ for complex types and arith
+ 'ccomplex' : False, # use C99/C++ for complex types and arith
'callspec' : "",
- 'nogil' : False,
+ 'nogil' : False,
'profile': False,
'linetrace': False,
- 'emit_code_comments': True, # copy original source code into C code comments
- 'annotation_typing': True, # read type declarations from Python function annotations
+ 'emit_code_comments': True, # copy original source code into C code comments
+ 'annotation_typing': True, # read type declarations from Python function annotations
'infer_types': None,
'infer_types.verbose': False,
'autotestdict': True,
'autotestdict.cdef': False,
'autotestdict.all': False,
- 'language_level': None,
- 'fast_getattr': False, # Undocumented until we come up with a better way to handle this everywhere.
- 'py2_import': False, # For backward compatibility of Cython's source code in Py3 source mode
+ 'language_level': None,
+ 'fast_getattr': False, # Undocumented until we come up with a better way to handle this everywhere.
+ 'py2_import': False, # For backward compatibility of Cython's source code in Py3 source mode
'preliminary_late_includes_cy28': False, # Temporary directive in 0.28, to be removed in a later version (see GH#2079).
'iterable_coroutine': False, # Make async coroutines backwards compatible with the old asyncio yield-from syntax.
'c_string_type': 'bytes',
'c_string_encoding': '',
- 'type_version_tag': True, # enables Py_TPFLAGS_HAVE_VERSION_TAG on extension types
+ 'type_version_tag': True, # enables Py_TPFLAGS_HAVE_VERSION_TAG on extension types
'unraisable_tracebacks': True,
- 'old_style_globals': False,
+ 'old_style_globals': False,
'np_pythran': False,
'fast_gil': False,
@@ -226,16 +226,16 @@ _directive_defaults = {
# optimizations
'optimize.inline_defnode_calls': True,
- 'optimize.unpack_method_calls': True, # increases code size when True
- 'optimize.unpack_method_calls_in_pyinit': False, # uselessly increases code size when True
+ 'optimize.unpack_method_calls': True, # increases code size when True
+ 'optimize.unpack_method_calls_in_pyinit': False, # uselessly increases code size when True
'optimize.use_switch': True,
# remove unreachable code
'remove_unreachable': True,
# control flow debug directives
- 'control_flow.dot_output': "", # Graphviz output filename
- 'control_flow.dot_annotate_defs': False, # Annotate definitions
+ 'control_flow.dot_output': "", # Graphviz output filename
+ 'control_flow.dot_annotate_defs': False, # Annotate definitions
# test support
'test_assert_path_exists' : [],
@@ -243,8 +243,8 @@ _directive_defaults = {
# experimental, subject to change
'binding': None,
-
- 'formal_grammar': False,
+
+ 'formal_grammar': False,
}
# Extra warning directives
@@ -300,49 +300,49 @@ def normalise_encoding_name(option_name, encoding):
# Override types possibilities above, if needed
directive_types = {
- 'language_level': str, # values can be None/2/3/'3str', where None == 2+warning
+ 'language_level': str, # values can be None/2/3/'3str', where None == 2+warning
'auto_pickle': bool,
- 'locals': dict,
+ 'locals': dict,
'final' : bool, # final cdef classes and methods
- 'nogil' : bool,
+ 'nogil' : bool,
'internal' : bool, # cdef class visibility in the module dict
- 'infer_types' : bool, # values can be True/None/False
+ 'infer_types' : bool, # values can be True/None/False
'binding' : bool,
- 'cfunc' : None, # decorators do not take directive value
+ 'cfunc' : None, # decorators do not take directive value
'ccall' : None,
'inline' : None,
'staticmethod' : None,
'cclass' : None,
- 'no_gc_clear' : bool,
- 'no_gc' : bool,
+ 'no_gc_clear' : bool,
+ 'no_gc' : bool,
'returns' : type,
- 'exceptval': type, # actually (type, check=True/False), but has its own parser
+ 'exceptval': type, # actually (type, check=True/False), but has its own parser
'set_initial_path': str,
'freelist': int,
'c_string_type': one_of('bytes', 'bytearray', 'str', 'unicode'),
'c_string_encoding': normalise_encoding_name,
}
-for key, val in _directive_defaults.items():
+for key, val in _directive_defaults.items():
if key not in directive_types:
directive_types[key] = type(val)
-directive_scopes = { # defaults to available everywhere
+directive_scopes = { # defaults to available everywhere
# 'module', 'function', 'class', 'with statement'
'auto_pickle': ('module', 'cclass'),
'final' : ('cclass', 'function'),
- 'nogil' : ('function', 'with statement'),
+ 'nogil' : ('function', 'with statement'),
'inline' : ('function',),
- 'cfunc' : ('function', 'with statement'),
- 'ccall' : ('function', 'with statement'),
+ 'cfunc' : ('function', 'with statement'),
+ 'ccall' : ('function', 'with statement'),
'returns' : ('function',),
'exceptval' : ('function',),
'locals' : ('function',),
'staticmethod' : ('function',), # FIXME: analysis currently lacks more specific function scope
'no_gc_clear' : ('cclass',),
- 'no_gc' : ('cclass',),
+ 'no_gc' : ('cclass',),
'internal' : ('cclass',),
- 'cclass' : ('class', 'cclass', 'with statement'),
+ 'cclass' : ('class', 'cclass', 'with statement'),
'autotestdict' : ('module',),
'autotestdict.all' : ('module',),
'autotestdict.cdef' : ('module',),
@@ -350,28 +350,28 @@ directive_scopes = { # defaults to available everywhere
'test_assert_path_exists' : ('function', 'class', 'cclass'),
'test_fail_if_path_exists' : ('function', 'class', 'cclass'),
'freelist': ('cclass',),
- 'emit_code_comments': ('module',),
+ 'emit_code_comments': ('module',),
'annotation_typing': ('module',), # FIXME: analysis currently lacks more specific function scope
# Avoid scope-specific to/from_py_functions for c_string.
'c_string_type': ('module',),
'c_string_encoding': ('module',),
'type_version_tag': ('module', 'cclass'),
- 'language_level': ('module',),
- # globals() could conceivably be controlled at a finer granularity,
- # but that would complicate the implementation
- 'old_style_globals': ('module',),
+ 'language_level': ('module',),
+ # globals() could conceivably be controlled at a finer granularity,
+ # but that would complicate the implementation
+ 'old_style_globals': ('module',),
'np_pythran': ('module',),
'fast_gil': ('module',),
'iterable_coroutine': ('module', 'function'),
}
-
+
def parse_directive_value(name, value, relaxed_bool=False):
"""
Parses value as an option value for the given name and returns
the interpreted value. None is returned if the option does not exist.
- >>> print(parse_directive_value('nonexisting', 'asdf asdfd'))
+ >>> print(parse_directive_value('nonexisting', 'asdf asdfd'))
None
>>> parse_directive_value('boundscheck', 'True')
True
@@ -395,21 +395,21 @@ def parse_directive_value(name, value, relaxed_bool=False):
ValueError: c_string_type directive must be one of ('bytes', 'bytearray', 'str', 'unicode'), got 'unnicode'
"""
type = directive_types.get(name)
- if not type:
- return None
+ if not type:
+ return None
orig_value = value
if type is bool:
value = str(value)
- if value == 'True':
- return True
- if value == 'False':
- return False
+ if value == 'True':
+ return True
+ if value == 'False':
+ return False
if relaxed_bool:
value = value.lower()
- if value in ("true", "yes"):
- return True
- elif value in ("false", "no"):
- return False
+ if value in ("true", "yes"):
+ return True
+ elif value in ("false", "no"):
+ return False
raise ValueError("%s directive must be set to True or False, got '%s'" % (
name, orig_value))
elif type is int:
@@ -425,7 +425,7 @@ def parse_directive_value(name, value, relaxed_bool=False):
else:
assert False
-
+
def parse_directive_list(s, relaxed_bool=False, ignore_unknown=False,
current_settings=None):
"""
@@ -461,16 +461,16 @@ def parse_directive_list(s, relaxed_bool=False, ignore_unknown=False,
result = current_settings
for item in s.split(','):
item = item.strip()
- if not item:
- continue
- if '=' not in item:
- raise ValueError('Expected "=" in option "%s"' % item)
- name, value = [s.strip() for s in item.strip().split('=', 1)]
- if name not in _directive_defaults:
+ if not item:
+ continue
+ if '=' not in item:
+ raise ValueError('Expected "=" in option "%s"' % item)
+ name, value = [s.strip() for s in item.strip().split('=', 1)]
+ if name not in _directive_defaults:
found = False
if name.endswith('.all'):
prefix = name[:-3]
- for directive in _directive_defaults:
+ for directive in _directive_defaults:
if directive.startswith(prefix):
found = True
parsed_value = parse_directive_value(directive, value, relaxed_bool=relaxed_bool)
@@ -481,73 +481,73 @@ def parse_directive_list(s, relaxed_bool=False, ignore_unknown=False,
parsed_value = parse_directive_value(name, value, relaxed_bool=relaxed_bool)
result[name] = parsed_value
return result
-
-
-def parse_variable_value(value):
- """
- Parses value as an option value for the given name and returns
- the interpreted value.
-
- >>> parse_variable_value('True')
- True
- >>> parse_variable_value('true')
- 'true'
- >>> parse_variable_value('us-ascii')
- 'us-ascii'
- >>> parse_variable_value('str')
- 'str'
- >>> parse_variable_value('123')
- 123
- >>> parse_variable_value('1.23')
- 1.23
-
- """
- if value == "True":
- return True
- elif value == "False":
- return False
- elif value == "None":
- return None
- elif value.isdigit():
- return int(value)
- else:
- try:
- value = float(value)
- except Exception:
- # Not a float
- pass
- return value
-
-
-def parse_compile_time_env(s, current_settings=None):
- """
- Parses a comma-separated list of pragma options. Whitespace
- is not considered.
-
- >>> parse_compile_time_env(' ')
- {}
- >>> (parse_compile_time_env('HAVE_OPENMP=True') ==
- ... {'HAVE_OPENMP': True})
- True
- >>> parse_compile_time_env(' asdf')
- Traceback (most recent call last):
- ...
- ValueError: Expected "=" in option "asdf"
- >>> parse_compile_time_env('NUM_THREADS=4') == {'NUM_THREADS': 4}
- True
- >>> parse_compile_time_env('unknown=anything') == {'unknown': 'anything'}
- True
- """
- if current_settings is None:
- result = {}
- else:
- result = current_settings
- for item in s.split(','):
- item = item.strip()
- if not item:
- continue
- if '=' not in item:
- raise ValueError('Expected "=" in option "%s"' % item)
- name, value = [s.strip() for s in item.split('=', 1)]
- result[name] = parse_variable_value(value)
- return result
+
+
+def parse_variable_value(value):
+ """
+ Parses value as an option value for the given name and returns
+ the interpreted value.
+
+ >>> parse_variable_value('True')
+ True
+ >>> parse_variable_value('true')
+ 'true'
+ >>> parse_variable_value('us-ascii')
+ 'us-ascii'
+ >>> parse_variable_value('str')
+ 'str'
+ >>> parse_variable_value('123')
+ 123
+ >>> parse_variable_value('1.23')
+ 1.23
+
+ """
+ if value == "True":
+ return True
+ elif value == "False":
+ return False
+ elif value == "None":
+ return None
+ elif value.isdigit():
+ return int(value)
+ else:
+ try:
+ value = float(value)
+ except Exception:
+ # Not a float
+ pass
+ return value
+
+
+def parse_compile_time_env(s, current_settings=None):
+ """
+ Parses a comma-separated list of pragma options. Whitespace
+ is not considered.
+
+ >>> parse_compile_time_env(' ')
+ {}
+ >>> (parse_compile_time_env('HAVE_OPENMP=True') ==
+ ... {'HAVE_OPENMP': True})
+ True
+ >>> parse_compile_time_env(' asdf')
+ Traceback (most recent call last):
+ ...
+ ValueError: Expected "=" in option "asdf"
+ >>> parse_compile_time_env('NUM_THREADS=4') == {'NUM_THREADS': 4}
+ True
+ >>> parse_compile_time_env('unknown=anything') == {'unknown': 'anything'}
+ True
+ """
+ if current_settings is None:
+ result = {}
+ else:
+ result = current_settings
+ for item in s.split(','):
+ item = item.strip()
+ if not item:
+ continue
+ if '=' not in item:
+ raise ValueError('Expected "=" in option "%s"' % item)
+ name, value = [s.strip() for s in item.split('=', 1)]
+ result[name] = parse_variable_value(value)
+ return result
diff --git a/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.pxd b/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.pxd
index 2c17901fa4..c71407c748 100644
--- a/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.pxd
+++ b/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.pxd
@@ -70,9 +70,9 @@ cdef class CreateClosureClasses(CythonTransform):
cdef create_class_from_scope(self, node, target_module_scope, inner_node=*)
cdef find_entries_used_in_closures(self, node)
-#cdef class InjectGilHandling(VisitorTransform, SkipDeclarations):
-# cdef bint nogil
-
+#cdef class InjectGilHandling(VisitorTransform, SkipDeclarations):
+# cdef bint nogil
+
cdef class GilCheck(VisitorTransform):
cdef list env_stack
cdef bint nogil
diff --git a/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py b/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py
index 0da3670cae..32bc736e00 100644
--- a/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py
+++ b/contrib/tools/cython/Cython/Compiler/ParseTreeTransforms.py
@@ -4,11 +4,11 @@ import cython
cython.declare(PyrexTypes=object, Naming=object, ExprNodes=object, Nodes=object,
Options=object, UtilNodes=object, LetNode=object,
LetRefNode=object, TreeFragment=object, EncodedString=object,
- error=object, warning=object, copy=object, _unicode=object)
+ error=object, warning=object, copy=object, _unicode=object)
-import copy
+import copy
import hashlib
-
+
from . import PyrexTypes
from . import Naming
from . import ExprNodes
@@ -19,9 +19,9 @@ from . import Errors
from .Visitor import VisitorTransform, TreeVisitor
from .Visitor import CythonTransform, EnvTransform, ScopeTrackingTransform
-from .UtilNodes import LetNode, LetRefNode
+from .UtilNodes import LetNode, LetRefNode
from .TreeFragment import TreeFragment
-from .StringEncoding import EncodedString, _unicode
+from .StringEncoding import EncodedString, _unicode
from .Errors import error, warning, CompileError, InternalError
from .Code import UtilityCode
@@ -52,7 +52,7 @@ class SkipDeclarations(object):
def visit_CStructOrUnionDefNode(self, node):
return node
-
+
class NormalizeTree(CythonTransform):
"""
This transform fixes up a few things after parsing
@@ -187,7 +187,7 @@ class PostParse(ScopeTrackingTransform):
body = Nodes.ReturnStatNode(
node.result_expr.pos, value=node.result_expr)
node.def_node = Nodes.DefNode(
- node.pos, name=node.name,
+ node.pos, name=node.name,
args=node.args, star_arg=node.star_arg,
starstar_arg=node.starstar_arg,
body=body, doc=None)
@@ -254,7 +254,7 @@ class PostParse(ScopeTrackingTransform):
newdecls.append(decl)
node.declarators = newdecls
return stats
- except PostParseError as e:
+ except PostParseError as e:
# An error in a cdef clause is ok, simply remove the declaration
# and try to move on to report more errors
self.context.nonfatal_error(e)
@@ -419,11 +419,11 @@ def sort_common_subsequences(items):
for pos, item in enumerate(items):
key = item[1] # the ResultRefNode which has already been injected into the sequences
new_pos = pos
- for i in range(pos-1, -1, -1):
+ for i in range(pos-1, -1, -1):
if lower_than(key, items[i][0]):
new_pos = i
if new_pos != pos:
- for i in range(pos, new_pos, -1):
+ for i in range(pos, new_pos, -1):
items[i] = items[i-1]
items[new_pos] = item
@@ -459,7 +459,7 @@ def flatten_parallel_assignments(input, output):
rhs_args = unpack_string_to_character_literals(rhs)
rhs_size = len(rhs_args)
- lhs_targets = [[] for _ in range(rhs_size)]
+ lhs_targets = [[] for _ in range(rhs_size)]
starred_assignments = []
for lhs in input[:-1]:
if not lhs.is_sequence_constructor:
@@ -613,8 +613,8 @@ class TrackNumpyAttributes(VisitorTransform, SkipDeclarations):
def visit_AttributeNode(self, node):
self.visitchildren(node)
- obj = node.obj
- if (obj.is_name and obj.name in self.numpy_module_names) or obj.is_numpy_attribute:
+ obj = node.obj
+ if (obj.is_name and obj.name in self.numpy_module_names) or obj.is_numpy_attribute:
node.is_numpy_attribute = True
return node
@@ -656,9 +656,9 @@ class InterpretCompilerDirectives(CythonTransform):
'operator.predecrement' : ExprNodes.inc_dec_constructor(True, '--'),
'operator.postincrement': ExprNodes.inc_dec_constructor(False, '++'),
'operator.postdecrement': ExprNodes.inc_dec_constructor(False, '--'),
- 'operator.typeid' : ExprNodes.TypeidNode,
+ 'operator.typeid' : ExprNodes.TypeidNode,
- # For backwards compatibility.
+ # For backwards compatibility.
'address': ExprNodes.AmpersandNode,
}
@@ -669,13 +669,13 @@ class InterpretCompilerDirectives(CythonTransform):
special_methods = set(['declare', 'union', 'struct', 'typedef',
'sizeof', 'cast', 'pointer', 'compiled',
'NULL', 'fused_type', 'parallel'])
- special_methods.update(unop_method_nodes)
+ special_methods.update(unop_method_nodes)
valid_parallel_directives = set([
"parallel",
"prange",
"threadid",
- #"threadsavailable",
+ #"threadsavailable",
])
def __init__(self, context, compilation_directive_defaults):
@@ -683,9 +683,9 @@ class InterpretCompilerDirectives(CythonTransform):
self.cython_module_names = set()
self.directive_names = {'staticmethod': 'staticmethod'}
self.parallel_directives = {}
- directives = copy.deepcopy(Options.get_directive_defaults())
+ directives = copy.deepcopy(Options.get_directive_defaults())
for key, value in compilation_directive_defaults.items():
- directives[_unicode(key)] = copy.deepcopy(value)
+ directives[_unicode(key)] = copy.deepcopy(value)
self.directives = directives
def check_directive_scope(self, pos, directive, scope):
@@ -695,13 +695,13 @@ class InterpretCompilerDirectives(CythonTransform):
'is not allowed in %s scope' % (directive, scope)))
return False
else:
- if directive not in Options.directive_types:
+ if directive not in Options.directive_types:
error(pos, "Invalid directive: '%s'." % (directive,))
return True
# Set up processing and handle the cython: comments.
def visit_ModuleNode(self, node):
- for key in sorted(node.directive_comments):
+ for key in sorted(node.directive_comments):
if not self.check_directive_scope(node.pos, key, 'module'):
self.wrong_scope_error(node.pos, key, 'module')
del node.directive_comments[key]
@@ -917,7 +917,7 @@ class InterpretCompilerDirectives(CythonTransform):
directivetype = Options.directive_types.get(optname)
if len(args) == 1 and isinstance(args[0], ExprNodes.NoneNode):
- return optname, Options.get_directive_defaults()[optname]
+ return optname, Options.get_directive_defaults()[optname]
elif directivetype is bool:
if kwds is not None or len(args) != 1 or not isinstance(args[0], ExprNodes.BoolNode):
raise PostParseError(pos,
@@ -958,34 +958,34 @@ class InterpretCompilerDirectives(CythonTransform):
else:
assert False
- def visit_with_directives(self, node, directives):
- if not directives:
- return self.visit_Node(node)
-
- old_directives = self.directives
- new_directives = dict(old_directives)
- new_directives.update(directives)
-
- if new_directives == old_directives:
- return self.visit_Node(node)
-
- self.directives = new_directives
- retbody = self.visit_Node(node)
- self.directives = old_directives
-
- if not isinstance(retbody, Nodes.StatListNode):
- retbody = Nodes.StatListNode(node.pos, stats=[retbody])
- return Nodes.CompilerDirectivesNode(
- pos=retbody.pos, body=retbody, directives=new_directives)
-
+ def visit_with_directives(self, node, directives):
+ if not directives:
+ return self.visit_Node(node)
+
+ old_directives = self.directives
+ new_directives = dict(old_directives)
+ new_directives.update(directives)
+
+ if new_directives == old_directives:
+ return self.visit_Node(node)
+
+ self.directives = new_directives
+ retbody = self.visit_Node(node)
+ self.directives = old_directives
+
+ if not isinstance(retbody, Nodes.StatListNode):
+ retbody = Nodes.StatListNode(node.pos, stats=[retbody])
+ return Nodes.CompilerDirectivesNode(
+ pos=retbody.pos, body=retbody, directives=new_directives)
+
# Handle decorators
def visit_FuncDefNode(self, node):
directives = self._extract_directives(node, 'function')
- return self.visit_with_directives(node, directives)
+ return self.visit_with_directives(node, directives)
def visit_CVarDefNode(self, node):
directives = self._extract_directives(node, 'function')
- for name, value in directives.items():
+ for name, value in directives.items():
if name == 'locals':
node.directive_locals = value
elif name not in ('final', 'staticmethod'):
@@ -993,19 +993,19 @@ class InterpretCompilerDirectives(CythonTransform):
node.pos,
"Cdef functions can only take cython.locals(), "
"staticmethod, or final decorators, got %s." % name))
- return self.visit_with_directives(node, directives)
+ return self.visit_with_directives(node, directives)
def visit_CClassDefNode(self, node):
directives = self._extract_directives(node, 'cclass')
- return self.visit_with_directives(node, directives)
+ return self.visit_with_directives(node, directives)
def visit_CppClassNode(self, node):
directives = self._extract_directives(node, 'cppclass')
- return self.visit_with_directives(node, directives)
+ return self.visit_with_directives(node, directives)
def visit_PyClassDefNode(self, node):
directives = self._extract_directives(node, 'class')
- return self.visit_with_directives(node, directives)
+ return self.visit_with_directives(node, directives)
def _extract_directives(self, node, scope_name):
if not node.decorators:
@@ -1052,7 +1052,7 @@ class InterpretCompilerDirectives(CythonTransform):
optdict[name] = value
return optdict
- # Handle with-statements
+ # Handle with-statements
def visit_WithStatNode(self, node):
directive_dict = {}
for directive in self.try_to_parse_directives(node.manager) or []:
@@ -1252,19 +1252,19 @@ class WithTransform(CythonTransform, SkipDeclarations):
def visit_WithStatNode(self, node):
self.visitchildren(node, 'body')
pos = node.pos
- is_async = node.is_async
+ is_async = node.is_async
body, target, manager = node.body, node.target, node.manager
node.enter_call = ExprNodes.SimpleCallNode(
pos, function=ExprNodes.AttributeNode(
pos, obj=ExprNodes.CloneNode(manager),
- attribute=EncodedString('__aenter__' if is_async else '__enter__'),
+ attribute=EncodedString('__aenter__' if is_async else '__enter__'),
is_special_lookup=True),
args=[],
is_temp=True)
- if is_async:
- node.enter_call = ExprNodes.AwaitExprNode(pos, arg=node.enter_call)
-
+ if is_async:
+ node.enter_call = ExprNodes.AwaitExprNode(pos, arg=node.enter_call)
+
if target is not None:
body = Nodes.StatListNode(
pos, stats=[
@@ -1282,7 +1282,7 @@ class WithTransform(CythonTransform, SkipDeclarations):
pos, operand=ExprNodes.WithExitCallNode(
pos, with_stat=node,
test_if_run=False,
- args=excinfo_target,
+ args=excinfo_target,
await_expr=ExprNodes.AwaitExprNode(pos, arg=None) if is_async else None)),
body=Nodes.ReraiseStatNode(pos),
),
@@ -1304,7 +1304,7 @@ class WithTransform(CythonTransform, SkipDeclarations):
pos, with_stat=node,
test_if_run=True,
args=ExprNodes.TupleNode(
- pos, args=[ExprNodes.NoneNode(pos) for _ in range(3)]),
+ pos, args=[ExprNodes.NoneNode(pos) for _ in range(3)]),
await_expr=ExprNodes.AwaitExprNode(pos, arg=None) if is_async else None)),
handle_error_case=False,
)
@@ -1316,76 +1316,76 @@ class WithTransform(CythonTransform, SkipDeclarations):
class DecoratorTransform(ScopeTrackingTransform, SkipDeclarations):
- """
- Transforms method decorators in cdef classes into nested calls or properties.
+ """
+ Transforms method decorators in cdef classes into nested calls or properties.
- Python-style decorator properties are transformed into a PropertyNode
- with up to the three getter, setter and deleter DefNodes.
- The functional style isn't supported yet.
+ Python-style decorator properties are transformed into a PropertyNode
+ with up to the three getter, setter and deleter DefNodes.
+ The functional style isn't supported yet.
"""
- _properties = None
-
- _map_property_attribute = {
- 'getter': '__get__',
- 'setter': '__set__',
- 'deleter': '__del__',
- }.get
-
- def visit_CClassDefNode(self, node):
- if self._properties is None:
- self._properties = []
- self._properties.append({})
- super(DecoratorTransform, self).visit_CClassDefNode(node)
- self._properties.pop()
- return node
-
- def visit_PropertyNode(self, node):
- # Low-level warning for other code until we can convert all our uses over.
- level = 2 if isinstance(node.pos[0], str) else 0
- warning(node.pos, "'property %s:' syntax is deprecated, use '@property'" % node.name, level)
- return node
-
- def visit_DefNode(self, node):
+ _properties = None
+
+ _map_property_attribute = {
+ 'getter': '__get__',
+ 'setter': '__set__',
+ 'deleter': '__del__',
+ }.get
+
+ def visit_CClassDefNode(self, node):
+ if self._properties is None:
+ self._properties = []
+ self._properties.append({})
+ super(DecoratorTransform, self).visit_CClassDefNode(node)
+ self._properties.pop()
+ return node
+
+ def visit_PropertyNode(self, node):
+ # Low-level warning for other code until we can convert all our uses over.
+ level = 2 if isinstance(node.pos[0], str) else 0
+ warning(node.pos, "'property %s:' syntax is deprecated, use '@property'" % node.name, level)
+ return node
+
+ def visit_DefNode(self, node):
scope_type = self.scope_type
- node = self.visit_FuncDefNode(node)
- if scope_type != 'cclass' or not node.decorators:
- return node
-
- # transform @property decorators
- properties = self._properties[-1]
- for decorator_node in node.decorators[::-1]:
- decorator = decorator_node.decorator
- if decorator.is_name and decorator.name == 'property':
- if len(node.decorators) > 1:
- return self._reject_decorated_property(node, decorator_node)
- name = node.name
- node.name = EncodedString('__get__')
- node.decorators.remove(decorator_node)
- stat_list = [node]
- if name in properties:
- prop = properties[name]
- prop.pos = node.pos
- prop.doc = node.doc
- prop.body.stats = stat_list
- return []
- prop = Nodes.PropertyNode(node.pos, name=name)
- prop.doc = node.doc
- prop.body = Nodes.StatListNode(node.pos, stats=stat_list)
- properties[name] = prop
- return [prop]
- elif decorator.is_attribute and decorator.obj.name in properties:
- handler_name = self._map_property_attribute(decorator.attribute)
- if handler_name:
+ node = self.visit_FuncDefNode(node)
+ if scope_type != 'cclass' or not node.decorators:
+ return node
+
+ # transform @property decorators
+ properties = self._properties[-1]
+ for decorator_node in node.decorators[::-1]:
+ decorator = decorator_node.decorator
+ if decorator.is_name and decorator.name == 'property':
+ if len(node.decorators) > 1:
+ return self._reject_decorated_property(node, decorator_node)
+ name = node.name
+ node.name = EncodedString('__get__')
+ node.decorators.remove(decorator_node)
+ stat_list = [node]
+ if name in properties:
+ prop = properties[name]
+ prop.pos = node.pos
+ prop.doc = node.doc
+ prop.body.stats = stat_list
+ return []
+ prop = Nodes.PropertyNode(node.pos, name=name)
+ prop.doc = node.doc
+ prop.body = Nodes.StatListNode(node.pos, stats=stat_list)
+ properties[name] = prop
+ return [prop]
+ elif decorator.is_attribute and decorator.obj.name in properties:
+ handler_name = self._map_property_attribute(decorator.attribute)
+ if handler_name:
if decorator.obj.name != node.name:
# CPython does not generate an error or warning, but not something useful either.
error(decorator_node.pos,
"Mismatching property names, expected '%s', got '%s'" % (
decorator.obj.name, node.name))
elif len(node.decorators) > 1:
- return self._reject_decorated_property(node, decorator_node)
+ return self._reject_decorated_property(node, decorator_node)
else:
return self._add_to_property(properties, node, handler_name, decorator_node)
-
+
# we clear node.decorators, so we need to set the
# is_staticmethod/is_classmethod attributes now
for decorator in node.decorators:
@@ -1394,61 +1394,61 @@ class DecoratorTransform(ScopeTrackingTransform, SkipDeclarations):
node.is_classmethod |= func.name == 'classmethod'
node.is_staticmethod |= func.name == 'staticmethod'
- # transform normal decorators
+ # transform normal decorators
decs = node.decorators
node.decorators = None
return self.chain_decorators(node, decs, node.name)
-
- @staticmethod
- def _reject_decorated_property(node, decorator_node):
- # restrict transformation to outermost decorator as wrapped properties will probably not work
- for deco in node.decorators:
- if deco != decorator_node:
- error(deco.pos, "Property methods with additional decorators are not supported")
- return node
-
- @staticmethod
- def _add_to_property(properties, node, name, decorator):
- prop = properties[node.name]
- node.name = name
- node.decorators.remove(decorator)
- stats = prop.body.stats
- for i, stat in enumerate(stats):
- if stat.name == name:
- stats[i] = node
- break
- else:
- stats.append(node)
- return []
-
- @staticmethod
- def chain_decorators(node, decorators, name):
- """
- Decorators are applied directly in DefNode and PyClassDefNode to avoid
- reassignments to the function/class name - except for cdef class methods.
- For those, the reassignment is required as methods are originally
- defined in the PyMethodDef struct.
-
- The IndirectionNode allows DefNode to override the decorator.
- """
- decorator_result = ExprNodes.NameNode(node.pos, name=name)
+
+ @staticmethod
+ def _reject_decorated_property(node, decorator_node):
+ # restrict transformation to outermost decorator as wrapped properties will probably not work
+ for deco in node.decorators:
+ if deco != decorator_node:
+ error(deco.pos, "Property methods with additional decorators are not supported")
+ return node
+
+ @staticmethod
+ def _add_to_property(properties, node, name, decorator):
+ prop = properties[node.name]
+ node.name = name
+ node.decorators.remove(decorator)
+ stats = prop.body.stats
+ for i, stat in enumerate(stats):
+ if stat.name == name:
+ stats[i] = node
+ break
+ else:
+ stats.append(node)
+ return []
+
+ @staticmethod
+ def chain_decorators(node, decorators, name):
+ """
+ Decorators are applied directly in DefNode and PyClassDefNode to avoid
+ reassignments to the function/class name - except for cdef class methods.
+ For those, the reassignment is required as methods are originally
+ defined in the PyMethodDef struct.
+
+ The IndirectionNode allows DefNode to override the decorator.
+ """
+ decorator_result = ExprNodes.NameNode(node.pos, name=name)
for decorator in decorators[::-1]:
decorator_result = ExprNodes.SimpleCallNode(
decorator.pos,
- function=decorator.decorator,
- args=[decorator_result])
+ function=decorator.decorator,
+ args=[decorator_result])
- name_node = ExprNodes.NameNode(node.pos, name=name)
+ name_node = ExprNodes.NameNode(node.pos, name=name)
reassignment = Nodes.SingleAssignmentNode(
node.pos,
- lhs=name_node,
- rhs=decorator_result)
+ lhs=name_node,
+ rhs=decorator_result)
reassignment = Nodes.IndirectionNode([reassignment])
node.decorator_indirection = reassignment
return [node, reassignment]
-
+
class CnameDirectivesTransform(CythonTransform, SkipDeclarations):
"""
Only part of the CythonUtilityCode pipeline. Must be run before
@@ -1482,7 +1482,7 @@ class CnameDirectivesTransform(CythonTransform, SkipDeclarations):
raise AssertionError(
"argument to cname decorator must be a string literal")
- cname = args[0].compile_time_value(None)
+ cname = args[0].compile_time_value(None)
del node.decorators[i]
node = Nodes.CnameDecoratorNode(pos=node.pos, node=node,
cname=cname)
@@ -1708,8 +1708,8 @@ if VALUE is not None:
# so it can be pickled *after* self is memoized.
unpickle_func = TreeFragment(u"""
def %(unpickle_func_name)s(__pyx_type, long __pyx_checksum, __pyx_state):
- cdef object __pyx_PickleError
- cdef object __pyx_result
+ cdef object __pyx_PickleError
+ cdef object __pyx_result
if __pyx_checksum != %(checksum)s:
from pickle import PickleError as __pyx_PickleError
raise __pyx_PickleError("Incompatible checksums (%%s vs %(checksum)s = (%(members)s))" %% __pyx_checksum)
@@ -1738,8 +1738,8 @@ if VALUE is not None:
pickle_func = TreeFragment(u"""
def __reduce_cython__(self):
- cdef tuple state
- cdef object _dict
+ cdef tuple state
+ cdef object _dict
cdef bint use_setstate
state = (%(members)s)
_dict = getattr(self, '__dict__', None)
@@ -1788,7 +1788,7 @@ if VALUE is not None:
if decorators:
transform = DecoratorTransform(self.context)
def_node = node.node
- _, reassignments = transform.chain_decorators(
+ _, reassignments = transform.chain_decorators(
def_node, decorators, def_node.name)
reassignments.analyse_declarations(env)
node = [node, reassignments]
@@ -1801,7 +1801,7 @@ if VALUE is not None:
node.stats.insert(0, node.py_func)
node.py_func = self.visit(node.py_func)
node.update_fused_defnode_entry(env)
- pycfunc = ExprNodes.PyCFunctionNode.from_defnode(node.py_func, binding=True)
+ pycfunc = ExprNodes.PyCFunctionNode.from_defnode(node.py_func, binding=True)
pycfunc = ExprNodes.ProxyNode(pycfunc.coerce_to_temp(env))
node.resulting_fused_function = pycfunc
# Create assignment node for our def function
@@ -1853,8 +1853,8 @@ if VALUE is not None:
node.body = Nodes.NogilTryFinallyStatNode(
node.body.pos,
body=node.body,
- finally_clause=Nodes.EnsureGILNode(node.body.pos),
- finally_except_clause=Nodes.EnsureGILNode(node.body.pos))
+ finally_clause=Nodes.EnsureGILNode(node.body.pos),
+ finally_except_clause=Nodes.EnsureGILNode(node.body.pos))
def _handle_fused(self, node):
if node.is_generator and node.has_fused_arguments:
@@ -1905,8 +1905,8 @@ if VALUE is not None:
def visit_DefNode(self, node):
node = self.visit_FuncDefNode(node)
env = self.current_env()
- if isinstance(node, Nodes.DefNode) and node.is_wrapper:
- env = env.parent_scope
+ if isinstance(node, Nodes.DefNode) and node.is_wrapper:
+ env = env.parent_scope
if (not isinstance(node, Nodes.DefNode) or
node.fused_py_func or node.is_generator_body or
not node.needs_assignment_synthesis(env)):
@@ -1930,7 +1930,7 @@ if VALUE is not None:
else:
binding = self.current_directives.get('binding')
rhs = ExprNodes.PyCFunctionNode.from_defnode(node, binding)
- node.code_object = rhs.code_object
+ node.code_object = rhs.code_object
if node.is_generator:
node.gbody.code_object = node.code_object
@@ -2161,28 +2161,28 @@ class CalculateQualifiedNamesTransform(EnvTransform):
return node
def visit_PyCFunctionNode(self, node):
- orig_qualified_name = self.qualified_name[:]
- if node.def_node.is_wrapper and self.qualified_name and self.qualified_name[-1] == '<locals>':
- self.qualified_name.pop()
- self._set_qualname(node)
- else:
- self._set_qualname(node, node.def_node.name)
+ orig_qualified_name = self.qualified_name[:]
+ if node.def_node.is_wrapper and self.qualified_name and self.qualified_name[-1] == '<locals>':
+ self.qualified_name.pop()
+ self._set_qualname(node)
+ else:
+ self._set_qualname(node, node.def_node.name)
self.visitchildren(node)
- self.qualified_name = orig_qualified_name
+ self.qualified_name = orig_qualified_name
return node
def visit_DefNode(self, node):
- if node.is_wrapper and self.qualified_name:
- assert self.qualified_name[-1] == '<locals>', self.qualified_name
- orig_qualified_name = self.qualified_name[:]
- self.qualified_name.pop()
- self._set_qualname(node)
- self._super_visit_FuncDefNode(node)
- self.qualified_name = orig_qualified_name
- else:
- self._set_qualname(node, node.name)
- self.visit_FuncDefNode(node)
- return node
+ if node.is_wrapper and self.qualified_name:
+ assert self.qualified_name[-1] == '<locals>', self.qualified_name
+ orig_qualified_name = self.qualified_name[:]
+ self.qualified_name.pop()
+ self._set_qualname(node)
+ self._super_visit_FuncDefNode(node)
+ self.qualified_name = orig_qualified_name
+ else:
+ self._set_qualname(node, node.name)
+ self.visit_FuncDefNode(node)
+ return node
def visit_FuncDefNode(self, node):
orig_qualified_name = self.qualified_name[:]
@@ -2273,26 +2273,26 @@ class ExpandInplaceOperators(EnvTransform):
if lhs.type.is_cpp_class:
# No getting around this exact operator here.
return node
- if isinstance(lhs, ExprNodes.BufferIndexNode):
- # There is code to handle this case in InPlaceAssignmentNode
+ if isinstance(lhs, ExprNodes.BufferIndexNode):
+ # There is code to handle this case in InPlaceAssignmentNode
return node
env = self.current_env()
def side_effect_free_reference(node, setting=False):
- if node.is_name:
+ if node.is_name:
return node, []
elif node.type.is_pyobject and not setting:
node = LetRefNode(node)
return node, [node]
- elif node.is_subscript:
+ elif node.is_subscript:
base, temps = side_effect_free_reference(node.base)
index = LetRefNode(node.index)
return ExprNodes.IndexNode(node.pos, base=base, index=index), temps + [index]
- elif node.is_attribute:
+ elif node.is_attribute:
obj, temps = side_effect_free_reference(node.obj)
return ExprNodes.AttributeNode(node.pos, obj=obj, attribute=node.attribute), temps
- elif isinstance(node, ExprNodes.BufferIndexNode):
- raise ValueError("Don't allow things like attributes of buffer indexing operations")
+ elif isinstance(node, ExprNodes.BufferIndexNode):
+ raise ValueError("Don't allow things like attributes of buffer indexing operations")
else:
node = LetRefNode(node)
return node, [node]
@@ -2333,7 +2333,7 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations):
@cython.cclass
@cython.ccall
@cython.inline
- @cython.nogil
+ @cython.nogil
"""
def visit_ModuleNode(self, node):
@@ -2353,7 +2353,7 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations):
modifiers = []
if 'inline' in self.directives:
modifiers.append('inline')
- nogil = self.directives.get('nogil')
+ nogil = self.directives.get('nogil')
except_val = self.directives.get('exceptval')
return_type_node = self.directives.get('returns')
if return_type_node is None and self.directives['annotation_typing']:
@@ -2366,7 +2366,7 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations):
except_val = (None, False)
if 'ccall' in self.directives:
node = node.as_cfunction(
- overridable=True, modifiers=modifiers, nogil=nogil,
+ overridable=True, modifiers=modifiers, nogil=nogil,
returns=return_type_node, except_val=except_val)
return self.visit(node)
if 'cfunc' in self.directives:
@@ -2374,21 +2374,21 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations):
error(node.pos, "cfunc directive is not allowed here")
else:
node = node.as_cfunction(
- overridable=False, modifiers=modifiers, nogil=nogil,
+ overridable=False, modifiers=modifiers, nogil=nogil,
returns=return_type_node, except_val=except_val)
return self.visit(node)
if 'inline' in modifiers:
error(node.pos, "Python functions cannot be declared 'inline'")
- if nogil:
- # TODO: turn this into a "with gil" declaration.
- error(node.pos, "Python functions cannot be declared 'nogil'")
+ if nogil:
+ # TODO: turn this into a "with gil" declaration.
+ error(node.pos, "Python functions cannot be declared 'nogil'")
self.visitchildren(node)
return node
- def visit_LambdaNode(self, node):
- # No directives should modify lambdas or generator expressions (and also nothing in them).
- return node
-
+ def visit_LambdaNode(self, node):
+ # No directives should modify lambdas or generator expressions (and also nothing in them).
+ return node
+
def visit_PyClassDefNode(self, node):
if 'cclass' in self.directives:
node = node.as_cclass()
@@ -2437,8 +2437,8 @@ class AlignFunctionDefinitions(CythonTransform):
if pxd_def is None:
pxd_def = self.scope.lookup(node.class_name)
if pxd_def:
- if not pxd_def.defined_in_pxd:
- return node
+ if not pxd_def.defined_in_pxd:
+ return node
outer_scope = self.scope
self.scope = pxd_def.type.scope
self.visitchildren(node)
@@ -2518,13 +2518,13 @@ class RemoveUnreachableCode(CythonTransform):
node.else_clause = None
return node
- def visit_TryFinallyStatNode(self, node):
- self.visitchildren(node)
- if node.finally_clause.is_terminator:
- node.is_terminator = True
- return node
-
+ def visit_TryFinallyStatNode(self, node):
+ self.visitchildren(node)
+ if node.finally_clause.is_terminator:
+ node.is_terminator = True
+ return node
+
class YieldNodeCollector(TreeVisitor):
def __init__(self):
@@ -2545,11 +2545,11 @@ class YieldNodeCollector(TreeVisitor):
self.has_yield = True
self.visitchildren(node)
- def visit_AwaitExprNode(self, node):
+ def visit_AwaitExprNode(self, node):
self.yields.append(node)
self.has_await = True
- self.visitchildren(node)
-
+ self.visitchildren(node)
+
def visit_ReturnStatNode(self, node):
self.visitchildren(node)
if node.value:
@@ -2576,12 +2576,12 @@ class YieldNodeCollector(TreeVisitor):
def visit_GeneratorExpressionNode(self, node):
pass
- def visit_CArgDeclNode(self, node):
- # do not look into annotations
- # FIXME: support (yield) in default arguments (currently crashes)
- pass
-
+ def visit_CArgDeclNode(self, node):
+ # do not look into annotations
+ # FIXME: support (yield) in default arguments (currently crashes)
+ pass
+
class MarkClosureVisitor(CythonTransform):
def visit_ModuleNode(self, node):
@@ -2598,7 +2598,7 @@ class MarkClosureVisitor(CythonTransform):
collector = YieldNodeCollector()
collector.visitchildren(node)
- if node.is_async_def:
+ if node.is_async_def:
coroutine_type = Nodes.AsyncDefNode
if collector.has_yield:
coroutine_type = Nodes.AsyncGenNode
@@ -2612,30 +2612,30 @@ class MarkClosureVisitor(CythonTransform):
return node
elif collector.has_yield:
coroutine_type = Nodes.GeneratorDefNode
- else:
- return node
+ else:
+ return node
for i, yield_expr in enumerate(collector.yields, 1):
- yield_expr.label_num = i
+ yield_expr.label_num = i
for retnode in collector.returns + collector.finallys + collector.excepts:
- retnode.in_generator = True
+ retnode.in_generator = True
- gbody = Nodes.GeneratorBodyDefNode(
+ gbody = Nodes.GeneratorBodyDefNode(
pos=node.pos, name=node.name, body=node.body,
is_async_gen_body=node.is_async_def and collector.has_yield)
coroutine = coroutine_type(
- pos=node.pos, name=node.name, args=node.args,
- star_arg=node.star_arg, starstar_arg=node.starstar_arg,
- doc=node.doc, decorators=node.decorators,
- gbody=gbody, lambda_name=node.lambda_name,
- return_type_annotation=node.return_type_annotation)
- return coroutine
-
+ pos=node.pos, name=node.name, args=node.args,
+ star_arg=node.star_arg, starstar_arg=node.starstar_arg,
+ doc=node.doc, decorators=node.decorators,
+ gbody=gbody, lambda_name=node.lambda_name,
+ return_type_annotation=node.return_type_annotation)
+ return coroutine
+
def visit_CFuncDefNode(self, node):
- self.needs_closure = False
- self.visitchildren(node)
- node.needs_closure = self.needs_closure
- self.needs_closure = True
+ self.needs_closure = False
+ self.visitchildren(node)
+ node.needs_closure = self.needs_closure
+ self.needs_closure = True
if node.needs_closure and node.overridable:
error(node.pos, "closures inside cpdef functions not yet supported")
return node
@@ -2652,7 +2652,7 @@ class MarkClosureVisitor(CythonTransform):
self.needs_closure = True
return node
-
+
class CreateClosureClasses(CythonTransform):
# Output closure classes in module scope for all functions
# that really need it.
@@ -2685,7 +2685,7 @@ class CreateClosureClasses(CythonTransform):
if node.is_generator:
for scope in node.local_scope.iter_local_scopes():
for entry in scope.entries.values():
- if not (entry.from_closure or entry.is_pyglobal or entry.is_cglobal):
+ if not (entry.from_closure or entry.is_pyglobal or entry.is_cglobal):
entry.in_closure = True
from_closure, in_closure = self.find_entries_used_in_closures(node)
@@ -2718,12 +2718,12 @@ class CreateClosureClasses(CythonTransform):
node.needs_outer_scope = True
return
- # entry.cname can contain periods (eg. a derived C method of a class).
- # We want to use the cname as part of a C struct name, so we replace
- # periods with double underscores.
+ # entry.cname can contain periods (eg. a derived C method of a class).
+ # We want to use the cname as part of a C struct name, so we replace
+ # periods with double underscores.
as_name = '%s_%s' % (
target_module_scope.next_id(Naming.closure_class_prefix),
- node.entry.cname.replace('.','__'))
+ node.entry.cname.replace('.','__'))
entry = target_module_scope.declare_c_class(
name=as_name, pos=node.pos, defining=True,
@@ -2796,60 +2796,60 @@ class CreateClosureClasses(CythonTransform):
return node
-class InjectGilHandling(VisitorTransform, SkipDeclarations):
- """
- Allow certain Python operations inside of nogil blocks by implicitly acquiring the GIL.
-
- Must run before the AnalyseDeclarationsTransform to make sure the GILStatNodes get
- set up, parallel sections know that the GIL is acquired inside of them, etc.
- """
- def __call__(self, root):
- self.nogil = False
- return super(InjectGilHandling, self).__call__(root)
-
- # special node handling
-
- def visit_RaiseStatNode(self, node):
- """Allow raising exceptions in nogil sections by wrapping them in a 'with gil' block."""
- if self.nogil:
- node = Nodes.GILStatNode(node.pos, state='gil', body=node)
- return node
-
- # further candidates:
- # def visit_AssertStatNode(self, node):
- # def visit_ReraiseStatNode(self, node):
-
- # nogil tracking
-
- def visit_GILStatNode(self, node):
- was_nogil = self.nogil
- self.nogil = (node.state == 'nogil')
- self.visitchildren(node)
- self.nogil = was_nogil
- return node
-
- def visit_CFuncDefNode(self, node):
- was_nogil = self.nogil
- if isinstance(node.declarator, Nodes.CFuncDeclaratorNode):
- self.nogil = node.declarator.nogil and not node.declarator.with_gil
- self.visitchildren(node)
- self.nogil = was_nogil
- return node
-
- def visit_ParallelRangeNode(self, node):
- was_nogil = self.nogil
- self.nogil = node.nogil
- self.visitchildren(node)
- self.nogil = was_nogil
- return node
-
- def visit_ExprNode(self, node):
- # No special GIL handling inside of expressions for now.
- return node
-
- visit_Node = VisitorTransform.recurse_to_children
-
-
+class InjectGilHandling(VisitorTransform, SkipDeclarations):
+ """
+ Allow certain Python operations inside of nogil blocks by implicitly acquiring the GIL.
+
+ Must run before the AnalyseDeclarationsTransform to make sure the GILStatNodes get
+ set up, parallel sections know that the GIL is acquired inside of them, etc.
+ """
+ def __call__(self, root):
+ self.nogil = False
+ return super(InjectGilHandling, self).__call__(root)
+
+ # special node handling
+
+ def visit_RaiseStatNode(self, node):
+ """Allow raising exceptions in nogil sections by wrapping them in a 'with gil' block."""
+ if self.nogil:
+ node = Nodes.GILStatNode(node.pos, state='gil', body=node)
+ return node
+
+ # further candidates:
+ # def visit_AssertStatNode(self, node):
+ # def visit_ReraiseStatNode(self, node):
+
+ # nogil tracking
+
+ def visit_GILStatNode(self, node):
+ was_nogil = self.nogil
+ self.nogil = (node.state == 'nogil')
+ self.visitchildren(node)
+ self.nogil = was_nogil
+ return node
+
+ def visit_CFuncDefNode(self, node):
+ was_nogil = self.nogil
+ if isinstance(node.declarator, Nodes.CFuncDeclaratorNode):
+ self.nogil = node.declarator.nogil and not node.declarator.with_gil
+ self.visitchildren(node)
+ self.nogil = was_nogil
+ return node
+
+ def visit_ParallelRangeNode(self, node):
+ was_nogil = self.nogil
+ self.nogil = node.nogil
+ self.visitchildren(node)
+ self.nogil = was_nogil
+ return node
+
+ def visit_ExprNode(self, node):
+ # No special GIL handling inside of expressions for now.
+ return node
+
+ visit_Node = VisitorTransform.recurse_to_children
+
+
class GilCheck(VisitorTransform):
"""
Call `node.gil_check(env)` on each node to make sure we hold the
@@ -2869,28 +2869,28 @@ class GilCheck(VisitorTransform):
self.nogil_declarator_only = False
return super(GilCheck, self).__call__(root)
- def _visit_scoped_children(self, node, gil_state):
- was_nogil = self.nogil
- outer_attrs = node.outer_attrs
- if outer_attrs and len(self.env_stack) > 1:
- self.nogil = self.env_stack[-2].nogil
- self.visitchildren(node, outer_attrs)
-
- self.nogil = gil_state
+ def _visit_scoped_children(self, node, gil_state):
+ was_nogil = self.nogil
+ outer_attrs = node.outer_attrs
+ if outer_attrs and len(self.env_stack) > 1:
+ self.nogil = self.env_stack[-2].nogil
+ self.visitchildren(node, outer_attrs)
+
+ self.nogil = gil_state
self.visitchildren(node, attrs=None, exclude=outer_attrs)
- self.nogil = was_nogil
-
+ self.nogil = was_nogil
+
def visit_FuncDefNode(self, node):
self.env_stack.append(node.local_scope)
- inner_nogil = node.local_scope.nogil
+ inner_nogil = node.local_scope.nogil
- if inner_nogil:
+ if inner_nogil:
self.nogil_declarator_only = True
- if inner_nogil and node.nogil_check:
+ if inner_nogil and node.nogil_check:
node.nogil_check(node.local_scope)
- self._visit_scoped_children(node, inner_nogil)
+ self._visit_scoped_children(node, inner_nogil)
# This cannot be nested, so it doesn't need backup/restore
self.nogil_declarator_only = False
@@ -2903,9 +2903,9 @@ class GilCheck(VisitorTransform):
node.nogil_check()
was_nogil = self.nogil
- is_nogil = (node.state == 'nogil')
+ is_nogil = (node.state == 'nogil')
- if was_nogil == is_nogil and not self.nogil_declarator_only:
+ if was_nogil == is_nogil and not self.nogil_declarator_only:
if not was_nogil:
error(node.pos, "Trying to acquire the GIL while it is "
"already held.")
@@ -2918,7 +2918,7 @@ class GilCheck(VisitorTransform):
# which is wrapped in a StatListNode. Just unpack that.
node.finally_clause, = node.finally_clause.stats
- self._visit_scoped_children(node, is_nogil)
+ self._visit_scoped_children(node, is_nogil)
return node
def visit_ParallelRangeNode(self, node):
@@ -2965,19 +2965,19 @@ class GilCheck(VisitorTransform):
def visit_Node(self, node):
if self.env_stack and self.nogil and node.nogil_check:
node.nogil_check(self.env_stack[-1])
- if node.outer_attrs:
- self._visit_scoped_children(node, self.nogil)
- else:
- self.visitchildren(node)
- if self.nogil:
- node.in_nogil_context = True
+ if node.outer_attrs:
+ self._visit_scoped_children(node, self.nogil)
+ else:
+ self.visitchildren(node)
+ if self.nogil:
+ node.in_nogil_context = True
return node
class TransformBuiltinMethods(EnvTransform):
- """
- Replace Cython's own cython.* builtins by the corresponding tree nodes.
- """
+ """
+ Replace Cython's own cython.* builtins by the corresponding tree nodes.
+ """
def visit_SingleAssignmentNode(self, node):
if node.declaration_only:
@@ -3137,13 +3137,13 @@ class TransformBuiltinMethods(EnvTransform):
node.function.pos, operand1=node.args[0], operand2=node.args[1])
elif function == u'cast':
if len(node.args) != 2:
- error(node.function.pos,
- u"cast() takes exactly two arguments and an optional typecheck keyword")
+ error(node.function.pos,
+ u"cast() takes exactly two arguments and an optional typecheck keyword")
else:
type = node.args[0].analyse_as_type(self.current_env())
if type:
- node = ExprNodes.TypecastNode(
- node.function.pos, type=type, operand=node.args[1], typecheck=False)
+ node = ExprNodes.TypecastNode(
+ node.function.pos, type=type, operand=node.args[1], typecheck=False)
else:
error(node.args[0].pos, "Not a type")
elif function == u'sizeof':
@@ -3189,12 +3189,12 @@ class TransformBuiltinMethods(EnvTransform):
return self._inject_super(node, func_name)
return node
- def visit_GeneralCallNode(self, node):
- function = node.function.as_cython_attribute()
+ def visit_GeneralCallNode(self, node):
+ function = node.function.as_cython_attribute()
if function == u'cast':
# NOTE: assuming simple tuple/dict nodes for positional_args and keyword_args
- args = node.positional_args.args
- kwargs = node.keyword_args.compile_time_value(None)
+ args = node.positional_args.args
+ kwargs = node.keyword_args.compile_time_value(None)
if (len(args) != 2 or len(kwargs) > 1 or
(len(kwargs) == 1 and 'typecheck' not in kwargs)):
error(node.function.pos,
@@ -3205,13 +3205,13 @@ class TransformBuiltinMethods(EnvTransform):
typecheck = kwargs.get('typecheck', False)
node = ExprNodes.TypecastNode(
node.function.pos, type=type, operand=args[1], typecheck=typecheck)
- else:
+ else:
error(args[0].pos, "Not a type")
- self.visitchildren(node)
- return node
-
-
+ self.visitchildren(node)
+ return node
+
+
class ReplaceFusedTypeChecks(VisitorTransform):
"""
This is not a transform in the pipeline. It is invoked on the specific
@@ -3348,11 +3348,11 @@ class DebugTransform(CythonTransform):
self.tb.start('Globals')
entries = {}
- for k, v in node.scope.entries.items():
+ for k, v in node.scope.entries.items():
if (v.qualified_name not in self.visited and not
- v.name.startswith('__pyx_') and not
- v.type.is_cfunction and not
- v.type.is_extension_type):
+ v.name.startswith('__pyx_') and not
+ v.type.is_cfunction and not
+ v.type.is_extension_type):
entries[k]= v
self.serialize_local_variables(entries)
@@ -3407,7 +3407,7 @@ class DebugTransform(CythonTransform):
def visit_NameNode(self, node):
if (self.register_stepinto and
- node.type is not None and
+ node.type is not None and
node.type.is_cfunction and
getattr(node, 'is_called', False) and
node.entry.func_cname is not None):
diff --git a/contrib/tools/cython/Cython/Compiler/Parsing.pxd b/contrib/tools/cython/Cython/Compiler/Parsing.pxd
index 25453b39ab..8117e05c1f 100644
--- a/contrib/tools/cython/Cython/Compiler/Parsing.pxd
+++ b/contrib/tools/cython/Cython/Compiler/Parsing.pxd
@@ -44,12 +44,12 @@ cdef p_typecast(PyrexScanner s)
cdef p_sizeof(PyrexScanner s)
cdef p_yield_expression(PyrexScanner s)
cdef p_yield_statement(PyrexScanner s)
-cdef p_async_statement(PyrexScanner s, ctx, decorators)
+cdef p_async_statement(PyrexScanner s, ctx, decorators)
cdef p_power(PyrexScanner s)
cdef p_new_expr(PyrexScanner s)
cdef p_trailer(PyrexScanner s, node1)
cdef p_call_parse_args(PyrexScanner s, bint allow_genexp = *)
-cdef p_call_build_packed_args(pos, positional_args, keyword_args)
+cdef p_call_build_packed_args(pos, positional_args, keyword_args)
cdef p_call(PyrexScanner s, function)
cdef p_index(PyrexScanner s, base)
cdef tuple p_subscript_list(PyrexScanner s)
@@ -72,7 +72,7 @@ cdef _append_escape_sequence(kind, builder, unicode escape_sequence, PyrexScanne
cdef tuple _f_string_error_pos(pos, string, Py_ssize_t i)
@cython.locals(i=Py_ssize_t, size=Py_ssize_t, c=Py_UCS4, next_start=Py_ssize_t)
cdef list p_f_string(PyrexScanner s, unicode_value, pos, bint is_raw)
-@cython.locals(i=Py_ssize_t, size=Py_ssize_t, c=Py_UCS4, quote_char=Py_UCS4, NO_CHAR=Py_UCS4)
+@cython.locals(i=Py_ssize_t, size=Py_ssize_t, c=Py_UCS4, quote_char=Py_UCS4, NO_CHAR=Py_UCS4)
cdef tuple p_f_string_expr(PyrexScanner s, unicode_value, pos, Py_ssize_t starting_index, bint is_raw)
cdef p_list_maker(PyrexScanner s)
cdef p_comp_iter(PyrexScanner s, body)
@@ -114,18 +114,18 @@ cdef p_if_statement(PyrexScanner s)
cdef p_if_clause(PyrexScanner s)
cdef p_else_clause(PyrexScanner s)
cdef p_while_statement(PyrexScanner s)
-cdef p_for_statement(PyrexScanner s, bint is_async=*)
-cdef dict p_for_bounds(PyrexScanner s, bint allow_testlist=*, bint is_async=*)
+cdef p_for_statement(PyrexScanner s, bint is_async=*)
+cdef dict p_for_bounds(PyrexScanner s, bint allow_testlist=*, bint is_async=*)
cdef p_for_from_relation(PyrexScanner s)
cdef p_for_from_step(PyrexScanner s)
cdef p_target(PyrexScanner s, terminator)
cdef p_for_target(PyrexScanner s)
-cdef p_for_iterator(PyrexScanner s, bint allow_testlist=*, bint is_async=*)
+cdef p_for_iterator(PyrexScanner s, bint allow_testlist=*, bint is_async=*)
cdef p_try_statement(PyrexScanner s)
cdef p_except_clause(PyrexScanner s)
cdef p_include_statement(PyrexScanner s, ctx)
cdef p_with_statement(PyrexScanner s)
-cdef p_with_items(PyrexScanner s, bint is_async=*)
+cdef p_with_items(PyrexScanner s, bint is_async=*)
cdef p_with_template(PyrexScanner s)
cdef p_simple_statement(PyrexScanner s, bint first_statement = *)
cdef p_simple_statement_list(PyrexScanner s, ctx, bint first_statement = *)
@@ -135,7 +135,7 @@ cdef p_IF_statement(PyrexScanner s, ctx)
cdef p_statement(PyrexScanner s, ctx, bint first_statement = *)
cdef p_statement_list(PyrexScanner s, ctx, bint first_statement = *)
cdef p_suite(PyrexScanner s, ctx = *)
-cdef tuple p_suite_with_docstring(PyrexScanner s, ctx, bint with_doc_only=*)
+cdef tuple p_suite_with_docstring(PyrexScanner s, ctx, bint with_doc_only=*)
cdef tuple _extract_docstring(node)
cdef p_positional_and_keyword_args(PyrexScanner s, end_sy_set, templates = *)
@@ -183,17 +183,17 @@ cdef p_c_modifiers(PyrexScanner s)
cdef p_c_func_or_var_declaration(PyrexScanner s, pos, ctx)
cdef p_ctypedef_statement(PyrexScanner s, ctx)
cdef p_decorators(PyrexScanner s)
-cdef _reject_cdef_modifier_in_py(PyrexScanner s, name)
-cdef p_def_statement(PyrexScanner s, list decorators=*, bint is_async_def=*)
+cdef _reject_cdef_modifier_in_py(PyrexScanner s, name)
+cdef p_def_statement(PyrexScanner s, list decorators=*, bint is_async_def=*)
cdef p_varargslist(PyrexScanner s, terminator=*, bint annotated = *)
cdef p_py_arg_decl(PyrexScanner s, bint annotated = *)
cdef p_class_statement(PyrexScanner s, decorators)
cdef p_c_class_definition(PyrexScanner s, pos, ctx)
-cdef tuple p_c_class_options(PyrexScanner s)
+cdef tuple p_c_class_options(PyrexScanner s)
cdef p_property_decl(PyrexScanner s)
cdef p_doc_string(PyrexScanner s)
cdef p_ignorable_statement(PyrexScanner s)
-cdef dict p_compiler_directive_comments(PyrexScanner s)
-cdef p_template_definition(PyrexScanner s)
+cdef dict p_compiler_directive_comments(PyrexScanner s)
+cdef p_template_definition(PyrexScanner s)
cdef p_cpp_class_definition(PyrexScanner s, pos, ctx)
cdef p_cpp_class_attribute(PyrexScanner s, ctx)
diff --git a/contrib/tools/cython/Cython/Compiler/Parsing.py b/contrib/tools/cython/Cython/Compiler/Parsing.py
index 4d2f12a24a..14110fcc06 100644
--- a/contrib/tools/cython/Cython/Compiler/Parsing.py
+++ b/contrib/tools/cython/Cython/Compiler/Parsing.py
@@ -8,37 +8,37 @@ from __future__ import absolute_import
# This should be done automatically
import cython
cython.declare(Nodes=object, ExprNodes=object, EncodedString=object,
- bytes_literal=object, StringEncoding=object,
+ bytes_literal=object, StringEncoding=object,
FileSourceDescriptor=object, lookup_unicodechar=object, unicode_category=object,
Future=object, Options=object, error=object, warning=object,
Builtin=object, ModuleNode=object, Utils=object, _unicode=object, _bytes=object,
re=object, sys=object, _parse_escape_sequences=object, _parse_escape_sequences_raw=object,
- partial=object, reduce=object, _IS_PY3=cython.bint, _IS_2BYTE_UNICODE=cython.bint,
- _CDEF_MODIFIERS=tuple)
+ partial=object, reduce=object, _IS_PY3=cython.bint, _IS_2BYTE_UNICODE=cython.bint,
+ _CDEF_MODIFIERS=tuple)
-from io import StringIO
+from io import StringIO
import re
-import sys
+import sys
from unicodedata import lookup as lookup_unicodechar, category as unicode_category
-from functools import partial, reduce
+from functools import partial, reduce
-from .Scanning import PyrexScanner, FileSourceDescriptor, StringSourceDescriptor
+from .Scanning import PyrexScanner, FileSourceDescriptor, StringSourceDescriptor
from . import Nodes
from . import ExprNodes
from . import Builtin
from . import StringEncoding
-from .StringEncoding import EncodedString, bytes_literal, _unicode, _bytes
+from .StringEncoding import EncodedString, bytes_literal, _unicode, _bytes
from .ModuleNode import ModuleNode
from .Errors import error, warning
from .. import Utils
from . import Future
from . import Options
-_IS_PY3 = sys.version_info[0] >= 3
+_IS_PY3 = sys.version_info[0] >= 3
_IS_2BYTE_UNICODE = sys.maxunicode == 0xffff
-_CDEF_MODIFIERS = ('inline', 'nogil', 'api')
-
+_CDEF_MODIFIERS = ('inline', 'nogil', 'api')
+
class Ctx(object):
# Parsing context
level = 'other'
@@ -62,8 +62,8 @@ class Ctx(object):
d.update(kwds)
return ctx
-
-def p_ident(s, message="Expected an identifier"):
+
+def p_ident(s, message="Expected an identifier"):
if s.sy == 'IDENT':
name = s.systring
s.next()
@@ -218,7 +218,7 @@ def p_starred_expr(s):
starred = False
expr = p_bit_expr(s)
if starred:
- expr = ExprNodes.StarredUnpackingNode(pos, expr)
+ expr = ExprNodes.StarredUnpackingNode(pos, expr)
return expr
def p_cascaded_cmp(s):
@@ -358,7 +358,7 @@ def p_sizeof(s):
s.expect(')')
return node
-
+
def p_yield_expression(s):
# s.sy == "yield"
pos = s.position()
@@ -368,8 +368,8 @@ def p_yield_expression(s):
is_yield_from = True
s.next()
if s.sy != ')' and s.sy not in statement_terminators:
- # "yield from" does not support implicit tuples, but "yield" does ("yield 1,2")
- arg = p_test(s) if is_yield_from else p_testlist(s)
+ # "yield from" does not support implicit tuples, but "yield" does ("yield 1,2")
+ arg = p_test(s) if is_yield_from else p_testlist(s)
else:
if is_yield_from:
s.error("'yield from' requires a source argument",
@@ -380,47 +380,47 @@ def p_yield_expression(s):
else:
return ExprNodes.YieldExprNode(pos, arg=arg)
-
+
def p_yield_statement(s):
# s.sy == "yield"
yield_expr = p_yield_expression(s)
return Nodes.ExprStatNode(yield_expr.pos, expr=yield_expr)
-def p_async_statement(s, ctx, decorators):
- # s.sy >> 'async' ...
- if s.sy == 'def':
- # 'async def' statements aren't allowed in pxd files
- if 'pxd' in ctx.level:
- s.error('def statement not allowed here')
- s.level = ctx.level
- return p_def_statement(s, decorators, is_async_def=True)
- elif decorators:
- s.error("Decorators can only be followed by functions or classes")
- elif s.sy == 'for':
- return p_for_statement(s, is_async=True)
- elif s.sy == 'with':
- s.next()
- return p_with_items(s, is_async=True)
- else:
- s.error("expected one of 'def', 'for', 'with' after 'async'")
-
-
-#power: atom_expr ('**' factor)*
-#atom_expr: ['await'] atom trailer*
-
+def p_async_statement(s, ctx, decorators):
+ # s.sy >> 'async' ...
+ if s.sy == 'def':
+ # 'async def' statements aren't allowed in pxd files
+ if 'pxd' in ctx.level:
+ s.error('def statement not allowed here')
+ s.level = ctx.level
+ return p_def_statement(s, decorators, is_async_def=True)
+ elif decorators:
+ s.error("Decorators can only be followed by functions or classes")
+ elif s.sy == 'for':
+ return p_for_statement(s, is_async=True)
+ elif s.sy == 'with':
+ s.next()
+ return p_with_items(s, is_async=True)
+ else:
+ s.error("expected one of 'def', 'for', 'with' after 'async'")
+
+
+#power: atom_expr ('**' factor)*
+#atom_expr: ['await'] atom trailer*
+
def p_power(s):
if s.systring == 'new' and s.peek()[0] == 'IDENT':
return p_new_expr(s)
- await_pos = None
- if s.sy == 'await':
- await_pos = s.position()
- s.next()
+ await_pos = None
+ if s.sy == 'await':
+ await_pos = s.position()
+ s.next()
n1 = p_atom(s)
while s.sy in ('(', '[', '.'):
n1 = p_trailer(s, n1)
- if await_pos:
- n1 = ExprNodes.AwaitExprNode(await_pos, arg=n1)
+ if await_pos:
+ n1 = ExprNodes.AwaitExprNode(await_pos, arg=n1)
if s.sy == '**':
pos = s.position()
s.next()
@@ -428,7 +428,7 @@ def p_power(s):
n1 = ExprNodes.binop_node(pos, '**', n1, n2)
return n1
-
+
def p_new_expr(s):
# s.systring == 'new'.
pos = s.position()
@@ -446,39 +446,39 @@ def p_trailer(s, node1):
return p_index(s, node1)
else: # s.sy == '.'
s.next()
- name = p_ident(s)
+ name = p_ident(s)
return ExprNodes.AttributeNode(pos,
- obj=node1, attribute=name)
-
+ obj=node1, attribute=name)
+
# arglist: argument (',' argument)* [',']
# argument: [test '='] test # Really [keyword '='] test
-# since PEP 448:
-# argument: ( test [comp_for] |
-# test '=' test |
-# '**' expr |
-# star_expr )
-
-def p_call_parse_args(s, allow_genexp=True):
+# since PEP 448:
+# argument: ( test [comp_for] |
+# test '=' test |
+# '**' expr |
+# star_expr )
+
+def p_call_parse_args(s, allow_genexp=True):
# s.sy == '('
pos = s.position()
s.next()
positional_args = []
keyword_args = []
- starstar_seen = False
- last_was_tuple_unpack = False
- while s.sy != ')':
+ starstar_seen = False
+ last_was_tuple_unpack = False
+ while s.sy != ')':
if s.sy == '*':
- if starstar_seen:
- s.error("Non-keyword arg following keyword arg", pos=s.position())
- s.next()
- positional_args.append(p_test(s))
- last_was_tuple_unpack = True
- elif s.sy == '**':
+ if starstar_seen:
+ s.error("Non-keyword arg following keyword arg", pos=s.position())
s.next()
- keyword_args.append(p_test(s))
- starstar_seen = True
+ positional_args.append(p_test(s))
+ last_was_tuple_unpack = True
+ elif s.sy == '**':
+ s.next()
+ keyword_args.append(p_test(s))
+ starstar_seen = True
else:
arg = p_test(s)
if s.sy == '=':
@@ -486,86 +486,86 @@ def p_call_parse_args(s, allow_genexp=True):
if not arg.is_name:
s.error("Expected an identifier before '='",
pos=arg.pos)
- encoded_name = s.context.intern_ustring(arg.name)
+ encoded_name = s.context.intern_ustring(arg.name)
keyword = ExprNodes.IdentifierStringNode(
arg.pos, value=encoded_name)
arg = p_test(s)
keyword_args.append((keyword, arg))
else:
if keyword_args:
- s.error("Non-keyword arg following keyword arg", pos=arg.pos)
- if positional_args and not last_was_tuple_unpack:
- positional_args[-1].append(arg)
- else:
- positional_args.append([arg])
- last_was_tuple_unpack = False
+ s.error("Non-keyword arg following keyword arg", pos=arg.pos)
+ if positional_args and not last_was_tuple_unpack:
+ positional_args[-1].append(arg)
+ else:
+ positional_args.append([arg])
+ last_was_tuple_unpack = False
if s.sy != ',':
break
s.next()
if s.sy in ('for', 'async'):
- if not keyword_args and not last_was_tuple_unpack:
- if len(positional_args) == 1 and len(positional_args[0]) == 1:
- positional_args = [[p_genexp(s, positional_args[0][0])]]
+ if not keyword_args and not last_was_tuple_unpack:
+ if len(positional_args) == 1 and len(positional_args[0]) == 1:
+ positional_args = [[p_genexp(s, positional_args[0][0])]]
s.expect(')')
- return positional_args or [[]], keyword_args
-
+ return positional_args or [[]], keyword_args
-def p_call_build_packed_args(pos, positional_args, keyword_args):
+
+def p_call_build_packed_args(pos, positional_args, keyword_args):
keyword_dict = None
-
- subtuples = [
- ExprNodes.TupleNode(pos, args=arg) if isinstance(arg, list) else ExprNodes.AsTupleNode(pos, arg=arg)
- for arg in positional_args
- ]
- # TODO: implement a faster way to join tuples than creating each one and adding them
- arg_tuple = reduce(partial(ExprNodes.binop_node, pos, '+'), subtuples)
-
- if keyword_args:
- kwargs = []
- dict_items = []
- for item in keyword_args:
- if isinstance(item, tuple):
- key, value = item
- dict_items.append(ExprNodes.DictItemNode(pos=key.pos, key=key, value=value))
- elif item.is_dict_literal:
- # unpack "**{a:b}" directly
- dict_items.extend(item.key_value_pairs)
- else:
- if dict_items:
- kwargs.append(ExprNodes.DictNode(
- dict_items[0].pos, key_value_pairs=dict_items, reject_duplicates=True))
- dict_items = []
- kwargs.append(item)
-
- if dict_items:
- kwargs.append(ExprNodes.DictNode(
- dict_items[0].pos, key_value_pairs=dict_items, reject_duplicates=True))
-
- if kwargs:
- if len(kwargs) == 1 and kwargs[0].is_dict_literal:
- # only simple keyword arguments found -> one dict
- keyword_dict = kwargs[0]
- else:
- # at least one **kwargs
- keyword_dict = ExprNodes.MergedDictNode(pos, keyword_args=kwargs)
-
+
+ subtuples = [
+ ExprNodes.TupleNode(pos, args=arg) if isinstance(arg, list) else ExprNodes.AsTupleNode(pos, arg=arg)
+ for arg in positional_args
+ ]
+ # TODO: implement a faster way to join tuples than creating each one and adding them
+ arg_tuple = reduce(partial(ExprNodes.binop_node, pos, '+'), subtuples)
+
+ if keyword_args:
+ kwargs = []
+ dict_items = []
+ for item in keyword_args:
+ if isinstance(item, tuple):
+ key, value = item
+ dict_items.append(ExprNodes.DictItemNode(pos=key.pos, key=key, value=value))
+ elif item.is_dict_literal:
+ # unpack "**{a:b}" directly
+ dict_items.extend(item.key_value_pairs)
+ else:
+ if dict_items:
+ kwargs.append(ExprNodes.DictNode(
+ dict_items[0].pos, key_value_pairs=dict_items, reject_duplicates=True))
+ dict_items = []
+ kwargs.append(item)
+
+ if dict_items:
+ kwargs.append(ExprNodes.DictNode(
+ dict_items[0].pos, key_value_pairs=dict_items, reject_duplicates=True))
+
+ if kwargs:
+ if len(kwargs) == 1 and kwargs[0].is_dict_literal:
+ # only simple keyword arguments found -> one dict
+ keyword_dict = kwargs[0]
+ else:
+ # at least one **kwargs
+ keyword_dict = ExprNodes.MergedDictNode(pos, keyword_args=kwargs)
+
return arg_tuple, keyword_dict
-
+
def p_call(s, function):
# s.sy == '('
pos = s.position()
- positional_args, keyword_args = p_call_parse_args(s)
+ positional_args, keyword_args = p_call_parse_args(s)
- if not keyword_args and len(positional_args) == 1 and isinstance(positional_args[0], list):
- return ExprNodes.SimpleCallNode(pos, function=function, args=positional_args[0])
+ if not keyword_args and len(positional_args) == 1 and isinstance(positional_args[0], list):
+ return ExprNodes.SimpleCallNode(pos, function=function, args=positional_args[0])
else:
- arg_tuple, keyword_dict = p_call_build_packed_args(pos, positional_args, keyword_args)
- return ExprNodes.GeneralCallNode(
- pos, function=function, positional_args=arg_tuple, keyword_args=keyword_dict)
-
+ arg_tuple, keyword_dict = p_call_build_packed_args(pos, positional_args, keyword_args)
+ return ExprNodes.GeneralCallNode(
+ pos, function=function, positional_args=arg_tuple, keyword_args=keyword_dict)
+
#lambdef: 'lambda' [varargslist] ':' test
#subscriptlist: subscript (',' subscript)* [',']
@@ -697,14 +697,14 @@ def p_atom(s):
return ExprNodes.UnicodeNode(pos, value = unicode_value, bytes_value = bytes_value)
elif kind == 'b':
return ExprNodes.BytesNode(pos, value = bytes_value)
- elif kind == 'f':
- return ExprNodes.JoinedStrNode(pos, values = unicode_value)
- elif kind == '':
- return ExprNodes.StringNode(pos, value = bytes_value, unicode_value = unicode_value)
+ elif kind == 'f':
+ return ExprNodes.JoinedStrNode(pos, values = unicode_value)
+ elif kind == '':
+ return ExprNodes.StringNode(pos, value = bytes_value, unicode_value = unicode_value)
else:
- s.error("invalid string kind '%s'" % kind)
+ s.error("invalid string kind '%s'" % kind)
elif sy == 'IDENT':
- name = s.systring
+ name = s.systring
if name == "None":
result = ExprNodes.NoneNode(pos)
elif name == "True":
@@ -771,9 +771,9 @@ def wrap_compile_time_constant(pos, value):
elif isinstance(value, bool):
return ExprNodes.BoolNode(pos, value=value)
elif isinstance(value, int):
- return ExprNodes.IntNode(pos, value=rep, constant_result=value)
+ return ExprNodes.IntNode(pos, value=rep, constant_result=value)
elif isinstance(value, float):
- return ExprNodes.FloatNode(pos, value=rep, constant_result=value)
+ return ExprNodes.FloatNode(pos, value=rep, constant_result=value)
elif isinstance(value, complex):
node = ExprNodes.ImagNode(pos, value=repr(value.imag), constant_result=complex(0.0, value.imag))
if value.real:
@@ -786,8 +786,8 @@ def wrap_compile_time_constant(pos, value):
elif isinstance(value, _unicode):
return ExprNodes.UnicodeNode(pos, value=EncodedString(value))
elif isinstance(value, _bytes):
- bvalue = bytes_literal(value, 'ascii') # actually: unknown encoding, but BytesLiteral requires one
- return ExprNodes.BytesNode(pos, value=bvalue, constant_result=value)
+ bvalue = bytes_literal(value, 'ascii') # actually: unknown encoding, but BytesLiteral requires one
+ return ExprNodes.BytesNode(pos, value=bvalue, constant_result=value)
elif isinstance(value, tuple):
args = [wrap_compile_time_constant(pos, arg)
for arg in value]
@@ -796,8 +796,8 @@ def wrap_compile_time_constant(pos, value):
else:
# error already reported
return None
- elif not _IS_PY3 and isinstance(value, long):
- return ExprNodes.IntNode(pos, value=rep.rstrip('L'), constant_result=value)
+ elif not _IS_PY3 and isinstance(value, long):
+ return ExprNodes.IntNode(pos, value=rep.rstrip('L'), constant_result=value)
error(pos, "Invalid type for compile-time constant: %r (type %s)"
% (value, value.__class__.__name__))
return None
@@ -806,84 +806,84 @@ def wrap_compile_time_constant(pos, value):
def p_cat_string_literal(s):
# A sequence of one or more adjacent string literals.
# Returns (kind, bytes_value, unicode_value)
- # where kind in ('b', 'c', 'u', 'f', '')
- pos = s.position()
+ # where kind in ('b', 'c', 'u', 'f', '')
+ pos = s.position()
kind, bytes_value, unicode_value = p_string_literal(s)
if kind == 'c' or s.sy != 'BEGIN_STRING':
return kind, bytes_value, unicode_value
- bstrings, ustrings, positions = [bytes_value], [unicode_value], [pos]
+ bstrings, ustrings, positions = [bytes_value], [unicode_value], [pos]
bytes_value = unicode_value = None
while s.sy == 'BEGIN_STRING':
pos = s.position()
next_kind, next_bytes_value, next_unicode_value = p_string_literal(s)
if next_kind == 'c':
error(pos, "Cannot concatenate char literal with another string or char literal")
- continue
+ continue
elif next_kind != kind:
- # concatenating f strings and normal strings is allowed and leads to an f string
- if set([kind, next_kind]) in (set(['f', 'u']), set(['f', ''])):
- kind = 'f'
- else:
+ # concatenating f strings and normal strings is allowed and leads to an f string
+ if set([kind, next_kind]) in (set(['f', 'u']), set(['f', ''])):
+ kind = 'f'
+ else:
error(pos, "Cannot mix string literals of different types, expected %s'', got %s''" % (
kind, next_kind))
- continue
- bstrings.append(next_bytes_value)
- ustrings.append(next_unicode_value)
- positions.append(pos)
+ continue
+ bstrings.append(next_bytes_value)
+ ustrings.append(next_unicode_value)
+ positions.append(pos)
# join and rewrap the partial literals
if kind in ('b', 'c', '') or kind == 'u' and None not in bstrings:
# Py3 enforced unicode literals are parsed as bytes/unicode combination
- bytes_value = bytes_literal(StringEncoding.join_bytes(bstrings), s.source_encoding)
+ bytes_value = bytes_literal(StringEncoding.join_bytes(bstrings), s.source_encoding)
if kind in ('u', ''):
- unicode_value = EncodedString(u''.join([u for u in ustrings if u is not None]))
- if kind == 'f':
- unicode_value = []
- for u, pos in zip(ustrings, positions):
- if isinstance(u, list):
- unicode_value += u
- else:
- # non-f-string concatenated into the f-string
- unicode_value.append(ExprNodes.UnicodeNode(pos, value=EncodedString(u)))
+ unicode_value = EncodedString(u''.join([u for u in ustrings if u is not None]))
+ if kind == 'f':
+ unicode_value = []
+ for u, pos in zip(ustrings, positions):
+ if isinstance(u, list):
+ unicode_value += u
+ else:
+ # non-f-string concatenated into the f-string
+ unicode_value.append(ExprNodes.UnicodeNode(pos, value=EncodedString(u)))
return kind, bytes_value, unicode_value
-
+
def p_opt_string_literal(s, required_type='u'):
- if s.sy != 'BEGIN_STRING':
- return None
- pos = s.position()
- kind, bytes_value, unicode_value = p_string_literal(s, required_type)
- if required_type == 'u':
- if kind == 'f':
- s.error("f-string not allowed here", pos)
- return unicode_value
- elif required_type == 'b':
- return bytes_value
- else:
- s.error("internal parser configuration error")
-
-
+ if s.sy != 'BEGIN_STRING':
+ return None
+ pos = s.position()
+ kind, bytes_value, unicode_value = p_string_literal(s, required_type)
+ if required_type == 'u':
+ if kind == 'f':
+ s.error("f-string not allowed here", pos)
+ return unicode_value
+ elif required_type == 'b':
+ return bytes_value
+ else:
+ s.error("internal parser configuration error")
+
+
def check_for_non_ascii_characters(string):
for c in string:
if c >= u'\x80':
return True
return False
-
+
def p_string_literal(s, kind_override=None):
# A single string or char literal. Returns (kind, bvalue, uvalue)
- # where kind in ('b', 'c', 'u', 'f', ''). The 'bvalue' is the source
+ # where kind in ('b', 'c', 'u', 'f', ''). The 'bvalue' is the source
# code byte sequence of the string literal, 'uvalue' is the
# decoded Unicode string. Either of the two may be None depending
# on the 'kind' of string, only unprefixed strings have both
- # representations. In f-strings, the uvalue is a list of the Unicode
- # strings and f-string expressions that make up the f-string.
+ # representations. In f-strings, the uvalue is a list of the Unicode
+ # strings and f-string expressions that make up the f-string.
# s.sy == 'BEGIN_STRING'
pos = s.position()
is_python3_source = s.context.language_level >= 3
- has_non_ascii_literal_characters = False
+ has_non_ascii_literal_characters = False
string_start_pos = (pos[0], pos[1], pos[2] + len(s.systring))
- kind_string = s.systring.rstrip('"\'').lower()
+ kind_string = s.systring.rstrip('"\'').lower()
if len(kind_string) > 1:
if len(set(kind_string)) != len(kind_string):
error(pos, 'Duplicate string prefix character')
@@ -893,32 +893,32 @@ def p_string_literal(s, kind_override=None):
error(pos, 'String prefixes b and f cannot be combined')
if 'u' in kind_string and 'f' in kind_string:
error(pos, 'String prefixes u and f cannot be combined')
-
- is_raw = 'r' in kind_string
-
- if 'c' in kind_string:
- # this should never happen, since the lexer does not allow combining c
- # with other prefix characters
- if len(kind_string) != 1:
+
+ is_raw = 'r' in kind_string
+
+ if 'c' in kind_string:
+ # this should never happen, since the lexer does not allow combining c
+ # with other prefix characters
+ if len(kind_string) != 1:
error(pos, 'Invalid string prefix for character literal')
- kind = 'c'
- elif 'f' in kind_string:
+ kind = 'c'
+ elif 'f' in kind_string:
kind = 'f' # u is ignored
is_raw = True # postpone the escape resolution
- elif 'b' in kind_string:
- kind = 'b'
- elif 'u' in kind_string:
- kind = 'u'
- else:
+ elif 'b' in kind_string:
+ kind = 'b'
+ elif 'u' in kind_string:
+ kind = 'u'
+ else:
kind = ''
-
+
if kind == '' and kind_override is None and Future.unicode_literals in s.context.future_directives:
chars = StringEncoding.StrLiteralBuilder(s.source_encoding)
kind = 'u'
else:
if kind_override is not None and kind_override in 'ub':
kind = kind_override
- if kind in ('u', 'f'): # f-strings are scanned exactly like Unicode literals, but are parsed further later
+ if kind in ('u', 'f'): # f-strings are scanned exactly like Unicode literals, but are parsed further later
chars = StringEncoding.UnicodeLiteralBuilder()
elif kind == '':
chars = StringEncoding.StrLiteralBuilder(s.source_encoding)
@@ -929,17 +929,17 @@ def p_string_literal(s, kind_override=None):
s.next()
sy = s.sy
systr = s.systring
- # print "p_string_literal: sy =", sy, repr(s.systring) ###
+ # print "p_string_literal: sy =", sy, repr(s.systring) ###
if sy == 'CHARS':
chars.append(systr)
- if is_python3_source and not has_non_ascii_literal_characters and check_for_non_ascii_characters(systr):
- has_non_ascii_literal_characters = True
+ if is_python3_source and not has_non_ascii_literal_characters and check_for_non_ascii_characters(systr):
+ has_non_ascii_literal_characters = True
elif sy == 'ESCAPE':
# in Py2, 'ur' raw unicode strings resolve unicode escapes but nothing else
if is_raw and (is_python3_source or kind != 'u' or systr[1] not in u'Uu'):
chars.append(systr)
if is_python3_source and not has_non_ascii_literal_characters and check_for_non_ascii_characters(systr):
- has_non_ascii_literal_characters = True
+ has_non_ascii_literal_characters = True
else:
_append_escape_sequence(kind, chars, systr, s)
elif sy == 'NEWLINE':
@@ -959,18 +959,18 @@ def p_string_literal(s, kind_override=None):
error(pos, u"invalid character literal: %r" % bytes_value)
else:
bytes_value, unicode_value = chars.getstrings()
- if (has_non_ascii_literal_characters
- and is_python3_source and Future.unicode_literals in s.context.future_directives):
+ if (has_non_ascii_literal_characters
+ and is_python3_source and Future.unicode_literals in s.context.future_directives):
# Python 3 forbids literal non-ASCII characters in byte strings
- if kind == 'b':
+ if kind == 'b':
s.error("bytes can only contain ASCII literal characters.", pos=pos)
bytes_value = None
- if kind == 'f':
+ if kind == 'f':
unicode_value = p_f_string(s, unicode_value, string_start_pos, is_raw='r' in kind_string)
s.next()
return (kind, bytes_value, unicode_value)
-
+
def _append_escape_sequence(kind, builder, escape_sequence, s):
c = escape_sequence[1]
if c in u"01234567":
@@ -1043,11 +1043,11 @@ def _f_string_error_pos(pos, string, i):
def p_f_string(s, unicode_value, pos, is_raw):
- # Parses a PEP 498 f-string literal into a list of nodes. Nodes are either UnicodeNodes
- # or FormattedValueNodes.
- values = []
+ # Parses a PEP 498 f-string literal into a list of nodes. Nodes are either UnicodeNodes
+ # or FormattedValueNodes.
+ values = []
next_start = 0
- size = len(unicode_value)
+ size = len(unicode_value)
builder = StringEncoding.UnicodeLiteralBuilder()
_parse_seq = _parse_escape_sequences_raw if is_raw else _parse_escape_sequences
@@ -1063,7 +1063,7 @@ def p_f_string(s, unicode_value, pos, is_raw):
if c == '\\':
if not is_raw and len(part) > 1:
_append_escape_sequence('f', builder, part, s)
- else:
+ else:
builder.append(part)
elif c == '{':
if part == '{{':
@@ -1074,150 +1074,150 @@ def p_f_string(s, unicode_value, pos, is_raw):
values.append(ExprNodes.UnicodeNode(pos, value=builder.getstring()))
builder = StringEncoding.UnicodeLiteralBuilder()
next_start, expr_node = p_f_string_expr(s, unicode_value, pos, next_start, is_raw)
- values.append(expr_node)
+ values.append(expr_node)
elif c == '}':
if part == '}}':
builder.append('}')
else:
error(_f_string_error_pos(pos, unicode_value, end),
"f-string: single '}' is not allowed")
- else:
+ else:
builder.append(part)
-
+
if builder.chars:
values.append(ExprNodes.UnicodeNode(pos, value=builder.getstring()))
- return values
-
-
+ return values
+
+
def p_f_string_expr(s, unicode_value, pos, starting_index, is_raw):
- # Parses a {}-delimited expression inside an f-string. Returns a FormattedValueNode
- # and the index in the string that follows the expression.
- i = starting_index
- size = len(unicode_value)
- conversion_char = terminal_char = format_spec = None
- format_spec_str = None
- NO_CHAR = 2**30
-
- nested_depth = 0
- quote_char = NO_CHAR
- in_triple_quotes = False
+ # Parses a {}-delimited expression inside an f-string. Returns a FormattedValueNode
+ # and the index in the string that follows the expression.
+ i = starting_index
+ size = len(unicode_value)
+ conversion_char = terminal_char = format_spec = None
+ format_spec_str = None
+ NO_CHAR = 2**30
+
+ nested_depth = 0
+ quote_char = NO_CHAR
+ in_triple_quotes = False
backslash_reported = False
-
- while True:
- if i >= size:
+
+ while True:
+ if i >= size:
break # error will be reported below
- c = unicode_value[i]
-
- if quote_char != NO_CHAR:
- if c == '\\':
+ c = unicode_value[i]
+
+ if quote_char != NO_CHAR:
+ if c == '\\':
# avoid redundant error reports along '\' sequences
if not backslash_reported:
error(_f_string_error_pos(pos, unicode_value, i),
"backslashes not allowed in f-strings")
backslash_reported = True
- elif c == quote_char:
- if in_triple_quotes:
- if i + 2 < size and unicode_value[i + 1] == c and unicode_value[i + 2] == c:
- in_triple_quotes = False
- quote_char = NO_CHAR
- i += 2
- else:
- quote_char = NO_CHAR
- elif c in '\'"':
- quote_char = c
- if i + 2 < size and unicode_value[i + 1] == c and unicode_value[i + 2] == c:
- in_triple_quotes = True
- i += 2
- elif c in '{[(':
- nested_depth += 1
- elif nested_depth != 0 and c in '}])':
- nested_depth -= 1
- elif c == '#':
+ elif c == quote_char:
+ if in_triple_quotes:
+ if i + 2 < size and unicode_value[i + 1] == c and unicode_value[i + 2] == c:
+ in_triple_quotes = False
+ quote_char = NO_CHAR
+ i += 2
+ else:
+ quote_char = NO_CHAR
+ elif c in '\'"':
+ quote_char = c
+ if i + 2 < size and unicode_value[i + 1] == c and unicode_value[i + 2] == c:
+ in_triple_quotes = True
+ i += 2
+ elif c in '{[(':
+ nested_depth += 1
+ elif nested_depth != 0 and c in '}])':
+ nested_depth -= 1
+ elif c == '#':
error(_f_string_error_pos(pos, unicode_value, i),
"format string cannot include #")
- elif nested_depth == 0 and c in '!:}':
- # allow != as a special case
- if c == '!' and i + 1 < size and unicode_value[i + 1] == '=':
- i += 1
- continue
-
- terminal_char = c
- break
- i += 1
-
- # normalise line endings as the parser expects that
- expr_str = unicode_value[starting_index:i].replace('\r\n', '\n').replace('\r', '\n')
- expr_pos = (pos[0], pos[1], pos[2] + starting_index + 2) # TODO: find exact code position (concat, multi-line, ...)
-
- if not expr_str.strip():
+ elif nested_depth == 0 and c in '!:}':
+ # allow != as a special case
+ if c == '!' and i + 1 < size and unicode_value[i + 1] == '=':
+ i += 1
+ continue
+
+ terminal_char = c
+ break
+ i += 1
+
+ # normalise line endings as the parser expects that
+ expr_str = unicode_value[starting_index:i].replace('\r\n', '\n').replace('\r', '\n')
+ expr_pos = (pos[0], pos[1], pos[2] + starting_index + 2) # TODO: find exact code position (concat, multi-line, ...)
+
+ if not expr_str.strip():
error(_f_string_error_pos(pos, unicode_value, starting_index),
"empty expression not allowed in f-string")
-
- if terminal_char == '!':
- i += 1
- if i + 2 > size:
+
+ if terminal_char == '!':
+ i += 1
+ if i + 2 > size:
pass # error will be reported below
else:
conversion_char = unicode_value[i]
i += 1
terminal_char = unicode_value[i]
-
- if terminal_char == ':':
- in_triple_quotes = False
- in_string = False
- nested_depth = 0
- start_format_spec = i + 1
- while True:
- if i >= size:
+
+ if terminal_char == ':':
+ in_triple_quotes = False
+ in_string = False
+ nested_depth = 0
+ start_format_spec = i + 1
+ while True:
+ if i >= size:
break # error will be reported below
- c = unicode_value[i]
- if not in_triple_quotes and not in_string:
- if c == '{':
- nested_depth += 1
- elif c == '}':
- if nested_depth > 0:
- nested_depth -= 1
- else:
- terminal_char = c
- break
- if c in '\'"':
- if not in_string and i + 2 < size and unicode_value[i + 1] == c and unicode_value[i + 2] == c:
- in_triple_quotes = not in_triple_quotes
- i += 2
- elif not in_triple_quotes:
- in_string = not in_string
- i += 1
-
- format_spec_str = unicode_value[start_format_spec:i]
-
- if terminal_char != '}':
+ c = unicode_value[i]
+ if not in_triple_quotes and not in_string:
+ if c == '{':
+ nested_depth += 1
+ elif c == '}':
+ if nested_depth > 0:
+ nested_depth -= 1
+ else:
+ terminal_char = c
+ break
+ if c in '\'"':
+ if not in_string and i + 2 < size and unicode_value[i + 1] == c and unicode_value[i + 2] == c:
+ in_triple_quotes = not in_triple_quotes
+ i += 2
+ elif not in_triple_quotes:
+ in_string = not in_string
+ i += 1
+
+ format_spec_str = unicode_value[start_format_spec:i]
+
+ if terminal_char != '}':
error(_f_string_error_pos(pos, unicode_value, i),
"missing '}' in format string expression" + (
", found '%s'" % terminal_char if terminal_char else ""))
-
- # parse the expression as if it was surrounded by parentheses
- buf = StringIO('(%s)' % expr_str)
- scanner = PyrexScanner(buf, expr_pos[0], parent_scanner=s, source_encoding=s.source_encoding, initial_pos=expr_pos)
- expr = p_testlist(scanner) # TODO is testlist right here?
-
- # validate the conversion char
- if conversion_char is not None and not ExprNodes.FormattedValueNode.find_conversion_func(conversion_char):
+
+ # parse the expression as if it was surrounded by parentheses
+ buf = StringIO('(%s)' % expr_str)
+ scanner = PyrexScanner(buf, expr_pos[0], parent_scanner=s, source_encoding=s.source_encoding, initial_pos=expr_pos)
+ expr = p_testlist(scanner) # TODO is testlist right here?
+
+ # validate the conversion char
+ if conversion_char is not None and not ExprNodes.FormattedValueNode.find_conversion_func(conversion_char):
error(expr_pos, "invalid conversion character '%s'" % conversion_char)
-
- # the format spec is itself treated like an f-string
- if format_spec_str:
+
+ # the format spec is itself treated like an f-string
+ if format_spec_str:
format_spec = ExprNodes.JoinedStrNode(pos, values=p_f_string(s, format_spec_str, pos, is_raw))
-
- return i + 1, ExprNodes.FormattedValueNode(
+
+ return i + 1, ExprNodes.FormattedValueNode(
pos, value=expr, conversion_char=conversion_char, format_spec=format_spec)
-
-
-# since PEP 448:
-# list_display ::= "[" [listmaker] "]"
-# listmaker ::= (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
+
+
+# since PEP 448:
+# list_display ::= "[" [listmaker] "]"
+# listmaker ::= (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
# comp_iter ::= comp_for | comp_if
# comp_for ::= ["async"] "for" expression_list "in" testlist [comp_iter]
-# comp_if ::= "if" test [comp_iter]
+# comp_if ::= "if" test [comp_iter]
def p_list_maker(s):
# s.sy == '['
@@ -1225,30 +1225,30 @@ def p_list_maker(s):
s.next()
if s.sy == ']':
s.expect(']')
- return ExprNodes.ListNode(pos, args=[])
-
- expr = p_test_or_starred_expr(s)
+ return ExprNodes.ListNode(pos, args=[])
+
+ expr = p_test_or_starred_expr(s)
if s.sy in ('for', 'async'):
- if expr.is_starred:
- s.error("iterable unpacking cannot be used in comprehension")
+ if expr.is_starred:
+ s.error("iterable unpacking cannot be used in comprehension")
append = ExprNodes.ComprehensionAppendNode(pos, expr=expr)
loop = p_comp_for(s, append)
s.expect(']')
return ExprNodes.ComprehensionNode(
- pos, loop=loop, append=append, type=Builtin.list_type,
+ pos, loop=loop, append=append, type=Builtin.list_type,
# list comprehensions leak their loop variable in Py2
- has_local_scope=s.context.language_level >= 3)
-
- # (merged) list literal
- if s.sy == ',':
- s.next()
- exprs = p_test_or_starred_expr_list(s, expr)
- else:
- exprs = [expr]
- s.expect(']')
- return ExprNodes.ListNode(pos, args=exprs)
-
-
+ has_local_scope=s.context.language_level >= 3)
+
+ # (merged) list literal
+ if s.sy == ',':
+ s.next()
+ exprs = p_test_or_starred_expr_list(s, expr)
+ else:
+ exprs = [expr]
+ s.expect(']')
+ return ExprNodes.ListNode(pos, args=exprs)
+
+
def p_comp_iter(s, body):
if s.sy in ('for', 'async'):
return p_comp_for(s, body)
@@ -1283,121 +1283,121 @@ def p_comp_if(s, body):
else_clause = None )
-# since PEP 448:
-#dictorsetmaker: ( ((test ':' test | '**' expr)
-# (comp_for | (',' (test ':' test | '**' expr))* [','])) |
-# ((test | star_expr)
-# (comp_for | (',' (test | star_expr))* [','])) )
-
+# since PEP 448:
+#dictorsetmaker: ( ((test ':' test | '**' expr)
+# (comp_for | (',' (test ':' test | '**' expr))* [','])) |
+# ((test | star_expr)
+# (comp_for | (',' (test | star_expr))* [','])) )
+
def p_dict_or_set_maker(s):
# s.sy == '{'
pos = s.position()
s.next()
if s.sy == '}':
s.next()
- return ExprNodes.DictNode(pos, key_value_pairs=[])
-
- parts = []
- target_type = 0
- last_was_simple_item = False
- while True:
- if s.sy in ('*', '**'):
- # merged set/dict literal
- if target_type == 0:
- target_type = 1 if s.sy == '*' else 2 # 'stars'
- elif target_type != len(s.sy):
- s.error("unexpected %sitem found in %s literal" % (
- s.sy, 'set' if target_type == 1 else 'dict'))
- s.next()
- if s.sy == '*':
- s.error("expected expression, found '*'")
- item = p_starred_expr(s)
- parts.append(item)
- last_was_simple_item = False
- else:
- item = p_test(s)
- if target_type == 0:
- target_type = 2 if s.sy == ':' else 1 # dict vs. set
- if target_type == 2:
- # dict literal
- s.expect(':')
- key = item
- value = p_test(s)
- item = ExprNodes.DictItemNode(key.pos, key=key, value=value)
- if last_was_simple_item:
- parts[-1].append(item)
- else:
- parts.append([item])
- last_was_simple_item = True
-
- if s.sy == ',':
+ return ExprNodes.DictNode(pos, key_value_pairs=[])
+
+ parts = []
+ target_type = 0
+ last_was_simple_item = False
+ while True:
+ if s.sy in ('*', '**'):
+ # merged set/dict literal
+ if target_type == 0:
+ target_type = 1 if s.sy == '*' else 2 # 'stars'
+ elif target_type != len(s.sy):
+ s.error("unexpected %sitem found in %s literal" % (
+ s.sy, 'set' if target_type == 1 else 'dict'))
s.next()
+ if s.sy == '*':
+ s.error("expected expression, found '*'")
+ item = p_starred_expr(s)
+ parts.append(item)
+ last_was_simple_item = False
+ else:
+ item = p_test(s)
+ if target_type == 0:
+ target_type = 2 if s.sy == ':' else 1 # dict vs. set
+ if target_type == 2:
+ # dict literal
+ s.expect(':')
+ key = item
+ value = p_test(s)
+ item = ExprNodes.DictItemNode(key.pos, key=key, value=value)
+ if last_was_simple_item:
+ parts[-1].append(item)
+ else:
+ parts.append([item])
+ last_was_simple_item = True
+
+ if s.sy == ',':
+ s.next()
if s.sy == '}':
break
- else:
- break
-
+ else:
+ break
+
if s.sy in ('for', 'async'):
- # dict/set comprehension
- if len(parts) == 1 and isinstance(parts[0], list) and len(parts[0]) == 1:
- item = parts[0][0]
- if target_type == 2:
- assert isinstance(item, ExprNodes.DictItemNode), type(item)
- comprehension_type = Builtin.dict_type
- append = ExprNodes.DictComprehensionAppendNode(
- item.pos, key_expr=item.key, value_expr=item.value)
- else:
- comprehension_type = Builtin.set_type
- append = ExprNodes.ComprehensionAppendNode(item.pos, expr=item)
+ # dict/set comprehension
+ if len(parts) == 1 and isinstance(parts[0], list) and len(parts[0]) == 1:
+ item = parts[0][0]
+ if target_type == 2:
+ assert isinstance(item, ExprNodes.DictItemNode), type(item)
+ comprehension_type = Builtin.dict_type
+ append = ExprNodes.DictComprehensionAppendNode(
+ item.pos, key_expr=item.key, value_expr=item.value)
+ else:
+ comprehension_type = Builtin.set_type
+ append = ExprNodes.ComprehensionAppendNode(item.pos, expr=item)
loop = p_comp_for(s, append)
s.expect('}')
- return ExprNodes.ComprehensionNode(pos, loop=loop, append=append, type=comprehension_type)
+ return ExprNodes.ComprehensionNode(pos, loop=loop, append=append, type=comprehension_type)
else:
- # syntax error, try to find a good error message
- if len(parts) == 1 and not isinstance(parts[0], list):
- s.error("iterable unpacking cannot be used in comprehension")
- else:
- # e.g. "{1,2,3 for ..."
- s.expect('}')
- return ExprNodes.DictNode(pos, key_value_pairs=[])
-
- s.expect('}')
- if target_type == 1:
- # (merged) set literal
- items = []
- set_items = []
- for part in parts:
- if isinstance(part, list):
- set_items.extend(part)
- else:
- if set_items:
- items.append(ExprNodes.SetNode(set_items[0].pos, args=set_items))
- set_items = []
- items.append(part)
- if set_items:
- items.append(ExprNodes.SetNode(set_items[0].pos, args=set_items))
- if len(items) == 1 and items[0].is_set_literal:
- return items[0]
- return ExprNodes.MergedSequenceNode(pos, args=items, type=Builtin.set_type)
- else:
- # (merged) dict literal
- items = []
- dict_items = []
- for part in parts:
- if isinstance(part, list):
- dict_items.extend(part)
- else:
- if dict_items:
- items.append(ExprNodes.DictNode(dict_items[0].pos, key_value_pairs=dict_items))
- dict_items = []
- items.append(part)
- if dict_items:
- items.append(ExprNodes.DictNode(dict_items[0].pos, key_value_pairs=dict_items))
- if len(items) == 1 and items[0].is_dict_literal:
- return items[0]
- return ExprNodes.MergedDictNode(pos, keyword_args=items, reject_duplicates=False)
-
-
+ # syntax error, try to find a good error message
+ if len(parts) == 1 and not isinstance(parts[0], list):
+ s.error("iterable unpacking cannot be used in comprehension")
+ else:
+ # e.g. "{1,2,3 for ..."
+ s.expect('}')
+ return ExprNodes.DictNode(pos, key_value_pairs=[])
+
+ s.expect('}')
+ if target_type == 1:
+ # (merged) set literal
+ items = []
+ set_items = []
+ for part in parts:
+ if isinstance(part, list):
+ set_items.extend(part)
+ else:
+ if set_items:
+ items.append(ExprNodes.SetNode(set_items[0].pos, args=set_items))
+ set_items = []
+ items.append(part)
+ if set_items:
+ items.append(ExprNodes.SetNode(set_items[0].pos, args=set_items))
+ if len(items) == 1 and items[0].is_set_literal:
+ return items[0]
+ return ExprNodes.MergedSequenceNode(pos, args=items, type=Builtin.set_type)
+ else:
+ # (merged) dict literal
+ items = []
+ dict_items = []
+ for part in parts:
+ if isinstance(part, list):
+ dict_items.extend(part)
+ else:
+ if dict_items:
+ items.append(ExprNodes.DictNode(dict_items[0].pos, key_value_pairs=dict_items))
+ dict_items = []
+ items.append(part)
+ if dict_items:
+ items.append(ExprNodes.DictNode(dict_items[0].pos, key_value_pairs=dict_items))
+ if len(items) == 1 and items[0].is_dict_literal:
+ return items[0]
+ return ExprNodes.MergedDictNode(pos, keyword_args=items, reject_duplicates=False)
+
+
# NOTE: no longer in Py3 :)
def p_backquote_expr(s):
# s.sy == '`'
@@ -1423,11 +1423,11 @@ def p_simple_expr_list(s, expr=None):
s.next()
return exprs
-
+
def p_test_or_starred_expr_list(s, expr=None):
exprs = expr is not None and [expr] or []
while s.sy not in expr_terminators:
- exprs.append(p_test_or_starred_expr(s))
+ exprs.append(p_test_or_starred_expr(s))
if s.sy != ',':
break
s.next()
@@ -1481,7 +1481,7 @@ def p_genexp(s, expr):
expr_terminators = cython.declare(set, set([
')', ']', '}', ':', '=', 'NEWLINE']))
-
+
#-------------------------------------------------------
#
# Statements
@@ -1495,14 +1495,14 @@ def p_global_statement(s):
names = p_ident_list(s)
return Nodes.GlobalNode(pos, names = names)
-
+
def p_nonlocal_statement(s):
pos = s.position()
s.next()
names = p_ident_list(s)
return Nodes.NonlocalNode(pos, names = names)
-
+
def p_expression_or_assignment(s):
expr = p_testlist_star_expr(s)
if s.sy == ':' and (expr.is_name or expr.is_subscript or expr.is_attribute):
@@ -1523,7 +1523,7 @@ def p_expression_or_assignment(s):
expr = p_testlist_star_expr(s)
expr_list.append(expr)
if len(expr_list) == 1:
- if re.match(r"([-+*/%^&|]|<<|>>|\*\*|//|@)=", s.sy):
+ if re.match(r"([-+*/%^&|]|<<|>>|\*\*|//|@)=", s.sy):
lhs = expr_list[0]
if isinstance(lhs, ExprNodes.SliceIndexNode):
# implementation requires IndexNode
@@ -1531,7 +1531,7 @@ def p_expression_or_assignment(s):
lhs.pos,
base=lhs.base,
index=make_slice_node(lhs.pos, lhs.start, lhs.stop))
- elif not isinstance(lhs, (ExprNodes.AttributeNode, ExprNodes.IndexNode, ExprNodes.NameNode)):
+ elif not isinstance(lhs, (ExprNodes.AttributeNode, ExprNodes.IndexNode, ExprNodes.NameNode)):
error(lhs.pos, "Illegal operand for inplace operation.")
operator = s.sy[:-1]
s.next()
@@ -1539,17 +1539,17 @@ def p_expression_or_assignment(s):
rhs = p_yield_expression(s)
else:
rhs = p_testlist(s)
- return Nodes.InPlaceAssignmentNode(lhs.pos, operator=operator, lhs=lhs, rhs=rhs)
+ return Nodes.InPlaceAssignmentNode(lhs.pos, operator=operator, lhs=lhs, rhs=rhs)
expr = expr_list[0]
return Nodes.ExprStatNode(expr.pos, expr=expr)
rhs = expr_list[-1]
if len(expr_list) == 2:
- return Nodes.SingleAssignmentNode(rhs.pos, lhs=expr_list[0], rhs=rhs)
+ return Nodes.SingleAssignmentNode(rhs.pos, lhs=expr_list[0], rhs=rhs)
else:
- return Nodes.CascadedAssignmentNode(rhs.pos, lhs_list=expr_list[:-1], rhs=rhs)
-
+ return Nodes.CascadedAssignmentNode(rhs.pos, lhs_list=expr_list[:-1], rhs=rhs)
+
def p_print_statement(s):
# s.sy == 'print'
pos = s.position()
@@ -1572,12 +1572,12 @@ def p_print_statement(s):
ends_with_comma = 1
break
args.append(p_test(s))
- arg_tuple = ExprNodes.TupleNode(pos, args=args)
+ arg_tuple = ExprNodes.TupleNode(pos, args=args)
return Nodes.PrintStatNode(pos,
- arg_tuple=arg_tuple, stream=stream,
- append_newline=not ends_with_comma)
-
+ arg_tuple=arg_tuple, stream=stream,
+ append_newline=not ends_with_comma)
+
def p_exec_statement(s):
# s.sy == 'exec'
pos = s.position()
@@ -1670,43 +1670,43 @@ def p_raise_statement(s):
else:
return Nodes.ReraiseStatNode(pos)
-
+
def p_import_statement(s):
# s.sy in ('import', 'cimport')
pos = s.position()
kind = s.sy
s.next()
- items = [p_dotted_name(s, as_allowed=1)]
+ items = [p_dotted_name(s, as_allowed=1)]
while s.sy == ',':
s.next()
- items.append(p_dotted_name(s, as_allowed=1))
+ items.append(p_dotted_name(s, as_allowed=1))
stats = []
- is_absolute = Future.absolute_import in s.context.future_directives
+ is_absolute = Future.absolute_import in s.context.future_directives
for pos, target_name, dotted_name, as_name in items:
if kind == 'cimport':
- stat = Nodes.CImportStatNode(
- pos,
- module_name=dotted_name,
- as_name=as_name,
- is_absolute=is_absolute)
+ stat = Nodes.CImportStatNode(
+ pos,
+ module_name=dotted_name,
+ as_name=as_name,
+ is_absolute=is_absolute)
else:
if as_name and "." in dotted_name:
- name_list = ExprNodes.ListNode(pos, args=[
- ExprNodes.IdentifierStringNode(pos, value=s.context.intern_ustring("*"))])
+ name_list = ExprNodes.ListNode(pos, args=[
+ ExprNodes.IdentifierStringNode(pos, value=s.context.intern_ustring("*"))])
else:
name_list = None
- stat = Nodes.SingleAssignmentNode(
- pos,
- lhs=ExprNodes.NameNode(pos, name=as_name or target_name),
- rhs=ExprNodes.ImportNode(
- pos,
- module_name=ExprNodes.IdentifierStringNode(pos, value=dotted_name),
- level=0 if is_absolute else None,
- name_list=name_list))
+ stat = Nodes.SingleAssignmentNode(
+ pos,
+ lhs=ExprNodes.NameNode(pos, name=as_name or target_name),
+ rhs=ExprNodes.ImportNode(
+ pos,
+ module_name=ExprNodes.IdentifierStringNode(pos, value=dotted_name),
+ level=0 if is_absolute else None,
+ name_list=name_list))
stats.append(stat)
- return Nodes.StatListNode(pos, stats=stats)
-
+ return Nodes.StatListNode(pos, stats=stats)
+
def p_from_import_statement(s, first_statement = 0):
# s.sy == 'from'
pos = s.position()
@@ -1721,7 +1721,7 @@ def p_from_import_statement(s, first_statement = 0):
level = None
if level is not None and s.sy in ('import', 'cimport'):
# we are dealing with "from .. import foo, bar"
- dotted_name_pos, dotted_name = s.position(), s.context.intern_ustring('')
+ dotted_name_pos, dotted_name = s.position(), s.context.intern_ustring('')
else:
if level is None and Future.absolute_import in s.context.future_directives:
level = 0
@@ -1734,7 +1734,7 @@ def p_from_import_statement(s, first_statement = 0):
is_cimport = kind == 'cimport'
is_parenthesized = False
if s.sy == '*':
- imported_names = [(s.position(), s.context.intern_ustring("*"), None, None)]
+ imported_names = [(s.position(), s.context.intern_ustring("*"), None, None)]
s.next()
else:
if s.sy == '(':
@@ -1775,11 +1775,11 @@ def p_from_import_statement(s, first_statement = 0):
items = []
for (name_pos, name, as_name, kind) in imported_names:
imported_name_strings.append(
- ExprNodes.IdentifierStringNode(name_pos, value=name))
+ ExprNodes.IdentifierStringNode(name_pos, value=name))
items.append(
- (name, ExprNodes.NameNode(name_pos, name=as_name or name)))
+ (name, ExprNodes.NameNode(name_pos, name=as_name or name)))
import_list = ExprNodes.ListNode(
- imported_names[0][0], args=imported_name_strings)
+ imported_names[0][0], args=imported_name_strings)
return Nodes.FromImportStatNode(pos,
module = ExprNodes.ImportNode(dotted_name_pos,
module_name = ExprNodes.IdentifierStringNode(pos, value = dotted_name),
@@ -1788,8 +1788,8 @@ def p_from_import_statement(s, first_statement = 0):
items = items)
-imported_name_kinds = cython.declare(set, set(['class', 'struct', 'union']))
-
+imported_name_kinds = cython.declare(set, set(['class', 'struct', 'union']))
+
def p_imported_name(s, is_cimport):
pos = s.position()
kind = None
@@ -1800,7 +1800,7 @@ def p_imported_name(s, is_cimport):
as_name = p_as_name(s)
return (pos, name, as_name, kind)
-
+
def p_dotted_name(s, as_allowed):
pos = s.position()
target_name = p_ident(s)
@@ -1811,9 +1811,9 @@ def p_dotted_name(s, as_allowed):
names.append(p_ident(s))
if as_allowed:
as_name = p_as_name(s)
- return (pos, target_name, s.context.intern_ustring(u'.'.join(names)), as_name)
-
+ return (pos, target_name, s.context.intern_ustring(u'.'.join(names)), as_name)
+
def p_as_name(s):
if s.sy == 'IDENT' and s.systring == 'as':
s.next()
@@ -1821,7 +1821,7 @@ def p_as_name(s):
else:
return None
-
+
def p_assert_statement(s):
# s.sy == 'assert'
pos = s.position()
@@ -1834,7 +1834,7 @@ def p_assert_statement(s):
value = None
return Nodes.AssertStatNode(pos, cond = cond, value = value)
-
+
statement_terminators = cython.declare(set, set([';', 'NEWLINE', 'EOF']))
def p_if_statement(s):
@@ -1874,25 +1874,25 @@ def p_while_statement(s):
condition = test, body = body,
else_clause = else_clause)
-
-def p_for_statement(s, is_async=False):
+
+def p_for_statement(s, is_async=False):
# s.sy == 'for'
pos = s.position()
s.next()
- kw = p_for_bounds(s, allow_testlist=True, is_async=is_async)
+ kw = p_for_bounds(s, allow_testlist=True, is_async=is_async)
body = p_suite(s)
else_clause = p_else_clause(s)
- kw.update(body=body, else_clause=else_clause, is_async=is_async)
+ kw.update(body=body, else_clause=else_clause, is_async=is_async)
return Nodes.ForStatNode(pos, **kw)
-
-def p_for_bounds(s, allow_testlist=True, is_async=False):
+
+def p_for_bounds(s, allow_testlist=True, is_async=False):
target = p_for_target(s)
if s.sy == 'in':
s.next()
- iterator = p_for_iterator(s, allow_testlist, is_async=is_async)
- return dict(target=target, iterator=iterator)
- elif not s.in_python_file and not is_async:
+ iterator = p_for_iterator(s, allow_testlist, is_async=is_async)
+ return dict(target=target, iterator=iterator)
+ elif not s.in_python_file and not is_async:
if s.sy == 'from':
s.next()
bound1 = p_bit_expr(s)
@@ -1962,20 +1962,20 @@ def p_target(s, terminator):
else:
return expr
-
+
def p_for_target(s):
return p_target(s, 'in')
-
-def p_for_iterator(s, allow_testlist=True, is_async=False):
+
+def p_for_iterator(s, allow_testlist=True, is_async=False):
pos = s.position()
if allow_testlist:
expr = p_testlist(s)
else:
expr = p_or_test(s)
- return (ExprNodes.AsyncIteratorNode if is_async else ExprNodes.IteratorNode)(pos, sequence=expr)
-
+ return (ExprNodes.AsyncIteratorNode if is_async else ExprNodes.IteratorNode)(pos, sequence=expr)
+
def p_try_statement(s):
# s.sy == 'try'
pos = s.position()
@@ -2043,14 +2043,14 @@ def p_include_statement(s, ctx):
include_file_path = s.context.find_include_file(include_file_name, pos)
if include_file_path:
s.included_files.append(include_file_name)
- with Utils.open_source_file(include_file_path) as f:
+ with Utils.open_source_file(include_file_path) as f:
if Options.source_root:
import os
rel_path = os.path.relpath(include_file_path, Options.source_root)
else:
rel_path = None
source_desc = FileSourceDescriptor(include_file_path, rel_path)
- s2 = PyrexScanner(f, source_desc, s, source_encoding=f.encoding, parse_comments=s.parse_comments)
+ s2 = PyrexScanner(f, source_desc, s, source_encoding=f.encoding, parse_comments=s.parse_comments)
tree = p_statement_list(s2, ctx)
return tree
else:
@@ -2058,21 +2058,21 @@ def p_include_statement(s, ctx):
else:
return Nodes.PassStatNode(pos)
-
+
def p_with_statement(s):
- s.next() # 'with'
+ s.next() # 'with'
if s.systring == 'template' and not s.in_python_file:
node = p_with_template(s)
else:
node = p_with_items(s)
return node
-
-def p_with_items(s, is_async=False):
+
+def p_with_items(s, is_async=False):
pos = s.position()
if not s.in_python_file and s.sy == 'IDENT' and s.systring in ('nogil', 'gil'):
- if is_async:
- s.error("with gil/nogil cannot be async")
+ if is_async:
+ s.error("with gil/nogil cannot be async")
state = s.systring
s.next()
if s.sy == ',':
@@ -2080,7 +2080,7 @@ def p_with_items(s, is_async=False):
body = p_with_items(s)
else:
body = p_suite(s)
- return Nodes.GILStatNode(pos, state=state, body=body)
+ return Nodes.GILStatNode(pos, state=state, body=body)
else:
manager = p_test(s)
target = None
@@ -2089,12 +2089,12 @@ def p_with_items(s, is_async=False):
target = p_starred_expr(s)
if s.sy == ',':
s.next()
- body = p_with_items(s, is_async=is_async)
+ body = p_with_items(s, is_async=is_async)
else:
body = p_suite(s)
- return Nodes.WithStatNode(pos, manager=manager, target=target, body=body, is_async=is_async)
-
+ return Nodes.WithStatNode(pos, manager=manager, target=target, body=body, is_async=is_async)
+
def p_with_template(s):
pos = s.position()
templates = []
@@ -2255,13 +2255,13 @@ def p_statement(s, ctx, first_statement = 0):
s.level = ctx.level
decorators = p_decorators(s)
if not ctx.allow_struct_enum_decorator and s.sy not in ('def', 'cdef', 'cpdef', 'class', 'async'):
- if s.sy == 'IDENT' and s.systring == 'async':
- pass # handled below
- else:
- s.error("Decorators can only be followed by functions or classes")
+ if s.sy == 'IDENT' and s.systring == 'async':
+ pass # handled below
+ else:
+ s.error("Decorators can only be followed by functions or classes")
elif s.sy == 'pass' and cdef_flag:
# empty cdef block
- return p_pass_statement(s, with_newline=1)
+ return p_pass_statement(s, with_newline=1)
overridable = 0
if s.sy == 'cdef':
@@ -2275,11 +2275,11 @@ def p_statement(s, ctx, first_statement = 0):
if ctx.level not in ('module', 'module_pxd', 'function', 'c_class', 'c_class_pxd'):
s.error('cdef statement not allowed here')
s.level = ctx.level
- node = p_cdef_statement(s, ctx(overridable=overridable))
+ node = p_cdef_statement(s, ctx(overridable=overridable))
if decorators is not None:
- tup = (Nodes.CFuncDefNode, Nodes.CVarDefNode, Nodes.CClassDefNode)
+ tup = (Nodes.CFuncDefNode, Nodes.CVarDefNode, Nodes.CClassDefNode)
if ctx.allow_struct_enum_decorator:
- tup += (Nodes.CStructOrUnionDefNode, Nodes.CEnumDefNode)
+ tup += (Nodes.CStructOrUnionDefNode, Nodes.CEnumDefNode)
if not isinstance(node, tup):
s.error("Decorators can only be followed by functions or classes")
node.decorators = decorators
@@ -2322,22 +2322,22 @@ def p_statement(s, ctx, first_statement = 0):
return p_try_statement(s)
elif s.sy == 'with':
return p_with_statement(s)
- elif s.sy == 'async':
- s.next()
- return p_async_statement(s, ctx, decorators)
+ elif s.sy == 'async':
+ s.next()
+ return p_async_statement(s, ctx, decorators)
else:
- if s.sy == 'IDENT' and s.systring == 'async':
- ident_name = s.systring
- # PEP 492 enables the async/await keywords when it spots "async def ..."
- s.next()
- if s.sy == 'def':
- return p_async_statement(s, ctx, decorators)
- elif decorators:
- s.error("Decorators can only be followed by functions or classes")
- s.put_back('IDENT', ident_name) # re-insert original token
- return p_simple_statement_list(s, ctx, first_statement=first_statement)
-
-
+ if s.sy == 'IDENT' and s.systring == 'async':
+ ident_name = s.systring
+ # PEP 492 enables the async/await keywords when it spots "async def ..."
+ s.next()
+ if s.sy == 'def':
+ return p_async_statement(s, ctx, decorators)
+ elif decorators:
+ s.error("Decorators can only be followed by functions or classes")
+ s.put_back('IDENT', ident_name) # re-insert original token
+ return p_simple_statement_list(s, ctx, first_statement=first_statement)
+
+
def p_statement_list(s, ctx, first_statement = 0):
# Parse a series of statements separated by newlines.
pos = s.position()
@@ -2412,7 +2412,7 @@ def p_positional_and_keyword_args(s, end_sy_set, templates = None):
arg = Nodes.CComplexBaseTypeNode(base_type.pos,
base_type = base_type, declarator = declarator)
parsed_type = True
- keyword_node = ExprNodes.IdentifierStringNode(arg.pos, value=ident)
+ keyword_node = ExprNodes.IdentifierStringNode(arg.pos, value=ident)
keyword_args.append((keyword_node, arg))
was_keyword = True
@@ -2455,31 +2455,31 @@ def p_calling_convention(s):
else:
return ""
-
+
calling_convention_words = cython.declare(
set, set(["__stdcall", "__cdecl", "__fastcall"]))
-
+
def p_c_complex_base_type(s, templates = None):
# s.sy == '('
pos = s.position()
s.next()
- base_type = p_c_base_type(s, templates=templates)
- declarator = p_c_declarator(s, empty=True)
- type_node = Nodes.CComplexBaseTypeNode(
- pos, base_type=base_type, declarator=declarator)
- if s.sy == ',':
- components = [type_node]
- while s.sy == ',':
- s.next()
- if s.sy == ')':
- break
- base_type = p_c_base_type(s, templates=templates)
- declarator = p_c_declarator(s, empty=True)
- components.append(Nodes.CComplexBaseTypeNode(
- pos, base_type=base_type, declarator=declarator))
- type_node = Nodes.CTupleBaseTypeNode(pos, components = components)
-
+ base_type = p_c_base_type(s, templates=templates)
+ declarator = p_c_declarator(s, empty=True)
+ type_node = Nodes.CComplexBaseTypeNode(
+ pos, base_type=base_type, declarator=declarator)
+ if s.sy == ',':
+ components = [type_node]
+ while s.sy == ',':
+ s.next()
+ if s.sy == ')':
+ break
+ base_type = p_c_base_type(s, templates=templates)
+ declarator = p_c_declarator(s, empty=True)
+ components.append(Nodes.CComplexBaseTypeNode(
+ pos, base_type=base_type, declarator=declarator))
+ type_node = Nodes.CTupleBaseTypeNode(pos, components = components)
+
s.expect(')')
if s.sy == '[':
if is_memoryviewslice_access(s):
@@ -2728,7 +2728,7 @@ special_basic_c_types = cython.declare(dict, {
# name : (signed, longness)
"Py_UNICODE" : (0, 0),
"Py_UCS4" : (0, 0),
- "Py_hash_t" : (2, 0),
+ "Py_hash_t" : (2, 0),
"Py_ssize_t" : (2, 0),
"ssize_t" : (2, 0),
"size_t" : (0, 0),
@@ -2783,7 +2783,7 @@ def p_c_declarator(s, ctx = Ctx(), empty = 0, is_type = 0, cmethod_flag = 0,
if s.sy == '(':
s.next()
if s.sy == ')' or looking_at_name(s):
- base = Nodes.CNameDeclaratorNode(pos, name=s.context.intern_ustring(u""), cname=None)
+ base = Nodes.CNameDeclaratorNode(pos, name=s.context.intern_ustring(u""), cname=None)
result = p_c_func_declarator(s, pos, ctx, base, cmethod_flag)
else:
result = p_c_declarator(s, ctx, empty = empty, is_type = is_type,
@@ -2835,8 +2835,8 @@ supported_overloaded_operators = cython.declare(set, set([
'+', '-', '*', '/', '%',
'++', '--', '~', '|', '&', '^', '<<', '>>', ',',
'==', '!=', '>=', '>', '<=', '<',
- '[]', '()', '!', '=',
- 'bool',
+ '[]', '()', '!', '=',
+ 'bool',
]))
def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
@@ -2877,7 +2877,7 @@ def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
else:
rhs = None
if s.sy == 'IDENT':
- name = s.systring
+ name = s.systring
if empty:
error(s.position(), "Declarator should be empty")
s.next()
@@ -2913,13 +2913,13 @@ def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
s.error("Overloading operator '%s' not yet supported." % op,
fatal=False)
name += op
- elif op == 'IDENT':
- op = s.systring;
- if op not in supported_overloaded_operators:
- s.error("Overloading operator '%s' not yet supported." % op,
- fatal=False)
- name = name + ' ' + op
- s.next()
+ elif op == 'IDENT':
+ op = s.systring;
+ if op not in supported_overloaded_operators:
+ s.error("Overloading operator '%s' not yet supported." % op,
+ fatal=False)
+ name = name + ' ' + op
+ s.next()
result = Nodes.CNameDeclaratorNode(pos,
name = name, cname = cname, default = rhs)
result.calling_convention = calling_convention
@@ -2955,9 +2955,9 @@ def p_exception_value_clause(s):
name = s.systring
s.next()
exc_val = p_name(s, name)
- elif s.sy == '*':
- exc_val = ExprNodes.CharNode(s.position(), value=u'*')
- s.next()
+ elif s.sy == '*':
+ exc_val = ExprNodes.CharNode(s.position(), value=u'*')
+ s.next()
else:
if s.sy == '?':
exc_check = 1
@@ -2965,7 +2965,7 @@ def p_exception_value_clause(s):
exc_val = p_test(s)
return exc_val, exc_check
-c_arg_list_terminators = cython.declare(set, set(['*', '**', '.', ')', ':']))
+c_arg_list_terminators = cython.declare(set, set(['*', '**', '.', ')', ':']))
def p_c_arg_list(s, ctx = Ctx(), in_pyfunc = 0, cmethod_flag = 0,
nonempty_declarators = 0, kw_only = 0, annotated = 1):
@@ -3278,14 +3278,14 @@ def p_c_func_or_var_declaration(s, pos, ctx):
is_const_method = 1
else:
is_const_method = 0
- if s.sy == '->':
- # Special enough to give a better error message and keep going.
- s.error(
- "Return type annotation is not allowed in cdef/cpdef signatures. "
- "Please define it before the function name, as in C signatures.",
- fatal=False)
- s.next()
- p_test(s) # Keep going, but ignore result.
+ if s.sy == '->':
+ # Special enough to give a better error message and keep going.
+ s.error(
+ "Return type annotation is not allowed in cdef/cpdef signatures. "
+ "Please define it before the function name, as in C signatures.",
+ fatal=False)
+ s.next()
+ p_test(s) # Keep going, but ignore result.
if s.sy == ':':
if ctx.level not in ('module', 'c_class', 'module_pxd', 'c_class_pxd', 'cpp_class') and not ctx.templates:
s.error("C function definition not allowed here")
@@ -3362,59 +3362,59 @@ def p_decorators(s):
s.next()
decstring = p_dotted_name(s, as_allowed=0)[2]
names = decstring.split('.')
- decorator = ExprNodes.NameNode(pos, name=s.context.intern_ustring(names[0]))
+ decorator = ExprNodes.NameNode(pos, name=s.context.intern_ustring(names[0]))
for name in names[1:]:
- decorator = ExprNodes.AttributeNode(
- pos, attribute=s.context.intern_ustring(name), obj=decorator)
+ decorator = ExprNodes.AttributeNode(
+ pos, attribute=s.context.intern_ustring(name), obj=decorator)
if s.sy == '(':
decorator = p_call(s, decorator)
decorators.append(Nodes.DecoratorNode(pos, decorator=decorator))
s.expect_newline("Expected a newline after decorator")
return decorators
-
-def _reject_cdef_modifier_in_py(s, name):
- """Step over incorrectly placed cdef modifiers (@see _CDEF_MODIFIERS) to provide a good error message for them.
- """
- if s.sy == 'IDENT' and name in _CDEF_MODIFIERS:
- # Special enough to provide a good error message.
- s.error("Cannot use cdef modifier '%s' in Python function signature. Use a decorator instead." % name, fatal=False)
- return p_ident(s) # Keep going, in case there are other errors.
- return name
-
-
-def p_def_statement(s, decorators=None, is_async_def=False):
+
+def _reject_cdef_modifier_in_py(s, name):
+ """Step over incorrectly placed cdef modifiers (@see _CDEF_MODIFIERS) to provide a good error message for them.
+ """
+ if s.sy == 'IDENT' and name in _CDEF_MODIFIERS:
+ # Special enough to provide a good error message.
+ s.error("Cannot use cdef modifier '%s' in Python function signature. Use a decorator instead." % name, fatal=False)
+ return p_ident(s) # Keep going, in case there are other errors.
+ return name
+
+
+def p_def_statement(s, decorators=None, is_async_def=False):
# s.sy == 'def'
pos = s.position()
- # PEP 492 switches the async/await keywords on in "async def" functions
- if is_async_def:
- s.enter_async()
+ # PEP 492 switches the async/await keywords on in "async def" functions
+ if is_async_def:
+ s.enter_async()
s.next()
- name = _reject_cdef_modifier_in_py(s, p_ident(s))
- s.expect(
- '(',
- "Expected '(', found '%s'. Did you use cdef syntax in a Python declaration? "
- "Use decorators and Python type annotations instead." % (
- s.systring if s.sy == 'IDENT' else s.sy))
+ name = _reject_cdef_modifier_in_py(s, p_ident(s))
+ s.expect(
+ '(',
+ "Expected '(', found '%s'. Did you use cdef syntax in a Python declaration? "
+ "Use decorators and Python type annotations instead." % (
+ s.systring if s.sy == 'IDENT' else s.sy))
args, star_arg, starstar_arg = p_varargslist(s, terminator=')')
s.expect(')')
- _reject_cdef_modifier_in_py(s, s.systring)
+ _reject_cdef_modifier_in_py(s, s.systring)
return_type_annotation = None
if s.sy == '->':
s.next()
return_type_annotation = p_test(s)
- _reject_cdef_modifier_in_py(s, s.systring)
-
+ _reject_cdef_modifier_in_py(s, s.systring)
+
doc, body = p_suite_with_docstring(s, Ctx(level='function'))
- if is_async_def:
- s.exit_async()
-
- return Nodes.DefNode(
- pos, name=name, args=args, star_arg=star_arg, starstar_arg=starstar_arg,
- doc=doc, body=body, decorators=decorators, is_async_def=is_async_def,
- return_type_annotation=return_type_annotation)
-
-
+ if is_async_def:
+ s.exit_async()
+
+ return Nodes.DefNode(
+ pos, name=name, args=args, star_arg=star_arg, starstar_arg=starstar_arg,
+ doc=doc, body=body, decorators=decorators, is_async_def=is_async_def,
+ return_type_annotation=return_type_annotation)
+
+
def p_varargslist(s, terminator=')', annotated=1):
args = p_c_arg_list(s, in_pyfunc = 1, nonempty_declarators = 1,
annotated = annotated)
@@ -3433,8 +3433,8 @@ def p_varargslist(s, terminator=')', annotated=1):
if s.sy == '**':
s.next()
starstar_arg = p_py_arg_decl(s, annotated=annotated)
- if s.sy == ',':
- s.next()
+ if s.sy == ',':
+ s.next()
return (args, star_arg, starstar_arg)
def p_py_arg_decl(s, annotated = 1):
@@ -3446,18 +3446,18 @@ def p_py_arg_decl(s, annotated = 1):
annotation = p_test(s)
return Nodes.PyArgDeclNode(pos, name = name, annotation = annotation)
-
+
def p_class_statement(s, decorators):
# s.sy == 'class'
pos = s.position()
s.next()
- class_name = EncodedString(p_ident(s))
- class_name.encoding = s.source_encoding # FIXME: why is this needed?
+ class_name = EncodedString(p_ident(s))
+ class_name.encoding = s.source_encoding # FIXME: why is this needed?
arg_tuple = None
keyword_dict = None
if s.sy == '(':
- positional_args, keyword_args = p_call_parse_args(s, allow_genexp=False)
- arg_tuple, keyword_dict = p_call_build_packed_args(pos, positional_args, keyword_args)
+ positional_args, keyword_args = p_call_parse_args(s, allow_genexp=False)
+ arg_tuple, keyword_dict = p_call_build_packed_args(pos, positional_args, keyword_args)
if arg_tuple is None:
# XXX: empty arg_tuple
arg_tuple = ExprNodes.TupleNode(pos, args=[])
@@ -3469,7 +3469,7 @@ def p_class_statement(s, decorators):
doc=doc, body=body, decorators=decorators,
force_py3_semantics=s.context.language_level >= 3)
-
+
def p_c_class_definition(s, pos, ctx):
# s.sy == 'class'
s.next()
@@ -3489,7 +3489,7 @@ def p_c_class_definition(s, pos, ctx):
objstruct_name = None
typeobj_name = None
bases = None
- check_size = None
+ check_size = None
if s.sy == '(':
positional_args, keyword_args = p_call_parse_args(s, allow_genexp=False)
if keyword_args:
@@ -3501,7 +3501,7 @@ def p_c_class_definition(s, pos, ctx):
if s.sy == '[':
if ctx.visibility not in ('public', 'extern') and not ctx.api:
error(s.position(), "Name options only allowed for 'public', 'api', or 'extern' C class")
- objstruct_name, typeobj_name, check_size = p_c_class_options(s)
+ objstruct_name, typeobj_name, check_size = p_c_class_options(s)
if s.sy == ':':
if ctx.level == 'module_pxd':
body_level = 'c_class_pxd'
@@ -3540,16 +3540,16 @@ def p_c_class_definition(s, pos, ctx):
bases = bases,
objstruct_name = objstruct_name,
typeobj_name = typeobj_name,
- check_size = check_size,
+ check_size = check_size,
in_pxd = ctx.level == 'module_pxd',
doc = doc,
body = body)
-
+
def p_c_class_options(s):
objstruct_name = None
typeobj_name = None
- check_size = None
+ check_size = None
s.expect('[')
while 1:
if s.sy != 'IDENT':
@@ -3560,16 +3560,16 @@ def p_c_class_options(s):
elif s.systring == 'type':
s.next()
typeobj_name = p_ident(s)
- elif s.systring == 'check_size':
- s.next()
- check_size = p_ident(s)
- if check_size not in ('ignore', 'warn', 'error'):
- s.error("Expected one of ignore, warn or error, found %r" % check_size)
+ elif s.systring == 'check_size':
+ s.next()
+ check_size = p_ident(s)
+ if check_size not in ('ignore', 'warn', 'error'):
+ s.error("Expected one of ignore, warn or error, found %r" % check_size)
if s.sy != ',':
break
s.next()
- s.expect(']', "Expected 'object', 'type' or 'check_size'")
- return objstruct_name, typeobj_name, check_size
+ s.expect(']', "Expected 'object', 'type' or 'check_size'")
+ return objstruct_name, typeobj_name, check_size
def p_property_decl(s):
@@ -3648,64 +3648,64 @@ def p_code(s, level=None, ctx=Ctx):
repr(s.sy), repr(s.systring)))
return body
-
+
_match_compiler_directive_comment = cython.declare(object, re.compile(
r"^#\s*cython\s*:\s*((\w|[.])+\s*=.*)$").match)
-
+
def p_compiler_directive_comments(s):
result = {}
while s.sy == 'commentline':
- pos = s.position()
+ pos = s.position()
m = _match_compiler_directive_comment(s.systring)
if m:
- directives_string = m.group(1).strip()
+ directives_string = m.group(1).strip()
try:
- new_directives = Options.parse_directive_list(directives_string, ignore_unknown=True)
- except ValueError as e:
+ new_directives = Options.parse_directive_list(directives_string, ignore_unknown=True)
+ except ValueError as e:
s.error(e.args[0], fatal=False)
- s.next()
- continue
-
- for name in new_directives:
- if name not in result:
- pass
- elif new_directives[name] == result[name]:
- warning(pos, "Duplicate directive found: %s" % (name,))
- else:
- s.error("Conflicting settings found for top-level directive %s: %r and %r" % (
- name, result[name], new_directives[name]), pos=pos)
-
- if 'language_level' in new_directives:
- # Make sure we apply the language level already to the first token that follows the comments.
- s.context.set_language_level(new_directives['language_level'])
-
- result.update(new_directives)
-
+ s.next()
+ continue
+
+ for name in new_directives:
+ if name not in result:
+ pass
+ elif new_directives[name] == result[name]:
+ warning(pos, "Duplicate directive found: %s" % (name,))
+ else:
+ s.error("Conflicting settings found for top-level directive %s: %r and %r" % (
+ name, result[name], new_directives[name]), pos=pos)
+
+ if 'language_level' in new_directives:
+ # Make sure we apply the language level already to the first token that follows the comments.
+ s.context.set_language_level(new_directives['language_level'])
+
+ result.update(new_directives)
+
s.next()
return result
-
+
def p_module(s, pxd, full_module_name, ctx=Ctx):
pos = s.position()
directive_comments = p_compiler_directive_comments(s)
s.parse_comments = False
- if s.context.language_level is None:
- s.context.set_language_level(2) # Arcadia default.
-
- if s.context.language_level is None:
- s.context.set_language_level(2)
- if pos[0].filename:
- import warnings
- warnings.warn(
- "Cython directive 'language_level' not set, using 2 for now (Py2). "
- "This will change in a later release! File: %s" % pos[0].filename,
- FutureWarning,
- stacklevel=1 if cython.compiled else 2,
- )
-
+ if s.context.language_level is None:
+ s.context.set_language_level(2) # Arcadia default.
+
+ if s.context.language_level is None:
+ s.context.set_language_level(2)
+ if pos[0].filename:
+ import warnings
+ warnings.warn(
+ "Cython directive 'language_level' not set, using 2 for now (Py2). "
+ "This will change in a later release! File: %s" % pos[0].filename,
+ FutureWarning,
+ stacklevel=1 if cython.compiled else 2,
+ )
+
doc = p_doc_string(s)
if pxd:
level = 'module_pxd'
@@ -3720,16 +3720,16 @@ def p_module(s, pxd, full_module_name, ctx=Ctx):
full_module_name = full_module_name,
directive_comments = directive_comments)
-def p_template_definition(s):
- name = p_ident(s)
- if s.sy == '=':
- s.expect('=')
- s.expect('*')
- required = False
- else:
- required = True
- return name, required
-
+def p_template_definition(s):
+ name = p_ident(s)
+ if s.sy == '=':
+ s.expect('=')
+ s.expect('*')
+ required = False
+ else:
+ required = True
+ return name, required
+
def p_cpp_class_definition(s, pos, ctx):
# s.sy == 'cppclass'
s.next()
@@ -3742,21 +3742,21 @@ def p_cpp_class_definition(s, pos, ctx):
error(pos, "Qualified class name not allowed C++ class")
if s.sy == '[':
s.next()
- templates = [p_template_definition(s)]
+ templates = [p_template_definition(s)]
while s.sy == ',':
s.next()
- templates.append(p_template_definition(s))
+ templates.append(p_template_definition(s))
s.expect(']')
- template_names = [name for name, required in templates]
+ template_names = [name for name, required in templates]
else:
templates = None
- template_names = None
+ template_names = None
if s.sy == '(':
s.next()
- base_classes = [p_c_base_type(s, templates = template_names)]
+ base_classes = [p_c_base_type(s, templates = template_names)]
while s.sy == ',':
s.next()
- base_classes.append(p_c_base_type(s, templates = template_names))
+ base_classes.append(p_c_base_type(s, templates = template_names))
s.expect(')')
else:
base_classes = []
@@ -3769,7 +3769,7 @@ def p_cpp_class_definition(s, pos, ctx):
s.expect_indent()
attributes = []
body_ctx = Ctx(visibility = ctx.visibility, level='cpp_class', nogil=nogil or ctx.nogil)
- body_ctx.templates = template_names
+ body_ctx.templates = template_names
while s.sy != 'DEDENT':
if s.sy != 'pass':
attributes.append(p_cpp_class_attribute(s, body_ctx))
@@ -3795,13 +3795,13 @@ def p_cpp_class_attribute(s, ctx):
decorators = p_decorators(s)
if s.systring == 'cppclass':
return p_cpp_class_definition(s, s.position(), ctx)
- elif s.systring == 'ctypedef':
- return p_ctypedef_statement(s, ctx)
- elif s.sy == 'IDENT' and s.systring in struct_enum_union:
- if s.systring != 'enum':
- return p_cpp_class_definition(s, s.position(), ctx)
- else:
- return p_struct_enum(s, s.position(), ctx)
+ elif s.systring == 'ctypedef':
+ return p_ctypedef_statement(s, ctx)
+ elif s.sy == 'IDENT' and s.systring in struct_enum_union:
+ if s.systring != 'enum':
+ return p_cpp_class_definition(s, s.position(), ctx)
+ else:
+ return p_struct_enum(s, s.position(), ctx)
else:
node = p_c_func_or_var_declaration(s, s.position(), ctx)
if decorators is not None:
@@ -3829,7 +3829,7 @@ def print_parse_tree(f, node, level, key = None):
t = type(node)
if t is tuple:
f.write("(%s @ %s\n" % (node[0], node[1]))
- for i in range(2, len(node)):
+ for i in range(2, len(node)):
print_parse_tree(f, node[i], level+1)
f.write("%s)\n" % ind)
return
@@ -3845,7 +3845,7 @@ def print_parse_tree(f, node, level, key = None):
return
elif t is list:
f.write("[\n")
- for i in range(len(node)):
+ for i in range(len(node)):
print_parse_tree(f, node[i], level+1)
f.write("%s]\n" % ind)
return
diff --git a/contrib/tools/cython/Cython/Compiler/Pipeline.py b/contrib/tools/cython/Cython/Compiler/Pipeline.py
index 5194c3e49b..891937248b 100644
--- a/contrib/tools/cython/Cython/Compiler/Pipeline.py
+++ b/contrib/tools/cython/Cython/Compiler/Pipeline.py
@@ -14,7 +14,7 @@ from . import Naming
#
def dumptree(t):
# For quick debugging in pipelines
- print(t.dump())
+ print(t.dump())
return t
def abort_on_errors(node):
@@ -29,7 +29,7 @@ def parse_stage_factory(context):
full_module_name = compsrc.full_module_name
initial_pos = (source_desc, 1, 0)
saved_cimport_from_pyx, Options.cimport_from_pyx = Options.cimport_from_pyx, False
- scope = context.find_module(full_module_name, pos = initial_pos, need_pxd = 0)
+ scope = context.find_module(full_module_name, pos = initial_pos, need_pxd = 0)
Options.cimport_from_pyx = saved_cimport_from_pyx
tree = context.parse(source_desc, scope, pxd = 0, full_module_name = full_module_name)
tree.compilation_source = compsrc
@@ -54,20 +54,20 @@ def generate_pyx_code_stage_factory(options, result):
return result
return generate_pyx_code_stage
-
+
def inject_pxd_code_stage_factory(context):
def inject_pxd_code_stage(module_node):
- for name, (statlistnode, scope) in context.pxds.items():
+ for name, (statlistnode, scope) in context.pxds.items():
module_node.merge_in(statlistnode, scope)
return module_node
return inject_pxd_code_stage
-
+
def use_utility_code_definitions(scope, target, seen=None):
if seen is None:
seen = set()
- for entry in scope.entries.values():
+ for entry in scope.entries.values():
if entry in seen:
continue
@@ -79,54 +79,54 @@ def use_utility_code_definitions(scope, target, seen=None):
elif entry.as_module:
use_utility_code_definitions(entry.as_module, target, seen)
-
-def sort_utility_codes(utilcodes):
- ranks = {}
- def get_rank(utilcode):
- if utilcode not in ranks:
- ranks[utilcode] = 0 # prevent infinite recursion on circular dependencies
- original_order = len(ranks)
- ranks[utilcode] = 1 + min([get_rank(dep) for dep in utilcode.requires or ()] or [-1]) + original_order * 1e-8
- return ranks[utilcode]
- for utilcode in utilcodes:
- get_rank(utilcode)
- return [utilcode for utilcode, _ in sorted(ranks.items(), key=lambda kv: kv[1])]
-
-
-def normalize_deps(utilcodes):
- deps = {}
- for utilcode in utilcodes:
- deps[utilcode] = utilcode
-
- def unify_dep(dep):
- if dep in deps:
- return deps[dep]
- else:
- deps[dep] = dep
- return dep
-
- for utilcode in utilcodes:
- utilcode.requires = [unify_dep(dep) for dep in utilcode.requires or ()]
-
-
+
+def sort_utility_codes(utilcodes):
+ ranks = {}
+ def get_rank(utilcode):
+ if utilcode not in ranks:
+ ranks[utilcode] = 0 # prevent infinite recursion on circular dependencies
+ original_order = len(ranks)
+ ranks[utilcode] = 1 + min([get_rank(dep) for dep in utilcode.requires or ()] or [-1]) + original_order * 1e-8
+ return ranks[utilcode]
+ for utilcode in utilcodes:
+ get_rank(utilcode)
+ return [utilcode for utilcode, _ in sorted(ranks.items(), key=lambda kv: kv[1])]
+
+
+def normalize_deps(utilcodes):
+ deps = {}
+ for utilcode in utilcodes:
+ deps[utilcode] = utilcode
+
+ def unify_dep(dep):
+ if dep in deps:
+ return deps[dep]
+ else:
+ deps[dep] = dep
+ return dep
+
+ for utilcode in utilcodes:
+ utilcode.requires = [unify_dep(dep) for dep in utilcode.requires or ()]
+
+
def inject_utility_code_stage_factory(context):
def inject_utility_code_stage(module_node):
- module_node.prepare_utility_code()
+ module_node.prepare_utility_code()
use_utility_code_definitions(context.cython_scope, module_node.scope)
- module_node.scope.utility_code_list = sort_utility_codes(module_node.scope.utility_code_list)
- normalize_deps(module_node.scope.utility_code_list)
+ module_node.scope.utility_code_list = sort_utility_codes(module_node.scope.utility_code_list)
+ normalize_deps(module_node.scope.utility_code_list)
added = []
# Note: the list might be extended inside the loop (if some utility code
# pulls in other utility code, explicitly or implicitly)
for utilcode in module_node.scope.utility_code_list:
- if utilcode in added:
- continue
+ if utilcode in added:
+ continue
added.append(utilcode)
if utilcode.requires:
for dep in utilcode.requires:
- if dep not in added and dep not in module_node.scope.utility_code_list:
+ if dep not in added and dep not in module_node.scope.utility_code_list:
module_node.scope.utility_code_list.append(dep)
- tree = utilcode.get_tree(cython_scope=context.cython_scope)
+ tree = utilcode.get_tree(cython_scope=context.cython_scope)
if tree:
module_node.merge_in(tree.body, tree.scope, merge_scope=True)
return module_node
@@ -141,7 +141,7 @@ def create_pipeline(context, mode, exclude_classes=()):
assert mode in ('pyx', 'py', 'pxd')
from .Visitor import PrintTree
from .ParseTreeTransforms import WithTransform, NormalizeTree, PostParse, PxdPostParse
- from .ParseTreeTransforms import ForwardDeclareTypes, InjectGilHandling, AnalyseDeclarationsTransform
+ from .ParseTreeTransforms import ForwardDeclareTypes, InjectGilHandling, AnalyseDeclarationsTransform
from .ParseTreeTransforms import AnalyseExpressionsTransform, FindInvalidUseOfFusedTypes
from .ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform
from .ParseTreeTransforms import TrackNumpyAttributes, InterpretCompilerDirectives, TransformBuiltinMethods
@@ -186,7 +186,7 @@ def create_pipeline(context, mode, exclude_classes=()):
InterpretCompilerDirectives(context, context.compiler_directives),
ParallelRangeTransform(context),
AdjustDefByDirectives(context),
- WithTransform(context),
+ WithTransform(context),
MarkClosureVisitor(context),
_align_function_definitions,
RemoveUnreachableCode(context),
@@ -194,12 +194,12 @@ def create_pipeline(context, mode, exclude_classes=()):
FlattenInListTransform(),
DecoratorTransform(context),
ForwardDeclareTypes(context),
- InjectGilHandling(),
+ InjectGilHandling(),
AnalyseDeclarationsTransform(context),
AutoTestDictTransform(context),
EmbedSignature(context),
EarlyReplaceBuiltinCalls(context), ## Necessary?
- TransformBuiltinMethods(context),
+ TransformBuiltinMethods(context),
MarkParallelAssignments(context),
ControlFlowAnalysis(context),
RemoveUnreachableCode(context),
@@ -211,8 +211,8 @@ def create_pipeline(context, mode, exclude_classes=()):
AnalyseExpressionsTransform(context),
FindInvalidUseOfFusedTypes(context),
ExpandInplaceOperators(context),
- IterationTransform(context),
- SwitchTransform(context),
+ IterationTransform(context),
+ SwitchTransform(context),
OptimizeBuiltinCalls(context), ## Necessary?
CreateClosureClasses(context), ## After all lookups and type inference
CalculateQualifiedNamesTransform(context),
@@ -344,7 +344,7 @@ def run_pipeline(pipeline, source, printtree=True):
continue
if DebugFlags.debug_verbose_pipeline:
t = time()
- print("Entering pipeline phase %r" % phase)
+ print("Entering pipeline phase %r" % phase)
# create a new wrapper for each step to show the name in profiles
phase_name = getattr(phase, '__name__', type(phase).__name__)
try:
@@ -354,16 +354,16 @@ def run_pipeline(pipeline, source, printtree=True):
run = _pipeline_entry_points[phase_name] = exec_ns[phase_name]
data = run(phase, data)
if DebugFlags.debug_verbose_pipeline:
- print(" %.3f seconds" % (time() - t))
- except CompileError as err:
+ print(" %.3f seconds" % (time() - t))
+ except CompileError as err:
# err is set
Errors.report_error(err, use_stack=False)
error = err
- except InternalError as err:
+ except InternalError as err:
# Only raise if there was not an earlier error
if Errors.num_errors == 0:
raise
error = err
- except AbortError as err:
+ except AbortError as err:
error = err
return (error, data)
diff --git a/contrib/tools/cython/Cython/Compiler/PyrexTypes.py b/contrib/tools/cython/Cython/Compiler/PyrexTypes.py
index 3d4931cea6..913d163597 100644
--- a/contrib/tools/cython/Cython/Compiler/PyrexTypes.py
+++ b/contrib/tools/cython/Cython/Compiler/PyrexTypes.py
@@ -6,19 +6,19 @@ from __future__ import absolute_import
import copy
import hashlib
-import re
-
-try:
- reduce
-except NameError:
- from functools import reduce
-
-from Cython.Utils import cached_function
+import re
+
+try:
+ reduce
+except NameError:
+ from functools import reduce
+
+from Cython.Utils import cached_function
from .Code import UtilityCode, LazyUtilityCode, TempitaUtilityCode
from . import StringEncoding
from . import Naming
-from .Errors import error, warning
+from .Errors import error, warning
class BaseType(object):
@@ -27,9 +27,9 @@ class BaseType(object):
# List of attribute names of any subtypes
subtypes = []
- _empty_declaration = None
+ _empty_declaration = None
_specialization_name = None
- default_format_spec = None
+ default_format_spec = None
def can_coerce_to_pyobject(self, env):
return False
@@ -37,20 +37,20 @@ class BaseType(object):
def can_coerce_from_pyobject(self, env):
return False
- def can_coerce_to_pystring(self, env, format_spec=None):
- return False
-
- def convert_to_pystring(self, cvalue, code, format_spec=None):
- raise NotImplementedError("C types that support string formatting must override this method")
-
+ def can_coerce_to_pystring(self, env, format_spec=None):
+ return False
+
+ def convert_to_pystring(self, cvalue, code, format_spec=None):
+ raise NotImplementedError("C types that support string formatting must override this method")
+
def cast_code(self, expr_code):
- return "((%s)%s)" % (self.empty_declaration_code(), expr_code)
-
- def empty_declaration_code(self):
- if self._empty_declaration is None:
- self._empty_declaration = self.declaration_code('')
- return self._empty_declaration
+ return "((%s)%s)" % (self.empty_declaration_code(), expr_code)
+ def empty_declaration_code(self):
+ if self._empty_declaration is None:
+ self._empty_declaration = self.declaration_code('')
+ return self._empty_declaration
+
def specialization_name(self):
if self._specialization_name is None:
# This is not entirely robust.
@@ -117,7 +117,7 @@ class BaseType(object):
http://en.cppreference.com/w/cpp/language/function_template#Template_argument_deduction
"""
- return {}
+ return {}
def __lt__(self, other):
"""
@@ -249,7 +249,7 @@ class PyrexType(BaseType):
is_returncode = 0
is_error = 0
is_buffer = 0
- is_ctuple = 0
+ is_ctuple = 0
is_memoryviewslice = 0
is_pythran_expr = 0
is_numpy_buffer = 0
@@ -338,7 +338,7 @@ def public_decl(base_code, dll_linkage):
else:
return base_code
-def create_typedef_type(name, base_type, cname, is_external=0, namespace=None):
+def create_typedef_type(name, base_type, cname, is_external=0, namespace=None):
is_fused = base_type.is_fused
if base_type.is_complex or is_fused:
if is_external:
@@ -351,7 +351,7 @@ def create_typedef_type(name, base_type, cname, is_external=0, namespace=None):
return base_type
else:
- return CTypedefType(name, base_type, cname, is_external, namespace)
+ return CTypedefType(name, base_type, cname, is_external, namespace)
class CTypedefType(BaseType):
@@ -375,13 +375,13 @@ class CTypedefType(BaseType):
subtypes = ['typedef_base_type']
- def __init__(self, name, base_type, cname, is_external=0, namespace=None):
+ def __init__(self, name, base_type, cname, is_external=0, namespace=None):
assert not base_type.is_complex
self.typedef_name = name
self.typedef_cname = cname
self.typedef_base_type = base_type
self.typedef_is_external = is_external
- self.typedef_namespace = namespace
+ self.typedef_namespace = namespace
def invalid_value(self):
return self.typedef_base_type.invalid_value()
@@ -395,8 +395,8 @@ class CTypedefType(BaseType):
base_code = self.typedef_name
else:
base_code = public_decl(self.typedef_cname, dll_linkage)
- if self.typedef_namespace is not None and not pyrex:
- base_code = "%s::%s" % (self.typedef_namespace.empty_declaration_code(), base_code)
+ if self.typedef_namespace is not None and not pyrex:
+ base_code = "%s::%s" % (self.typedef_namespace.empty_declaration_code(), base_code)
return self.base_declaration_code(base_code, entity_code)
def as_argument_type(self):
@@ -411,15 +411,15 @@ class CTypedefType(BaseType):
else:
return BaseType.cast_code(self, expr_code)
- def specialize(self, values):
- base_type = self.typedef_base_type.specialize(values)
- namespace = self.typedef_namespace.specialize(values) if self.typedef_namespace else None
- if base_type is self.typedef_base_type and namespace is self.typedef_namespace:
- return self
- else:
- return create_typedef_type(self.typedef_name, base_type, self.typedef_cname,
- 0, namespace)
-
+ def specialize(self, values):
+ base_type = self.typedef_base_type.specialize(values)
+ namespace = self.typedef_namespace.specialize(values) if self.typedef_namespace else None
+ if base_type is self.typedef_base_type and namespace is self.typedef_namespace:
+ return self
+ else:
+ return create_typedef_type(self.typedef_name, base_type, self.typedef_cname,
+ 0, namespace)
+
def __repr__(self):
return "<CTypedefType %s>" % self.typedef_cname
@@ -428,7 +428,7 @@ class CTypedefType(BaseType):
def _create_utility_code(self, template_utility_code,
template_function_name):
- type_name = type_identifier(self.typedef_cname)
+ type_name = type_identifier(self.typedef_cname)
utility_code = template_utility_code.specialize(
type = self.typedef_cname,
TypeName = type_name)
@@ -441,9 +441,9 @@ class CTypedefType(BaseType):
base_type = self.typedef_base_type
if type(base_type) is CIntType:
self.to_py_function = "__Pyx_PyInt_From_" + self.specialization_name()
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"CIntToPy", "TypeConversion.c",
- context={"TYPE": self.empty_declaration_code(),
+ context={"TYPE": self.empty_declaration_code(),
"TO_PY_FUNCTION": self.to_py_function}))
return True
elif base_type.is_float:
@@ -451,17 +451,17 @@ class CTypedefType(BaseType):
elif base_type.is_complex:
pass # XXX implement!
pass
- elif base_type.is_cpp_string:
- cname = "__pyx_convert_PyObject_string_to_py_%s" % type_identifier(self)
- context = {
- 'cname': cname,
- 'type': self.typedef_cname,
- }
- from .UtilityCode import CythonUtilityCode
- env.use_utility_code(CythonUtilityCode.load(
- "string.to_py", "CppConvert.pyx", context=context))
- self.to_py_function = cname
- return True
+ elif base_type.is_cpp_string:
+ cname = "__pyx_convert_PyObject_string_to_py_%s" % type_identifier(self)
+ context = {
+ 'cname': cname,
+ 'type': self.typedef_cname,
+ }
+ from .UtilityCode import CythonUtilityCode
+ env.use_utility_code(CythonUtilityCode.load(
+ "string.to_py", "CppConvert.pyx", context=context))
+ self.to_py_function = cname
+ return True
if self.to_py_utility_code:
env.use_utility_code(self.to_py_utility_code)
return True
@@ -474,62 +474,62 @@ class CTypedefType(BaseType):
base_type = self.typedef_base_type
if type(base_type) is CIntType:
self.from_py_function = "__Pyx_PyInt_As_" + self.specialization_name()
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"CIntFromPy", "TypeConversion.c",
- context={"TYPE": self.empty_declaration_code(),
+ context={"TYPE": self.empty_declaration_code(),
"FROM_PY_FUNCTION": self.from_py_function}))
return True
elif base_type.is_float:
pass # XXX implement!
elif base_type.is_complex:
pass # XXX implement!
- elif base_type.is_cpp_string:
- cname = '__pyx_convert_string_from_py_%s' % type_identifier(self)
- context = {
- 'cname': cname,
- 'type': self.typedef_cname,
- }
- from .UtilityCode import CythonUtilityCode
- env.use_utility_code(CythonUtilityCode.load(
- "string.from_py", "CppConvert.pyx", context=context))
- self.from_py_function = cname
- return True
+ elif base_type.is_cpp_string:
+ cname = '__pyx_convert_string_from_py_%s' % type_identifier(self)
+ context = {
+ 'cname': cname,
+ 'type': self.typedef_cname,
+ }
+ from .UtilityCode import CythonUtilityCode
+ env.use_utility_code(CythonUtilityCode.load(
+ "string.from_py", "CppConvert.pyx", context=context))
+ self.from_py_function = cname
+ return True
if self.from_py_utility_code:
env.use_utility_code(self.from_py_utility_code)
return True
# delegation
return self.typedef_base_type.create_from_py_utility_code(env)
- def to_py_call_code(self, source_code, result_code, result_type, to_py_function=None):
- if to_py_function is None:
- to_py_function = self.to_py_function
- return self.typedef_base_type.to_py_call_code(
- source_code, result_code, result_type, to_py_function)
-
- def from_py_call_code(self, source_code, result_code, error_pos, code,
- from_py_function=None, error_condition=None):
- return self.typedef_base_type.from_py_call_code(
+ def to_py_call_code(self, source_code, result_code, result_type, to_py_function=None):
+ if to_py_function is None:
+ to_py_function = self.to_py_function
+ return self.typedef_base_type.to_py_call_code(
+ source_code, result_code, result_type, to_py_function)
+
+ def from_py_call_code(self, source_code, result_code, error_pos, code,
+ from_py_function=None, error_condition=None):
+ return self.typedef_base_type.from_py_call_code(
source_code, result_code, error_pos, code,
from_py_function or self.from_py_function,
error_condition or self.error_condition(result_code)
)
-
+
def overflow_check_binop(self, binop, env, const_rhs=False):
env.use_utility_code(UtilityCode.load("Common", "Overflow.c"))
- type = self.empty_declaration_code()
+ type = self.empty_declaration_code()
name = self.specialization_name()
if binop == "lshift":
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"LeftShift", "Overflow.c",
context={'TYPE': type, 'NAME': name, 'SIGNED': self.signed}))
else:
if const_rhs:
binop += "_const"
_load_overflow_base(env)
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"SizeCheck", "Overflow.c",
context={'TYPE': type, 'NAME': name}))
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"Binop", "Overflow.c",
context={'TYPE': type, 'NAME': name, 'BINOP': binop}))
return "__Pyx_%s_%s_checking_overflow" % (binop, name)
@@ -537,8 +537,8 @@ class CTypedefType(BaseType):
def error_condition(self, result_code):
if self.typedef_is_external:
if self.exception_value:
- condition = "(%s == %s)" % (
- result_code, self.cast_code(self.exception_value))
+ condition = "(%s == %s)" % (
+ result_code, self.cast_code(self.exception_value))
if self.exception_check:
condition += " && PyErr_Occurred()"
return condition
@@ -594,9 +594,9 @@ class MemoryViewSliceType(PyrexType):
the packing specifiers specify how the array elements are layed-out
in memory.
- 'contig' -- The data is contiguous in memory along this dimension.
+ 'contig' -- The data is contiguous in memory along this dimension.
At most one dimension may be specified as 'contig'.
- 'strided' -- The data isn't contiguous along this dimension.
+ 'strided' -- The data isn't contiguous along this dimension.
'follow' -- Used for C/Fortran contiguous arrays, a 'follow' dimension
has its stride automatically computed from extents of the other
dimensions to ensure C or Fortran memory layout.
@@ -608,7 +608,7 @@ class MemoryViewSliceType(PyrexType):
the *first* axis' packing spec and 'follow' for all other packing
specs.
"""
- from . import Buffer, MemoryView
+ from . import Buffer, MemoryView
self.dtype = base_dtype
self.axes = axes
@@ -622,17 +622,17 @@ class MemoryViewSliceType(PyrexType):
self.writable_needed = False
if not self.dtype.is_fused:
- self.dtype_name = Buffer.mangle_dtype_name(self.dtype)
-
- def __hash__(self):
- return hash(self.__class__) ^ hash(self.dtype) ^ hash(tuple(self.axes))
-
- def __eq__(self, other):
- if isinstance(other, BaseType):
- return self.same_as_resolved_type(other)
- else:
- return False
-
+ self.dtype_name = Buffer.mangle_dtype_name(self.dtype)
+
+ def __hash__(self):
+ return hash(self.__class__) ^ hash(self.dtype) ^ hash(tuple(self.axes))
+
+ def __eq__(self, other):
+ if isinstance(other, BaseType):
+ return self.same_as_resolved_type(other)
+ else:
+ return False
+
def same_as_resolved_type(self, other_type):
return ((other_type.is_memoryviewslice and
#self.writable_needed == other_type.writable_needed and # FIXME: should be only uni-directional
@@ -653,9 +653,9 @@ class MemoryViewSliceType(PyrexType):
assert not pyrex
assert not dll_linkage
from . import MemoryView
- base_code = str(self) if for_display else MemoryView.memviewslice_cname
+ base_code = str(self) if for_display else MemoryView.memviewslice_cname
return self.base_declaration_code(
- base_code,
+ base_code,
entity_code)
def attributes_known(self):
@@ -707,33 +707,33 @@ class MemoryViewSliceType(PyrexType):
elif attribute in ("copy", "copy_fortran"):
ndim = len(self.axes)
- follow_dim = [('direct', 'follow')]
- contig_dim = [('direct', 'contig')]
- to_axes_c = follow_dim * (ndim - 1) + contig_dim
- to_axes_f = contig_dim + follow_dim * (ndim -1)
-
- dtype = self.dtype
- if dtype.is_const:
- dtype = dtype.const_base_type
+ follow_dim = [('direct', 'follow')]
+ contig_dim = [('direct', 'contig')]
+ to_axes_c = follow_dim * (ndim - 1) + contig_dim
+ to_axes_f = contig_dim + follow_dim * (ndim -1)
- to_memview_c = MemoryViewSliceType(dtype, to_axes_c)
- to_memview_f = MemoryViewSliceType(dtype, to_axes_f)
+ dtype = self.dtype
+ if dtype.is_const:
+ dtype = dtype.const_base_type
+ to_memview_c = MemoryViewSliceType(dtype, to_axes_c)
+ to_memview_f = MemoryViewSliceType(dtype, to_axes_f)
+
for to_memview, cython_name in [(to_memview_c, "copy"),
(to_memview_f, "copy_fortran")]:
- copy_func_type = CFuncType(
- to_memview,
- [CFuncTypeArg("memviewslice", self, None)])
- copy_cname = MemoryView.copy_c_or_fortran_cname(to_memview)
-
- entry = scope.declare_cfunction(
- cython_name,
- copy_func_type, pos=pos, defining=1,
- cname=copy_cname)
-
- utility = MemoryView.get_copy_new_utility(pos, self, to_memview)
- env.use_utility_code(utility)
-
+ copy_func_type = CFuncType(
+ to_memview,
+ [CFuncTypeArg("memviewslice", self, None)])
+ copy_cname = MemoryView.copy_c_or_fortran_cname(to_memview)
+
+ entry = scope.declare_cfunction(
+ cython_name,
+ copy_func_type, pos=pos, defining=1,
+ cname=copy_cname)
+
+ utility = MemoryView.get_copy_new_utility(pos, self, to_memview)
+ env.use_utility_code(utility)
+
MemoryView.use_cython_array_utility_code(env)
elif attribute in ("is_c_contig", "is_f_contig"):
@@ -758,35 +758,35 @@ class MemoryViewSliceType(PyrexType):
return True
- def get_entry(self, node, cname=None, type=None):
- from . import MemoryView, Symtab
-
- if cname is None:
- assert node.is_simple() or node.is_temp or node.is_elemental
- cname = node.result()
-
- if type is None:
- type = node.type
-
- entry = Symtab.Entry(cname, cname, type, node.pos)
- return MemoryView.MemoryViewSliceBufferEntry(entry)
-
- def conforms_to(self, dst, broadcast=False, copying=False):
- """
- Returns True if src conforms to dst, False otherwise.
-
- If conformable, the types are the same, the ndims are equal, and each axis spec is conformable.
-
- Any packing/access spec is conformable to itself.
-
- 'direct' and 'ptr' are conformable to 'full'.
- 'contig' and 'follow' are conformable to 'strided'.
- Any other combo is not conformable.
- """
- from . import MemoryView
-
- src = self
-
+ def get_entry(self, node, cname=None, type=None):
+ from . import MemoryView, Symtab
+
+ if cname is None:
+ assert node.is_simple() or node.is_temp or node.is_elemental
+ cname = node.result()
+
+ if type is None:
+ type = node.type
+
+ entry = Symtab.Entry(cname, cname, type, node.pos)
+ return MemoryView.MemoryViewSliceBufferEntry(entry)
+
+ def conforms_to(self, dst, broadcast=False, copying=False):
+ """
+ Returns True if src conforms to dst, False otherwise.
+
+ If conformable, the types are the same, the ndims are equal, and each axis spec is conformable.
+
+ Any packing/access spec is conformable to itself.
+
+ 'direct' and 'ptr' are conformable to 'full'.
+ 'contig' and 'follow' are conformable to 'strided'.
+ Any other combo is not conformable.
+ """
+ from . import MemoryView
+
+ src = self
+
#if not copying and self.writable_needed and not dst.writable_needed:
# return False
@@ -802,73 +802,73 @@ class MemoryViewSliceType(PyrexType):
src_dtype = src_dtype.const_base_type
if src_dtype != dst_dtype:
- return False
-
- if src.ndim != dst.ndim:
- if broadcast:
- src, dst = MemoryView.broadcast_types(src, dst)
- else:
- return False
-
- for src_spec, dst_spec in zip(src.axes, dst.axes):
- src_access, src_packing = src_spec
- dst_access, dst_packing = dst_spec
- if src_access != dst_access and dst_access != 'full':
- return False
- if src_packing != dst_packing and dst_packing != 'strided' and not copying:
- return False
-
- return True
-
- def valid_dtype(self, dtype, i=0):
- """
- Return whether type dtype can be used as the base type of a
- memoryview slice.
-
- We support structs, numeric types and objects
- """
- if dtype.is_complex and dtype.real_type.is_int:
- return False
-
- if dtype.is_struct and dtype.kind == 'struct':
- for member in dtype.scope.var_entries:
- if not self.valid_dtype(member.type):
- return False
-
- return True
-
- return (
- dtype.is_error or
- # Pointers are not valid (yet)
- # (dtype.is_ptr and valid_memslice_dtype(dtype.base_type)) or
- (dtype.is_array and i < 8 and self.valid_dtype(dtype.base_type, i + 1)) or
- dtype.is_numeric or
- dtype.is_pyobject or
- dtype.is_fused or # accept this as it will be replaced by specializations later
- (dtype.is_typedef and self.valid_dtype(dtype.typedef_base_type))
- )
-
- def validate_memslice_dtype(self, pos):
- if not self.valid_dtype(self.dtype):
- error(pos, "Invalid base type for memoryview slice: %s" % self.dtype)
-
- def assert_direct_dims(self, pos):
- for access, packing in self.axes:
- if access != 'direct':
- error(pos, "All dimensions must be direct")
- return False
- return True
-
- def transpose(self, pos):
- if not self.assert_direct_dims(pos):
- return error_type
- return MemoryViewSliceType(self.dtype, self.axes[::-1])
-
- def specialization_name(self):
- return '%s_%s' % (
- super(MemoryViewSliceType,self).specialization_name(),
- self.specialization_suffix())
-
+ return False
+
+ if src.ndim != dst.ndim:
+ if broadcast:
+ src, dst = MemoryView.broadcast_types(src, dst)
+ else:
+ return False
+
+ for src_spec, dst_spec in zip(src.axes, dst.axes):
+ src_access, src_packing = src_spec
+ dst_access, dst_packing = dst_spec
+ if src_access != dst_access and dst_access != 'full':
+ return False
+ if src_packing != dst_packing and dst_packing != 'strided' and not copying:
+ return False
+
+ return True
+
+ def valid_dtype(self, dtype, i=0):
+ """
+ Return whether type dtype can be used as the base type of a
+ memoryview slice.
+
+ We support structs, numeric types and objects
+ """
+ if dtype.is_complex and dtype.real_type.is_int:
+ return False
+
+ if dtype.is_struct and dtype.kind == 'struct':
+ for member in dtype.scope.var_entries:
+ if not self.valid_dtype(member.type):
+ return False
+
+ return True
+
+ return (
+ dtype.is_error or
+ # Pointers are not valid (yet)
+ # (dtype.is_ptr and valid_memslice_dtype(dtype.base_type)) or
+ (dtype.is_array and i < 8 and self.valid_dtype(dtype.base_type, i + 1)) or
+ dtype.is_numeric or
+ dtype.is_pyobject or
+ dtype.is_fused or # accept this as it will be replaced by specializations later
+ (dtype.is_typedef and self.valid_dtype(dtype.typedef_base_type))
+ )
+
+ def validate_memslice_dtype(self, pos):
+ if not self.valid_dtype(self.dtype):
+ error(pos, "Invalid base type for memoryview slice: %s" % self.dtype)
+
+ def assert_direct_dims(self, pos):
+ for access, packing in self.axes:
+ if access != 'direct':
+ error(pos, "All dimensions must be direct")
+ return False
+ return True
+
+ def transpose(self, pos):
+ if not self.assert_direct_dims(pos):
+ return error_type
+ return MemoryViewSliceType(self.dtype, self.axes[::-1])
+
+ def specialization_name(self):
+ return '%s_%s' % (
+ super(MemoryViewSliceType,self).specialization_name(),
+ self.specialization_suffix())
+
def specialization_suffix(self):
return "%s_%s" % (self.axes_to_name(), self.dtype_name)
@@ -886,9 +886,9 @@ class MemoryViewSliceType(PyrexType):
# We don't have 'code', so use a LazyUtilityCode with a callback.
def lazy_utility_callback(code):
- context['dtype_typeinfo'] = Buffer.get_type_information_cname(code, self.dtype)
+ context['dtype_typeinfo'] = Buffer.get_type_information_cname(code, self.dtype)
return TempitaUtilityCode.load(
- "ObjectToMemviewSlice", "MemoryView_C.c", context=context)
+ "ObjectToMemviewSlice", "MemoryView_C.c", context=context)
env.use_utility_code(MemoryView.memviewslice_init_code)
env.use_utility_code(LazyUtilityCode(lazy_utility_callback))
@@ -908,7 +908,7 @@ class MemoryViewSliceType(PyrexType):
buf_flag = self.flags,
ndim = self.ndim,
axes_specs = ', '.join(self.axes_to_code()),
- dtype_typedecl = self.dtype.empty_declaration_code(),
+ dtype_typedecl = self.dtype.empty_declaration_code(),
struct_nesting_depth = self.dtype.struct_nesting_depth(),
c_or_f_flag = c_or_f_flag,
funcname = funcname,
@@ -917,29 +917,29 @@ class MemoryViewSliceType(PyrexType):
self.from_py_function = funcname
return True
- def from_py_call_code(self, source_code, result_code, error_pos, code,
- from_py_function=None, error_condition=None):
+ def from_py_call_code(self, source_code, result_code, error_pos, code,
+ from_py_function=None, error_condition=None):
# NOTE: auto-detection of readonly buffers is disabled:
# writable = self.writable_needed or not self.dtype.is_const
writable = not self.dtype.is_const
return self._assign_from_py_code(
source_code, result_code, error_pos, code, from_py_function, error_condition,
extra_args=['PyBUF_WRITABLE' if writable else '0'])
-
+
def create_to_py_utility_code(self, env):
- self._dtype_to_py_func, self._dtype_from_py_func = self.dtype_object_conversion_funcs(env)
+ self._dtype_to_py_func, self._dtype_from_py_func = self.dtype_object_conversion_funcs(env)
return True
- def to_py_call_code(self, source_code, result_code, result_type, to_py_function=None):
- assert self._dtype_to_py_func
- assert self._dtype_from_py_func
-
- to_py_func = "(PyObject *(*)(char *)) " + self._dtype_to_py_func
- from_py_func = "(int (*)(char *, PyObject *)) " + self._dtype_from_py_func
+ def to_py_call_code(self, source_code, result_code, result_type, to_py_function=None):
+ assert self._dtype_to_py_func
+ assert self._dtype_from_py_func
- tup = (result_code, source_code, self.ndim, to_py_func, from_py_func, self.dtype.is_pyobject)
- return "%s = __pyx_memoryview_fromslice(%s, %s, %s, %s, %d);" % tup
+ to_py_func = "(PyObject *(*)(char *)) " + self._dtype_to_py_func
+ from_py_func = "(int (*)(char *, PyObject *)) " + self._dtype_from_py_func
+ tup = (result_code, source_code, self.ndim, to_py_func, from_py_func, self.dtype.is_pyobject)
+ return "%s = __pyx_memoryview_fromslice(%s, %s, %s, %s, %d);" % tup
+
def dtype_object_conversion_funcs(self, env):
get_function = "__pyx_memview_get_%s" % self.dtype_name
set_function = "__pyx_memview_set_%s" % self.dtype_name
@@ -977,8 +977,8 @@ class MemoryViewSliceType(PyrexType):
error_condition=error_condition,
)
- utility = TempitaUtilityCode.load_cached(
- utility_name, "MemoryView_C.c", context=context)
+ utility = TempitaUtilityCode.load_cached(
+ utility_name, "MemoryView_C.c", context=context)
env.use_utility_code(utility)
return get_function, set_function
@@ -1061,9 +1061,9 @@ class BufferType(BaseType):
self.cast = cast
self.is_numpy_buffer = self.base.name == "ndarray"
- def can_coerce_to_pyobject(self,env):
- return True
-
+ def can_coerce_to_pyobject(self,env):
+ return True
+
def can_coerce_from_pyobject(self,env):
return True
@@ -1077,11 +1077,11 @@ class BufferType(BaseType):
self.negative_indices, self.cast)
return self
- def get_entry(self, node):
- from . import Buffer
- assert node.is_name
- return Buffer.BufferEntry(node.entry)
-
+ def get_entry(self, node):
+ from . import Buffer
+ assert node.is_name
+ return Buffer.BufferEntry(node.entry)
+
def __getattr__(self, name):
return getattr(self.base, name)
@@ -1195,7 +1195,7 @@ class BuiltinObjectType(PyObjectType):
has_attributes = 1
base_type = None
module_name = '__builtin__'
- require_exact = 1
+ require_exact = 1
# fields that let it look like an extension type
vtabslot_cname = None
@@ -1203,7 +1203,7 @@ class BuiltinObjectType(PyObjectType):
vtabptr_cname = None
typedef_flag = True
is_external = True
- decl_type = 'PyObject'
+ decl_type = 'PyObject'
def __init__(self, name, cname, objstruct_cname=None):
self.name = name
@@ -1211,12 +1211,12 @@ class BuiltinObjectType(PyObjectType):
self.typeptr_cname = "(&%s)" % cname
self.objstruct_cname = objstruct_cname
self.is_gc_simple = name in builtin_types_that_cannot_create_refcycles
- if name == 'type':
- # Special case the type type, as many C API calls (and other
- # libraries) actually expect a PyTypeObject* for type arguments.
- self.decl_type = objstruct_cname
- if name == 'Exception':
- self.require_exact = 0
+ if name == 'type':
+ # Special case the type type, as many C API calls (and other
+ # libraries) actually expect a PyTypeObject* for type arguments.
+ self.decl_type = objstruct_cname
+ if name == 'Exception':
+ self.require_exact = 0
def set_scope(self, scope):
self.scope = scope
@@ -1270,15 +1270,15 @@ class BuiltinObjectType(PyObjectType):
type_check = 'PyString_Check'
elif type_name == 'basestring':
type_check = '__Pyx_PyBaseString_Check'
- elif type_name == 'Exception':
- type_check = '__Pyx_PyException_Check'
+ elif type_name == 'Exception':
+ type_check = '__Pyx_PyException_Check'
elif type_name == 'bytearray':
type_check = 'PyByteArray_Check'
elif type_name == 'frozenset':
type_check = 'PyFrozenSet_Check'
else:
type_check = 'Py%s_Check' % type_name.capitalize()
- if exact and type_name not in ('bool', 'slice', 'Exception'):
+ if exact and type_name not in ('bool', 'slice', 'Exception'):
type_check += 'Exact'
return type_check
@@ -1306,19 +1306,19 @@ class BuiltinObjectType(PyObjectType):
if pyrex or for_display:
base_code = self.name
else:
- base_code = public_decl(self.decl_type, dll_linkage)
+ base_code = public_decl(self.decl_type, dll_linkage)
entity_code = "*%s" % entity_code
return self.base_declaration_code(base_code, entity_code)
- def as_pyobject(self, cname):
- if self.decl_type == 'PyObject':
- return cname
- else:
- return "(PyObject *)" + cname
-
+ def as_pyobject(self, cname):
+ if self.decl_type == 'PyObject':
+ return cname
+ else:
+ return "(PyObject *)" + cname
+
def cast_code(self, expr_code, to_object_struct = False):
return "((%s*)%s)" % (
- to_object_struct and self.objstruct_cname or self.decl_type, # self.objstruct_cname may be None
+ to_object_struct and self.objstruct_cname or self.decl_type, # self.objstruct_cname may be None
expr_code)
def py_type_name(self):
@@ -1346,7 +1346,7 @@ class PyExtensionType(PyObjectType):
# vtable_cname string Name of C method table definition
# early_init boolean Whether to initialize early (as opposed to during module execution).
# defered_declarations [thunk] Used to declare class hierarchies in order
- # check_size 'warn', 'error', 'ignore' What to do if tp_basicsize does not match
+ # check_size 'warn', 'error', 'ignore' What to do if tp_basicsize does not match
is_extension_type = 1
has_attributes = 1
@@ -1354,7 +1354,7 @@ class PyExtensionType(PyObjectType):
objtypedef_cname = None
- def __init__(self, name, typedef_flag, base_type, is_external=0, check_size=None):
+ def __init__(self, name, typedef_flag, base_type, is_external=0, check_size=None):
self.name = name
self.scope = None
self.typedef_flag = typedef_flag
@@ -1370,7 +1370,7 @@ class PyExtensionType(PyObjectType):
self.vtabptr_cname = None
self.vtable_cname = None
self.is_external = is_external
- self.check_size = check_size or 'warn'
+ self.check_size = check_size or 'warn'
self.defered_declarations = []
def set_scope(self, scope):
@@ -1494,31 +1494,31 @@ class CType(PyrexType):
else:
return 0
- def to_py_call_code(self, source_code, result_code, result_type, to_py_function=None):
- func = self.to_py_function if to_py_function is None else to_py_function
- assert func
- if self.is_string or self.is_cpp_string:
- if result_type.is_builtin_type:
- result_type_name = result_type.name
- if result_type_name in ('bytes', 'str', 'unicode'):
- func = func.replace("Object", result_type_name.title(), 1)
- elif result_type_name == 'bytearray':
- func = func.replace("Object", "ByteArray", 1)
- return '%s = %s(%s)' % (
- result_code,
- func,
- source_code or 'NULL')
-
- def from_py_call_code(self, source_code, result_code, error_pos, code,
- from_py_function=None, error_condition=None):
+ def to_py_call_code(self, source_code, result_code, result_type, to_py_function=None):
+ func = self.to_py_function if to_py_function is None else to_py_function
+ assert func
+ if self.is_string or self.is_cpp_string:
+ if result_type.is_builtin_type:
+ result_type_name = result_type.name
+ if result_type_name in ('bytes', 'str', 'unicode'):
+ func = func.replace("Object", result_type_name.title(), 1)
+ elif result_type_name == 'bytearray':
+ func = func.replace("Object", "ByteArray", 1)
+ return '%s = %s(%s)' % (
+ result_code,
+ func,
+ source_code or 'NULL')
+
+ def from_py_call_code(self, source_code, result_code, error_pos, code,
+ from_py_function=None, error_condition=None):
return self._assign_from_py_code(
source_code, result_code, error_pos, code, from_py_function, error_condition)
-
+
class PythranExpr(CType):
# Pythran object of a given type
-
+
to_py_function = "__Pyx_pythran_to_python"
is_pythran_expr = True
writable = True
@@ -1576,10 +1576,10 @@ class CConstType(BaseType):
def declaration_code(self, entity_code,
for_display = 0, dll_linkage = None, pyrex = 0):
- if for_display or pyrex:
- return "const " + self.const_base_type.declaration_code(entity_code, for_display, dll_linkage, pyrex)
- else:
- return self.const_base_type.declaration_code("const %s" % entity_code, for_display, dll_linkage, pyrex)
+ if for_display or pyrex:
+ return "const " + self.const_base_type.declaration_code(entity_code, for_display, dll_linkage, pyrex)
+ else:
+ return self.const_base_type.declaration_code("const %s" % entity_code, for_display, dll_linkage, pyrex)
def specialize(self, values):
base_type = self.const_base_type.specialize(values)
@@ -1591,9 +1591,9 @@ class CConstType(BaseType):
def deduce_template_params(self, actual):
return self.const_base_type.deduce_template_params(actual)
- def can_coerce_to_pyobject(self, env):
- return self.const_base_type.can_coerce_to_pyobject(env)
-
+ def can_coerce_to_pyobject(self, env):
+ return self.const_base_type.can_coerce_to_pyobject(env)
+
def can_coerce_from_pyobject(self, env):
return self.const_base_type.can_coerce_from_pyobject(env)
@@ -1628,17 +1628,17 @@ class FusedType(CType):
exception_check = 0
def __init__(self, types, name=None):
- # Use list rather than set to preserve order (list should be short).
- flattened_types = []
- for t in types:
- if t.is_fused:
- # recursively merge in subtypes
- for subtype in t.types:
- if subtype not in flattened_types:
- flattened_types.append(subtype)
- elif t not in flattened_types:
- flattened_types.append(t)
- self.types = flattened_types
+ # Use list rather than set to preserve order (list should be short).
+ flattened_types = []
+ for t in types:
+ if t.is_fused:
+ # recursively merge in subtypes
+ for subtype in t.types:
+ if subtype not in flattened_types:
+ flattened_types.append(subtype)
+ elif t not in flattened_types:
+ flattened_types.append(t)
+ self.types = flattened_types
self.name = name
def declaration_code(self, entity_code, for_display = 0,
@@ -1669,7 +1669,7 @@ class CVoidType(CType):
#
is_void = 1
- to_py_function = "__Pyx_void_to_None"
+ to_py_function = "__Pyx_void_to_None"
def __repr__(self):
return "<CVoidType>"
@@ -1716,10 +1716,10 @@ class CNumericType(CType):
def __init__(self, rank, signed = 1):
self.rank = rank
- if rank > 0 and signed == SIGNED:
- # Signed is meaningless for anything but char, and complicates
- # type promotion.
- signed = 1
+ if rank > 0 and signed == SIGNED:
+ # Signed is meaningless for anything but char, and complicates
+ # type promotion.
+ signed = 1
self.signed = signed
def sign_and_name(self):
@@ -1783,12 +1783,12 @@ class CIntLike(object):
"""
to_py_function = None
from_py_function = None
- to_pyunicode_utility = None
- default_format_spec = 'd'
-
- def can_coerce_to_pyobject(self, env):
- return True
+ to_pyunicode_utility = None
+ default_format_spec = 'd'
+ def can_coerce_to_pyobject(self, env):
+ return True
+
def can_coerce_from_pyobject(self, env):
return True
@@ -1810,48 +1810,48 @@ class CIntLike(object):
"FROM_PY_FUNCTION": self.from_py_function}))
return True
- @staticmethod
- def _parse_format(format_spec):
- padding = ' '
- if not format_spec:
- return ('d', 0, padding)
- format_type = format_spec[-1]
- if format_type in ('o', 'd', 'x', 'X'):
- prefix = format_spec[:-1]
- elif format_type.isdigit():
- format_type = 'd'
- prefix = format_spec
- else:
- return (None, 0, padding)
- if not prefix:
- return (format_type, 0, padding)
- if prefix[0] == '-':
- prefix = prefix[1:]
- if prefix and prefix[0] == '0':
- padding = '0'
- prefix = prefix.lstrip('0')
- if prefix.isdigit():
- return (format_type, int(prefix), padding)
- return (None, 0, padding)
-
- def can_coerce_to_pystring(self, env, format_spec=None):
- format_type, width, padding = self._parse_format(format_spec)
- return format_type is not None and width <= 2**30
-
- def convert_to_pystring(self, cvalue, code, format_spec=None):
- if self.to_pyunicode_utility is None:
- utility_code_name = "__Pyx_PyUnicode_From_" + self.specialization_name()
- to_pyunicode_utility = TempitaUtilityCode.load_cached(
- "CIntToPyUnicode", "TypeConversion.c",
- context={"TYPE": self.empty_declaration_code(),
- "TO_PY_FUNCTION": utility_code_name})
- self.to_pyunicode_utility = (utility_code_name, to_pyunicode_utility)
- else:
- utility_code_name, to_pyunicode_utility = self.to_pyunicode_utility
- code.globalstate.use_utility_code(to_pyunicode_utility)
- format_type, width, padding_char = self._parse_format(format_spec)
- return "%s(%s, %d, '%s', '%s')" % (utility_code_name, cvalue, width, padding_char, format_type)
-
+ @staticmethod
+ def _parse_format(format_spec):
+ padding = ' '
+ if not format_spec:
+ return ('d', 0, padding)
+ format_type = format_spec[-1]
+ if format_type in ('o', 'd', 'x', 'X'):
+ prefix = format_spec[:-1]
+ elif format_type.isdigit():
+ format_type = 'd'
+ prefix = format_spec
+ else:
+ return (None, 0, padding)
+ if not prefix:
+ return (format_type, 0, padding)
+ if prefix[0] == '-':
+ prefix = prefix[1:]
+ if prefix and prefix[0] == '0':
+ padding = '0'
+ prefix = prefix.lstrip('0')
+ if prefix.isdigit():
+ return (format_type, int(prefix), padding)
+ return (None, 0, padding)
+
+ def can_coerce_to_pystring(self, env, format_spec=None):
+ format_type, width, padding = self._parse_format(format_spec)
+ return format_type is not None and width <= 2**30
+
+ def convert_to_pystring(self, cvalue, code, format_spec=None):
+ if self.to_pyunicode_utility is None:
+ utility_code_name = "__Pyx_PyUnicode_From_" + self.specialization_name()
+ to_pyunicode_utility = TempitaUtilityCode.load_cached(
+ "CIntToPyUnicode", "TypeConversion.c",
+ context={"TYPE": self.empty_declaration_code(),
+ "TO_PY_FUNCTION": utility_code_name})
+ self.to_pyunicode_utility = (utility_code_name, to_pyunicode_utility)
+ else:
+ utility_code_name, to_pyunicode_utility = self.to_pyunicode_utility
+ code.globalstate.use_utility_code(to_pyunicode_utility)
+ format_type, width, padding_char = self._parse_format(format_spec)
+ return "%s(%s, %d, '%s', '%s')" % (utility_code_name, cvalue, width, padding_char, format_type)
+
class CIntType(CIntLike, CNumericType):
@@ -1890,21 +1890,21 @@ class CIntType(CIntLike, CNumericType):
def overflow_check_binop(self, binop, env, const_rhs=False):
env.use_utility_code(UtilityCode.load("Common", "Overflow.c"))
- type = self.empty_declaration_code()
+ type = self.empty_declaration_code()
name = self.specialization_name()
if binop == "lshift":
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"LeftShift", "Overflow.c",
context={'TYPE': type, 'NAME': name, 'SIGNED': self.signed}))
else:
if const_rhs:
binop += "_const"
if type in ('int', 'long', 'long long'):
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"BaseCaseSigned", "Overflow.c",
context={'INT': type, 'NAME': name}))
elif type in ('unsigned int', 'unsigned long', 'unsigned long long'):
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"BaseCaseUnsigned", "Overflow.c",
context={'UINT': type, 'NAME': name}))
elif self.rank <= 1:
@@ -1912,23 +1912,23 @@ class CIntType(CIntLike, CNumericType):
return "__Pyx_%s_%s_no_overflow" % (binop, name)
else:
_load_overflow_base(env)
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"SizeCheck", "Overflow.c",
context={'TYPE': type, 'NAME': name}))
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"Binop", "Overflow.c",
context={'TYPE': type, 'NAME': name, 'BINOP': binop}))
return "__Pyx_%s_%s_checking_overflow" % (binop, name)
-
+
def _load_overflow_base(env):
env.use_utility_code(UtilityCode.load("Common", "Overflow.c"))
for type in ('int', 'long', 'long long'):
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"BaseCaseSigned", "Overflow.c",
context={'INT': type, 'NAME': type.replace(' ', '_')}))
for type in ('unsigned int', 'unsigned long', 'unsigned long long'):
- env.use_utility_code(TempitaUtilityCode.load_cached(
+ env.use_utility_code(TempitaUtilityCode.load_cached(
"BaseCaseUnsigned", "Overflow.c",
context={'UINT': type, 'NAME': type.replace(' ', '_')}))
@@ -1947,45 +1947,45 @@ class CReturnCodeType(CIntType):
is_returncode = True
exception_check = False
- default_format_spec = ''
-
- def can_coerce_to_pystring(self, env, format_spec=None):
- return not format_spec
-
- def convert_to_pystring(self, cvalue, code, format_spec=None):
- return "__Pyx_NewRef(%s)" % code.globalstate.get_py_string_const(StringEncoding.EncodedString("None")).cname
+ default_format_spec = ''
+ def can_coerce_to_pystring(self, env, format_spec=None):
+ return not format_spec
+ def convert_to_pystring(self, cvalue, code, format_spec=None):
+ return "__Pyx_NewRef(%s)" % code.globalstate.get_py_string_const(StringEncoding.EncodedString("None")).cname
+
+
class CBIntType(CIntType):
to_py_function = "__Pyx_PyBool_FromLong"
from_py_function = "__Pyx_PyObject_IsTrue"
- exception_check = 1 # for C++ bool
- default_format_spec = ''
-
- def can_coerce_to_pystring(self, env, format_spec=None):
- return not format_spec or super(CBIntType, self).can_coerce_to_pystring(env, format_spec)
-
- def convert_to_pystring(self, cvalue, code, format_spec=None):
- if format_spec:
- return super(CBIntType, self).convert_to_pystring(cvalue, code, format_spec)
- # NOTE: no caching here as the string constant cnames depend on the current module
- utility_code_name = "__Pyx_PyUnicode_FromBInt_" + self.specialization_name()
- to_pyunicode_utility = TempitaUtilityCode.load_cached(
- "CBIntToPyUnicode", "TypeConversion.c", context={
- "TRUE_CONST": code.globalstate.get_py_string_const(StringEncoding.EncodedString("True")).cname,
- "FALSE_CONST": code.globalstate.get_py_string_const(StringEncoding.EncodedString("False")).cname,
- "TO_PY_FUNCTION": utility_code_name,
- })
- code.globalstate.use_utility_code(to_pyunicode_utility)
- return "%s(%s)" % (utility_code_name, cvalue)
-
+ exception_check = 1 # for C++ bool
+ default_format_spec = ''
+
+ def can_coerce_to_pystring(self, env, format_spec=None):
+ return not format_spec or super(CBIntType, self).can_coerce_to_pystring(env, format_spec)
+
+ def convert_to_pystring(self, cvalue, code, format_spec=None):
+ if format_spec:
+ return super(CBIntType, self).convert_to_pystring(cvalue, code, format_spec)
+ # NOTE: no caching here as the string constant cnames depend on the current module
+ utility_code_name = "__Pyx_PyUnicode_FromBInt_" + self.specialization_name()
+ to_pyunicode_utility = TempitaUtilityCode.load_cached(
+ "CBIntToPyUnicode", "TypeConversion.c", context={
+ "TRUE_CONST": code.globalstate.get_py_string_const(StringEncoding.EncodedString("True")).cname,
+ "FALSE_CONST": code.globalstate.get_py_string_const(StringEncoding.EncodedString("False")).cname,
+ "TO_PY_FUNCTION": utility_code_name,
+ })
+ code.globalstate.use_utility_code(to_pyunicode_utility)
+ return "%s(%s)" % (utility_code_name, cvalue)
+
def declaration_code(self, entity_code,
for_display = 0, dll_linkage = None, pyrex = 0):
- if for_display:
+ if for_display:
base_code = 'bool'
- elif pyrex:
- base_code = 'bint'
+ elif pyrex:
+ base_code = 'bint'
else:
base_code = public_decl('int', dll_linkage)
return self.base_declaration_code(base_code, entity_code)
@@ -2014,9 +2014,9 @@ class CPyUCS4IntType(CIntType):
to_py_function = "PyUnicode_FromOrdinal"
from_py_function = "__Pyx_PyObject_AsPy_UCS4"
- def can_coerce_to_pystring(self, env, format_spec=None):
- return False # does the right thing anyway
-
+ def can_coerce_to_pystring(self, env, format_spec=None):
+ return False # does the right thing anyway
+
def create_from_py_utility_code(self, env):
env.use_utility_code(UtilityCode.load_cached("ObjectAsUCS4", "TypeConversion.c"))
return True
@@ -2038,9 +2038,9 @@ class CPyUnicodeIntType(CIntType):
to_py_function = "PyUnicode_FromOrdinal"
from_py_function = "__Pyx_PyObject_AsPy_UNICODE"
- def can_coerce_to_pystring(self, env, format_spec=None):
- return False # does the right thing anyway
-
+ def can_coerce_to_pystring(self, env, format_spec=None):
+ return False # does the right thing anyway
+
def create_from_py_utility_code(self, env):
env.use_utility_code(UtilityCode.load_cached("ObjectAsPyUnicode", "TypeConversion.c"))
return True
@@ -2116,11 +2116,11 @@ class CComplexType(CNumericType):
def __init__(self, real_type):
while real_type.is_typedef and not real_type.typedef_is_external:
real_type = real_type.typedef_base_type
- self.funcsuffix = "_%s" % real_type.specialization_name()
- if real_type.is_float:
- self.math_h_modifier = real_type.math_h_modifier
+ self.funcsuffix = "_%s" % real_type.specialization_name()
+ if real_type.is_float:
+ self.math_h_modifier = real_type.math_h_modifier
else:
- self.math_h_modifier = "_UNUSED"
+ self.math_h_modifier = "_UNUSED"
self.real_type = real_type
CNumericType.__init__(self, real_type.rank + 0.5, real_type.signed)
@@ -2201,40 +2201,40 @@ class CComplexType(CNumericType):
return True
- def _utility_code_context(self):
- return {
- 'type': self.empty_declaration_code(),
- 'type_name': self.specialization_name(),
- 'real_type': self.real_type.empty_declaration_code(),
- 'func_suffix': self.funcsuffix,
- 'm': self.math_h_modifier,
- 'is_float': int(self.real_type.is_float)
- }
-
+ def _utility_code_context(self):
+ return {
+ 'type': self.empty_declaration_code(),
+ 'type_name': self.specialization_name(),
+ 'real_type': self.real_type.empty_declaration_code(),
+ 'func_suffix': self.funcsuffix,
+ 'm': self.math_h_modifier,
+ 'is_float': int(self.real_type.is_float)
+ }
+
def create_declaration_utility_code(self, env):
# This must always be run, because a single CComplexType instance can be shared
# across multiple compilations (the one created in the module scope)
- env.use_utility_code(UtilityCode.load_cached('Header', 'Complex.c'))
- env.use_utility_code(UtilityCode.load_cached('RealImag', 'Complex.c'))
- env.use_utility_code(TempitaUtilityCode.load_cached(
- 'Declarations', 'Complex.c', self._utility_code_context()))
- env.use_utility_code(TempitaUtilityCode.load_cached(
- 'Arithmetic', 'Complex.c', self._utility_code_context()))
- return True
-
- def can_coerce_to_pyobject(self, env):
+ env.use_utility_code(UtilityCode.load_cached('Header', 'Complex.c'))
+ env.use_utility_code(UtilityCode.load_cached('RealImag', 'Complex.c'))
+ env.use_utility_code(TempitaUtilityCode.load_cached(
+ 'Declarations', 'Complex.c', self._utility_code_context()))
+ env.use_utility_code(TempitaUtilityCode.load_cached(
+ 'Arithmetic', 'Complex.c', self._utility_code_context()))
return True
+ def can_coerce_to_pyobject(self, env):
+ return True
+
def can_coerce_from_pyobject(self, env):
return True
def create_to_py_utility_code(self, env):
- env.use_utility_code(UtilityCode.load_cached('ToPy', 'Complex.c'))
+ env.use_utility_code(UtilityCode.load_cached('ToPy', 'Complex.c'))
return True
def create_from_py_utility_code(self, env):
- env.use_utility_code(TempitaUtilityCode.load_cached(
- 'FromPy', 'Complex.c', self._utility_code_context()))
+ env.use_utility_code(TempitaUtilityCode.load_cached(
+ 'FromPy', 'Complex.c', self._utility_code_context()))
self.from_py_function = "__Pyx_PyComplex_As_" + self.specialization_name()
return True
@@ -2269,7 +2269,7 @@ complex_ops = {
(2, '-'): 'diff',
(2, '*'): 'prod',
(2, '/'): 'quot',
- (2, '**'): 'pow',
+ (2, '**'): 'pow',
(2, '=='): 'eq',
}
@@ -2302,8 +2302,8 @@ class CPointerBaseType(CType):
def __init__(self, base_type):
self.base_type = base_type
- if base_type.is_const:
- base_type = base_type.const_base_type
+ if base_type.is_const:
+ base_type = base_type.const_base_type
for char_type in (c_char_type, c_uchar_type, c_schar_type):
if base_type.same_as(char_type):
self.is_string = 1
@@ -2313,16 +2313,16 @@ class CPointerBaseType(CType):
self.is_pyunicode_ptr = 1
if self.is_string and not base_type.is_error:
- if base_type.signed == 2:
- self.to_py_function = "__Pyx_PyObject_FromCString"
- if self.is_ptr:
+ if base_type.signed == 2:
+ self.to_py_function = "__Pyx_PyObject_FromCString"
+ if self.is_ptr:
self.from_py_function = "__Pyx_PyObject_As%sSString"
- elif base_type.signed:
+ elif base_type.signed:
self.to_py_function = "__Pyx_PyObject_FromString"
if self.is_ptr:
self.from_py_function = "__Pyx_PyObject_As%sString"
else:
- self.to_py_function = "__Pyx_PyObject_FromCString"
+ self.to_py_function = "__Pyx_PyObject_FromCString"
if self.is_ptr:
self.from_py_function = "__Pyx_PyObject_As%sUString"
if self.is_ptr:
@@ -2353,7 +2353,7 @@ class CArrayType(CPointerBaseType):
# size integer or None Number of elements
is_array = 1
- to_tuple_function = None
+ to_tuple_function = None
def __init__(self, base_type, size):
super(CArrayType, self).__init__(base_type)
@@ -2376,12 +2376,12 @@ class CArrayType(CPointerBaseType):
or other_type is error_type)
def assignable_from_resolved_type(self, src_type):
- # C arrays are assigned by value, either Python containers or C arrays/pointers
- if src_type.is_pyobject:
- return True
- if src_type.is_ptr or src_type.is_array:
- return self.base_type.assignable_from(src_type.base_type)
- return False
+ # C arrays are assigned by value, either Python containers or C arrays/pointers
+ if src_type.is_pyobject:
+ return True
+ if src_type.is_ptr or src_type.is_array:
+ return self.base_type.assignable_from(src_type.base_type)
+ return False
def element_ptr_type(self):
return c_ptr_type(self.base_type)
@@ -2409,7 +2409,7 @@ class CArrayType(CPointerBaseType):
if base_type == self.base_type:
return self
else:
- return CArrayType(base_type, self.size)
+ return CArrayType(base_type, self.size)
def deduce_template_params(self, actual):
if isinstance(actual, CArrayType):
@@ -2417,79 +2417,79 @@ class CArrayType(CPointerBaseType):
else:
return {}
- def can_coerce_to_pyobject(self, env):
- return self.base_type.can_coerce_to_pyobject(env)
+ def can_coerce_to_pyobject(self, env):
+ return self.base_type.can_coerce_to_pyobject(env)
def can_coerce_from_pyobject(self, env):
return self.base_type.can_coerce_from_pyobject(env)
- def create_to_py_utility_code(self, env):
- if self.to_py_function is not None:
- return self.to_py_function
- if not self.base_type.create_to_py_utility_code(env):
- return False
-
+ def create_to_py_utility_code(self, env):
+ if self.to_py_function is not None:
+ return self.to_py_function
+ if not self.base_type.create_to_py_utility_code(env):
+ return False
+
safe_typename = self.base_type.specialization_name()
- to_py_function = "__Pyx_carray_to_py_%s" % safe_typename
- to_tuple_function = "__Pyx_carray_to_tuple_%s" % safe_typename
-
- from .UtilityCode import CythonUtilityCode
- context = {
- 'cname': to_py_function,
- 'to_tuple_cname': to_tuple_function,
+ to_py_function = "__Pyx_carray_to_py_%s" % safe_typename
+ to_tuple_function = "__Pyx_carray_to_tuple_%s" % safe_typename
+
+ from .UtilityCode import CythonUtilityCode
+ context = {
+ 'cname': to_py_function,
+ 'to_tuple_cname': to_tuple_function,
'base_type': self.base_type,
- }
- env.use_utility_code(CythonUtilityCode.load(
- "carray.to_py", "CConvert.pyx",
- outer_module_scope=env.global_scope(), # need access to types declared in module
- context=context, compiler_directives=dict(env.global_scope().directives)))
- self.to_tuple_function = to_tuple_function
- self.to_py_function = to_py_function
- return True
-
- def to_py_call_code(self, source_code, result_code, result_type, to_py_function=None):
- func = self.to_py_function if to_py_function is None else to_py_function
- if self.is_string or self.is_pyunicode_ptr:
- return '%s = %s(%s)' % (
- result_code,
- func,
- source_code)
- target_is_tuple = result_type.is_builtin_type and result_type.name == 'tuple'
- return '%s = %s(%s, %s)' % (
- result_code,
- self.to_tuple_function if target_is_tuple else func,
- source_code,
- self.size)
-
- def create_from_py_utility_code(self, env):
- if self.from_py_function is not None:
- return self.from_py_function
- if not self.base_type.create_from_py_utility_code(env):
- return False
-
+ }
+ env.use_utility_code(CythonUtilityCode.load(
+ "carray.to_py", "CConvert.pyx",
+ outer_module_scope=env.global_scope(), # need access to types declared in module
+ context=context, compiler_directives=dict(env.global_scope().directives)))
+ self.to_tuple_function = to_tuple_function
+ self.to_py_function = to_py_function
+ return True
+
+ def to_py_call_code(self, source_code, result_code, result_type, to_py_function=None):
+ func = self.to_py_function if to_py_function is None else to_py_function
+ if self.is_string or self.is_pyunicode_ptr:
+ return '%s = %s(%s)' % (
+ result_code,
+ func,
+ source_code)
+ target_is_tuple = result_type.is_builtin_type and result_type.name == 'tuple'
+ return '%s = %s(%s, %s)' % (
+ result_code,
+ self.to_tuple_function if target_is_tuple else func,
+ source_code,
+ self.size)
+
+ def create_from_py_utility_code(self, env):
+ if self.from_py_function is not None:
+ return self.from_py_function
+ if not self.base_type.create_from_py_utility_code(env):
+ return False
+
from_py_function = "__Pyx_carray_from_py_%s" % self.base_type.specialization_name()
-
- from .UtilityCode import CythonUtilityCode
- context = {
- 'cname': from_py_function,
+
+ from .UtilityCode import CythonUtilityCode
+ context = {
+ 'cname': from_py_function,
'base_type': self.base_type,
- }
- env.use_utility_code(CythonUtilityCode.load(
- "carray.from_py", "CConvert.pyx",
- outer_module_scope=env.global_scope(), # need access to types declared in module
- context=context, compiler_directives=dict(env.global_scope().directives)))
- self.from_py_function = from_py_function
- return True
-
- def from_py_call_code(self, source_code, result_code, error_pos, code,
- from_py_function=None, error_condition=None):
+ }
+ env.use_utility_code(CythonUtilityCode.load(
+ "carray.from_py", "CConvert.pyx",
+ outer_module_scope=env.global_scope(), # need access to types declared in module
+ context=context, compiler_directives=dict(env.global_scope().directives)))
+ self.from_py_function = from_py_function
+ return True
+
+ def from_py_call_code(self, source_code, result_code, error_pos, code,
+ from_py_function=None, error_condition=None):
assert not error_condition, '%s: %s' % (error_pos, error_condition)
- call_code = "%s(%s, %s, %s)" % (
- from_py_function or self.from_py_function,
- source_code, result_code, self.size)
- return code.error_goto_if_neg(call_code, error_pos)
-
-
+ call_code = "%s(%s, %s, %s)" % (
+ from_py_function or self.from_py_function,
+ source_code, result_code, self.size)
+ return code.error_goto_if_neg(call_code, error_pos)
+
+
class CPtrType(CPointerBaseType):
# base_type CType Reference type
@@ -2564,7 +2564,7 @@ class CPtrType(CPointerBaseType):
return self.base_type.find_cpp_operation_type(operator, operand_type)
return None
-
+
class CNullPtrType(CPtrType):
is_null_ptr = 1
@@ -2573,7 +2573,7 @@ class CNullPtrType(CPtrType):
class CReferenceType(BaseType):
is_reference = 1
- is_fake_reference = 0
+ is_fake_reference = 0
def __init__(self, base_type):
self.ref_base_type = base_type
@@ -2596,7 +2596,7 @@ class CReferenceType(BaseType):
if base_type == self.ref_base_type:
return self
else:
- return type(self)(base_type)
+ return type(self)(base_type)
def deduce_template_params(self, actual):
return self.ref_base_type.deduce_template_params(actual)
@@ -2605,22 +2605,22 @@ class CReferenceType(BaseType):
return getattr(self.ref_base_type, name)
-class CFakeReferenceType(CReferenceType):
-
- is_fake_reference = 1
-
- def __repr__(self):
- return "<CFakeReferenceType %s>" % repr(self.ref_base_type)
-
- def __str__(self):
- return "%s [&]" % self.ref_base_type
-
- def declaration_code(self, entity_code,
- for_display = 0, dll_linkage = None, pyrex = 0):
- #print "CReferenceType.declaration_code: pointer to", self.base_type ###
- return "__Pyx_FakeReference<%s> %s" % (self.ref_base_type.empty_declaration_code(), entity_code)
-
-
+class CFakeReferenceType(CReferenceType):
+
+ is_fake_reference = 1
+
+ def __repr__(self):
+ return "<CFakeReferenceType %s>" % repr(self.ref_base_type)
+
+ def __str__(self):
+ return "%s [&]" % self.ref_base_type
+
+ def declaration_code(self, entity_code,
+ for_display = 0, dll_linkage = None, pyrex = 0):
+ #print "CReferenceType.declaration_code: pointer to", self.base_type ###
+ return "__Pyx_FakeReference<%s> %s" % (self.ref_base_type.empty_declaration_code(), entity_code)
+
+
class CFuncType(CType):
# return_type CType
# args [CFuncTypeArg]
@@ -2668,7 +2668,7 @@ class CFuncType(CType):
self.is_strict_signature = is_strict_signature
def __repr__(self):
- arg_reprs = list(map(repr, self.args))
+ arg_reprs = list(map(repr, self.args))
if self.has_varargs:
arg_reprs.append("...")
if self.exception_value:
@@ -2730,8 +2730,8 @@ class CFuncType(CType):
# is exempt from compatibility checking (the proper check
# is performed elsewhere).
for i in range(as_cmethod, nargs):
- if not self.args[i].type.same_as(other_type.args[i].type):
- return 0
+ if not self.args[i].type.same_as(other_type.args[i].type):
+ return 0
if self.has_varargs != other_type.has_varargs:
return 0
if self.optional_arg_count != other_type.optional_arg_count:
@@ -2751,25 +2751,25 @@ class CFuncType(CType):
if not self._same_exception_value(other_type.exception_value):
return 0
elif not self._is_exception_compatible_with(other_type):
- return 0
- return 1
-
- def _same_exception_value(self, other_exc_value):
- if self.exception_value == other_exc_value:
- return 1
- if self.exception_check != '+':
- return 0
- if not self.exception_value or not other_exc_value:
- return 0
- if self.exception_value.type != other_exc_value.type:
- return 0
- if self.exception_value.entry and other_exc_value.entry:
- if self.exception_value.entry.cname != other_exc_value.entry.cname:
- return 0
- if self.exception_value.name != other_exc_value.name:
- return 0
+ return 0
return 1
+ def _same_exception_value(self, other_exc_value):
+ if self.exception_value == other_exc_value:
+ return 1
+ if self.exception_check != '+':
+ return 0
+ if not self.exception_value or not other_exc_value:
+ return 0
+ if self.exception_value.type != other_exc_value.type:
+ return 0
+ if self.exception_value.entry and other_exc_value.entry:
+ if self.exception_value.entry.cname != other_exc_value.entry.cname:
+ return 0
+ if self.exception_value.name != other_exc_value.name:
+ return 0
+ return 1
+
def compatible_signature_with(self, other_type, as_cmethod = 0):
return self.compatible_signature_with_resolved_type(other_type.resolve(), as_cmethod)
@@ -2803,7 +2803,7 @@ class CFuncType(CType):
if self.nogil != other_type.nogil:
return 0
if not self._is_exception_compatible_with(other_type):
- return 0
+ return 0
self.original_sig = other_type.original_sig or other_type
return 1
@@ -2844,11 +2844,11 @@ class CFuncType(CType):
return 0
if not self.return_type.subtype_of_resolved_type(other_type.return_type):
return 0
- if not self.exception_check and other_type.exception_check:
- # a redundant exception check doesn't make functions incompatible, but a missing one does
- return 0
- if not self._same_exception_value(other_type.exception_value):
- return 0
+ if not self.exception_check and other_type.exception_check:
+ # a redundant exception check doesn't make functions incompatible, but a missing one does
+ return 0
+ if not self._same_exception_value(other_type.exception_value):
+ return 0
return 1
def same_calling_convention_as(self, other):
@@ -2902,9 +2902,9 @@ class CFuncType(CType):
trailer = " except %s" % self.exception_value
elif self.exception_check == '+':
trailer = " except +"
- elif self.exception_check and for_display:
- # not spelled out by default, unless for human eyes
- trailer = " except *"
+ elif self.exception_check and for_display:
+ # not spelled out by default, unless for human eyes
+ trailer = " except *"
if self.nogil:
trailer += " nogil"
if not with_calling_convention:
@@ -2929,7 +2929,7 @@ class CFuncType(CType):
func_name, arg_code, trailer)
def signature_string(self):
- s = self.empty_declaration_code()
+ s = self.empty_declaration_code()
return s
def signature_cast_string(self):
@@ -3029,86 +3029,86 @@ class CFuncType(CType):
assert not self.is_fused
specialize_entry(entry, cname)
- def can_coerce_to_pyobject(self, env):
- # duplicating the decisions from create_to_py_utility_code() here avoids writing out unused code
- if self.has_varargs or self.optional_arg_count:
- return False
- if self.to_py_function is not None:
- return self.to_py_function
- for arg in self.args:
- if not arg.type.is_pyobject and not arg.type.can_coerce_to_pyobject(env):
- return False
- if not self.return_type.is_pyobject and not self.return_type.can_coerce_to_pyobject(env):
- return False
- return True
-
- def create_to_py_utility_code(self, env):
- # FIXME: it seems we're trying to coerce in more cases than we should
- if self.to_py_function is not None:
- return self.to_py_function
- if not self.can_coerce_to_pyobject(env):
- return False
- from .UtilityCode import CythonUtilityCode
- safe_typename = re.sub('[^a-zA-Z0-9]', '__', self.declaration_code("", pyrex=1))
- to_py_function = "__Pyx_CFunc_%s_to_py" % safe_typename
-
- for arg in self.args:
- if not arg.type.is_pyobject and not arg.type.create_from_py_utility_code(env):
- return False
- if not self.return_type.is_pyobject and not self.return_type.create_to_py_utility_code(env):
- return False
-
- def declared_type(ctype):
- type_displayname = str(ctype.declaration_code("", for_display=True))
- if ctype.is_pyobject:
- arg_ctype = type_name = type_displayname
- if ctype.is_builtin_type:
- arg_ctype = ctype.name
- elif not ctype.is_extension_type:
- type_name = 'object'
- type_displayname = None
- else:
- type_displayname = repr(type_displayname)
- elif ctype is c_bint_type:
- type_name = arg_ctype = 'bint'
- else:
- type_name = arg_ctype = type_displayname
- if ctype is c_double_type:
- type_displayname = 'float'
- else:
- type_displayname = repr(type_displayname)
- return type_name, arg_ctype, type_displayname
-
- class Arg(object):
- def __init__(self, arg_name, arg_type):
- self.name = arg_name
- self.type = arg_type
- self.type_cname, self.ctype, self.type_displayname = declared_type(arg_type)
-
- if self.return_type.is_void:
- except_clause = 'except *'
- elif self.return_type.is_pyobject:
- except_clause = ''
- elif self.exception_value:
- except_clause = ('except? %s' if self.exception_check else 'except %s') % self.exception_value
- else:
- except_clause = 'except *'
-
- context = {
- 'cname': to_py_function,
- 'args': [Arg(arg.name or 'arg%s' % ix, arg.type) for ix, arg in enumerate(self.args)],
- 'return_type': Arg('return', self.return_type),
- 'except_clause': except_clause,
- }
- # FIXME: directives come from first defining environment and do not adapt for reuse
- env.use_utility_code(CythonUtilityCode.load(
- "cfunc.to_py", "CConvert.pyx",
- outer_module_scope=env.global_scope(), # need access to types declared in module
- context=context, compiler_directives=dict(env.global_scope().directives)))
- self.to_py_function = to_py_function
- return True
-
-
+ def can_coerce_to_pyobject(self, env):
+ # duplicating the decisions from create_to_py_utility_code() here avoids writing out unused code
+ if self.has_varargs or self.optional_arg_count:
+ return False
+ if self.to_py_function is not None:
+ return self.to_py_function
+ for arg in self.args:
+ if not arg.type.is_pyobject and not arg.type.can_coerce_to_pyobject(env):
+ return False
+ if not self.return_type.is_pyobject and not self.return_type.can_coerce_to_pyobject(env):
+ return False
+ return True
+
+ def create_to_py_utility_code(self, env):
+ # FIXME: it seems we're trying to coerce in more cases than we should
+ if self.to_py_function is not None:
+ return self.to_py_function
+ if not self.can_coerce_to_pyobject(env):
+ return False
+ from .UtilityCode import CythonUtilityCode
+ safe_typename = re.sub('[^a-zA-Z0-9]', '__', self.declaration_code("", pyrex=1))
+ to_py_function = "__Pyx_CFunc_%s_to_py" % safe_typename
+
+ for arg in self.args:
+ if not arg.type.is_pyobject and not arg.type.create_from_py_utility_code(env):
+ return False
+ if not self.return_type.is_pyobject and not self.return_type.create_to_py_utility_code(env):
+ return False
+
+ def declared_type(ctype):
+ type_displayname = str(ctype.declaration_code("", for_display=True))
+ if ctype.is_pyobject:
+ arg_ctype = type_name = type_displayname
+ if ctype.is_builtin_type:
+ arg_ctype = ctype.name
+ elif not ctype.is_extension_type:
+ type_name = 'object'
+ type_displayname = None
+ else:
+ type_displayname = repr(type_displayname)
+ elif ctype is c_bint_type:
+ type_name = arg_ctype = 'bint'
+ else:
+ type_name = arg_ctype = type_displayname
+ if ctype is c_double_type:
+ type_displayname = 'float'
+ else:
+ type_displayname = repr(type_displayname)
+ return type_name, arg_ctype, type_displayname
+
+ class Arg(object):
+ def __init__(self, arg_name, arg_type):
+ self.name = arg_name
+ self.type = arg_type
+ self.type_cname, self.ctype, self.type_displayname = declared_type(arg_type)
+
+ if self.return_type.is_void:
+ except_clause = 'except *'
+ elif self.return_type.is_pyobject:
+ except_clause = ''
+ elif self.exception_value:
+ except_clause = ('except? %s' if self.exception_check else 'except %s') % self.exception_value
+ else:
+ except_clause = 'except *'
+
+ context = {
+ 'cname': to_py_function,
+ 'args': [Arg(arg.name or 'arg%s' % ix, arg.type) for ix, arg in enumerate(self.args)],
+ 'return_type': Arg('return', self.return_type),
+ 'except_clause': except_clause,
+ }
+ # FIXME: directives come from first defining environment and do not adapt for reuse
+ env.use_utility_code(CythonUtilityCode.load(
+ "cfunc.to_py", "CConvert.pyx",
+ outer_module_scope=env.global_scope(), # need access to types declared in module
+ context=context, compiler_directives=dict(env.global_scope().directives)))
+ self.to_py_function = to_py_function
+ return True
+
+
def specialize_entry(entry, cname):
"""
Specialize an entry of a copied fused function or method
@@ -3195,15 +3195,15 @@ def specialization_signature_string(fused_compound_type, fused_to_specific):
return fused_type.specialize(fused_to_specific).typeof_name()
-
+
def get_specialized_types(type):
"""
- Return a list of specialized types in their declared order.
+ Return a list of specialized types in their declared order.
"""
assert type.is_fused
if isinstance(type, FusedType):
- result = list(type.types)
+ result = list(type.types)
for specialized_type in result:
specialized_type.specialization_string = specialized_type.typeof_name()
else:
@@ -3214,7 +3214,7 @@ def get_specialized_types(type):
specialization_signature_string(type, f2s))
result.append(specialized_type)
- return result
+ return result
class CFuncTypeArg(BaseType):
@@ -3258,12 +3258,12 @@ class ToPyStructUtilityCode(object):
requires = None
- def __init__(self, type, forward_decl, env):
+ def __init__(self, type, forward_decl, env):
self.type = type
self.header = "static PyObject* %s(%s)" % (type.to_py_function,
type.declaration_code('s'))
self.forward_decl = forward_decl
- self.env = env
+ self.env = env
def __eq__(self, other):
return isinstance(other, ToPyStructUtilityCode) and self.header == other.header
@@ -3271,7 +3271,7 @@ class ToPyStructUtilityCode(object):
def __hash__(self):
return hash(self.header)
- def get_tree(self, **kwargs):
+ def get_tree(self, **kwargs):
pass
def put_code(self, output):
@@ -3285,9 +3285,9 @@ class ToPyStructUtilityCode(object):
len(self.type.scope.var_entries))
for member in self.type.scope.var_entries:
nameconst_cname = code.get_py_string_const(member.name, identifier=True)
- code.putln("%s; if (unlikely(!member)) goto bad;" % (
- member.type.to_py_call_code('s.%s' % member.cname, 'member', member.type)))
- code.putln("if (unlikely(PyDict_SetItem(res, %s, member) < 0)) goto bad;" % nameconst_cname)
+ code.putln("%s; if (unlikely(!member)) goto bad;" % (
+ member.type.to_py_call_code('s.%s' % member.cname, 'member', member.type)))
+ code.putln("if (unlikely(PyDict_SetItem(res, %s, member) < 0)) goto bad;" % nameconst_cname)
code.putln("Py_DECREF(member);")
code.putln("return res;")
code.putln("bad:")
@@ -3299,7 +3299,7 @@ class ToPyStructUtilityCode(object):
# This is a bit of a hack, we need a forward declaration
# due to the way things are ordered in the module...
if self.forward_decl:
- proto.putln(self.type.empty_declaration_code() + ';')
+ proto.putln(self.type.empty_declaration_code() + ';')
proto.putln(self.header + ";")
def inject_tree_and_scope_into(self, module_node):
@@ -3327,10 +3327,10 @@ class CStructOrUnionType(CType):
self.scope = scope
self.typedef_flag = typedef_flag
self.is_struct = kind == 'struct'
- self.to_py_function = "%s_to_py_%s" % (
- Naming.convert_func_prefix, self.specialization_name())
- self.from_py_function = "%s_from_py_%s" % (
- Naming.convert_func_prefix, self.specialization_name())
+ self.to_py_function = "%s_to_py_%s" % (
+ Naming.convert_func_prefix, self.specialization_name())
+ self.from_py_function = "%s_from_py_%s" % (
+ Naming.convert_func_prefix, self.specialization_name())
self.exception_check = True
self._convert_to_py_code = None
self._convert_from_py_code = None
@@ -3344,27 +3344,27 @@ class CStructOrUnionType(CType):
return False
if self._convert_to_py_code is None:
- is_union = not self.is_struct
- unsafe_union_types = set()
- safe_union_types = set()
+ is_union = not self.is_struct
+ unsafe_union_types = set()
+ safe_union_types = set()
for member in self.scope.var_entries:
- member_type = member.type
+ member_type = member.type
if not member_type.can_coerce_to_pyobject(env):
self.to_py_function = None
self._convert_to_py_code = False
return False
- if is_union:
- if member_type.is_ptr or member_type.is_cpp_class:
- unsafe_union_types.add(member_type)
- else:
- safe_union_types.add(member_type)
-
- if unsafe_union_types and (safe_union_types or len(unsafe_union_types) > 1):
- # unsafe mix of safe and unsafe to convert types
- self.from_py_function = None
- self._convert_from_py_code = False
- return False
-
+ if is_union:
+ if member_type.is_ptr or member_type.is_cpp_class:
+ unsafe_union_types.add(member_type)
+ else:
+ safe_union_types.add(member_type)
+
+ if unsafe_union_types and (safe_union_types or len(unsafe_union_types) > 1):
+ # unsafe mix of safe and unsafe to convert types
+ self.from_py_function = None
+ self._convert_from_py_code = False
+ return False
+
return True
def create_to_py_utility_code(self, env):
@@ -3374,9 +3374,9 @@ class CStructOrUnionType(CType):
if self._convert_to_py_code is None:
for member in self.scope.var_entries:
member.type.create_to_py_utility_code(env)
- forward_decl = self.entry.visibility != 'extern' and not self.typedef_flag
- self._convert_to_py_code = ToPyStructUtilityCode(self, forward_decl, env)
-
+ forward_decl = self.entry.visibility != 'extern' and not self.typedef_flag
+ self._convert_to_py_code = ToPyStructUtilityCode(self, forward_decl, env)
+
env.use_utility_code(self._convert_to_py_code)
return True
@@ -3412,12 +3412,12 @@ class CStructOrUnionType(CType):
var_entries=self.scope.var_entries,
funcname=self.from_py_function,
)
- from .UtilityCode import CythonUtilityCode
- self._convert_from_py_code = CythonUtilityCode.load(
- "FromPyStructUtility" if self.is_struct else "FromPyUnionUtility",
- "CConvert.pyx",
- outer_module_scope=env.global_scope(), # need access to types declared in module
- context=context)
+ from .UtilityCode import CythonUtilityCode
+ self._convert_from_py_code = CythonUtilityCode.load(
+ "FromPyStructUtility" if self.is_struct else "FromPyUnionUtility",
+ "CConvert.pyx",
+ outer_module_scope=env.global_scope(), # need access to types declared in module
+ context=context)
env.use_utility_code(self._convert_from_py_code)
return True
@@ -3469,8 +3469,8 @@ class CStructOrUnionType(CType):
if len(fields) != 2: return False
a, b = fields
return (a.type.is_float and b.type.is_float and
- a.type.empty_declaration_code() ==
- b.type.empty_declaration_code())
+ a.type.empty_declaration_code() ==
+ b.type.empty_declaration_code())
def struct_nesting_depth(self):
child_depths = [x.type.struct_nesting_depth()
@@ -3484,22 +3484,22 @@ class CStructOrUnionType(CType):
cpp_string_conversions = ("std::string", "TString", "TStringBuf")
-builtin_cpp_conversions = {
- # type element template params
- "std::pair": 2,
- "std::vector": 1,
- "std::list": 1,
- "std::set": 1,
- "std::unordered_set": 1,
- "std::map": 2,
- "std::unordered_map": 2,
- "std::complex": 1,
- # arcadia_cpp_conversions
- "TMaybe": 1,
+builtin_cpp_conversions = {
+ # type element template params
+ "std::pair": 2,
+ "std::vector": 1,
+ "std::list": 1,
+ "std::set": 1,
+ "std::unordered_set": 1,
+ "std::map": 2,
+ "std::unordered_map": 2,
+ "std::complex": 1,
+ # arcadia_cpp_conversions
+ "TMaybe": 1,
"TVector": 1,
"THashMap": 2,
"TMap": 2,
-}
+}
class CppClassType(CType):
# name string
@@ -3519,7 +3519,7 @@ class CppClassType(CType):
subtypes = ['templates']
- def __init__(self, name, scope, cname, base_classes, templates=None, template_type=None):
+ def __init__(self, name, scope, cname, base_classes, templates=None, template_type=None):
self.name = name
self.cname = cname
self.scope = scope
@@ -3527,11 +3527,11 @@ class CppClassType(CType):
self.operators = []
self.templates = templates
self.template_type = template_type
- self.num_optional_templates = sum(is_optional_template_param(T) for T in templates or ())
- if templates and False: # https://github.com/cython/cython/issues/1868
- self.specializations = {tuple(zip(templates, templates)): self}
- else:
- self.specializations = {}
+ self.num_optional_templates = sum(is_optional_template_param(T) for T in templates or ())
+ if templates and False: # https://github.com/cython/cython/issues/1868
+ self.specializations = {tuple(zip(templates, templates)): self}
+ else:
+ self.specializations = {}
self.is_cpp_string = cname in cpp_string_conversions
def use_conversion_utility(self, from_or_to):
@@ -3559,13 +3559,13 @@ class CppClassType(CType):
def create_from_py_utility_code(self, env):
if self.from_py_function is not None:
return True
- if self.cname in builtin_cpp_conversions or self.cname in cpp_string_conversions:
+ if self.cname in builtin_cpp_conversions or self.cname in cpp_string_conversions:
X = "XYZABC"
tags = []
context = {}
for ix, T in enumerate(self.templates or []):
- if ix >= builtin_cpp_conversions[self.cname]:
- break
+ if ix >= builtin_cpp_conversions[self.cname]:
+ break
if T.is_pyobject or not T.create_from_py_utility_code(env):
return False
tags.append(T.specialization_name())
@@ -3573,19 +3573,19 @@ class CppClassType(CType):
if self.cname in cpp_string_conversions:
cls = 'string'
- tags = type_identifier(self),
+ tags = type_identifier(self),
elif self.cname.startswith('std::'):
cls = self.cname[5:]
else:
cls = 'arcadia_' + self.cname
- cname = '__pyx_convert_%s_from_py_%s' % (cls, '__and_'.join(tags))
+ cname = '__pyx_convert_%s_from_py_%s' % (cls, '__and_'.join(tags))
context.update({
'cname': cname,
'maybe_unordered': self.maybe_unordered(),
'type': self.cname,
})
from .UtilityCode import CythonUtilityCode
- env.use_utility_code(CythonUtilityCode.load(
+ env.use_utility_code(CythonUtilityCode.load(
cls.replace('unordered_', '') + ".from_py", "CppConvert.pyx",
context=context, compiler_directives=env.directives))
self.from_py_function = cname
@@ -3603,13 +3603,13 @@ class CppClassType(CType):
def create_to_py_utility_code(self, env):
if self.to_py_function is not None:
return True
- if self.cname in builtin_cpp_conversions or self.cname in cpp_string_conversions:
+ if self.cname in builtin_cpp_conversions or self.cname in cpp_string_conversions:
X = "XYZABC"
tags = []
context = {}
for ix, T in enumerate(self.templates or []):
- if ix >= builtin_cpp_conversions[self.cname]:
- break
+ if ix >= builtin_cpp_conversions[self.cname]:
+ break
if not T.create_to_py_utility_code(env):
return False
tags.append(T.specialization_name())
@@ -3617,60 +3617,60 @@ class CppClassType(CType):
if self.cname in cpp_string_conversions:
cls = 'string'
- prefix = 'PyObject_' # gets specialised by explicit type casts in CoerceToPyTypeNode
- tags = type_identifier(self),
+ prefix = 'PyObject_' # gets specialised by explicit type casts in CoerceToPyTypeNode
+ tags = type_identifier(self),
elif self.cname.startswith('std::'):
cls = self.cname[5:]
- prefix = ''
+ prefix = ''
else:
cls = 'arcadia_' + self.cname
prefix = ''
- cname = "__pyx_convert_%s%s_to_py_%s" % (prefix, cls, "____".join(tags))
+ cname = "__pyx_convert_%s%s_to_py_%s" % (prefix, cls, "____".join(tags))
context.update({
'cname': cname,
'maybe_unordered': self.maybe_unordered(),
'type': self.cname,
})
from .UtilityCode import CythonUtilityCode
- env.use_utility_code(CythonUtilityCode.load(
+ env.use_utility_code(CythonUtilityCode.load(
cls.replace('unordered_', '') + ".to_py", "CppConvert.pyx",
context=context, compiler_directives=env.directives))
self.to_py_function = cname
return True
- def is_template_type(self):
- return self.templates is not None and self.template_type is None
-
- def get_fused_types(self, result=None, seen=None):
- if result is None:
- result = []
- seen = set()
- if self.namespace:
- self.namespace.get_fused_types(result, seen)
- if self.templates:
- for T in self.templates:
- T.get_fused_types(result, seen)
- return result
-
- def specialize_here(self, pos, template_values=None):
- if not self.is_template_type():
+ def is_template_type(self):
+ return self.templates is not None and self.template_type is None
+
+ def get_fused_types(self, result=None, seen=None):
+ if result is None:
+ result = []
+ seen = set()
+ if self.namespace:
+ self.namespace.get_fused_types(result, seen)
+ if self.templates:
+ for T in self.templates:
+ T.get_fused_types(result, seen)
+ return result
+
+ def specialize_here(self, pos, template_values=None):
+ if not self.is_template_type():
error(pos, "'%s' type is not a template" % self)
return error_type
- if len(self.templates) - self.num_optional_templates <= len(template_values) < len(self.templates):
- num_defaults = len(self.templates) - len(template_values)
- partial_specialization = self.declaration_code('', template_params=template_values)
- # Most of the time we don't need to declare anything typed to these
- # default template arguments, but when we do there's no way in C++
- # to reference this directly. However, it is common convention to
- # provide a typedef in the template class that resolves to each
- # template type. For now, allow the user to specify this name as
- # the template parameter.
- # TODO: Allow typedefs in cpp classes and search for it in this
- # classes scope as a concrete name we could use.
- template_values = template_values + [
- TemplatePlaceholderType(
- "%s::%s" % (partial_specialization, param.name), True)
- for param in self.templates[-num_defaults:]]
+ if len(self.templates) - self.num_optional_templates <= len(template_values) < len(self.templates):
+ num_defaults = len(self.templates) - len(template_values)
+ partial_specialization = self.declaration_code('', template_params=template_values)
+ # Most of the time we don't need to declare anything typed to these
+ # default template arguments, but when we do there's no way in C++
+ # to reference this directly. However, it is common convention to
+ # provide a typedef in the template class that resolves to each
+ # template type. For now, allow the user to specify this name as
+ # the template parameter.
+ # TODO: Allow typedefs in cpp classes and search for it in this
+ # classes scope as a concrete name we could use.
+ template_values = template_values + [
+ TemplatePlaceholderType(
+ "%s::%s" % (partial_specialization, param.name), True)
+ for param in self.templates[-num_defaults:]]
if len(self.templates) != len(template_values):
error(pos, "%s templated type receives %d arguments, got %d" %
(self.name, len(self.templates), len(template_values)))
@@ -3701,20 +3701,20 @@ class CppClassType(CType):
specialized.base_classes = [b.specialize(values) for b in self.base_classes]
if self.namespace is not None:
specialized.namespace = self.namespace.specialize(values)
- specialized.scope = self.scope.specialize(values, specialized)
- if self.cname == 'std::vector':
- # vector<bool> is special cased in the C++ standard, and its
- # accessors do not necessarily return references to the underlying
- # elements (which may be bit-packed).
- # http://www.cplusplus.com/reference/vector/vector-bool/
- # Here we pretend that the various methods return bool values
- # (as the actual returned values are coercable to such, and
- # we don't support call expressions as lvalues).
- T = values.get(self.templates[0], None)
- if T and not T.is_fused and T.empty_declaration_code() == 'bool':
- for bit_ref_returner in ('at', 'back', 'front'):
- if bit_ref_returner in specialized.scope.entries:
- specialized.scope.entries[bit_ref_returner].type.return_type = T
+ specialized.scope = self.scope.specialize(values, specialized)
+ if self.cname == 'std::vector':
+ # vector<bool> is special cased in the C++ standard, and its
+ # accessors do not necessarily return references to the underlying
+ # elements (which may be bit-packed).
+ # http://www.cplusplus.com/reference/vector/vector-bool/
+ # Here we pretend that the various methods return bool values
+ # (as the actual returned values are coercable to such, and
+ # we don't support call expressions as lvalues).
+ T = values.get(self.templates[0], None)
+ if T and not T.is_fused and T.empty_declaration_code() == 'bool':
+ for bit_ref_returner in ('at', 'back', 'front'):
+ if bit_ref_returner in specialized.scope.entries:
+ specialized.scope.entries[bit_ref_returner].type.return_type = T
return specialized
def deduce_template_params(self, actual):
@@ -3724,16 +3724,16 @@ class CppClassType(CType):
actual = actual.ref_base_type
if self == actual:
return {}
- elif actual.is_cpp_class:
+ elif actual.is_cpp_class:
self_template_type = self
while getattr(self_template_type, 'template_type', None):
self_template_type = self_template_type.template_type
- def all_bases(cls):
- yield cls
- for parent in cls.base_classes:
- for base in all_bases(parent):
- yield base
- for actual_base in all_bases(actual):
+ def all_bases(cls):
+ yield cls
+ for parent in cls.base_classes:
+ for base in all_bases(parent):
+ yield base
+ for actual_base in all_bases(actual):
template_type = actual_base
while getattr(template_type, 'template_type', None):
template_type = template_type.template_type
@@ -3746,17 +3746,17 @@ class CppClassType(CType):
in zip(self.templates, actual_base.templates)],
{})
else:
- return {}
+ return {}
def declaration_code(self, entity_code,
- for_display = 0, dll_linkage = None, pyrex = 0,
- template_params = None):
- if template_params is None:
- template_params = self.templates
+ for_display = 0, dll_linkage = None, pyrex = 0,
+ template_params = None):
+ if template_params is None:
+ template_params = self.templates
if self.templates:
template_strings = [param.declaration_code('', for_display, None, pyrex)
- for param in template_params
- if not is_optional_template_param(param) and not param.is_fused]
+ for param in template_params
+ if not is_optional_template_param(param) and not param.is_fused]
if for_display:
brackets = "[%s]"
else:
@@ -3769,7 +3769,7 @@ class CppClassType(CType):
else:
base_code = "%s%s" % (self.cname, templates)
if self.namespace is not None:
- base_code = "%s::%s" % (self.namespace.empty_declaration_code(), base_code)
+ base_code = "%s::%s" % (self.namespace.empty_declaration_code(), base_code)
base_code = public_decl(base_code, dll_linkage)
return self.base_declaration_code(base_code, entity_code)
@@ -3801,7 +3801,7 @@ class CppClassType(CType):
if self.templates == other_type.templates:
return 1
for t1, t2 in zip(self.templates, other_type.templates):
- if is_optional_template_param(t1) and is_optional_template_param(t2):
+ if is_optional_template_param(t1) and is_optional_template_param(t2):
break
if not t1.same_as_resolved_type(t2):
return 0
@@ -3858,9 +3858,9 @@ class CppClassType(CType):
class TemplatePlaceholderType(CType):
- def __init__(self, name, optional=False):
+ def __init__(self, name, optional=False):
self.name = name
- self.optional = optional
+ self.optional = optional
def declaration_code(self, entity_code,
for_display = 0, dll_linkage = None, pyrex = 0):
@@ -3899,27 +3899,27 @@ class TemplatePlaceholderType(CType):
else:
return False
-def is_optional_template_param(type):
- return isinstance(type, TemplatePlaceholderType) and type.optional
-
-
+def is_optional_template_param(type):
+ return isinstance(type, TemplatePlaceholderType) and type.optional
+
+
class CEnumType(CIntLike, CType):
# name string
# cname string or None
# typedef_flag boolean
- # values [string], populated during declaration analysis
+ # values [string], populated during declaration analysis
is_enum = 1
signed = 1
rank = -1 # Ranks below any integer type
- def __init__(self, name, cname, typedef_flag, namespace=None):
+ def __init__(self, name, cname, typedef_flag, namespace=None):
self.name = name
self.cname = cname
self.values = []
self.typedef_flag = typedef_flag
- self.namespace = namespace
- self.default_value = "(%s) 0" % self.empty_declaration_code()
+ self.namespace = namespace
+ self.default_value = "(%s) 0" % self.empty_declaration_code()
def __str__(self):
return self.name
@@ -3933,127 +3933,127 @@ class CEnumType(CIntLike, CType):
if pyrex or for_display:
base_code = self.name
else:
- if self.namespace:
- base_code = "%s::%s" % (
- self.namespace.empty_declaration_code(), self.cname)
- elif self.typedef_flag:
+ if self.namespace:
+ base_code = "%s::%s" % (
+ self.namespace.empty_declaration_code(), self.cname)
+ elif self.typedef_flag:
base_code = self.cname
else:
base_code = "enum %s" % self.cname
base_code = public_decl(base_code, dll_linkage)
return self.base_declaration_code(base_code, entity_code)
- def specialize(self, values):
- if self.namespace:
- namespace = self.namespace.specialize(values)
- if namespace != self.namespace:
- return CEnumType(
- self.name, self.cname, self.typedef_flag, namespace)
- return self
-
- def create_type_wrapper(self, env):
- from .UtilityCode import CythonUtilityCode
- env.use_utility_code(CythonUtilityCode.load(
- "EnumType", "CpdefEnums.pyx",
- context={"name": self.name,
- "items": tuple(self.values)},
- outer_module_scope=env.global_scope()))
-
-
-class CTupleType(CType):
- # components [PyrexType]
-
- is_ctuple = True
-
- def __init__(self, cname, components):
- self.cname = cname
- self.components = components
- self.size = len(components)
- self.to_py_function = "%s_to_py_%s" % (Naming.convert_func_prefix, self.cname)
- self.from_py_function = "%s_from_py_%s" % (Naming.convert_func_prefix, self.cname)
- self.exception_check = True
- self._convert_to_py_code = None
- self._convert_from_py_code = None
-
- def __str__(self):
- return "(%s)" % ", ".join(str(c) for c in self.components)
-
- def declaration_code(self, entity_code,
- for_display = 0, dll_linkage = None, pyrex = 0):
- if pyrex or for_display:
- return str(self)
- else:
- return self.base_declaration_code(self.cname, entity_code)
-
- def can_coerce_to_pyobject(self, env):
- for component in self.components:
- if not component.can_coerce_to_pyobject(env):
- return False
- return True
-
+ def specialize(self, values):
+ if self.namespace:
+ namespace = self.namespace.specialize(values)
+ if namespace != self.namespace:
+ return CEnumType(
+ self.name, self.cname, self.typedef_flag, namespace)
+ return self
+
+ def create_type_wrapper(self, env):
+ from .UtilityCode import CythonUtilityCode
+ env.use_utility_code(CythonUtilityCode.load(
+ "EnumType", "CpdefEnums.pyx",
+ context={"name": self.name,
+ "items": tuple(self.values)},
+ outer_module_scope=env.global_scope()))
+
+
+class CTupleType(CType):
+ # components [PyrexType]
+
+ is_ctuple = True
+
+ def __init__(self, cname, components):
+ self.cname = cname
+ self.components = components
+ self.size = len(components)
+ self.to_py_function = "%s_to_py_%s" % (Naming.convert_func_prefix, self.cname)
+ self.from_py_function = "%s_from_py_%s" % (Naming.convert_func_prefix, self.cname)
+ self.exception_check = True
+ self._convert_to_py_code = None
+ self._convert_from_py_code = None
+
+ def __str__(self):
+ return "(%s)" % ", ".join(str(c) for c in self.components)
+
+ def declaration_code(self, entity_code,
+ for_display = 0, dll_linkage = None, pyrex = 0):
+ if pyrex or for_display:
+ return str(self)
+ else:
+ return self.base_declaration_code(self.cname, entity_code)
+
+ def can_coerce_to_pyobject(self, env):
+ for component in self.components:
+ if not component.can_coerce_to_pyobject(env):
+ return False
+ return True
+
def can_coerce_from_pyobject(self, env):
for component in self.components:
if not component.can_coerce_from_pyobject(env):
return False
return True
- def create_to_py_utility_code(self, env):
- if self._convert_to_py_code is False:
- return None # tri-state-ish
-
- if self._convert_to_py_code is None:
- for component in self.components:
- if not component.create_to_py_utility_code(env):
- self.to_py_function = None
- self._convert_to_py_code = False
- return False
-
- context = dict(
- struct_type_decl=self.empty_declaration_code(),
- components=self.components,
- funcname=self.to_py_function,
- size=len(self.components)
- )
- self._convert_to_py_code = TempitaUtilityCode.load(
- "ToPyCTupleUtility", "TypeConversion.c", context=context)
-
- env.use_utility_code(self._convert_to_py_code)
- return True
-
- def create_from_py_utility_code(self, env):
- if self._convert_from_py_code is False:
- return None # tri-state-ish
-
- if self._convert_from_py_code is None:
- for component in self.components:
- if not component.create_from_py_utility_code(env):
- self.from_py_function = None
- self._convert_from_py_code = False
- return False
-
- context = dict(
- struct_type_decl=self.empty_declaration_code(),
- components=self.components,
- funcname=self.from_py_function,
- size=len(self.components)
- )
- self._convert_from_py_code = TempitaUtilityCode.load(
- "FromPyCTupleUtility", "TypeConversion.c", context=context)
-
- env.use_utility_code(self._convert_from_py_code)
- return True
-
+ def create_to_py_utility_code(self, env):
+ if self._convert_to_py_code is False:
+ return None # tri-state-ish
+
+ if self._convert_to_py_code is None:
+ for component in self.components:
+ if not component.create_to_py_utility_code(env):
+ self.to_py_function = None
+ self._convert_to_py_code = False
+ return False
+
+ context = dict(
+ struct_type_decl=self.empty_declaration_code(),
+ components=self.components,
+ funcname=self.to_py_function,
+ size=len(self.components)
+ )
+ self._convert_to_py_code = TempitaUtilityCode.load(
+ "ToPyCTupleUtility", "TypeConversion.c", context=context)
+
+ env.use_utility_code(self._convert_to_py_code)
+ return True
+
+ def create_from_py_utility_code(self, env):
+ if self._convert_from_py_code is False:
+ return None # tri-state-ish
+
+ if self._convert_from_py_code is None:
+ for component in self.components:
+ if not component.create_from_py_utility_code(env):
+ self.from_py_function = None
+ self._convert_from_py_code = False
+ return False
+
+ context = dict(
+ struct_type_decl=self.empty_declaration_code(),
+ components=self.components,
+ funcname=self.from_py_function,
+ size=len(self.components)
+ )
+ self._convert_from_py_code = TempitaUtilityCode.load(
+ "FromPyCTupleUtility", "TypeConversion.c", context=context)
+
+ env.use_utility_code(self._convert_from_py_code)
+ return True
+
def cast_code(self, expr_code):
return expr_code
-
-
-def c_tuple_type(components):
- components = tuple(components)
- cname = Naming.ctuple_type_prefix + type_list_identifier(components)
- tuple_type = CTupleType(cname, components)
- return tuple_type
-
-
+
+
+def c_tuple_type(components):
+ components = tuple(components)
+ cname = Naming.ctuple_type_prefix + type_list_identifier(components)
+ tuple_type = CTupleType(cname, components)
+ return tuple_type
+
+
class UnspecifiedType(PyrexType):
# Used as a placeholder until the type can be determined.
@@ -4159,13 +4159,13 @@ c_null_ptr_type = CNullPtrType(c_void_type)
c_void_ptr_type = CPtrType(c_void_type)
c_void_ptr_ptr_type = CPtrType(c_void_ptr_type)
c_char_ptr_type = CPtrType(c_char_type)
-c_const_char_ptr_type = CPtrType(CConstType(c_char_type))
+c_const_char_ptr_type = CPtrType(CConstType(c_char_type))
c_uchar_ptr_type = CPtrType(c_uchar_type)
-c_const_uchar_ptr_type = CPtrType(CConstType(c_uchar_type))
+c_const_uchar_ptr_type = CPtrType(CConstType(c_uchar_type))
c_char_ptr_ptr_type = CPtrType(c_char_ptr_type)
c_int_ptr_type = CPtrType(c_int_type)
c_py_unicode_ptr_type = CPtrType(c_py_unicode_type)
-c_const_py_unicode_ptr_type = CPtrType(CConstType(c_py_unicode_type))
+c_const_py_unicode_ptr_type = CPtrType(CConstType(c_py_unicode_type))
c_py_ssize_t_ptr_type = CPtrType(c_py_ssize_t_type)
c_ssize_t_ptr_type = CPtrType(c_ssize_t_type)
c_size_t_ptr_type = CPtrType(c_size_t_type)
@@ -4270,7 +4270,7 @@ def is_promotion(src_type, dst_type):
return src_type.is_float and src_type.rank <= dst_type.rank
return False
-def best_match(arg_types, functions, pos=None, env=None, args=None):
+def best_match(arg_types, functions, pos=None, env=None, args=None):
"""
Given a list args of arguments and a list of functions, choose one
to call which seems to be the "best" fit for this list of arguments.
@@ -4293,7 +4293,7 @@ def best_match(arg_types, functions, pos=None, env=None, args=None):
is not None, we also generate an error.
"""
# TODO: args should be a list of types, not a list of Nodes.
- actual_nargs = len(arg_types)
+ actual_nargs = len(arg_types)
candidates = []
errors = []
@@ -4338,7 +4338,7 @@ def best_match(arg_types, functions, pos=None, env=None, args=None):
from .Symtab import Entry
specialization = Entry(
name = func.name + "[%s]" % ",".join([str(t) for t in type_list]),
- cname = func.cname + "<%s>" % ",".join([t.empty_declaration_code() for t in type_list]),
+ cname = func.cname + "<%s>" % ",".join([t.empty_declaration_code() for t in type_list]),
type = func_type.specialize(deductions),
pos = func.pos)
candidates.append((specialization, specialization.type))
@@ -4363,13 +4363,13 @@ def best_match(arg_types, functions, pos=None, env=None, args=None):
for index, (func, func_type) in enumerate(candidates):
score = [0,0,0,0,0,0,0]
- for i in range(min(actual_nargs, len(func_type.args))):
- src_type = arg_types[i]
+ for i in range(min(actual_nargs, len(func_type.args))):
+ src_type = arg_types[i]
dst_type = func_type.args[i].type
assignable = dst_type.assignable_from(src_type)
- # Now take care of unprefixed string literals. So when you call a cdef
+ # Now take care of unprefixed string literals. So when you call a cdef
# function that takes a char *, the coercion will mean that the
# type will simply become bytes. We need to do this coercion
# manually for overloaded and fused functions
@@ -4387,13 +4387,13 @@ def best_match(arg_types, functions, pos=None, env=None, args=None):
assignable = dst_type.assignable_from(c_src_type)
if assignable:
src_type = c_src_type
- needed_coercions[func] = (i, dst_type)
+ needed_coercions[func] = (i, dst_type)
if assignable:
if src_type == dst_type or dst_type.same_as(src_type):
- pass # score 0
+ pass # score 0
elif func_type.is_strict_signature:
- break # exact match requested but not found
+ break # exact match requested but not found
elif is_promotion(src_type, dst_type):
score[2] += 1
elif ((src_type.is_int and dst_type.is_int) or
@@ -4412,11 +4412,11 @@ def best_match(arg_types, functions, pos=None, env=None, args=None):
else:
score[0] += 1
else:
- error_mesg = "Invalid conversion from '%s' to '%s'" % (src_type, dst_type)
+ error_mesg = "Invalid conversion from '%s' to '%s'" % (src_type, dst_type)
bad_types.append((func, error_mesg))
break
else:
- possibilities.append((score, index, func)) # so we can sort it
+ possibilities.append((score, index, func)) # so we can sort it
if possibilities:
possibilities.sort()
@@ -4448,7 +4448,7 @@ def merge_template_deductions(a, b):
if a is None or b is None:
return None
all = a
- for param, value in b.items():
+ for param, value in b.items():
if param in all:
if a[param] != b[param]:
return None
@@ -4458,12 +4458,12 @@ def merge_template_deductions(a, b):
def widest_numeric_type(type1, type2):
- """Given two numeric types, return the narrowest type encompassing both of them.
- """
- if type1.is_reference:
- type1 = type1.ref_base_type
- if type2.is_reference:
- type2 = type2.ref_base_type
+ """Given two numeric types, return the narrowest type encompassing both of them.
+ """
+ if type1.is_reference:
+ type1 = type1.ref_base_type
+ if type2.is_reference:
+ type2 = type2.ref_base_type
if type1.is_const:
type1 = type1.const_base_type
if type2.is_const:
@@ -4487,10 +4487,10 @@ def widest_numeric_type(type1, type2):
widest_type = type1
elif type1.signed < type2.signed:
widest_type = type1
- elif type1.signed > type2.signed:
- widest_type = type2
- elif type1.is_typedef > type2.is_typedef:
- widest_type = type1
+ elif type1.signed > type2.signed:
+ widest_type = type2
+ elif type1.is_typedef > type2.is_typedef:
+ widest_type = type1
else:
widest_type = type2
return widest_type
@@ -4508,11 +4508,11 @@ def independent_spanning_type(type1, type2):
# whereas "x = True or 2" must evaluate to a type that can hold
# both a boolean value and an integer, so this function works
# better.
- if type1.is_reference ^ type2.is_reference:
- if type1.is_reference:
- type1 = type1.ref_base_type
- else:
- type2 = type2.ref_base_type
+ if type1.is_reference ^ type2.is_reference:
+ if type1.is_reference:
+ type1 = type1.ref_base_type
+ else:
+ type2 = type2.ref_base_type
if type1 == type2:
return type1
elif (type1 is c_bint_type or type2 is c_bint_type) and (type1.is_numeric and type2.is_numeric):
@@ -4565,10 +4565,10 @@ def _spanning_type(type1, type2):
return py_object_type
return type2
elif type1.is_ptr and type2.is_ptr:
- if type1.base_type.is_cpp_class and type2.base_type.is_cpp_class:
- common_base = widest_cpp_type(type1.base_type, type2.base_type)
- if common_base:
- return CPtrType(common_base)
+ if type1.base_type.is_cpp_class and type2.base_type.is_cpp_class:
+ common_base = widest_cpp_type(type1.base_type, type2.base_type)
+ if common_base:
+ return CPtrType(common_base)
# incompatible pointers, void* will do as a result
return c_void_ptr_type
else:
@@ -4586,24 +4586,24 @@ def widest_extension_type(type1, type2):
if type1 is None or type2 is None:
return py_object_type
-def widest_cpp_type(type1, type2):
- @cached_function
- def bases(type):
- all = set()
- for base in type.base_classes:
- all.add(base)
- all.update(bases(base))
- return all
- common_bases = bases(type1).intersection(bases(type2))
- common_bases_bases = reduce(set.union, [bases(b) for b in common_bases], set())
- candidates = [b for b in common_bases if b not in common_bases_bases]
- if len(candidates) == 1:
- return candidates[0]
- else:
- # Fall back to void* for now.
- return None
-
-
+def widest_cpp_type(type1, type2):
+ @cached_function
+ def bases(type):
+ all = set()
+ for base in type.base_classes:
+ all.add(base)
+ all.update(bases(base))
+ return all
+ common_bases = bases(type1).intersection(bases(type2))
+ common_bases_bases = reduce(set.union, [bases(b) for b in common_bases], set())
+ candidates = [b for b in common_bases if b not in common_bases_bases]
+ if len(candidates) == 1:
+ return candidates[0]
+ else:
+ # Fall back to void* for now.
+ return None
+
+
def simple_c_type(signed, longness, name):
# Find type descriptor for simple type given name and modifiers.
# Returns None if arguments don't make sense.
@@ -4668,8 +4668,8 @@ def c_ptr_type(base_type):
# Construct a C pointer type.
if base_type is error_type:
return error_type
- elif base_type.is_reference:
- return CPtrType(base_type.ref_base_type)
+ elif base_type.is_reference:
+ return CPtrType(base_type.ref_base_type)
else:
return CPtrType(base_type)
@@ -4707,38 +4707,38 @@ def typecast(to_type, from_type, expr_code):
else:
#print "typecast: to", to_type, "from", from_type ###
return to_type.cast_code(expr_code)
-
-def type_list_identifier(types):
- return cap_length('__and_'.join(type_identifier(type) for type in types))
-
-_type_identifier_cache = {}
-def type_identifier(type):
- decl = type.empty_declaration_code()
- safe = _type_identifier_cache.get(decl)
- if safe is None:
- safe = decl
- safe = re.sub(' +', ' ', safe)
- safe = re.sub(' ([^a-zA-Z0-9_])', r'\1', safe)
- safe = re.sub('([^a-zA-Z0-9_]) ', r'\1', safe)
- safe = (safe.replace('__', '__dunder')
- .replace('const ', '__const_')
- .replace(' ', '__space_')
- .replace('*', '__ptr')
- .replace('&', '__ref')
- .replace('[', '__lArr')
- .replace(']', '__rArr')
- .replace('<', '__lAng')
- .replace('>', '__rAng')
- .replace('(', '__lParen')
- .replace(')', '__rParen')
- .replace(',', '__comma_')
- .replace('::', '__in_'))
- safe = cap_length(re.sub('[^a-zA-Z0-9_]', lambda x: '__%X' % ord(x.group(0)), safe))
- _type_identifier_cache[decl] = safe
- return safe
-
-def cap_length(s, max_prefix=63, max_len=1024):
- if len(s) <= max_prefix:
- return s
+
+def type_list_identifier(types):
+ return cap_length('__and_'.join(type_identifier(type) for type in types))
+
+_type_identifier_cache = {}
+def type_identifier(type):
+ decl = type.empty_declaration_code()
+ safe = _type_identifier_cache.get(decl)
+ if safe is None:
+ safe = decl
+ safe = re.sub(' +', ' ', safe)
+ safe = re.sub(' ([^a-zA-Z0-9_])', r'\1', safe)
+ safe = re.sub('([^a-zA-Z0-9_]) ', r'\1', safe)
+ safe = (safe.replace('__', '__dunder')
+ .replace('const ', '__const_')
+ .replace(' ', '__space_')
+ .replace('*', '__ptr')
+ .replace('&', '__ref')
+ .replace('[', '__lArr')
+ .replace(']', '__rArr')
+ .replace('<', '__lAng')
+ .replace('>', '__rAng')
+ .replace('(', '__lParen')
+ .replace(')', '__rParen')
+ .replace(',', '__comma_')
+ .replace('::', '__in_'))
+ safe = cap_length(re.sub('[^a-zA-Z0-9_]', lambda x: '__%X' % ord(x.group(0)), safe))
+ _type_identifier_cache[decl] = safe
+ return safe
+
+def cap_length(s, max_prefix=63, max_len=1024):
+ if len(s) <= max_prefix:
+ return s
hash_prefix = hashlib.sha256(s.encode('ascii')).hexdigest()[:6]
return '%s__%s__etc' % (hash_prefix, s[:max_len-17])
diff --git a/contrib/tools/cython/Cython/Compiler/Pythran.py b/contrib/tools/cython/Cython/Compiler/Pythran.py
index c02704a918..8828c90c80 100644
--- a/contrib/tools/cython/Cython/Compiler/Pythran.py
+++ b/contrib/tools/cython/Cython/Compiler/Pythran.py
@@ -6,28 +6,28 @@ from .PyrexTypes import CType, CTypedefType, CStructOrUnionType
import cython
-try:
- import pythran
- pythran_is_pre_0_9 = tuple(map(int, pythran.__version__.split('.')[0:2])) < (0, 9)
+try:
+ import pythran
+ pythran_is_pre_0_9 = tuple(map(int, pythran.__version__.split('.')[0:2])) < (0, 9)
pythran_is_pre_0_9_6 = tuple(map(int, pythran.__version__.split('.')[0:3])) < (0, 9, 6)
-except ImportError:
- pythran = None
- pythran_is_pre_0_9 = True
+except ImportError:
+ pythran = None
+ pythran_is_pre_0_9 = True
pythran_is_pre_0_9_6 = True
if pythran_is_pre_0_9_6:
pythran_builtins = '__builtin__'
else:
pythran_builtins = 'builtins'
-
+
# Pythran/Numpy specific operations
def has_np_pythran(env):
- if env is None:
- return False
- directives = getattr(env, 'directives', None)
- return (directives and directives.get('np_pythran', False))
+ if env is None:
+ return False
+ directives = getattr(env, 'directives', None)
+ return (directives and directives.get('np_pythran', False))
@cython.ccall
def is_pythran_supported_dtype(type_):
@@ -47,10 +47,10 @@ def pythran_type(Ty, ptype="ndarray"):
ctype = dtype.typedef_cname
else:
raise ValueError("unsupported type %s!" % dtype)
- if pythran_is_pre_0_9:
- return "pythonic::types::%s<%s,%d>" % (ptype,ctype, ndim)
- else:
- return "pythonic::types::%s<%s,pythonic::types::pshape<%s>>" % (ptype,ctype, ",".join(("long",)*ndim))
+ if pythran_is_pre_0_9:
+ return "pythonic::types::%s<%s,%d>" % (ptype,ctype, ndim)
+ else:
+ return "pythonic::types::%s<%s,pythonic::types::pshape<%s>>" % (ptype,ctype, ",".join(("long",)*ndim))
if Ty.is_pythran_expr:
return Ty.pythran_type
#if Ty.is_none:
@@ -66,12 +66,12 @@ def type_remove_ref(ty):
def pythran_binop_type(op, tA, tB):
- if op == '**':
- return 'decltype(pythonic::numpy::functor::power{}(std::declval<%s>(), std::declval<%s>()))' % (
- pythran_type(tA), pythran_type(tB))
- else:
- return "decltype(std::declval<%s>() %s std::declval<%s>())" % (
- pythran_type(tA), op, pythran_type(tB))
+ if op == '**':
+ return 'decltype(pythonic::numpy::functor::power{}(std::declval<%s>(), std::declval<%s>()))' % (
+ pythran_type(tA), pythran_type(tB))
+ else:
+ return "decltype(std::declval<%s>() %s std::declval<%s>())" % (
+ pythran_type(tA), op, pythran_type(tB))
def pythran_unaryop_type(op, type_):
@@ -88,7 +88,7 @@ def _index_access(index_code, indices):
def _index_type_code(index_with_type):
idx, index_type = index_with_type
if idx.is_slice:
- n = 2 + int(not idx.step.is_none)
+ n = 2 + int(not idx.step.is_none)
return "pythonic::%s::functor::slice{}(%s)" % (
pythran_builtins,
",".join(["0"]*n))
@@ -126,32 +126,32 @@ def pythran_indexing_type(type_, indices):
def pythran_indexing_code(indices):
return _index_access(_index_code, indices)
-def np_func_to_list(func):
- if not func.is_numpy_attribute:
- return []
- return np_func_to_list(func.obj) + [func.attribute]
-
-if pythran is None:
- def pythran_is_numpy_func_supported(name):
- return False
-else:
- def pythran_is_numpy_func_supported(func):
- CurF = pythran.tables.MODULES['numpy']
- FL = np_func_to_list(func)
- for F in FL:
- CurF = CurF.get(F, None)
- if CurF is None:
- return False
- return True
-
-def pythran_functor(func):
- func = np_func_to_list(func)
- submodules = "::".join(func[:-1] + ["functor"])
- return "pythonic::numpy::%s::%s" % (submodules, func[-1])
-
+def np_func_to_list(func):
+ if not func.is_numpy_attribute:
+ return []
+ return np_func_to_list(func.obj) + [func.attribute]
+
+if pythran is None:
+ def pythran_is_numpy_func_supported(name):
+ return False
+else:
+ def pythran_is_numpy_func_supported(func):
+ CurF = pythran.tables.MODULES['numpy']
+ FL = np_func_to_list(func)
+ for F in FL:
+ CurF = CurF.get(F, None)
+ if CurF is None:
+ return False
+ return True
+
+def pythran_functor(func):
+ func = np_func_to_list(func)
+ submodules = "::".join(func[:-1] + ["functor"])
+ return "pythonic::numpy::%s::%s" % (submodules, func[-1])
+
def pythran_func_type(func, args):
args = ",".join(("std::declval<%s>()" % pythran_type(a.type) for a in args))
- return "decltype(%s{}(%s))" % (pythran_functor(func), args)
+ return "decltype(%s{}(%s))" % (pythran_functor(func), args)
@cython.ccall
@@ -205,9 +205,9 @@ def is_pythran_buffer(type_):
return (type_.is_numpy_buffer and is_pythran_supported_dtype(type_.dtype) and
type_.mode in ("c", "strided") and not type_.cast)
-def pythran_get_func_include_file(func):
- func = np_func_to_list(func)
- return "pythonic/numpy/%s.hpp" % "/".join(func)
+def pythran_get_func_include_file(func):
+ func = np_func_to_list(func)
+ return "pythonic/numpy/%s.hpp" % "/".join(func)
def include_pythran_generic(env):
# Generic files
@@ -215,7 +215,7 @@ def include_pythran_generic(env):
env.add_include_file("pythonic/python/core.hpp")
env.add_include_file("pythonic/types/bool.hpp")
env.add_include_file("pythonic/types/ndarray.hpp")
- env.add_include_file("pythonic/numpy/power.hpp")
+ env.add_include_file("pythonic/numpy/power.hpp")
env.add_include_file("pythonic/%s/slice.hpp" % pythran_builtins)
env.add_include_file("<new>") # for placement new
@@ -223,5 +223,5 @@ def include_pythran_generic(env):
env.add_include_file("pythonic/types/uint%d.hpp" % i)
env.add_include_file("pythonic/types/int%d.hpp" % i)
for t in ("float", "float32", "float64", "set", "slice", "tuple", "int",
- "complex", "complex64", "complex128"):
+ "complex", "complex64", "complex128"):
env.add_include_file("pythonic/types/%s.hpp" % t)
diff --git a/contrib/tools/cython/Cython/Compiler/Scanning.pxd b/contrib/tools/cython/Cython/Compiler/Scanning.pxd
index 59593f88a2..8eba7f068e 100644
--- a/contrib/tools/cython/Cython/Compiler/Scanning.pxd
+++ b/contrib/tools/cython/Cython/Compiler/Scanning.pxd
@@ -4,27 +4,27 @@ import cython
from ..Plex.Scanners cimport Scanner
-cdef unicode any_string_prefix, IDENT
-
-cdef get_lexicon()
-cdef initial_compile_time_env()
-
+cdef unicode any_string_prefix, IDENT
+
+cdef get_lexicon()
+cdef initial_compile_time_env()
+
cdef class Method:
cdef object name
- cdef dict kwargs
- cdef readonly object __name__ # for tracing the scanner
-
-## methods commented with '##' out are used by Parsing.py when compiled.
+ cdef dict kwargs
+ cdef readonly object __name__ # for tracing the scanner
-@cython.final
+## methods commented with '##' out are used by Parsing.py when compiled.
+
+@cython.final
cdef class CompileTimeScope:
cdef public dict entries
cdef public CompileTimeScope outer
- ##cdef declare(self, name, value)
- ##cdef lookup_here(self, name)
- ##cpdef lookup(self, name)
+ ##cdef declare(self, name, value)
+ ##cdef lookup_here(self, name)
+ ##cpdef lookup(self, name)
-@cython.final
+@cython.final
cdef class PyrexScanner(Scanner):
cdef public context
cdef public list included_files
@@ -53,15 +53,15 @@ cdef class PyrexScanner(Scanner):
@cython.locals(current_level=cython.long, new_level=cython.long)
cpdef indentation_action(self, text)
#cpdef eof_action(self, text)
- ##cdef next(self)
- ##cdef peek(self)
+ ##cdef next(self)
+ ##cdef peek(self)
#cpdef put_back(self, sy, systring)
#cdef unread(self, token, value)
- ##cdef bint expect(self, what, message = *) except -2
- ##cdef expect_keyword(self, what, message = *)
- ##cdef expected(self, what, message = *)
- ##cdef expect_indent(self)
- ##cdef expect_dedent(self)
- ##cdef expect_newline(self, message=*, bint ignore_semicolon=*)
- ##cdef int enter_async(self) except -1
- ##cdef int exit_async(self) except -1
+ ##cdef bint expect(self, what, message = *) except -2
+ ##cdef expect_keyword(self, what, message = *)
+ ##cdef expected(self, what, message = *)
+ ##cdef expect_indent(self)
+ ##cdef expect_dedent(self)
+ ##cdef expect_newline(self, message=*, bint ignore_semicolon=*)
+ ##cdef int enter_async(self) except -1
+ ##cdef int exit_async(self) except -1
diff --git a/contrib/tools/cython/Cython/Compiler/Scanning.py b/contrib/tools/cython/Cython/Compiler/Scanning.py
index c721bba69b..78ad205d04 100644
--- a/contrib/tools/cython/Cython/Compiler/Scanning.py
+++ b/contrib/tools/cython/Cython/Compiler/Scanning.py
@@ -5,11 +5,11 @@
from __future__ import absolute_import
-import cython
-cython.declare(make_lexicon=object, lexicon=object,
- print_function=object, error=object, warning=object,
- os=object, platform=object)
-
+import cython
+cython.declare(make_lexicon=object, lexicon=object,
+ print_function=object, error=object, warning=object,
+ os=object, platform=object)
+
import os
import platform
@@ -27,14 +27,14 @@ scanner_dump_file = None
lexicon = None
-
+
def get_lexicon():
global lexicon
if not lexicon:
lexicon = make_lexicon()
return lexicon
-
+
#------------------------------------------------------------------
py_reserved_words = [
@@ -50,22 +50,22 @@ pyx_reserved_words = py_reserved_words + [
"cimport", "DEF", "IF", "ELIF", "ELSE"
]
-
+
class Method(object):
- def __init__(self, name, **kwargs):
+ def __init__(self, name, **kwargs):
self.name = name
- self.kwargs = kwargs or None
- self.__name__ = name # for Plex tracing
+ self.kwargs = kwargs or None
+ self.__name__ = name # for Plex tracing
def __call__(self, stream, text):
- method = getattr(stream, self.name)
- # self.kwargs is almost always unused => avoid call overhead
- return method(text, **self.kwargs) if self.kwargs is not None else method(text)
+ method = getattr(stream, self.name)
+ # self.kwargs is almost always unused => avoid call overhead
+ return method(text, **self.kwargs) if self.kwargs is not None else method(text)
def __copy__(self):
return self # immutable, no need to copy
-
+
def __deepcopy__(self, memo):
return self # immutable, no need to copy
@@ -74,7 +74,7 @@ class Method(object):
class CompileTimeScope(object):
- def __init__(self, outer=None):
+ def __init__(self, outer=None):
self.entries = {}
self.outer = outer
@@ -100,10 +100,10 @@ class CompileTimeScope(object):
else:
raise
-
+
def initial_compile_time_env():
benv = CompileTimeScope()
- names = ('UNAME_SYSNAME', 'UNAME_NODENAME', 'UNAME_RELEASE', 'UNAME_VERSION', 'UNAME_MACHINE')
+ names = ('UNAME_SYSNAME', 'UNAME_NODENAME', 'UNAME_RELEASE', 'UNAME_VERSION', 'UNAME_MACHINE')
for name, value in zip(names, platform.uname()):
benv.declare(name, value)
try:
@@ -111,17 +111,17 @@ def initial_compile_time_env():
except ImportError:
import builtins
- names = (
- 'False', 'True',
- 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes',
- 'chr', 'cmp', 'complex', 'dict', 'divmod', 'enumerate', 'filter',
- 'float', 'format', 'frozenset', 'hash', 'hex', 'int', 'len',
- 'list', 'map', 'max', 'min', 'oct', 'ord', 'pow', 'range',
- 'repr', 'reversed', 'round', 'set', 'slice', 'sorted', 'str',
- 'sum', 'tuple', 'zip',
- ### defined below in a platform independent way
- # 'long', 'unicode', 'reduce', 'xrange'
- )
+ names = (
+ 'False', 'True',
+ 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes',
+ 'chr', 'cmp', 'complex', 'dict', 'divmod', 'enumerate', 'filter',
+ 'float', 'format', 'frozenset', 'hash', 'hex', 'int', 'len',
+ 'list', 'map', 'max', 'min', 'oct', 'ord', 'pow', 'range',
+ 'repr', 'reversed', 'round', 'set', 'slice', 'sorted', 'str',
+ 'sum', 'tuple', 'zip',
+ ### defined below in a platform independent way
+ # 'long', 'unicode', 'reduce', 'xrange'
+ )
for name in names:
try:
@@ -129,26 +129,26 @@ def initial_compile_time_env():
except AttributeError:
# ignore, likely Py3
pass
-
- # Py2/3 adaptations
- from functools import reduce
- benv.declare('reduce', reduce)
- benv.declare('unicode', getattr(builtins, 'unicode', getattr(builtins, 'str')))
- benv.declare('long', getattr(builtins, 'long', getattr(builtins, 'int')))
- benv.declare('xrange', getattr(builtins, 'xrange', getattr(builtins, 'range')))
-
+
+ # Py2/3 adaptations
+ from functools import reduce
+ benv.declare('reduce', reduce)
+ benv.declare('unicode', getattr(builtins, 'unicode', getattr(builtins, 'str')))
+ benv.declare('long', getattr(builtins, 'long', getattr(builtins, 'int')))
+ benv.declare('xrange', getattr(builtins, 'xrange', getattr(builtins, 'range')))
+
denv = CompileTimeScope(benv)
return denv
-
+
#------------------------------------------------------------------
class SourceDescriptor(object):
"""
A SourceDescriptor should be considered immutable.
"""
- filename = None
-
+ filename = None
+
_file_type = 'pyx'
_escaped_description = None
@@ -168,11 +168,11 @@ class SourceDescriptor(object):
def get_escaped_description(self):
if self._escaped_description is None:
- esc_desc = \
+ esc_desc = \
self.get_description().encode('ASCII', 'replace').decode("ASCII")
# Use forward slashes on Windows since these paths
- # will be used in the #line directives in the C/C++ files.
- self._escaped_description = esc_desc.replace('\\', '/')
+ # will be used in the #line directives in the C/C++ files.
+ self._escaped_description = esc_desc.replace('\\', '/')
return self._escaped_description
def __gt__(self, other):
@@ -198,7 +198,7 @@ class SourceDescriptor(object):
def __copy__(self):
return self # immutable, no need to copy
-
+
def __deepcopy__(self, memo):
return self # immutable, no need to copy
@@ -232,10 +232,10 @@ class FileSourceDescriptor(SourceDescriptor):
return lines
except KeyError:
pass
-
- with Utils.open_source_file(self.filename, encoding=encoding, error_handling=error_handling) as f:
+
+ with Utils.open_source_file(self.filename, encoding=encoding, error_handling=error_handling) as f:
lines = list(f)
-
+
if key in self._lines:
self._lines[key] = lines
else:
@@ -272,7 +272,7 @@ class FileSourceDescriptor(SourceDescriptor):
def __repr__(self):
return "<FileSourceDescriptor:%s>" % self.filename
-
+
class StringSourceDescriptor(SourceDescriptor):
"""
Instances of this class can be used instead of a filenames if the
@@ -288,8 +288,8 @@ class StringSourceDescriptor(SourceDescriptor):
if not encoding:
return self.codelines
else:
- return [line.encode(encoding, error_handling).decode(encoding)
- for line in self.codelines]
+ return [line.encode(encoding, error_handling).decode(encoding)
+ for line in self.codelines]
def get_description(self):
return self.name
@@ -311,7 +311,7 @@ class StringSourceDescriptor(SourceDescriptor):
def __repr__(self):
return "<StringSourceDescriptor:%s>" % self.name
-
+
#------------------------------------------------------------------
class PyrexScanner(Scanner):
@@ -321,8 +321,8 @@ class PyrexScanner(Scanner):
# compile_time_eval boolean In a true conditional compilation context
# compile_time_expr boolean In a compile-time expression context
- def __init__(self, file, filename, parent_scanner=None,
- scope=None, context=None, source_encoding=None, parse_comments=True, initial_pos=None):
+ def __init__(self, file, filename, parent_scanner=None,
+ scope=None, context=None, source_encoding=None, parse_comments=True, initial_pos=None):
Scanner.__init__(self, get_lexicon(), file, filename, initial_pos)
if filename.is_python_file():
@@ -349,7 +349,7 @@ class PyrexScanner(Scanner):
self.compile_time_env = initial_compile_time_env()
self.compile_time_eval = 1
self.compile_time_expr = 0
- if getattr(context.options, 'compile_time_env', None):
+ if getattr(context.options, 'compile_time_env', None):
self.compile_time_env.update(context.options.compile_time_env)
self.parse_comments = parse_comments
self.source_encoding = source_encoding
@@ -366,18 +366,18 @@ class PyrexScanner(Scanner):
if self.parse_comments:
self.produce('commentline', text)
- def strip_underscores(self, text, symbol):
- self.produce(symbol, text.replace('_', ''))
-
+ def strip_underscores(self, text, symbol):
+ self.produce(symbol, text.replace('_', ''))
+
def current_level(self):
return self.indentation_stack[-1]
def open_bracket_action(self, text):
- self.bracket_nesting_level += 1
+ self.bracket_nesting_level += 1
return text
def close_bracket_action(self, text):
- self.bracket_nesting_level -= 1
+ self.bracket_nesting_level -= 1
return text
def newline_action(self, text):
@@ -453,7 +453,7 @@ class PyrexScanner(Scanner):
sy, systring = self.read()
except UnrecognizedInput:
self.error("Unrecognized character")
- return # just a marker, error() always raises
+ return # just a marker, error() always raises
if sy == IDENT:
if systring in self.keywords:
if systring == u'print' and print_function in self.context.future_directives:
@@ -462,7 +462,7 @@ class PyrexScanner(Scanner):
self.keywords.discard('exec')
else:
sy = systring
- systring = self.context.intern_ustring(systring)
+ systring = self.context.intern_ustring(systring)
self.sy = sy
self.systring = systring
if False: # debug_scanner:
@@ -490,27 +490,27 @@ class PyrexScanner(Scanner):
# This method should be added to Plex
self.queue.insert(0, (token, value))
- def error(self, message, pos=None, fatal=True):
+ def error(self, message, pos=None, fatal=True):
if pos is None:
pos = self.position()
if self.sy == 'INDENT':
- error(pos, "Possible inconsistent indentation")
+ error(pos, "Possible inconsistent indentation")
err = error(pos, message)
if fatal: raise err
- def expect(self, what, message=None):
+ def expect(self, what, message=None):
if self.sy == what:
self.next()
else:
self.expected(what, message)
- def expect_keyword(self, what, message=None):
+ def expect_keyword(self, what, message=None):
if self.sy == IDENT and self.systring == what:
self.next()
else:
self.expected(what, message)
- def expected(self, what, message=None):
+ def expected(self, what, message=None):
if message:
self.error(message)
else:
@@ -521,10 +521,10 @@ class PyrexScanner(Scanner):
self.error("Expected '%s', found '%s'" % (what, found))
def expect_indent(self):
- self.expect('INDENT', "Expected an increase in indentation level")
+ self.expect('INDENT', "Expected an increase in indentation level")
def expect_dedent(self):
- self.expect('DEDENT', "Expected a decrease in indentation level")
+ self.expect('DEDENT', "Expected a decrease in indentation level")
def expect_newline(self, message="Expected a newline", ignore_semicolon=False):
# Expect either a newline or end of file
@@ -536,18 +536,18 @@ class PyrexScanner(Scanner):
self.expect('NEWLINE', message)
if useless_trailing_semicolon is not None:
warning(useless_trailing_semicolon, "useless trailing semicolon")
-
- def enter_async(self):
- self.async_enabled += 1
- if self.async_enabled == 1:
- self.keywords.add('async')
- self.keywords.add('await')
-
- def exit_async(self):
- assert self.async_enabled > 0
- self.async_enabled -= 1
- if not self.async_enabled:
- self.keywords.discard('await')
- self.keywords.discard('async')
- if self.sy in ('async', 'await'):
- self.sy, self.systring = IDENT, self.context.intern_ustring(self.sy)
+
+ def enter_async(self):
+ self.async_enabled += 1
+ if self.async_enabled == 1:
+ self.keywords.add('async')
+ self.keywords.add('await')
+
+ def exit_async(self):
+ assert self.async_enabled > 0
+ self.async_enabled -= 1
+ if not self.async_enabled:
+ self.keywords.discard('await')
+ self.keywords.discard('async')
+ if self.sy in ('async', 'await'):
+ self.sy, self.systring = IDENT, self.context.intern_ustring(self.sy)
diff --git a/contrib/tools/cython/Cython/Compiler/StringEncoding.py b/contrib/tools/cython/Cython/Compiler/StringEncoding.py
index c37e8aab79..ee2df88a2f 100644
--- a/contrib/tools/cython/Cython/Compiler/StringEncoding.py
+++ b/contrib/tools/cython/Cython/Compiler/StringEncoding.py
@@ -8,10 +8,10 @@ import re
import sys
if sys.version_info[0] >= 3:
- _unicode, _str, _bytes, _unichr = str, str, bytes, chr
+ _unicode, _str, _bytes, _unichr = str, str, bytes, chr
IS_PYTHON3 = True
else:
- _unicode, _str, _bytes, _unichr = unicode, str, str, unichr
+ _unicode, _str, _bytes, _unichr = unicode, str, str, unichr
IS_PYTHON3 = False
empty_bytes = _bytes()
@@ -39,13 +39,13 @@ class UnicodeLiteralBuilder(object):
# wide Unicode character on narrow platform => replace
# by surrogate pair
char_number -= 0x10000
- self.chars.append( _unichr((char_number // 1024) + 0xD800) )
- self.chars.append( _unichr((char_number % 1024) + 0xDC00) )
+ self.chars.append( _unichr((char_number // 1024) + 0xD800) )
+ self.chars.append( _unichr((char_number % 1024) + 0xDC00) )
else:
- self.chars.append( _unichr(char_number) )
+ self.chars.append( _unichr(char_number) )
else:
def append_charval(self, char_number):
- self.chars.append( _unichr(char_number) )
+ self.chars.append( _unichr(char_number) )
def append_uescape(self, char_number, escape_string):
self.append_charval(char_number)
@@ -71,14 +71,14 @@ class BytesLiteralBuilder(object):
self.chars.append(characters)
def append_charval(self, char_number):
- self.chars.append( _unichr(char_number).encode('ISO-8859-1') )
+ self.chars.append( _unichr(char_number).encode('ISO-8859-1') )
def append_uescape(self, char_number, escape_string):
self.append(escape_string)
def getstring(self):
# this *must* return a byte string!
- return bytes_literal(join_bytes(self.chars), self.target_encoding)
+ return bytes_literal(join_bytes(self.chars), self.target_encoding)
def getchar(self):
# this *must* return a byte string!
@@ -135,10 +135,10 @@ class EncodedString(_unicode):
def contains_surrogates(self):
return string_contains_surrogates(self)
- def as_utf8_string(self):
- return bytes_literal(self.utf8encode(), 'utf8')
-
+ def as_utf8_string(self):
+ return bytes_literal(self.utf8encode(), 'utf8')
+
def string_contains_surrogates(ustring):
"""
Check if the unicode string contains surrogate code points
@@ -207,18 +207,18 @@ class BytesLiteral(_bytes):
is_unicode = False
- def as_c_string_literal(self):
- value = split_string_literal(escape_byte_string(self))
- return '"%s"' % value
-
-
-def bytes_literal(s, encoding):
- assert isinstance(s, bytes)
- s = BytesLiteral(s)
- s.encoding = encoding
- return s
-
-
+ def as_c_string_literal(self):
+ value = split_string_literal(escape_byte_string(self))
+ return '"%s"' % value
+
+
+def bytes_literal(s, encoding):
+ assert isinstance(s, bytes)
+ s = BytesLiteral(s)
+ s.encoding = encoding
+ return s
+
+
def encoded_string(s, encoding):
assert isinstance(s, (_unicode, bytes))
s = EncodedString(s)
@@ -338,7 +338,7 @@ def split_string_literal(s, limit=2000):
def encode_pyunicode_string(s):
"""Create Py_UNICODE[] representation of a given unicode string.
"""
- s = list(map(ord, s)) + [0]
+ s = list(map(ord, s)) + [0]
if sys.maxunicode >= 0x10000: # Wide build or Py3.3
utf16, utf32 = [], s
@@ -360,4 +360,4 @@ def encode_pyunicode_string(s):
if utf16 == utf32:
utf16 = []
- return ",".join(map(_unicode, utf16)), ",".join(map(_unicode, utf32))
+ return ",".join(map(_unicode, utf16)), ",".join(map(_unicode, utf32))
diff --git a/contrib/tools/cython/Cython/Compiler/Symtab.py b/contrib/tools/cython/Cython/Compiler/Symtab.py
index 7361a55aea..dabe67f573 100644
--- a/contrib/tools/cython/Cython/Compiler/Symtab.py
+++ b/contrib/tools/cython/Cython/Compiler/Symtab.py
@@ -7,12 +7,12 @@ from __future__ import absolute_import
import re
import copy
import operator
-
-try:
- import __builtin__ as builtins
-except ImportError: # Py3
- import builtins
-
+
+try:
+ import __builtin__ as builtins
+except ImportError: # Py3
+ import builtins
+
from .Errors import warning, error, InternalError
from .StringEncoding import EncodedString
from . import Options, Naming
@@ -21,8 +21,8 @@ from .PyrexTypes import py_object_type, unspecified_type
from .TypeSlots import (
pyfunction_signature, pymethod_signature, richcmp_special_methods,
get_special_method_signature, get_property_accessor_signature)
-from . import Future
-
+from . import Future
+
from . import Code
iso_c99_keywords = set(
@@ -232,13 +232,13 @@ class Entry(object):
def all_entries(self):
return [self] + self.inner_entries
- def __lt__(left, right):
- if isinstance(left, Entry) and isinstance(right, Entry):
- return (left.name, left.cname) < (right.name, right.cname)
- else:
- return NotImplemented
-
+ def __lt__(left, right):
+ if isinstance(left, Entry) and isinstance(right, Entry):
+ return (left.name, left.cname) < (right.name, right.cname)
+ else:
+ return NotImplemented
+
class InnerEntry(Entry):
"""
An entry in a closure scope that represents the real outer Entry.
@@ -326,7 +326,7 @@ class Scope(object):
self.name = name
self.outer_scope = outer_scope
self.parent_scope = parent_scope
- mangled_name = "%d%s_" % (len(name), name.replace('.', '_dot_'))
+ mangled_name = "%d%s_" % (len(name), name.replace('.', '_dot_'))
qual_scope = self.qualifying_scope()
if qual_scope:
self.qualified_name = qual_scope.qualify_name(name)
@@ -361,7 +361,7 @@ class Scope(object):
def merge_in(self, other, merge_unused=True, whitelist=None):
# Use with care...
entries = []
- for name, entry in other.entries.items():
+ for name, entry in other.entries.items():
if not whitelist or name in whitelist:
if entry.used or merge_unused:
entries.append((name, entry))
@@ -463,11 +463,11 @@ class Scope(object):
if cpp_override_allowed:
# C++ function/method overrides with different signatures are ok.
- pass
+ pass
elif self.is_cpp_class_scope and entries[name].is_inherited:
# Likewise ignore inherited classes.
pass
- elif visibility == 'extern':
+ elif visibility == 'extern':
# Silenced outside of "cdef extern" blocks, until we have a safe way to
# prevent pxd-defined cpdef functions from ending up here.
warning(pos, "'%s' redeclared " % name, 1 if self.in_cinclude else 0)
@@ -531,19 +531,19 @@ class Scope(object):
def declare_typedef(self, name, base_type, pos, cname = None,
visibility = 'private', api = 0):
if not cname:
- if self.in_cinclude or (visibility != 'private' or api):
+ if self.in_cinclude or (visibility != 'private' or api):
cname = name
else:
cname = self.mangle(Naming.type_prefix, name)
try:
- if self.is_cpp_class_scope:
- namespace = self.outer_scope.lookup(self.name).type
- else:
- namespace = None
+ if self.is_cpp_class_scope:
+ namespace = self.outer_scope.lookup(self.name).type
+ else:
+ namespace = None
type = PyrexTypes.create_typedef_type(name, base_type, cname,
- (visibility == 'extern'),
- namespace)
- except ValueError as e:
+ (visibility == 'extern'),
+ namespace)
+ except ValueError as e:
error(pos, e.args[0])
type = PyrexTypes.error_type
entry = self.declare_type(name, type, pos, cname,
@@ -582,8 +582,8 @@ class Scope(object):
if scope:
entry.type.scope = scope
self.type_entries.append(entry)
- if self.is_cpp_class_scope:
- entry.type.namespace = self.outer_scope.lookup(self.name).type
+ if self.is_cpp_class_scope:
+ entry.type.namespace = self.outer_scope.lookup(self.name).type
return entry
def declare_cpp_class(self, name, scope,
@@ -633,7 +633,7 @@ class Scope(object):
else:
declare_inherited_attributes(entry, base_class.base_classes)
entry.type.scope.declare_inherited_cpp_attributes(base_class)
- if scope:
+ if scope:
declare_inherited_attributes(entry, base_classes)
scope.declare_var(name="this", cname="this", type=PyrexTypes.CPtrType(entry.type), pos=entry.pos)
if self.is_cpp_class_scope:
@@ -654,16 +654,16 @@ class Scope(object):
visibility = 'private', api = 0, create_wrapper = 0):
if name:
if not cname:
- if (self.in_cinclude or visibility == 'public'
- or visibility == 'extern' or api):
+ if (self.in_cinclude or visibility == 'public'
+ or visibility == 'extern' or api):
cname = name
else:
cname = self.mangle(Naming.type_prefix, name)
- if self.is_cpp_class_scope:
- namespace = self.outer_scope.lookup(self.name).type
- else:
- namespace = None
- type = PyrexTypes.CEnumType(name, cname, typedef_flag, namespace)
+ if self.is_cpp_class_scope:
+ namespace = self.outer_scope.lookup(self.name).type
+ else:
+ namespace = None
+ type = PyrexTypes.CEnumType(name, cname, typedef_flag, namespace)
else:
type = PyrexTypes.c_anon_enum_type
entry = self.declare_type(name, type, pos, cname = cname,
@@ -673,9 +673,9 @@ class Scope(object):
self.sue_entries.append(entry)
return entry
- def declare_tuple_type(self, pos, components):
- return self.outer_scope.declare_tuple_type(pos, components)
-
+ def declare_tuple_type(self, pos, components):
+ return self.outer_scope.declare_tuple_type(pos, components)
+
def declare_var(self, name, type, pos,
cname = None, visibility = 'private',
api = 0, in_pxd = 0, is_cdef = 0):
@@ -751,8 +751,8 @@ class Scope(object):
self.pyfunc_entries.append(entry)
def declare_cfunction(self, name, type, pos,
- cname=None, visibility='private', api=0, in_pxd=0,
- defining=0, modifiers=(), utility_code=None, overridable=False):
+ cname=None, visibility='private', api=0, in_pxd=0,
+ defining=0, modifiers=(), utility_code=None, overridable=False):
# Add an entry for a C function.
if not cname:
if visibility != 'private' or api:
@@ -761,18 +761,18 @@ class Scope(object):
cname = self.mangle(Naming.func_prefix, name)
entry = self.lookup_here(name)
if entry:
- if not in_pxd and visibility != entry.visibility and visibility == 'extern':
- # Previously declared, but now extern => treat this
- # as implementing the function, using the new cname
- defining = True
- visibility = entry.visibility
- entry.cname = cname
- entry.func_cname = cname
+ if not in_pxd and visibility != entry.visibility and visibility == 'extern':
+ # Previously declared, but now extern => treat this
+ # as implementing the function, using the new cname
+ defining = True
+ visibility = entry.visibility
+ entry.cname = cname
+ entry.func_cname = cname
if visibility != 'private' and visibility != entry.visibility:
- warning(pos, "Function '%s' previously declared as '%s', now as '%s'" % (name, entry.visibility, visibility), 1)
- if overridable != entry.is_overridable:
- warning(pos, "Function '%s' previously declared as '%s'" % (
- name, 'cpdef' if overridable else 'cdef'), 1)
+ warning(pos, "Function '%s' previously declared as '%s', now as '%s'" % (name, entry.visibility, visibility), 1)
+ if overridable != entry.is_overridable:
+ warning(pos, "Function '%s' previously declared as '%s'" % (
+ name, 'cpdef' if overridable else 'cdef'), 1)
if entry.type.same_as(type):
# Fix with_gil vs nogil.
entry.type = entry.type.with_with_gil(type.with_gil)
@@ -805,7 +805,7 @@ class Scope(object):
else:
entry = self.add_cfunction(name, type, pos, cname, visibility, modifiers)
entry.func_cname = cname
- entry.is_overridable = overridable
+ entry.is_overridable = overridable
if in_pxd and visibility != 'extern':
entry.defined_in_pxd = 1
if api:
@@ -819,14 +819,14 @@ class Scope(object):
if utility_code:
assert not entry.utility_code, "duplicate utility code definition in entry %s (%s)" % (name, cname)
entry.utility_code = utility_code
- if overridable:
- # names of cpdef functions can be used as variables and can be assigned to
- var_entry = Entry(name, cname, py_object_type) # FIXME: cname?
+ if overridable:
+ # names of cpdef functions can be used as variables and can be assigned to
+ var_entry = Entry(name, cname, py_object_type) # FIXME: cname?
var_entry.qualified_name = self.qualify_name(name)
- var_entry.is_variable = 1
- var_entry.is_pyglobal = 1
- var_entry.scope = entry.scope
- entry.as_variable = var_entry
+ var_entry.is_variable = 1
+ var_entry.is_pyglobal = 1
+ var_entry.scope = entry.scope
+ entry.as_variable = var_entry
type.entry = entry
return entry
@@ -903,34 +903,34 @@ class Scope(object):
obj_type = operands[0].type
method = obj_type.scope.lookup("operator%s" % operator)
if method is not None:
- arg_types = [arg.type for arg in operands[1:]]
- res = PyrexTypes.best_match([arg.type for arg in operands[1:]],
- method.all_alternatives())
+ arg_types = [arg.type for arg in operands[1:]]
+ res = PyrexTypes.best_match([arg.type for arg in operands[1:]],
+ method.all_alternatives())
if res is not None:
return res
function = self.lookup("operator%s" % operator)
- function_alternatives = []
- if function is not None:
- function_alternatives = function.all_alternatives()
-
- # look-up nonmember methods listed within a class
- method_alternatives = []
- if len(operands)==2: # binary operators only
- for n in range(2):
- if operands[n].type.is_cpp_class:
- obj_type = operands[n].type
- method = obj_type.scope.lookup("operator%s" % operator)
- if method is not None:
- method_alternatives += method.all_alternatives()
-
- if (not method_alternatives) and (not function_alternatives):
+ function_alternatives = []
+ if function is not None:
+ function_alternatives = function.all_alternatives()
+
+ # look-up nonmember methods listed within a class
+ method_alternatives = []
+ if len(operands)==2: # binary operators only
+ for n in range(2):
+ if operands[n].type.is_cpp_class:
+ obj_type = operands[n].type
+ method = obj_type.scope.lookup("operator%s" % operator)
+ if method is not None:
+ method_alternatives += method.all_alternatives()
+
+ if (not method_alternatives) and (not function_alternatives):
return None
-
- # select the unique alternatives
- all_alternatives = list(set(method_alternatives + function_alternatives))
-
- return PyrexTypes.best_match([arg.type for arg in operands],
- all_alternatives)
+
+ # select the unique alternatives
+ all_alternatives = list(set(method_alternatives + function_alternatives))
+
+ return PyrexTypes.best_match([arg.type for arg in operands],
+ all_alternatives)
def lookup_operator_for_types(self, pos, operator, types):
from .Nodes import Node
@@ -942,9 +942,9 @@ class Scope(object):
def use_utility_code(self, new_code):
self.global_scope().use_utility_code(new_code)
- def use_entry_utility_code(self, entry):
- self.global_scope().use_entry_utility_code(entry)
-
+ def use_entry_utility_code(self, entry):
+ self.global_scope().use_entry_utility_code(entry)
+
def defines_any(self, names):
# Test whether any of the given names are defined in this scope.
for name in names:
@@ -970,8 +970,8 @@ class Scope(object):
else:
return outer.is_cpp()
- def add_include_file(self, filename, verbatim_include=None, late=False):
- self.outer_scope.add_include_file(filename, verbatim_include, late)
+ def add_include_file(self, filename, verbatim_include=None, late=False):
+ self.outer_scope.add_include_file(filename, verbatim_include, late)
class PreImportScope(Scope):
@@ -1000,16 +1000,16 @@ class BuiltinScope(Scope):
Scope.__init__(self, "__builtin__", PreImportScope(), None)
self.type_names = {}
- for name, definition in sorted(self.builtin_entries.items()):
+ for name, definition in sorted(self.builtin_entries.items()):
cname, type = definition
self.declare_var(name, type, None, cname)
- def lookup(self, name, language_level=None, str_is_str=None):
- # 'language_level' and 'str_is_str' are passed by ModuleScope
- if name == 'str':
- if str_is_str is None:
- str_is_str = language_level in (None, 2)
- if not str_is_str:
+ def lookup(self, name, language_level=None, str_is_str=None):
+ # 'language_level' and 'str_is_str' are passed by ModuleScope
+ if name == 'str':
+ if str_is_str is None:
+ str_is_str = language_level in (None, 2)
+ if not str_is_str:
name = 'unicode'
return Scope.lookup(self, name)
@@ -1023,12 +1023,12 @@ class BuiltinScope(Scope):
else:
warning(pos, "undeclared name not builtin: %s" % name, 2)
- def declare_builtin_cfunction(self, name, type, cname, python_equiv=None, utility_code=None):
+ def declare_builtin_cfunction(self, name, type, cname, python_equiv=None, utility_code=None):
# If python_equiv == "*", the Python equivalent has the same name
# as the entry, otherwise it has the name specified by python_equiv.
name = EncodedString(name)
entry = self.declare_cfunction(name, type, None, cname, visibility='extern',
- utility_code=utility_code)
+ utility_code=utility_code)
if python_equiv:
if python_equiv == "*":
python_equiv = name
@@ -1058,14 +1058,14 @@ class BuiltinScope(Scope):
var_entry = Entry(name = entry.name,
type = self.lookup('type').type, # make sure "type" is the first type declared...
pos = entry.pos,
- cname = entry.type.typeptr_cname)
+ cname = entry.type.typeptr_cname)
var_entry.qualified_name = self.qualify_name(name)
var_entry.is_variable = 1
var_entry.is_cglobal = 1
var_entry.is_readonly = 1
var_entry.is_builtin = 1
var_entry.utility_code = utility_code
- var_entry.scope = self
+ var_entry.scope = self
if Options.cache_builtins:
var_entry.is_const = True
entry.as_variable = var_entry
@@ -1134,7 +1134,7 @@ class ModuleScope(Scope):
is_module_scope = 1
has_import_star = 0
is_cython_builtin = 0
- old_style_globals = 0
+ old_style_globals = 0
def __init__(self, name, parent_module, context):
from . import Builtin
@@ -1168,7 +1168,7 @@ class ModuleScope(Scope):
self.cached_builtins = []
self.undeclared_cached_builtins = []
self.namespace_cname = self.module_cname
- self._cached_tuple_types = {}
+ self._cached_tuple_types = {}
for var_name in ['__builtins__', '__name__', '__file__', '__doc__', '__path__',
'__spec__', '__loader__', '__package__', '__cached__']:
self.declare_var(EncodedString(var_name), py_object_type, None)
@@ -1180,39 +1180,39 @@ class ModuleScope(Scope):
def global_scope(self):
return self
- def lookup(self, name, language_level=None, str_is_str=None):
+ def lookup(self, name, language_level=None, str_is_str=None):
entry = self.lookup_here(name)
if entry is not None:
return entry
- if language_level is None:
- language_level = self.context.language_level if self.context is not None else 3
- if str_is_str is None:
- str_is_str = language_level == 2 or (
- self.context is not None and Future.unicode_literals not in self.context.future_directives)
-
- return self.outer_scope.lookup(name, language_level=language_level, str_is_str=str_is_str)
-
- def declare_tuple_type(self, pos, components):
- components = tuple(components)
- try:
- ttype = self._cached_tuple_types[components]
- except KeyError:
- ttype = self._cached_tuple_types[components] = PyrexTypes.c_tuple_type(components)
- cname = ttype.cname
- entry = self.lookup_here(cname)
- if not entry:
- scope = StructOrUnionScope(cname)
- for ix, component in enumerate(components):
- scope.declare_var(name="f%s" % ix, type=component, pos=pos)
- struct_entry = self.declare_struct_or_union(
- cname + '_struct', 'struct', scope, typedef_flag=True, pos=pos, cname=cname)
- self.type_entries.remove(struct_entry)
- ttype.struct_entry = struct_entry
- entry = self.declare_type(cname, ttype, pos, cname)
- ttype.entry = entry
- return entry
-
+ if language_level is None:
+ language_level = self.context.language_level if self.context is not None else 3
+ if str_is_str is None:
+ str_is_str = language_level == 2 or (
+ self.context is not None and Future.unicode_literals not in self.context.future_directives)
+
+ return self.outer_scope.lookup(name, language_level=language_level, str_is_str=str_is_str)
+
+ def declare_tuple_type(self, pos, components):
+ components = tuple(components)
+ try:
+ ttype = self._cached_tuple_types[components]
+ except KeyError:
+ ttype = self._cached_tuple_types[components] = PyrexTypes.c_tuple_type(components)
+ cname = ttype.cname
+ entry = self.lookup_here(cname)
+ if not entry:
+ scope = StructOrUnionScope(cname)
+ for ix, component in enumerate(components):
+ scope.declare_var(name="f%s" % ix, type=component, pos=pos)
+ struct_entry = self.declare_struct_or_union(
+ cname + '_struct', 'struct', scope, typedef_flag=True, pos=pos, cname=cname)
+ self.type_entries.remove(struct_entry)
+ ttype.struct_entry = struct_entry
+ entry = self.declare_type(cname, ttype, pos, cname)
+ ttype.entry = entry
+ return entry
+
def declare_builtin(self, name, pos):
if not hasattr(builtins, name) \
and name not in Code.non_portable_builtins_map \
@@ -1233,10 +1233,10 @@ class ModuleScope(Scope):
for entry in self.cached_builtins:
if entry.name == name:
return entry
- if name == 'globals' and not self.old_style_globals:
- return self.outer_scope.lookup('__Pyx_Globals')
- else:
- entry = self.declare(None, None, py_object_type, pos, 'private')
+ if name == 'globals' and not self.old_style_globals:
+ return self.outer_scope.lookup('__Pyx_Globals')
+ else:
+ entry = self.declare(None, None, py_object_type, pos, 'private')
if Options.cache_builtins and name not in Code.uncachable_builtins:
entry.is_builtin = 1
entry.is_const = 1 # cached
@@ -1255,49 +1255,49 @@ class ModuleScope(Scope):
# relative imports relative to this module's parent.
# Finds and parses the module's .pxd file if the module
# has not been referenced before.
- relative_to = None
- absolute_fallback = False
- if relative_level is not None and relative_level > 0:
- # explicit relative cimport
- # error of going beyond top-level is handled in cimport node
- relative_to = self
- while relative_level > 0 and relative_to:
- relative_to = relative_to.parent_module
- relative_level -= 1
- elif relative_level != 0:
- # -1 or None: try relative cimport first, then absolute
- relative_to = self.parent_module
- absolute_fallback = True
-
+ relative_to = None
+ absolute_fallback = False
+ if relative_level is not None and relative_level > 0:
+ # explicit relative cimport
+ # error of going beyond top-level is handled in cimport node
+ relative_to = self
+ while relative_level > 0 and relative_to:
+ relative_to = relative_to.parent_module
+ relative_level -= 1
+ elif relative_level != 0:
+ # -1 or None: try relative cimport first, then absolute
+ relative_to = self.parent_module
+ absolute_fallback = True
+
module_scope = self.global_scope()
return module_scope.context.find_module(
- module_name, relative_to=relative_to, pos=pos, absolute_fallback=absolute_fallback)
+ module_name, relative_to=relative_to, pos=pos, absolute_fallback=absolute_fallback)
def find_submodule(self, name):
# Find and return scope for a submodule of this module,
# creating a new empty one if necessary. Doesn't parse .pxd.
- if '.' in name:
- name, submodule = name.split('.', 1)
- else:
- submodule = None
+ if '.' in name:
+ name, submodule = name.split('.', 1)
+ else:
+ submodule = None
scope = self.lookup_submodule(name)
if not scope:
- scope = ModuleScope(name, parent_module=self, context=self.context)
+ scope = ModuleScope(name, parent_module=self, context=self.context)
self.module_entries[name] = scope
- if submodule:
- scope = scope.find_submodule(submodule)
+ if submodule:
+ scope = scope.find_submodule(submodule)
return scope
def lookup_submodule(self, name):
# Return scope for submodule of this module, or None.
- if '.' in name:
- name, submodule = name.split('.', 1)
- else:
- submodule = None
- module = self.module_entries.get(name, None)
- if submodule and module is not None:
- module = module.lookup_submodule(submodule)
- return module
+ if '.' in name:
+ name, submodule = name.split('.', 1)
+ else:
+ submodule = None
+ module = self.module_entries.get(name, None)
+ if submodule and module is not None:
+ module = module.lookup_submodule(submodule)
+ return module
def add_include_file(self, filename, verbatim_include=None, late=False):
"""
@@ -1438,8 +1438,8 @@ class ModuleScope(Scope):
return entry
def declare_cfunction(self, name, type, pos,
- cname=None, visibility='private', api=0, in_pxd=0,
- defining=0, modifiers=(), utility_code=None, overridable=False):
+ cname=None, visibility='private', api=0, in_pxd=0,
+ defining=0, modifiers=(), utility_code=None, overridable=False):
if not defining and 'inline' in modifiers:
# TODO(github/1736): Make this an error.
warning(pos, "Declarations should not be declared inline.", 1)
@@ -1449,8 +1449,8 @@ class ModuleScope(Scope):
cname = name
else:
cname = self.mangle(Naming.func_prefix, name)
- if visibility == 'extern' and type.optional_arg_count:
- error(pos, "Extern functions cannot have default arguments values.")
+ if visibility == 'extern' and type.optional_arg_count:
+ error(pos, "Extern functions cannot have default arguments values.")
entry = self.lookup_here(name)
if entry and entry.defined_in_pxd:
if entry.visibility != "private":
@@ -1461,9 +1461,9 @@ class ModuleScope(Scope):
entry.func_cname = cname
entry = Scope.declare_cfunction(
self, name, type, pos,
- cname=cname, visibility=visibility, api=api, in_pxd=in_pxd,
- defining=defining, modifiers=modifiers, utility_code=utility_code,
- overridable=overridable)
+ cname=cname, visibility=visibility, api=api, in_pxd=in_pxd,
+ defining=defining, modifiers=modifiers, utility_code=utility_code,
+ overridable=overridable)
return entry
def declare_global(self, name, pos):
@@ -1475,19 +1475,19 @@ class ModuleScope(Scope):
if new_code is not None:
self.utility_code_list.append(new_code)
- def use_entry_utility_code(self, entry):
- if entry is None:
- return
- if entry.utility_code:
- self.utility_code_list.append(entry.utility_code)
- if entry.utility_code_definition:
- self.utility_code_list.append(entry.utility_code_definition)
-
- def declare_c_class(self, name, pos, defining=0, implementing=0,
- module_name=None, base_type=None, objstruct_cname=None,
- typeobj_cname=None, typeptr_cname=None, visibility='private',
- typedef_flag=0, api=0, check_size=None,
- buffer_defaults=None, shadow=0):
+ def use_entry_utility_code(self, entry):
+ if entry is None:
+ return
+ if entry.utility_code:
+ self.utility_code_list.append(entry.utility_code)
+ if entry.utility_code_definition:
+ self.utility_code_list.append(entry.utility_code_definition)
+
+ def declare_c_class(self, name, pos, defining=0, implementing=0,
+ module_name=None, base_type=None, objstruct_cname=None,
+ typeobj_cname=None, typeptr_cname=None, visibility='private',
+ typedef_flag=0, api=0, check_size=None,
+ buffer_defaults=None, shadow=0):
# If this is a non-extern typedef class, expose the typedef, but use
# the non-typedef struct internally to avoid needing forward
# declarations for anonymous structs.
@@ -1519,8 +1519,8 @@ class ModuleScope(Scope):
# Make a new entry if needed
#
if not entry or shadow:
- type = PyrexTypes.PyExtensionType(
- name, typedef_flag, base_type, visibility == 'extern', check_size=check_size)
+ type = PyrexTypes.PyExtensionType(
+ name, typedef_flag, base_type, visibility == 'extern', check_size=check_size)
type.pos = pos
type.buffer_defaults = buffer_defaults
if objtypedef_cname is not None:
@@ -1710,12 +1710,12 @@ class ModuleScope(Scope):
var_entry = Entry(name = entry.name,
type = Builtin.type_type,
pos = entry.pos,
- cname = entry.type.typeptr_cname)
+ cname = entry.type.typeptr_cname)
var_entry.qualified_name = entry.qualified_name
var_entry.is_variable = 1
var_entry.is_cglobal = 1
var_entry.is_readonly = 1
- var_entry.scope = entry.scope
+ var_entry.scope = entry.scope
entry.as_variable = var_entry
def is_cpp(self):
@@ -1937,10 +1937,10 @@ class StructOrUnionScope(Scope):
return entry
def declare_cfunction(self, name, type, pos,
- cname=None, visibility='private', api=0, in_pxd=0,
- defining=0, modifiers=(), overridable=False): # currently no utility code ...
- if overridable:
- error(pos, "C struct/union member cannot be declared 'cpdef'")
+ cname=None, visibility='private', api=0, in_pxd=0,
+ defining=0, modifiers=(), overridable=False): # currently no utility code ...
+ if overridable:
+ error(pos, "C struct/union member cannot be declared 'cpdef'")
return self.declare_var(name, type, pos,
cname=cname, visibility=visibility)
@@ -1975,7 +1975,7 @@ class ClassScope(Scope):
py_object_type,
[PyrexTypes.CFuncTypeArg("", py_object_type, None)], 0, 0))
entry.utility_code_definition = Code.UtilityCode.load_cached("ClassMethod", "CythonFunction.c")
- self.use_entry_utility_code(entry)
+ self.use_entry_utility_code(entry)
entry.is_cfunction = 1
return entry
@@ -2050,7 +2050,7 @@ class CClassScope(ClassScope):
# getset_table_cname string
# has_pyobject_attrs boolean Any PyObject attributes?
# has_memoryview_attrs boolean Any memory view attributes?
- # has_cpp_class_attrs boolean Any (non-pointer) C++ attributes?
+ # has_cpp_class_attrs boolean Any (non-pointer) C++ attributes?
# has_cyclic_pyobject_attrs boolean Any PyObject attributes that may need GC?
# property_entries [Entry]
# defined boolean Defined in .pxd file
@@ -2062,7 +2062,7 @@ class CClassScope(ClassScope):
has_pyobject_attrs = False
has_memoryview_attrs = False
- has_cpp_class_attrs = False
+ has_cpp_class_attrs = False
has_cyclic_pyobject_attrs = False
defined = False
implemented = False
@@ -2078,7 +2078,7 @@ class CClassScope(ClassScope):
def needs_gc(self):
# If the type or any of its base types have Python-valued
# C attributes, then it needs to participate in GC.
- if self.has_cyclic_pyobject_attrs and not self.directives.get('no_gc', False):
+ if self.has_cyclic_pyobject_attrs and not self.directives.get('no_gc', False):
return True
base_type = self.parent_type.base_type
if base_type and base_type.scope is not None:
@@ -2138,8 +2138,8 @@ class CClassScope(ClassScope):
self.var_entries.append(entry)
if type.is_memoryviewslice:
self.has_memoryview_attrs = True
- elif type.is_cpp_class:
- self.has_cpp_class_attrs = True
+ elif type.is_cpp_class:
+ self.has_cpp_class_attrs = True
elif type.is_pyobject and (self.is_closure_class_scope or name != '__weakref__'):
self.has_pyobject_attrs = True
if (not type.is_builtin_type
@@ -2155,9 +2155,9 @@ class CClassScope(ClassScope):
entry.needs_property = True
if not self.is_closure_class_scope and name == "__weakref__":
error(pos, "Special attribute __weakref__ cannot be exposed to Python")
- if not (type.is_pyobject or type.can_coerce_to_pyobject(self)):
- # we're not testing for coercion *from* Python here - that would fail later
- error(pos, "C attribute of type '%s' cannot be accessed from Python" % type)
+ if not (type.is_pyobject or type.can_coerce_to_pyobject(self)):
+ # we're not testing for coercion *from* Python here - that would fail later
+ error(pos, "C attribute of type '%s' cannot be accessed from Python" % type)
else:
entry.needs_property = False
return entry
@@ -2218,8 +2218,8 @@ class CClassScope(ClassScope):
return entry
def declare_cfunction(self, name, type, pos,
- cname=None, visibility='private', api=0, in_pxd=0,
- defining=0, modifiers=(), utility_code=None, overridable=False):
+ cname=None, visibility='private', api=0, in_pxd=0,
+ defining=0, modifiers=(), utility_code=None, overridable=False):
if get_special_method_signature(name) and not self.parent_type.is_builtin_type:
error(pos, "Special methods must be declared with 'def', not 'cdef'")
args = type.args
@@ -2250,9 +2250,9 @@ class CClassScope(ClassScope):
# TODO(robertwb): Make this an error.
warning(pos,
"Compatible but non-identical C method '%s' not redeclared "
- "in definition part of extension type '%s'. "
- "This may cause incorrect vtables to be generated." % (
- name, self.class_name), 2)
+ "in definition part of extension type '%s'. "
+ "This may cause incorrect vtables to be generated." % (
+ name, self.class_name), 2)
warning(entry.pos, "Previous declaration is here", 2)
entry = self.add_cfunction(name, type, pos, cname, visibility='ignore', modifiers=modifiers)
else:
@@ -2263,7 +2263,7 @@ class CClassScope(ClassScope):
error(pos,
"C method '%s' not previously declared in definition part of"
" extension type '%s'" % (name, self.class_name))
- entry = self.add_cfunction(name, type, pos, cname, visibility, modifiers)
+ entry = self.add_cfunction(name, type, pos, cname, visibility, modifiers)
if defining:
entry.func_cname = self.mangle(Naming.func_prefix, name)
entry.utility_code = utility_code
@@ -2293,13 +2293,13 @@ class CClassScope(ClassScope):
# equivalent that must be accessible to support bound methods
name = EncodedString(name)
entry = self.declare_cfunction(name, type, None, cname, visibility='extern',
- utility_code=utility_code)
+ utility_code=utility_code)
var_entry = Entry(name, name, py_object_type)
var_entry.qualified_name = name
var_entry.is_variable = 1
var_entry.is_builtin = 1
var_entry.utility_code = utility_code
- var_entry.scope = entry.scope
+ var_entry.scope = entry.scope
entry.as_variable = var_entry
return entry
@@ -2397,15 +2397,15 @@ class CppClassScope(Scope):
entry = self.declare(name, cname, type, pos, visibility)
entry.is_variable = 1
if type.is_cfunction and self.type:
- if not self.type.get_fused_types():
- entry.func_cname = "%s::%s" % (self.type.empty_declaration_code(), cname)
+ if not self.type.get_fused_types():
+ entry.func_cname = "%s::%s" % (self.type.empty_declaration_code(), cname)
if name != "this" and (defining or name != "<init>"):
self.var_entries.append(entry)
return entry
def declare_cfunction(self, name, type, pos,
- cname=None, visibility='extern', api=0, in_pxd=0,
- defining=0, modifiers=(), utility_code=None, overridable=False):
+ cname=None, visibility='extern', api=0, in_pxd=0,
+ defining=0, modifiers=(), utility_code=None, overridable=False):
class_name = self.name.split('::')[-1]
if name in (class_name, '__init__') and cname is None:
cname = "%s__init__%s" % (Naming.func_prefix, class_name)
@@ -2469,9 +2469,9 @@ class CppClassScope(Scope):
for base_entry in base_scope.cfunc_entries:
entry = self.declare_cfunction(base_entry.name, base_entry.type,
base_entry.pos, base_entry.cname,
- base_entry.visibility, api=0,
- modifiers=base_entry.func_modifiers,
- utility_code=base_entry.utility_code)
+ base_entry.visibility, api=0,
+ modifiers=base_entry.func_modifiers,
+ utility_code=base_entry.utility_code)
entry.is_inherited = 1
for base_entry in base_scope.type_entries:
if base_entry.name not in base_templates:
@@ -2496,7 +2496,7 @@ class CppClassScope(Scope):
e.type.specialize(values),
e.pos,
e.cname,
- utility_code=e.utility_code)
+ utility_code=e.utility_code)
else:
scope.declare_var(entry.name,
entry.type.specialize(values),
diff --git a/contrib/tools/cython/Cython/Compiler/Tests/TestCmdLine.py b/contrib/tools/cython/Cython/Compiler/Tests/TestCmdLine.py
index abc7c0a892..f8862d064a 100644
--- a/contrib/tools/cython/Cython/Compiler/Tests/TestCmdLine.py
+++ b/contrib/tools/cython/Cython/Compiler/Tests/TestCmdLine.py
@@ -1,118 +1,118 @@
-
-import sys
-from unittest import TestCase
-try:
- from StringIO import StringIO
-except ImportError:
- from io import StringIO # doesn't accept 'str' in Py2
-
-from .. import Options
-from ..CmdLine import parse_command_line
-
-
-class CmdLineParserTest(TestCase):
- def setUp(self):
- backup = {}
- for name, value in vars(Options).items():
- backup[name] = value
- self._options_backup = backup
-
- def tearDown(self):
- no_value = object()
- for name, orig_value in self._options_backup.items():
- if getattr(Options, name, no_value) != orig_value:
- setattr(Options, name, orig_value)
-
- def test_short_options(self):
- options, sources = parse_command_line([
- '-V', '-l', '-+', '-t', '-v', '-v', '-v', '-p', '-D', '-a', '-3',
- ])
- self.assertFalse(sources)
- self.assertTrue(options.show_version)
- self.assertTrue(options.use_listing_file)
- self.assertTrue(options.cplus)
- self.assertTrue(options.timestamps)
- self.assertTrue(options.verbose >= 3)
- self.assertTrue(Options.embed_pos_in_docstring)
- self.assertFalse(Options.docstrings)
- self.assertTrue(Options.annotate)
- self.assertEqual(options.language_level, 3)
-
- options, sources = parse_command_line([
- '-f', '-2', 'source.pyx',
- ])
- self.assertTrue(sources)
- self.assertTrue(len(sources) == 1)
- self.assertFalse(options.timestamps)
- self.assertEqual(options.language_level, 2)
-
- def test_long_options(self):
- options, sources = parse_command_line([
- '--version', '--create-listing', '--cplus', '--embed', '--timestamps',
- '--verbose', '--verbose', '--verbose',
- '--embed-positions', '--no-docstrings', '--annotate', '--lenient',
- ])
- self.assertFalse(sources)
- self.assertTrue(options.show_version)
- self.assertTrue(options.use_listing_file)
- self.assertTrue(options.cplus)
- self.assertEqual(Options.embed, 'main')
- self.assertTrue(options.timestamps)
- self.assertTrue(options.verbose >= 3)
- self.assertTrue(Options.embed_pos_in_docstring)
- self.assertFalse(Options.docstrings)
- self.assertTrue(Options.annotate)
- self.assertFalse(Options.error_on_unknown_names)
- self.assertFalse(Options.error_on_uninitialized)
-
- options, sources = parse_command_line([
- '--force', 'source.pyx',
- ])
- self.assertTrue(sources)
- self.assertTrue(len(sources) == 1)
- self.assertFalse(options.timestamps)
-
- def test_options_with_values(self):
- options, sources = parse_command_line([
- '--embed=huhu',
- '-I/test/include/dir1', '--include-dir=/test/include/dir2',
- '--include-dir', '/test/include/dir3',
- '--working=/work/dir',
- 'source.pyx',
- '--output-file=/output/dir',
- '--pre-import=/pre/import',
- '--cleanup=3',
- '--annotate-coverage=cov.xml',
- '--gdb-outdir=/gdb/outdir',
- '--directive=wraparound=false',
- ])
- self.assertEqual(sources, ['source.pyx'])
- self.assertEqual(Options.embed, 'huhu')
- self.assertEqual(options.include_path, ['/test/include/dir1', '/test/include/dir2', '/test/include/dir3'])
- self.assertEqual(options.working_path, '/work/dir')
- self.assertEqual(options.output_file, '/output/dir')
- self.assertEqual(Options.pre_import, '/pre/import')
- self.assertEqual(Options.generate_cleanup_code, 3)
- self.assertTrue(Options.annotate)
- self.assertEqual(Options.annotate_coverage_xml, 'cov.xml')
- self.assertTrue(options.gdb_debug)
- self.assertEqual(options.output_dir, '/gdb/outdir')
-
- def test_errors(self):
- def error(*args):
- old_stderr = sys.stderr
- stderr = sys.stderr = StringIO()
- try:
- self.assertRaises(SystemExit, parse_command_line, list(args))
- finally:
- sys.stderr = old_stderr
- self.assertTrue(stderr.getvalue())
-
- error('-1')
- error('-I')
- error('--version=-a')
- error('--version=--annotate=true')
- error('--working')
- error('--verbose=1')
- error('--verbose=1')
- error('--cleanup')
+
+import sys
+from unittest import TestCase
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO # doesn't accept 'str' in Py2
+
+from .. import Options
+from ..CmdLine import parse_command_line
+
+
+class CmdLineParserTest(TestCase):
+ def setUp(self):
+ backup = {}
+ for name, value in vars(Options).items():
+ backup[name] = value
+ self._options_backup = backup
+
+ def tearDown(self):
+ no_value = object()
+ for name, orig_value in self._options_backup.items():
+ if getattr(Options, name, no_value) != orig_value:
+ setattr(Options, name, orig_value)
+
+ def test_short_options(self):
+ options, sources = parse_command_line([
+ '-V', '-l', '-+', '-t', '-v', '-v', '-v', '-p', '-D', '-a', '-3',
+ ])
+ self.assertFalse(sources)
+ self.assertTrue(options.show_version)
+ self.assertTrue(options.use_listing_file)
+ self.assertTrue(options.cplus)
+ self.assertTrue(options.timestamps)
+ self.assertTrue(options.verbose >= 3)
+ self.assertTrue(Options.embed_pos_in_docstring)
+ self.assertFalse(Options.docstrings)
+ self.assertTrue(Options.annotate)
+ self.assertEqual(options.language_level, 3)
+
+ options, sources = parse_command_line([
+ '-f', '-2', 'source.pyx',
+ ])
+ self.assertTrue(sources)
+ self.assertTrue(len(sources) == 1)
+ self.assertFalse(options.timestamps)
+ self.assertEqual(options.language_level, 2)
+
+ def test_long_options(self):
+ options, sources = parse_command_line([
+ '--version', '--create-listing', '--cplus', '--embed', '--timestamps',
+ '--verbose', '--verbose', '--verbose',
+ '--embed-positions', '--no-docstrings', '--annotate', '--lenient',
+ ])
+ self.assertFalse(sources)
+ self.assertTrue(options.show_version)
+ self.assertTrue(options.use_listing_file)
+ self.assertTrue(options.cplus)
+ self.assertEqual(Options.embed, 'main')
+ self.assertTrue(options.timestamps)
+ self.assertTrue(options.verbose >= 3)
+ self.assertTrue(Options.embed_pos_in_docstring)
+ self.assertFalse(Options.docstrings)
+ self.assertTrue(Options.annotate)
+ self.assertFalse(Options.error_on_unknown_names)
+ self.assertFalse(Options.error_on_uninitialized)
+
+ options, sources = parse_command_line([
+ '--force', 'source.pyx',
+ ])
+ self.assertTrue(sources)
+ self.assertTrue(len(sources) == 1)
+ self.assertFalse(options.timestamps)
+
+ def test_options_with_values(self):
+ options, sources = parse_command_line([
+ '--embed=huhu',
+ '-I/test/include/dir1', '--include-dir=/test/include/dir2',
+ '--include-dir', '/test/include/dir3',
+ '--working=/work/dir',
+ 'source.pyx',
+ '--output-file=/output/dir',
+ '--pre-import=/pre/import',
+ '--cleanup=3',
+ '--annotate-coverage=cov.xml',
+ '--gdb-outdir=/gdb/outdir',
+ '--directive=wraparound=false',
+ ])
+ self.assertEqual(sources, ['source.pyx'])
+ self.assertEqual(Options.embed, 'huhu')
+ self.assertEqual(options.include_path, ['/test/include/dir1', '/test/include/dir2', '/test/include/dir3'])
+ self.assertEqual(options.working_path, '/work/dir')
+ self.assertEqual(options.output_file, '/output/dir')
+ self.assertEqual(Options.pre_import, '/pre/import')
+ self.assertEqual(Options.generate_cleanup_code, 3)
+ self.assertTrue(Options.annotate)
+ self.assertEqual(Options.annotate_coverage_xml, 'cov.xml')
+ self.assertTrue(options.gdb_debug)
+ self.assertEqual(options.output_dir, '/gdb/outdir')
+
+ def test_errors(self):
+ def error(*args):
+ old_stderr = sys.stderr
+ stderr = sys.stderr = StringIO()
+ try:
+ self.assertRaises(SystemExit, parse_command_line, list(args))
+ finally:
+ sys.stderr = old_stderr
+ self.assertTrue(stderr.getvalue())
+
+ error('-1')
+ error('-I')
+ error('--version=-a')
+ error('--version=--annotate=true')
+ error('--working')
+ error('--verbose=1')
+ error('--verbose=1')
+ error('--cleanup')
diff --git a/contrib/tools/cython/Cython/Compiler/Tests/TestFlowControl.py b/contrib/tools/cython/Cython/Compiler/Tests/TestFlowControl.py
index 443551ab88..cad428607a 100644
--- a/contrib/tools/cython/Cython/Compiler/Tests/TestFlowControl.py
+++ b/contrib/tools/cython/Cython/Compiler/Tests/TestFlowControl.py
@@ -1,68 +1,68 @@
-
-from __future__ import absolute_import
-
-from copy import deepcopy
-from unittest import TestCase
-
-from Cython.Compiler.FlowControl import (
- NameAssignment, StaticAssignment, Argument, NameDeletion)
-
-
-class FakeType(object):
- is_pyobject = True
-
-
-class FakeNode(object):
- pos = ('filename.pyx', 1, 2)
- cf_state = None
- type = FakeType()
-
- def infer_type(self, scope):
- return self.type
-
-
-class FakeEntry(object):
- type = FakeType()
-
-
-class TestGraph(TestCase):
- def test_deepcopy(self):
- lhs, rhs = FakeNode(), FakeNode()
- entry = FakeEntry()
- entry.pos = lhs.pos
-
- name_ass = NameAssignment(lhs, rhs, entry)
- ass = deepcopy(name_ass)
- self.assertTrue(ass.lhs)
- self.assertTrue(ass.rhs)
- self.assertTrue(ass.entry)
- self.assertEqual(ass.pos, name_ass.pos)
- self.assertFalse(ass.is_arg)
- self.assertFalse(ass.is_deletion)
-
- static_ass = StaticAssignment(entry)
- ass = deepcopy(static_ass)
- self.assertTrue(ass.lhs)
- self.assertTrue(ass.rhs)
- self.assertTrue(ass.entry)
- self.assertEqual(ass.pos, static_ass.pos)
- self.assertFalse(ass.is_arg)
- self.assertFalse(ass.is_deletion)
-
- arg_ass = Argument(lhs, rhs, entry)
- ass = deepcopy(arg_ass)
- self.assertTrue(ass.lhs)
- self.assertTrue(ass.rhs)
- self.assertTrue(ass.entry)
- self.assertEqual(ass.pos, arg_ass.pos)
- self.assertTrue(ass.is_arg)
- self.assertFalse(ass.is_deletion)
-
- name_del = NameDeletion(lhs, entry)
- ass = deepcopy(name_del)
- self.assertTrue(ass.lhs)
- self.assertTrue(ass.rhs)
- self.assertTrue(ass.entry)
- self.assertEqual(ass.pos, name_del.pos)
- self.assertFalse(ass.is_arg)
- self.assertTrue(ass.is_deletion)
+
+from __future__ import absolute_import
+
+from copy import deepcopy
+from unittest import TestCase
+
+from Cython.Compiler.FlowControl import (
+ NameAssignment, StaticAssignment, Argument, NameDeletion)
+
+
+class FakeType(object):
+ is_pyobject = True
+
+
+class FakeNode(object):
+ pos = ('filename.pyx', 1, 2)
+ cf_state = None
+ type = FakeType()
+
+ def infer_type(self, scope):
+ return self.type
+
+
+class FakeEntry(object):
+ type = FakeType()
+
+
+class TestGraph(TestCase):
+ def test_deepcopy(self):
+ lhs, rhs = FakeNode(), FakeNode()
+ entry = FakeEntry()
+ entry.pos = lhs.pos
+
+ name_ass = NameAssignment(lhs, rhs, entry)
+ ass = deepcopy(name_ass)
+ self.assertTrue(ass.lhs)
+ self.assertTrue(ass.rhs)
+ self.assertTrue(ass.entry)
+ self.assertEqual(ass.pos, name_ass.pos)
+ self.assertFalse(ass.is_arg)
+ self.assertFalse(ass.is_deletion)
+
+ static_ass = StaticAssignment(entry)
+ ass = deepcopy(static_ass)
+ self.assertTrue(ass.lhs)
+ self.assertTrue(ass.rhs)
+ self.assertTrue(ass.entry)
+ self.assertEqual(ass.pos, static_ass.pos)
+ self.assertFalse(ass.is_arg)
+ self.assertFalse(ass.is_deletion)
+
+ arg_ass = Argument(lhs, rhs, entry)
+ ass = deepcopy(arg_ass)
+ self.assertTrue(ass.lhs)
+ self.assertTrue(ass.rhs)
+ self.assertTrue(ass.entry)
+ self.assertEqual(ass.pos, arg_ass.pos)
+ self.assertTrue(ass.is_arg)
+ self.assertFalse(ass.is_deletion)
+
+ name_del = NameDeletion(lhs, entry)
+ ass = deepcopy(name_del)
+ self.assertTrue(ass.lhs)
+ self.assertTrue(ass.rhs)
+ self.assertTrue(ass.entry)
+ self.assertEqual(ass.pos, name_del.pos)
+ self.assertFalse(ass.is_arg)
+ self.assertTrue(ass.is_deletion)
diff --git a/contrib/tools/cython/Cython/Compiler/Tests/TestGrammar.py b/contrib/tools/cython/Cython/Compiler/Tests/TestGrammar.py
index 3dddc960b3..a0ece5c1b5 100644
--- a/contrib/tools/cython/Cython/Compiler/Tests/TestGrammar.py
+++ b/contrib/tools/cython/Cython/Compiler/Tests/TestGrammar.py
@@ -1,129 +1,129 @@
-# mode: run
-# tag: syntax
-
-"""
-Uses TreeFragment to test invalid syntax.
-"""
-
-from __future__ import absolute_import
-
-from ...TestUtils import CythonTest
-from ..Errors import CompileError
-from .. import ExprNodes
-
-# Copied from CPython's test_grammar.py
-VALID_UNDERSCORE_LITERALS = [
- '0_0_0',
- '4_2',
- '1_0000_0000',
- '0b1001_0100',
- '0xffff_ffff',
- '0o5_7_7',
- '1_00_00.5',
- '1_00_00.5j',
- '1_00_00.5e5',
- '1_00_00j',
- '1_00_00e5_1',
- '1e1_0',
- '.1_4',
- '.1_4e1',
- '.1_4j',
-]
-
-# Copied from CPython's test_grammar.py
-INVALID_UNDERSCORE_LITERALS = [
- # Trailing underscores:
- '0_',
- '42_',
- '1.4j_',
- '0b1_',
- '0xf_',
- '0o5_',
- # Underscores in the base selector:
- '0_b0',
- '0_xf',
- '0_o5',
- # Underscore right after the base selector:
- '0b_0',
- '0x_f',
- '0o_5',
- # Old-style octal, still disallowed:
- #'0_7',
- #'09_99',
- # Special case with exponent:
- '0 if 1_Else 1',
- # Underscore right before a dot:
- '1_.4',
- '1_.4j',
- # Underscore right after a dot:
- '1._4',
- '1._4j',
- '._5',
- # Underscore right after a sign:
- '1.0e+_1',
- # Multiple consecutive underscores:
- '4_______2',
- '0.1__4',
- '0b1001__0100',
- '0xffff__ffff',
- '0o5__77',
- '1e1__0',
- # Underscore right before j:
- '1.4_j',
- '1.4e5_j',
- # Underscore right before e:
- '1_e1',
- '1.4_e1',
- # Underscore right after e:
- '1e_1',
- '1.4e_1',
- # Whitespace in literals
- '1_ 2',
- '1 _2',
- '1_2.2_ 1',
- '1_2.2 _1',
- '1_2e _1',
- '1_2e2 _1',
- '1_2e 2_1',
-]
-
-
-class TestGrammar(CythonTest):
-
- def test_invalid_number_literals(self):
- for literal in INVALID_UNDERSCORE_LITERALS:
- for expression in ['%s', '1 + %s', '%s + 1', '2 * %s', '%s * 2']:
- code = 'x = ' + expression % literal
- try:
- self.fragment(u'''\
- # cython: language_level=3
- ''' + code)
- except CompileError as exc:
- assert code in [s.strip() for s in str(exc).splitlines()], str(exc)
- else:
- assert False, "Invalid Cython code '%s' failed to raise an exception" % code
-
- def test_valid_number_literals(self):
- for literal in VALID_UNDERSCORE_LITERALS:
- for i, expression in enumerate(['%s', '1 + %s', '%s + 1', '2 * %s', '%s * 2']):
- code = 'x = ' + expression % literal
- node = self.fragment(u'''\
- # cython: language_level=3
- ''' + code).root
- assert node is not None
-
- literal_node = node.stats[0].rhs # StatListNode([SingleAssignmentNode('x', expr)])
- if i > 0:
- # Add/MulNode() -> literal is first or second operand
- literal_node = literal_node.operand2 if i % 2 else literal_node.operand1
- if 'j' in literal or 'J' in literal:
- assert isinstance(literal_node, ExprNodes.ImagNode)
- elif '.' in literal or 'e' in literal or 'E' in literal and not ('0x' in literal or '0X' in literal):
- assert isinstance(literal_node, ExprNodes.FloatNode)
- else:
- assert isinstance(literal_node, ExprNodes.IntNode)
-
-
-if __name__ == "__main__":
- import unittest
- unittest.main()
+# mode: run
+# tag: syntax
+
+"""
+Uses TreeFragment to test invalid syntax.
+"""
+
+from __future__ import absolute_import
+
+from ...TestUtils import CythonTest
+from ..Errors import CompileError
+from .. import ExprNodes
+
+# Copied from CPython's test_grammar.py
+VALID_UNDERSCORE_LITERALS = [
+ '0_0_0',
+ '4_2',
+ '1_0000_0000',
+ '0b1001_0100',
+ '0xffff_ffff',
+ '0o5_7_7',
+ '1_00_00.5',
+ '1_00_00.5j',
+ '1_00_00.5e5',
+ '1_00_00j',
+ '1_00_00e5_1',
+ '1e1_0',
+ '.1_4',
+ '.1_4e1',
+ '.1_4j',
+]
+
+# Copied from CPython's test_grammar.py
+INVALID_UNDERSCORE_LITERALS = [
+ # Trailing underscores:
+ '0_',
+ '42_',
+ '1.4j_',
+ '0b1_',
+ '0xf_',
+ '0o5_',
+ # Underscores in the base selector:
+ '0_b0',
+ '0_xf',
+ '0_o5',
+ # Underscore right after the base selector:
+ '0b_0',
+ '0x_f',
+ '0o_5',
+ # Old-style octal, still disallowed:
+ #'0_7',
+ #'09_99',
+ # Special case with exponent:
+ '0 if 1_Else 1',
+ # Underscore right before a dot:
+ '1_.4',
+ '1_.4j',
+ # Underscore right after a dot:
+ '1._4',
+ '1._4j',
+ '._5',
+ # Underscore right after a sign:
+ '1.0e+_1',
+ # Multiple consecutive underscores:
+ '4_______2',
+ '0.1__4',
+ '0b1001__0100',
+ '0xffff__ffff',
+ '0o5__77',
+ '1e1__0',
+ # Underscore right before j:
+ '1.4_j',
+ '1.4e5_j',
+ # Underscore right before e:
+ '1_e1',
+ '1.4_e1',
+ # Underscore right after e:
+ '1e_1',
+ '1.4e_1',
+ # Whitespace in literals
+ '1_ 2',
+ '1 _2',
+ '1_2.2_ 1',
+ '1_2.2 _1',
+ '1_2e _1',
+ '1_2e2 _1',
+ '1_2e 2_1',
+]
+
+
+class TestGrammar(CythonTest):
+
+ def test_invalid_number_literals(self):
+ for literal in INVALID_UNDERSCORE_LITERALS:
+ for expression in ['%s', '1 + %s', '%s + 1', '2 * %s', '%s * 2']:
+ code = 'x = ' + expression % literal
+ try:
+ self.fragment(u'''\
+ # cython: language_level=3
+ ''' + code)
+ except CompileError as exc:
+ assert code in [s.strip() for s in str(exc).splitlines()], str(exc)
+ else:
+ assert False, "Invalid Cython code '%s' failed to raise an exception" % code
+
+ def test_valid_number_literals(self):
+ for literal in VALID_UNDERSCORE_LITERALS:
+ for i, expression in enumerate(['%s', '1 + %s', '%s + 1', '2 * %s', '%s * 2']):
+ code = 'x = ' + expression % literal
+ node = self.fragment(u'''\
+ # cython: language_level=3
+ ''' + code).root
+ assert node is not None
+
+ literal_node = node.stats[0].rhs # StatListNode([SingleAssignmentNode('x', expr)])
+ if i > 0:
+ # Add/MulNode() -> literal is first or second operand
+ literal_node = literal_node.operand2 if i % 2 else literal_node.operand1
+ if 'j' in literal or 'J' in literal:
+ assert isinstance(literal_node, ExprNodes.ImagNode)
+ elif '.' in literal or 'e' in literal or 'E' in literal and not ('0x' in literal or '0X' in literal):
+ assert isinstance(literal_node, ExprNodes.FloatNode)
+ else:
+ assert isinstance(literal_node, ExprNodes.IntNode)
+
+
+if __name__ == "__main__":
+ import unittest
+ unittest.main()
diff --git a/contrib/tools/cython/Cython/Compiler/Tests/TestSignatureMatching.py b/contrib/tools/cython/Cython/Compiler/Tests/TestSignatureMatching.py
index 166bb225b9..4b0bef8175 100644
--- a/contrib/tools/cython/Cython/Compiler/Tests/TestSignatureMatching.py
+++ b/contrib/tools/cython/Cython/Compiler/Tests/TestSignatureMatching.py
@@ -16,7 +16,7 @@ class SignatureMatcherTest(unittest.TestCase):
Test the signature matching algorithm for overloaded signatures.
"""
def assertMatches(self, expected_type, arg_types, functions):
- match = pt.best_match(arg_types, functions)
+ match = pt.best_match(arg_types, functions)
if expected_type is not None:
self.assertNotEqual(None, match)
self.assertEqual(expected_type, match.type)
diff --git a/contrib/tools/cython/Cython/Compiler/TreeFragment.py b/contrib/tools/cython/Cython/Compiler/TreeFragment.py
index b85da8191a..5d2150f347 100644
--- a/contrib/tools/cython/Cython/Compiler/TreeFragment.py
+++ b/contrib/tools/cython/Cython/Compiler/TreeFragment.py
@@ -9,7 +9,7 @@ Support for parsing strings into code trees.
from __future__ import absolute_import
import re
-from io import StringIO
+from io import StringIO
from .Scanning import PyrexScanner, StringSourceDescriptor
from .Symtab import ModuleScope
@@ -17,7 +17,7 @@ from . import PyrexTypes
from .Visitor import VisitorTransform
from .Nodes import Node, StatListNode
from .ExprNodes import NameNode
-from .StringEncoding import _unicode
+from .StringEncoding import _unicode
from . import Parsing
from . import Main
from . import UtilNodes
@@ -25,21 +25,21 @@ from . import UtilNodes
class StringParseContext(Main.Context):
def __init__(self, name, include_directories=None, compiler_directives=None, cpp=False):
- if include_directories is None:
- include_directories = []
- if compiler_directives is None:
- compiler_directives = {}
- # TODO: see if "language_level=3" also works for our internal code here.
- Main.Context.__init__(self, include_directories, compiler_directives, cpp=cpp, language_level=2)
+ if include_directories is None:
+ include_directories = []
+ if compiler_directives is None:
+ compiler_directives = {}
+ # TODO: see if "language_level=3" also works for our internal code here.
+ Main.Context.__init__(self, include_directories, compiler_directives, cpp=cpp, language_level=2)
self.module_name = name
- def find_module(self, module_name, relative_to=None, pos=None, need_pxd=1, absolute_fallback=True):
+ def find_module(self, module_name, relative_to=None, pos=None, need_pxd=1, absolute_fallback=True):
if module_name not in (self.module_name, 'cython'):
raise AssertionError("Not yet supporting any cimports/includes from string code snippets")
- return ModuleScope(module_name, parent_module=None, context=self)
+ return ModuleScope(module_name, parent_module=None, context=self)
-def parse_from_strings(name, code, pxds=None, level=None, initial_pos=None,
+def parse_from_strings(name, code, pxds=None, level=None, initial_pos=None,
context=None, allow_struct_enum_decorator=False):
"""
Utility method to parse a (unicode) string of code. This is mostly
@@ -60,7 +60,7 @@ def parse_from_strings(name, code, pxds=None, level=None, initial_pos=None,
# to use a unicode string so that code fragments don't have to bother
# with encoding. This means that test code passed in should not have an
# encoding header.
- assert isinstance(code, _unicode), "unicode code snippets only please"
+ assert isinstance(code, _unicode), "unicode code snippets only please"
encoding = "UTF-8"
module_name = name
@@ -68,7 +68,7 @@ def parse_from_strings(name, code, pxds=None, level=None, initial_pos=None,
initial_pos = (name, 1, 0)
code_source = StringSourceDescriptor(name, code)
- scope = context.find_module(module_name, pos=initial_pos, need_pxd=False)
+ scope = context.find_module(module_name, pos=initial_pos, need_pxd=False)
buf = StringIO(code)
@@ -86,7 +86,7 @@ def parse_from_strings(name, code, pxds=None, level=None, initial_pos=None,
tree.scope = scope
return tree
-
+
class TreeCopier(VisitorTransform):
def visit_Node(self, node):
if node is None:
@@ -96,7 +96,7 @@ class TreeCopier(VisitorTransform):
self.visitchildren(c)
return c
-
+
class ApplyPositionAndCopy(TreeCopier):
def __init__(self, pos):
super(ApplyPositionAndCopy, self).__init__()
@@ -107,7 +107,7 @@ class ApplyPositionAndCopy(TreeCopier):
copy.pos = self.pos
return copy
-
+
class TemplateTransform(VisitorTransform):
"""
Makes a copy of a template tree while doing substitutions.
@@ -197,16 +197,16 @@ class TemplateTransform(VisitorTransform):
else:
return self.visit_Node(node)
-
+
def copy_code_tree(node):
return TreeCopier()(node)
-
-_match_indent = re.compile(u"^ *").match
-
-
+
+_match_indent = re.compile(u"^ *").match
+
+
def strip_common_indent(lines):
- """Strips empty lines and common indentation from the list of strings given in lines"""
+ """Strips empty lines and common indentation from the list of strings given in lines"""
# TODO: Facilitate textwrap.indent instead
lines = [x for x in lines if x.strip() != u""]
if lines:
@@ -214,24 +214,24 @@ def strip_common_indent(lines):
lines = [x[minindent:] for x in lines]
return lines
-
+
class TreeFragment(object):
- def __init__(self, code, name=None, pxds=None, temps=None, pipeline=None, level=None, initial_pos=None):
- if pxds is None:
- pxds = {}
- if temps is None:
- temps = []
- if pipeline is None:
- pipeline = []
- if not name:
- name = "(tree fragment)"
-
- if isinstance(code, _unicode):
+ def __init__(self, code, name=None, pxds=None, temps=None, pipeline=None, level=None, initial_pos=None):
+ if pxds is None:
+ pxds = {}
+ if temps is None:
+ temps = []
+ if pipeline is None:
+ pipeline = []
+ if not name:
+ name = "(tree fragment)"
+
+ if isinstance(code, _unicode):
def fmt(x): return u"\n".join(strip_common_indent(x.split(u"\n")))
fmt_code = fmt(code)
fmt_pxds = {}
- for key, value in pxds.items():
+ for key, value in pxds.items():
fmt_pxds[key] = fmt(value)
mod = t = parse_from_strings(name, fmt_code, fmt_pxds, level=level, initial_pos=initial_pos)
if level is None:
@@ -244,8 +244,8 @@ class TreeFragment(object):
t = transform(t)
self.root = t
elif isinstance(code, Node):
- if pxds:
- raise NotImplementedError()
+ if pxds:
+ raise NotImplementedError()
self.root = code
else:
raise ValueError("Unrecognized code format (accepts unicode and Node)")
@@ -254,16 +254,16 @@ class TreeFragment(object):
def copy(self):
return copy_code_tree(self.root)
- def substitute(self, nodes=None, temps=None, pos = None):
- if nodes is None:
- nodes = {}
- if temps is None:
- temps = []
+ def substitute(self, nodes=None, temps=None, pos = None):
+ if nodes is None:
+ nodes = {}
+ if temps is None:
+ temps = []
return TemplateTransform()(self.root,
substitutions = nodes,
temps = self.temps + temps, pos = pos)
-
+
class SetPosTransform(VisitorTransform):
def __init__(self, pos):
super(SetPosTransform, self).__init__()
diff --git a/contrib/tools/cython/Cython/Compiler/TreePath.py b/contrib/tools/cython/Cython/Compiler/TreePath.py
index 8585905557..20db8aae26 100644
--- a/contrib/tools/cython/Cython/Compiler/TreePath.py
+++ b/contrib/tools/cython/Cython/Compiler/TreePath.py
@@ -18,14 +18,14 @@ else:
_unicode = unicode
path_tokenizer = re.compile(
- r"("
- r"'[^']*'|\"[^\"]*\"|"
- r"//?|"
- r"\(\)|"
- r"==?|"
- r"[/.*\[\]()@])|"
- r"([^/\[\]()@=\s]+)|"
- r"\s+"
+ r"("
+ r"'[^']*'|\"[^\"]*\"|"
+ r"//?|"
+ r"\(\)|"
+ r"==?|"
+ r"[/.*\[\]()@])|"
+ r"([^/\[\]()@=\s]+)|"
+ r"\s+"
).findall
def iterchildren(node, attr_name):
diff --git a/contrib/tools/cython/Cython/Compiler/TypeInference.py b/contrib/tools/cython/Cython/Compiler/TypeInference.py
index c7ffee7d24..1edda5bbfa 100644
--- a/contrib/tools/cython/Cython/Compiler/TypeInference.py
+++ b/contrib/tools/cython/Cython/Compiler/TypeInference.py
@@ -9,19 +9,19 @@ from .. import Utils
from .PyrexTypes import py_object_type, unspecified_type
from .Visitor import CythonTransform, EnvTransform
-try:
- reduce
-except NameError:
- from functools import reduce
-
+try:
+ reduce
+except NameError:
+ from functools import reduce
+
class TypedExprNode(ExprNodes.ExprNode):
# Used for declaring assignments of a specified type without a known entry.
- subexprs = []
-
- def __init__(self, type, pos=None):
- super(TypedExprNode, self).__init__(pos, type=type)
+ subexprs = []
+ def __init__(self, type, pos=None):
+ super(TypedExprNode, self).__init__(pos, type=type)
+
object_expr = TypedExprNode(py_object_type)
@@ -68,12 +68,12 @@ class MarkParallelAssignments(EnvTransform):
parallel_node.assigned_nodes.append(lhs)
elif isinstance(lhs, ExprNodes.SequenceNode):
- for i, arg in enumerate(lhs.args):
- if not rhs or arg.is_starred:
- item_node = None
- else:
- item_node = rhs.inferable_item_node(i)
- self.mark_assignment(arg, item_node)
+ for i, arg in enumerate(lhs.args):
+ if not rhs or arg.is_starred:
+ item_node = None
+ else:
+ item_node = rhs.inferable_item_node(i)
+ self.mark_assignment(arg, item_node)
else:
# Could use this info to infer cdef class attributes...
pass
@@ -191,10 +191,10 @@ class MarkParallelAssignments(EnvTransform):
# use fake expressions with the right result type
if node.star_arg:
self.mark_assignment(
- node.star_arg, TypedExprNode(Builtin.tuple_type, node.pos))
+ node.star_arg, TypedExprNode(Builtin.tuple_type, node.pos))
if node.starstar_arg:
self.mark_assignment(
- node.starstar_arg, TypedExprNode(Builtin.dict_type, node.pos))
+ node.starstar_arg, TypedExprNode(Builtin.dict_type, node.pos))
EnvTransform.visit_FuncDefNode(self, node)
return node
@@ -404,7 +404,7 @@ class SimpleAssignmentTypeInferer(object):
else:
entry = node.entry
node_type = spanning_type(
- types, entry.might_overflow, entry.pos, scope)
+ types, entry.might_overflow, entry.pos, scope)
node.inferred_type = node_type
def infer_name_node_type_partial(node):
@@ -413,7 +413,7 @@ class SimpleAssignmentTypeInferer(object):
if not types:
return
entry = node.entry
- return spanning_type(types, entry.might_overflow, entry.pos, scope)
+ return spanning_type(types, entry.might_overflow, entry.pos, scope)
def inferred_types(entry):
has_none = False
@@ -488,7 +488,7 @@ class SimpleAssignmentTypeInferer(object):
types = inferred_types(entry)
if types and all(types):
entry_type = spanning_type(
- types, entry.might_overflow, entry.pos, scope)
+ types, entry.might_overflow, entry.pos, scope)
inferred.add(entry)
self.set_entry_type(entry, entry_type)
@@ -498,7 +498,7 @@ class SimpleAssignmentTypeInferer(object):
for assmt in entry.cf_assignments:
assmt.infer_type()
types = inferred_types(entry)
- new_type = spanning_type(types, entry.might_overflow, entry.pos, scope)
+ new_type = spanning_type(types, entry.might_overflow, entry.pos, scope)
if new_type != entry.type:
self.set_entry_type(entry, new_type)
dirty = True
@@ -530,22 +530,22 @@ def find_spanning_type(type1, type2):
return PyrexTypes.c_double_type
return result_type
-def simply_type(result_type, pos):
+def simply_type(result_type, pos):
if result_type.is_reference:
result_type = result_type.ref_base_type
if result_type.is_const:
result_type = result_type.const_base_type
if result_type.is_cpp_class:
result_type.check_nullary_constructor(pos)
- if result_type.is_array:
- result_type = PyrexTypes.c_ptr_type(result_type.base_type)
+ if result_type.is_array:
+ result_type = PyrexTypes.c_ptr_type(result_type.base_type)
return result_type
-def aggressive_spanning_type(types, might_overflow, pos, scope):
- return simply_type(reduce(find_spanning_type, types), pos)
-
-def safe_spanning_type(types, might_overflow, pos, scope):
- result_type = simply_type(reduce(find_spanning_type, types), pos)
+def aggressive_spanning_type(types, might_overflow, pos, scope):
+ return simply_type(reduce(find_spanning_type, types), pos)
+
+def safe_spanning_type(types, might_overflow, pos, scope):
+ result_type = simply_type(reduce(find_spanning_type, types), pos)
if result_type.is_pyobject:
# In theory, any specific Python type is always safe to
# infer. However, inferring str can cause some existing code
@@ -581,9 +581,9 @@ def safe_spanning_type(types, might_overflow, pos, scope):
# to make sure everything is supported.
elif (result_type.is_int or result_type.is_enum) and not might_overflow:
return result_type
- elif (not result_type.can_coerce_to_pyobject(scope)
- and not result_type.is_error):
- return result_type
+ elif (not result_type.can_coerce_to_pyobject(scope)
+ and not result_type.is_error):
+ return result_type
return py_object_type
diff --git a/contrib/tools/cython/Cython/Compiler/TypeSlots.py b/contrib/tools/cython/Cython/Compiler/TypeSlots.py
index 0b4ff67042..34e31df0af 100644
--- a/contrib/tools/cython/Cython/Compiler/TypeSlots.py
+++ b/contrib/tools/cython/Cython/Compiler/TypeSlots.py
@@ -7,7 +7,7 @@ from __future__ import absolute_import
from . import Naming
from . import PyrexTypes
-from .Errors import error
+from .Errors import error
invisible = ['__cinit__', '__dealloc__', '__richcmp__',
'__nonzero__', '__bool__']
@@ -73,7 +73,7 @@ class Signature(object):
}
type_to_format_map = dict(
- (type_, format_) for format_, type_ in format_map.items())
+ (type_, format_) for format_, type_ in format_map.items())
error_value_map = {
'O': "NULL",
@@ -101,12 +101,12 @@ class Signature(object):
self.exception_check = ret_format != 'r' and self.error_value is not None
self.is_staticmethod = False
- def __repr__(self):
- return '<Signature[%s(%s%s)]>' % (
- self.ret_format,
- ', '.join(self.fixed_arg_format),
- '*' if self.has_generic_args else '')
-
+ def __repr__(self):
+ return '<Signature[%s(%s%s)]>' % (
+ self.ret_format,
+ ', '.join(self.fixed_arg_format),
+ '*' if self.has_generic_args else '')
+
def num_fixed_args(self):
return len(self.fixed_arg_format)
@@ -135,7 +135,7 @@ class Signature(object):
def function_type(self, self_arg_override=None):
# Construct a C function type descriptor for this signature
args = []
- for i in range(self.num_fixed_args()):
+ for i in range(self.num_fixed_args()):
if self_arg_override is not None and self.is_self_arg(i):
assert isinstance(self_arg_override, PyrexTypes.CFuncTypeArg)
args.append(self_arg_override)
@@ -202,10 +202,10 @@ class SlotDescriptor(object):
return guard
def generate(self, scope, code):
- preprocessor_guard = self.preprocessor_guard_code()
- if preprocessor_guard:
- code.putln(preprocessor_guard)
-
+ preprocessor_guard = self.preprocessor_guard_code()
+ if preprocessor_guard:
+ code.putln(preprocessor_guard)
+
end_pypy_guard = False
if self.is_initialised_dynamically:
value = "0"
@@ -229,12 +229,12 @@ class SlotDescriptor(object):
code.putln("%s, /*%s*/" % (inherited_value, self.slot_name))
code.putln("#else")
end_pypy_guard = True
-
+
code.putln("%s, /*%s*/" % (value, self.slot_name))
-
- if end_pypy_guard:
- code.putln("#endif")
-
+
+ if end_pypy_guard:
+ code.putln("#endif")
+
if self.py3 == '<RESERVED>':
code.putln("#else")
code.putln("0, /*reserved*/")
@@ -370,7 +370,7 @@ class ConstructorSlot(InternalMethodSlot):
and scope.parent_type.base_type
and not scope.has_pyobject_attrs
and not scope.has_memoryview_attrs
- and not scope.has_cpp_class_attrs
+ and not scope.has_cpp_class_attrs
and not (entry and entry.is_special)):
# if the type does not have object attributes, it can
# delegate GC methods to its parent - iff the parent
@@ -439,12 +439,12 @@ class DocStringSlot(SlotDescriptor):
# Descriptor for the docstring slot.
def slot_code(self, scope):
- doc = scope.doc
- if doc is None:
+ doc = scope.doc
+ if doc is None:
return "0"
- if doc.is_unicode:
- doc = doc.as_utf8_string()
- return doc.as_c_string_literal()
+ if doc.is_unicode:
+ doc = doc.as_utf8_string()
+ return doc.as_c_string_literal()
class SuiteSlot(SlotDescriptor):
@@ -452,8 +452,8 @@ class SuiteSlot(SlotDescriptor):
#
# sub_slots [SlotDescriptor]
- def __init__(self, sub_slots, slot_type, slot_name, ifdef=None):
- SlotDescriptor.__init__(self, slot_name, ifdef=ifdef)
+ def __init__(self, sub_slots, slot_type, slot_name, ifdef=None):
+ SlotDescriptor.__init__(self, slot_name, ifdef=ifdef)
self.sub_slots = sub_slots
self.slot_type = slot_type
substructures.append(self)
@@ -475,8 +475,8 @@ class SuiteSlot(SlotDescriptor):
def generate_substructure(self, scope, code):
if not self.is_empty(scope):
code.putln("")
- if self.ifdef:
- code.putln("#if %s" % self.ifdef)
+ if self.ifdef:
+ code.putln("#if %s" % self.ifdef)
code.putln(
"static %s %s = {" % (
self.slot_type,
@@ -484,8 +484,8 @@ class SuiteSlot(SlotDescriptor):
for slot in self.sub_slots:
slot.generate(scope, code)
code.putln("};")
- if self.ifdef:
- code.putln("#endif")
+ if self.ifdef:
+ code.putln("#endif")
substructures = [] # List of all SuiteSlot instances
@@ -531,27 +531,27 @@ class BaseClassSlot(SlotDescriptor):
base_type.typeptr_cname))
-class DictOffsetSlot(SlotDescriptor):
- # Slot descriptor for a class' dict offset, for dynamic attributes.
-
- def slot_code(self, scope):
+class DictOffsetSlot(SlotDescriptor):
+ # Slot descriptor for a class' dict offset, for dynamic attributes.
+
+ def slot_code(self, scope):
dict_entry = scope.lookup_here("__dict__") if not scope.is_closure_class_scope else None
- if dict_entry and dict_entry.is_variable:
- if getattr(dict_entry.type, 'cname', None) != 'PyDict_Type':
- error(dict_entry.pos, "__dict__ slot must be of type 'dict'")
- return "0"
- type = scope.parent_type
- if type.typedef_flag:
- objstruct = type.objstruct_cname
- else:
- objstruct = "struct %s" % type.objstruct_cname
- return ("offsetof(%s, %s)" % (
- objstruct,
- dict_entry.cname))
- else:
- return "0"
-
-
+ if dict_entry and dict_entry.is_variable:
+ if getattr(dict_entry.type, 'cname', None) != 'PyDict_Type':
+ error(dict_entry.pos, "__dict__ slot must be of type 'dict'")
+ return "0"
+ type = scope.parent_type
+ if type.typedef_flag:
+ objstruct = type.objstruct_cname
+ else:
+ objstruct = "struct %s" % type.objstruct_cname
+ return ("offsetof(%s, %s)" % (
+ objstruct,
+ dict_entry.cname))
+ else:
+ return "0"
+
+
# The following dictionary maps __xxx__ method names to slot descriptors.
method_name_to_slot = {}
@@ -726,12 +726,12 @@ property_accessor_signatures = {
#------------------------------------------------------------------------------------------
PyNumberMethods_Py3_GUARD = "PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)"
-
+
PyNumberMethods = (
MethodSlot(binaryfunc, "nb_add", "__add__"),
MethodSlot(binaryfunc, "nb_subtract", "__sub__"),
MethodSlot(binaryfunc, "nb_multiply", "__mul__"),
- MethodSlot(binaryfunc, "nb_divide", "__div__", ifdef = PyNumberMethods_Py3_GUARD),
+ MethodSlot(binaryfunc, "nb_divide", "__div__", ifdef = PyNumberMethods_Py3_GUARD),
MethodSlot(binaryfunc, "nb_remainder", "__mod__"),
MethodSlot(binaryfunc, "nb_divmod", "__divmod__"),
MethodSlot(ternaryfunc, "nb_power", "__pow__"),
@@ -745,18 +745,18 @@ PyNumberMethods = (
MethodSlot(binaryfunc, "nb_and", "__and__"),
MethodSlot(binaryfunc, "nb_xor", "__xor__"),
MethodSlot(binaryfunc, "nb_or", "__or__"),
- EmptySlot("nb_coerce", ifdef = PyNumberMethods_Py3_GUARD),
+ EmptySlot("nb_coerce", ifdef = PyNumberMethods_Py3_GUARD),
MethodSlot(unaryfunc, "nb_int", "__int__", fallback="__long__"),
MethodSlot(unaryfunc, "nb_long", "__long__", fallback="__int__", py3 = "<RESERVED>"),
MethodSlot(unaryfunc, "nb_float", "__float__"),
- MethodSlot(unaryfunc, "nb_oct", "__oct__", ifdef = PyNumberMethods_Py3_GUARD),
- MethodSlot(unaryfunc, "nb_hex", "__hex__", ifdef = PyNumberMethods_Py3_GUARD),
+ MethodSlot(unaryfunc, "nb_oct", "__oct__", ifdef = PyNumberMethods_Py3_GUARD),
+ MethodSlot(unaryfunc, "nb_hex", "__hex__", ifdef = PyNumberMethods_Py3_GUARD),
# Added in release 2.0
MethodSlot(ibinaryfunc, "nb_inplace_add", "__iadd__"),
MethodSlot(ibinaryfunc, "nb_inplace_subtract", "__isub__"),
MethodSlot(ibinaryfunc, "nb_inplace_multiply", "__imul__"),
- MethodSlot(ibinaryfunc, "nb_inplace_divide", "__idiv__", ifdef = PyNumberMethods_Py3_GUARD),
+ MethodSlot(ibinaryfunc, "nb_inplace_divide", "__idiv__", ifdef = PyNumberMethods_Py3_GUARD),
MethodSlot(ibinaryfunc, "nb_inplace_remainder", "__imod__"),
MethodSlot(ibinaryfunc, "nb_inplace_power", "__ipow__"), # actually ternaryfunc!!!
MethodSlot(ibinaryfunc, "nb_inplace_lshift", "__ilshift__"),
@@ -809,13 +809,13 @@ PyBufferProcs = (
MethodSlot(releasebufferproc, "bf_releasebuffer", "__releasebuffer__")
)
-PyAsyncMethods = (
- MethodSlot(unaryfunc, "am_await", "__await__"),
- MethodSlot(unaryfunc, "am_aiter", "__aiter__"),
- MethodSlot(unaryfunc, "am_anext", "__anext__"),
+PyAsyncMethods = (
+ MethodSlot(unaryfunc, "am_await", "__await__"),
+ MethodSlot(unaryfunc, "am_aiter", "__aiter__"),
+ MethodSlot(unaryfunc, "am_anext", "__anext__"),
EmptySlot("am_send", ifdef="PY_VERSION_HEX >= 0x030A00A3"),
-)
-
+)
+
#------------------------------------------------------------------------------------------
#
# The main slot table. This table contains descriptors for all the
@@ -826,15 +826,15 @@ PyAsyncMethods = (
slot_table = (
ConstructorSlot("tp_dealloc", '__dealloc__'),
- EmptySlot("tp_print", ifdef="PY_VERSION_HEX < 0x030800b4"),
- EmptySlot("tp_vectorcall_offset", ifdef="PY_VERSION_HEX >= 0x030800b4"),
+ EmptySlot("tp_print", ifdef="PY_VERSION_HEX < 0x030800b4"),
+ EmptySlot("tp_vectorcall_offset", ifdef="PY_VERSION_HEX >= 0x030800b4"),
EmptySlot("tp_getattr"),
EmptySlot("tp_setattr"),
-
- # tp_compare (Py2) / tp_reserved (Py3<3.5) / tp_as_async (Py3.5+) is always used as tp_as_async in Py3
- MethodSlot(cmpfunc, "tp_compare", "__cmp__", ifdef="PY_MAJOR_VERSION < 3"),
- SuiteSlot(PyAsyncMethods, "__Pyx_PyAsyncMethodsStruct", "tp_as_async", ifdef="PY_MAJOR_VERSION >= 3"),
-
+
+ # tp_compare (Py2) / tp_reserved (Py3<3.5) / tp_as_async (Py3.5+) is always used as tp_as_async in Py3
+ MethodSlot(cmpfunc, "tp_compare", "__cmp__", ifdef="PY_MAJOR_VERSION < 3"),
+ SuiteSlot(PyAsyncMethods, "__Pyx_PyAsyncMethodsStruct", "tp_as_async", ifdef="PY_MAJOR_VERSION >= 3"),
+
MethodSlot(reprfunc, "tp_repr", "__repr__"),
SuiteSlot(PyNumberMethods, "PyNumberMethods", "tp_as_number"),
@@ -873,7 +873,7 @@ slot_table = (
SyntheticSlot("tp_descr_get", ["__get__"], "0"),
SyntheticSlot("tp_descr_set", ["__set__", "__delete__"], "0"),
- DictOffsetSlot("tp_dictoffset"),
+ DictOffsetSlot("tp_dictoffset"),
MethodSlot(initproc, "tp_init", "__init__"),
EmptySlot("tp_alloc"), #FixedSlot("tp_alloc", "PyType_GenericAlloc"),
diff --git a/contrib/tools/cython/Cython/Compiler/UtilNodes.py b/contrib/tools/cython/Cython/Compiler/UtilNodes.py
index c41748ace0..376fb602e1 100644
--- a/contrib/tools/cython/Cython/Compiler/UtilNodes.py
+++ b/contrib/tools/cython/Cython/Compiler/UtilNodes.py
@@ -51,15 +51,15 @@ class TempRefNode(AtomicExprNode):
def generate_result_code(self, code):
pass
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
if self.type.is_pyobject:
rhs.make_owned_reference(code)
# TODO: analyse control flow to see if this is necessary
code.put_xdecref(self.result(), self.ctype())
- code.putln('%s = %s;' % (
- self.result(),
- rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()),
- ))
+ code.putln('%s = %s;' % (
+ self.result(),
+ rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()),
+ ))
rhs.generate_post_assignment_code(code)
rhs.free_temps(code)
@@ -142,15 +142,15 @@ class ResultRefNode(AtomicExprNode):
else:
return ()
- def update_expression(self, expression):
- self.expression = expression
- if hasattr(expression, "type"):
- self.type = expression.type
-
+ def update_expression(self, expression):
+ self.expression = expression
+ if hasattr(expression, "type"):
+ self.type = expression.type
+
def analyse_types(self, env):
if self.expression is not None:
- if not self.expression.type:
- self.expression = self.expression.analyse_types(env)
+ if not self.expression.type:
+ self.expression = self.expression.analyse_types(env)
self.type = self.expression.type
return self
@@ -197,15 +197,15 @@ class ResultRefNode(AtomicExprNode):
def generate_disposal_code(self, code):
pass
- def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
+ def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
if self.type.is_pyobject:
rhs.make_owned_reference(code)
if not self.lhs_of_first_assignment:
code.put_decref(self.result(), self.ctype())
- code.putln('%s = %s;' % (
- self.result(),
- rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()),
- ))
+ code.putln('%s = %s;' % (
+ self.result(),
+ rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()),
+ ))
rhs.generate_post_assignment_code(code)
rhs.free_temps(code)
@@ -250,7 +250,7 @@ class LetNodeMixin:
code.put_decref_clear(self.temp, self.temp_type)
code.funcstate.release_temp(self.temp)
-
+
class EvalWithTempExprNode(ExprNodes.ExprNode, LetNodeMixin):
# A wrapper around a subexpression that moves an expression into a
# temp variable and provides it to the subexpression.
@@ -275,7 +275,7 @@ class EvalWithTempExprNode(ExprNodes.ExprNode, LetNodeMixin):
def analyse_types(self, env):
self.temp_expression = self.temp_expression.analyse_types(env)
- self.lazy_temp.update_expression(self.temp_expression) # overwrite in case it changed
+ self.lazy_temp.update_expression(self.temp_expression) # overwrite in case it changed
self.subexpression = self.subexpression.analyse_types(env)
self.type = self.subexpression.type
return self
@@ -291,10 +291,10 @@ class EvalWithTempExprNode(ExprNodes.ExprNode, LetNodeMixin):
self.subexpression.generate_evaluation_code(code)
self.teardown_temp_expr(code)
-
+
LetRefNode = ResultRefNode
-
+
class LetNode(Nodes.StatNode, LetNodeMixin):
# Implements a local temporary variable scope. Imagine this
# syntax being present:
diff --git a/contrib/tools/cython/Cython/Compiler/UtilityCode.py b/contrib/tools/cython/Cython/Compiler/UtilityCode.py
index 98e9ab5bfb..91daffe65f 100644
--- a/contrib/tools/cython/Cython/Compiler/UtilityCode.py
+++ b/contrib/tools/cython/Cython/Compiler/UtilityCode.py
@@ -16,7 +16,7 @@ class NonManglingModuleScope(Symtab.ModuleScope):
def add_imported_entry(self, name, entry, pos):
entry.used = True
- return super(NonManglingModuleScope, self).add_imported_entry(name, entry, pos)
+ return super(NonManglingModuleScope, self).add_imported_entry(name, entry, pos)
def mangle(self, prefix, name=None):
if name:
@@ -28,13 +28,13 @@ class NonManglingModuleScope(Symtab.ModuleScope):
else:
return Symtab.ModuleScope.mangle(self, prefix)
-
+
class CythonUtilityCodeContext(StringParseContext):
scope = None
- def find_module(self, module_name, relative_to=None, pos=None, need_pxd=True, absolute_fallback=True):
- if relative_to:
- raise AssertionError("Relative imports not supported in utility code.")
+ def find_module(self, module_name, relative_to=None, pos=None, need_pxd=True, absolute_fallback=True):
+ if relative_to:
+ raise AssertionError("Relative imports not supported in utility code.")
if module_name != self.module_name:
if module_name not in self.modules:
raise AssertionError("Only the cython cimport is supported.")
@@ -42,7 +42,7 @@ class CythonUtilityCodeContext(StringParseContext):
return self.modules[module_name]
if self.scope is None:
- self.scope = NonManglingModuleScope(
+ self.scope = NonManglingModuleScope(
self.prefix, module_name, parent_module=None, context=self, cpp=self.cpp)
return self.scope
@@ -68,8 +68,8 @@ class CythonUtilityCode(Code.UtilityCodeBase):
is_cython_utility = True
def __init__(self, impl, name="__pyxutil", prefix="", requires=None,
- file=None, from_scope=None, context=None, compiler_directives=None,
- outer_module_scope=None):
+ file=None, from_scope=None, context=None, compiler_directives=None,
+ outer_module_scope=None):
# 1) We need to delay the parsing/processing, so that all modules can be
# imported without import loops
# 2) The same utility code object can be used for multiple source files;
@@ -90,25 +90,25 @@ class CythonUtilityCode(Code.UtilityCodeBase):
self.prefix = prefix
self.requires = requires or []
self.from_scope = from_scope
- self.outer_module_scope = outer_module_scope
- self.compiler_directives = compiler_directives
+ self.outer_module_scope = outer_module_scope
+ self.compiler_directives = compiler_directives
self.context_types = context_types
- def __eq__(self, other):
- if isinstance(other, CythonUtilityCode):
- return self._equality_params() == other._equality_params()
- else:
- return False
-
- def _equality_params(self):
- outer_scope = self.outer_module_scope
- while isinstance(outer_scope, NonManglingModuleScope):
- outer_scope = outer_scope.outer_scope
- return self.impl, outer_scope, self.compiler_directives
-
- def __hash__(self):
- return hash(self.impl)
-
+ def __eq__(self, other):
+ if isinstance(other, CythonUtilityCode):
+ return self._equality_params() == other._equality_params()
+ else:
+ return False
+
+ def _equality_params(self):
+ outer_scope = self.outer_module_scope
+ while isinstance(outer_scope, NonManglingModuleScope):
+ outer_scope = outer_scope.outer_scope
+ return self.impl, outer_scope, self.compiler_directives
+
+ def __hash__(self):
+ return hash(self.impl)
+
def get_tree(self, entries_only=False, cython_scope=None):
from .AnalysedTreeTransforms import AutoTestDictTransform
# The AutoTestDictTransform creates the statement "__test__ = {}",
@@ -117,14 +117,14 @@ class CythonUtilityCode(Code.UtilityCodeBase):
excludes = [AutoTestDictTransform]
from . import Pipeline, ParseTreeTransforms
- context = CythonUtilityCodeContext(
+ context = CythonUtilityCodeContext(
self.name, compiler_directives=self.compiler_directives,
cpp=cython_scope.is_cpp() if cython_scope else False)
context.prefix = self.prefix
context.cython_scope = cython_scope
#context = StringParseContext(self.name)
- tree = parse_from_strings(
- self.name, self.impl, context=context, allow_struct_enum_decorator=True)
+ tree = parse_from_strings(
+ self.name, self.impl, context=context, allow_struct_enum_decorator=True)
pipeline = Pipeline.create_pipeline(context, 'pyx', exclude_classes=excludes)
if entries_only:
@@ -143,33 +143,33 @@ class CythonUtilityCode(Code.UtilityCodeBase):
pipeline = Pipeline.insert_into_pipeline(pipeline, transform,
before=before)
- def merge_scope(scope):
- def merge_scope_transform(module_node):
- module_node.scope.merge_in(scope)
+ def merge_scope(scope):
+ def merge_scope_transform(module_node):
+ module_node.scope.merge_in(scope)
return module_node
- return merge_scope_transform
-
- if self.from_scope:
- pipeline = Pipeline.insert_into_pipeline(
- pipeline, merge_scope(self.from_scope),
- before=ParseTreeTransforms.AnalyseDeclarationsTransform)
-
- for dep in self.requires:
- if isinstance(dep, CythonUtilityCode) and hasattr(dep, 'tree') and not cython_scope:
- pipeline = Pipeline.insert_into_pipeline(
- pipeline, merge_scope(dep.tree.scope),
- before=ParseTreeTransforms.AnalyseDeclarationsTransform)
-
- if self.outer_module_scope:
- # inject outer module between utility code module and builtin module
- def scope_transform(module_node):
- module_node.scope.outer_scope = self.outer_module_scope
- return module_node
-
- pipeline = Pipeline.insert_into_pipeline(
- pipeline, scope_transform,
- before=ParseTreeTransforms.AnalyseDeclarationsTransform)
-
+ return merge_scope_transform
+
+ if self.from_scope:
+ pipeline = Pipeline.insert_into_pipeline(
+ pipeline, merge_scope(self.from_scope),
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
+
+ for dep in self.requires:
+ if isinstance(dep, CythonUtilityCode) and hasattr(dep, 'tree') and not cython_scope:
+ pipeline = Pipeline.insert_into_pipeline(
+ pipeline, merge_scope(dep.tree.scope),
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
+
+ if self.outer_module_scope:
+ # inject outer module between utility code module and builtin module
+ def scope_transform(module_node):
+ module_node.scope.outer_scope = self.outer_module_scope
+ return module_node
+
+ pipeline = Pipeline.insert_into_pipeline(
+ pipeline, scope_transform,
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
+
if self.context_types:
# inject types into module scope
def scope_transform(module_node):
@@ -184,7 +184,7 @@ class CythonUtilityCode(Code.UtilityCodeBase):
(err, tree) = Pipeline.run_pipeline(pipeline, tree, printtree=False)
assert not err, err
- self.tree = tree
+ self.tree = tree
return tree
def put_code(self, output):
@@ -213,12 +213,12 @@ class CythonUtilityCode(Code.UtilityCodeBase):
entries.pop('__builtins__')
entries.pop('__doc__')
- for entry in entries.values():
+ for entry in entries.values():
entry.utility_code_definition = self
entry.used = used
original_scope = tree.scope
- dest_scope.merge_in(original_scope, merge_unused=True, whitelist=whitelist)
+ dest_scope.merge_in(original_scope, merge_unused=True, whitelist=whitelist)
tree.scope = dest_scope
for dep in self.requires:
@@ -227,7 +227,7 @@ class CythonUtilityCode(Code.UtilityCodeBase):
return original_scope
-
+
def declare_declarations_in_scope(declaration_string, env, private_type=True,
*args, **kwargs):
"""
diff --git a/contrib/tools/cython/Cython/Compiler/Visitor.pxd b/contrib/tools/cython/Cython/Compiler/Visitor.pxd
index d5d5692aa7..36fe5b1885 100644
--- a/contrib/tools/cython/Cython/Compiler/Visitor.pxd
+++ b/contrib/tools/cython/Cython/Compiler/Visitor.pxd
@@ -12,13 +12,13 @@ cdef class TreeVisitor:
cdef _visitchild(self, child, parent, attrname, idx)
cdef dict _visitchildren(self, parent, attrs)
cpdef visitchildren(self, parent, attrs=*)
- cdef _raise_compiler_error(self, child, e)
+ cdef _raise_compiler_error(self, child, e)
cdef class VisitorTransform(TreeVisitor):
- cdef dict _process_children(self, parent, attrs=*)
- cpdef visitchildren(self, parent, attrs=*, exclude=*)
- cdef list _flatten_list(self, list orig_list)
- cdef list _select_attrs(self, attrs, exclude)
+ cdef dict _process_children(self, parent, attrs=*)
+ cpdef visitchildren(self, parent, attrs=*, exclude=*)
+ cdef list _flatten_list(self, list orig_list)
+ cdef list _select_attrs(self, attrs, exclude)
cdef class CythonTransform(VisitorTransform):
cdef public context
diff --git a/contrib/tools/cython/Cython/Compiler/Visitor.py b/contrib/tools/cython/Cython/Compiler/Visitor.py
index a35d13e1d0..ad5525fe01 100644
--- a/contrib/tools/cython/Cython/Compiler/Visitor.py
+++ b/contrib/tools/cython/Cython/Compiler/Visitor.py
@@ -1,14 +1,14 @@
# cython: infer_types=True
-# cython: language_level=3
-# cython: auto_pickle=False
+# cython: language_level=3
+# cython: auto_pickle=False
#
# Tree visitor and transform framework
#
-from __future__ import absolute_import, print_function
+from __future__ import absolute_import, print_function
-import sys
+import sys
import inspect
from . import TypeSlots
@@ -17,19 +17,19 @@ from . import Nodes
from . import ExprNodes
from . import Errors
from . import DebugFlags
-from . import Future
+from . import Future
import cython
-cython.declare(_PRINTABLE=tuple)
-
-if sys.version_info[0] >= 3:
- _PRINTABLE = (bytes, str, int, float)
-else:
- _PRINTABLE = (str, unicode, long, int, float)
-
-
+cython.declare(_PRINTABLE=tuple)
+
+if sys.version_info[0] >= 3:
+ _PRINTABLE = (bytes, str, int, float)
+else:
+ _PRINTABLE = (str, unicode, long, int, float)
+
+
class TreeVisitor(object):
"""
Base class for writing visitors for a Cython tree, contains utilities for
@@ -59,9 +59,9 @@ class TreeVisitor(object):
>>> tree = SampleNode(0, SampleNode(1), [SampleNode(2), SampleNode(3)])
>>> class MyVisitor(TreeVisitor):
... def visit_SampleNode(self, node):
- ... print("in %s %s" % (node.value, self.access_path))
+ ... print("in %s %s" % (node.value, self.access_path))
... self.visitchildren(node)
- ... print("out %s" % node.value)
+ ... print("out %s" % node.value)
...
>>> MyVisitor().visit(tree)
in 0 []
@@ -78,9 +78,9 @@ class TreeVisitor(object):
self.dispatch_table = {}
self.access_path = []
- def dump_node(self, node):
- ignored = list(node.child_attrs or []) + [
- u'child_attrs', u'pos', u'gil_message', u'cpp_message', u'subexprs']
+ def dump_node(self, node):
+ ignored = list(node.child_attrs or []) + [
+ u'child_attrs', u'pos', u'gil_message', u'cpp_message', u'subexprs']
values = []
pos = getattr(node, 'pos', None)
if pos:
@@ -93,7 +93,7 @@ class TreeVisitor(object):
for attr in attribute_names:
if attr in ignored:
continue
- if attr.startswith('_') or attr.endswith('_'):
+ if attr.startswith('_') or attr.endswith('_'):
continue
try:
value = getattr(node, attr)
@@ -103,12 +103,12 @@ class TreeVisitor(object):
continue
elif isinstance(value, list):
value = u'[...]/%d' % len(value)
- elif not isinstance(value, _PRINTABLE):
+ elif not isinstance(value, _PRINTABLE):
continue
else:
value = repr(value)
values.append(u'%s = %s' % (attr, value))
- return u'%s(%s)' % (node.__class__.__name__, u',\n '.join(values))
+ return u'%s(%s)' % (node.__class__.__name__, u',\n '.join(values))
def _find_node_path(self, stacktrace):
import os.path
@@ -159,11 +159,11 @@ class TreeVisitor(object):
handler_method = getattr(self, pattern % mro_cls.__name__, None)
if handler_method is not None:
return handler_method
- print(type(self), cls)
+ print(type(self), cls)
if self.access_path:
- print(self.access_path)
- print(self.access_path[-1][0].pos)
- print(self.access_path[-1][0].__dict__)
+ print(self.access_path)
+ print(self.access_path[-1][0].pos)
+ print(self.access_path[-1][0].__dict__)
raise RuntimeError("Visitor %r does not accept object: %s" % (self, obj))
def visit(self, obj):
@@ -182,7 +182,7 @@ class TreeVisitor(object):
raise
except Errors.AbortError:
raise
- except Exception as e:
+ except Exception as e:
if DebugFlags.debug_no_exception_intercept:
raise
self._raise_compiler_error(obj, e)
@@ -244,46 +244,46 @@ class VisitorTransform(TreeVisitor):
was not, an exception will be raised. (Typically you want to ensure that you
are within a StatListNode or similar before doing this.)
"""
- def visitchildren(self, parent, attrs=None, exclude=None):
- # generic def entry point for calls from Python subclasses
- if exclude is not None:
- attrs = self._select_attrs(parent.child_attrs if attrs is None else attrs, exclude)
- return self._process_children(parent, attrs)
-
- @cython.final
- def _select_attrs(self, attrs, exclude):
- return [name for name in attrs if name not in exclude]
-
- @cython.final
- def _process_children(self, parent, attrs=None):
- # fast cdef entry point for calls from Cython subclasses
+ def visitchildren(self, parent, attrs=None, exclude=None):
+ # generic def entry point for calls from Python subclasses
+ if exclude is not None:
+ attrs = self._select_attrs(parent.child_attrs if attrs is None else attrs, exclude)
+ return self._process_children(parent, attrs)
+
+ @cython.final
+ def _select_attrs(self, attrs, exclude):
+ return [name for name in attrs if name not in exclude]
+
+ @cython.final
+ def _process_children(self, parent, attrs=None):
+ # fast cdef entry point for calls from Cython subclasses
result = self._visitchildren(parent, attrs)
- for attr, newnode in result.items():
- if type(newnode) is list:
- newnode = self._flatten_list(newnode)
- setattr(parent, attr, newnode)
+ for attr, newnode in result.items():
+ if type(newnode) is list:
+ newnode = self._flatten_list(newnode)
+ setattr(parent, attr, newnode)
return result
- @cython.final
- def _flatten_list(self, orig_list):
- # Flatten the list one level and remove any None
- newlist = []
- for x in orig_list:
- if x is not None:
- if type(x) is list:
- newlist.extend(x)
- else:
- newlist.append(x)
- return newlist
-
+ @cython.final
+ def _flatten_list(self, orig_list):
+ # Flatten the list one level and remove any None
+ newlist = []
+ for x in orig_list:
+ if x is not None:
+ if type(x) is list:
+ newlist.extend(x)
+ else:
+ newlist.append(x)
+ return newlist
+
def recurse_to_children(self, node):
- self._process_children(node)
+ self._process_children(node)
return node
def __call__(self, root):
return self._visit(root)
-
+
class CythonTransform(VisitorTransform):
"""
Certain common conventions and utilities for Cython transforms.
@@ -304,15 +304,15 @@ class CythonTransform(VisitorTransform):
def visit_CompilerDirectivesNode(self, node):
old = self.current_directives
self.current_directives = node.directives
- self._process_children(node)
+ self._process_children(node)
self.current_directives = old
return node
def visit_Node(self, node):
- self._process_children(node)
+ self._process_children(node)
return node
-
+
class ScopeTrackingTransform(CythonTransform):
# Keeps track of type of scopes
#scope_type: can be either of 'module', 'function', 'cclass', 'pyclass', 'struct'
@@ -321,14 +321,14 @@ class ScopeTrackingTransform(CythonTransform):
def visit_ModuleNode(self, node):
self.scope_type = 'module'
self.scope_node = node
- self._process_children(node)
+ self._process_children(node)
return node
def visit_scope(self, node, scope_type):
prev = self.scope_type, self.scope_node
self.scope_type = scope_type
self.scope_node = node
- self._process_children(node)
+ self._process_children(node)
self.scope_type, self.scope_node = prev
return node
@@ -371,45 +371,45 @@ class EnvTransform(CythonTransform):
def visit_FuncDefNode(self, node):
self.enter_scope(node, node.local_scope)
- self._process_children(node)
+ self._process_children(node)
self.exit_scope()
return node
def visit_GeneratorBodyDefNode(self, node):
- self._process_children(node)
+ self._process_children(node)
return node
def visit_ClassDefNode(self, node):
self.enter_scope(node, node.scope)
- self._process_children(node)
+ self._process_children(node)
self.exit_scope()
return node
def visit_CStructOrUnionDefNode(self, node):
self.enter_scope(node, node.scope)
- self._process_children(node)
+ self._process_children(node)
self.exit_scope()
return node
def visit_ScopedExprNode(self, node):
if node.expr_scope:
self.enter_scope(node, node.expr_scope)
- self._process_children(node)
+ self._process_children(node)
self.exit_scope()
else:
- self._process_children(node)
+ self._process_children(node)
return node
def visit_CArgDeclNode(self, node):
# default arguments are evaluated in the outer scope
if node.default:
- attrs = [attr for attr in node.child_attrs if attr != 'default']
- self._process_children(node, attrs)
+ attrs = [attr for attr in node.child_attrs if attr != 'default']
+ self._process_children(node, attrs)
self.enter_scope(node, self.current_env().outer_scope)
self.visitchildren(node, ('default',))
self.exit_scope()
else:
- self._process_children(node)
+ self._process_children(node)
return node
@@ -430,7 +430,7 @@ class NodeRefCleanupMixin(object):
def visit_CloneNode(self, node):
arg = node.arg
if arg not in self._replacements:
- self.visitchildren(arg)
+ self.visitchildren(arg)
node.arg = self._replacements.get(arg, arg)
return node
@@ -457,7 +457,7 @@ find_special_method_for_binary_operator = {
'>': '__gt__',
'+': '__add__',
'&': '__and__',
- '/': '__div__',
+ '/': '__div__',
'//': '__floordiv__',
'<<': '__lshift__',
'%': '__mod__',
@@ -494,7 +494,7 @@ class MethodDispatcherTransform(EnvTransform):
"""
# only visit call nodes and Python operations
def visit_GeneralCallNode(self, node):
- self._process_children(node)
+ self._process_children(node)
function = node.function
if not function.type.is_pyobject:
return node
@@ -509,7 +509,7 @@ class MethodDispatcherTransform(EnvTransform):
return self._dispatch_to_handler(node, function, args, keyword_args)
def visit_SimpleCallNode(self, node):
- self._process_children(node)
+ self._process_children(node)
function = node.function
if function.type.is_pyobject:
arg_tuple = node.arg_tuple
@@ -523,7 +523,7 @@ class MethodDispatcherTransform(EnvTransform):
def visit_PrimaryCmpNode(self, node):
if node.cascade:
# not currently handled below
- self._process_children(node)
+ self._process_children(node)
return node
return self._visit_binop_node(node)
@@ -531,16 +531,16 @@ class MethodDispatcherTransform(EnvTransform):
return self._visit_binop_node(node)
def _visit_binop_node(self, node):
- self._process_children(node)
+ self._process_children(node)
# FIXME: could special case 'not_in'
special_method_name = find_special_method_for_binary_operator(node.operator)
if special_method_name:
operand1, operand2 = node.operand1, node.operand2
if special_method_name == '__contains__':
operand1, operand2 = operand2, operand1
- elif special_method_name == '__div__':
- if Future.division in self.current_env().global_scope().context.future_directives:
- special_method_name = '__truediv__'
+ elif special_method_name == '__div__':
+ if Future.division in self.current_env().global_scope().context.future_directives:
+ special_method_name = '__truediv__'
obj_type = operand1.type
if obj_type.is_builtin_type:
type_name = obj_type.name
@@ -552,7 +552,7 @@ class MethodDispatcherTransform(EnvTransform):
return node
def visit_UnopNode(self, node):
- self._process_children(node)
+ self._process_children(node)
special_method_name = find_special_method_for_unary_operator(node.operator)
if special_method_name:
operand = node.operand
@@ -624,19 +624,19 @@ class MethodDispatcherTransform(EnvTransform):
return function_handler(node, function, arg_list, kwargs)
else:
return function_handler(node, function, arg_list)
- elif function.is_attribute:
+ elif function.is_attribute:
attr_name = function.attribute
- if function.type.is_pyobject:
- self_arg = function.obj
- elif node.self and function.entry:
- entry = function.entry.as_variable
- if not entry or not entry.is_builtin:
- return node
- # C implementation of a Python builtin method - see if we find further matches
- self_arg = node.self
- arg_list = arg_list[1:] # drop CloneNode of self argument
- else:
- return node
+ if function.type.is_pyobject:
+ self_arg = function.obj
+ elif node.self and function.entry:
+ entry = function.entry.as_variable
+ if not entry or not entry.is_builtin:
+ return node
+ # C implementation of a Python builtin method - see if we find further matches
+ self_arg = node.self
+ arg_list = arg_list[1:] # drop CloneNode of self argument
+ else:
+ return node
obj_type = self_arg.type
is_unbound_method = False
if obj_type.is_builtin_type:
@@ -673,12 +673,12 @@ class MethodDispatcherTransform(EnvTransform):
if self_arg is not None:
arg_list = [self_arg] + list(arg_list)
if kwargs:
- result = method_handler(
+ result = method_handler(
node, function, arg_list, is_unbound_method, kwargs)
else:
- result = method_handler(
+ result = method_handler(
node, function, arg_list, is_unbound_method)
- return result
+ return result
def _handle_function(self, node, function_name, function, arg_list, kwargs):
"""Fallback handler"""
@@ -699,15 +699,15 @@ class RecursiveNodeReplacer(VisitorTransform):
super(RecursiveNodeReplacer, self).__init__()
self.orig_node, self.new_node = orig_node, new_node
- def visit_CloneNode(self, node):
- if node is self.orig_node:
- return self.new_node
- if node.arg is self.orig_node:
- node.arg = self.new_node
- return node
-
+ def visit_CloneNode(self, node):
+ if node is self.orig_node:
+ return self.new_node
+ if node.arg is self.orig_node:
+ node.arg = self.new_node
+ return node
+
def visit_Node(self, node):
- self._process_children(node)
+ self._process_children(node)
if node is self.orig_node:
return self.new_node
else:
@@ -752,22 +752,22 @@ def replace_node(ptr, value):
else:
getattr(parent, attrname)[listidx] = value
-
+
class PrintTree(TreeVisitor):
"""Prints a representation of the tree to standard output.
Subclass and override repr_of to provide more information
about nodes. """
- def __init__(self, start=None, end=None):
+ def __init__(self, start=None, end=None):
TreeVisitor.__init__(self)
self._indent = ""
- if start is not None or end is not None:
- self._line_range = (start or 0, end or 2**30)
- else:
- self._line_range = None
+ if start is not None or end is not None:
+ self._line_range = (start or 0, end or 2**30)
+ else:
+ self._line_range = None
def indent(self):
self._indent += " "
-
+
def unindent(self):
self._indent = self._indent[:-2]
@@ -781,37 +781,37 @@ class PrintTree(TreeVisitor):
# under the parent-node, not displaying the list itself in
# the hierarchy.
def visit_Node(self, node):
- self._print_node(node)
+ self._print_node(node)
self.indent()
self.visitchildren(node)
self.unindent()
return node
- def visit_CloneNode(self, node):
- self._print_node(node)
- self.indent()
- line = node.pos[1]
- if self._line_range is None or self._line_range[0] <= line <= self._line_range[1]:
- print("%s- %s: %s" % (self._indent, 'arg', self.repr_of(node.arg)))
- self.indent()
- self.visitchildren(node.arg)
- self.unindent()
- self.unindent()
- return node
-
- def _print_node(self, node):
- line = node.pos[1]
- if self._line_range is None or self._line_range[0] <= line <= self._line_range[1]:
- if len(self.access_path) == 0:
- name = "(root)"
- else:
- parent, attr, idx = self.access_path[-1]
- if idx is not None:
- name = "%s[%d]" % (attr, idx)
- else:
- name = attr
- print("%s- %s: %s" % (self._indent, name, self.repr_of(node)))
-
+ def visit_CloneNode(self, node):
+ self._print_node(node)
+ self.indent()
+ line = node.pos[1]
+ if self._line_range is None or self._line_range[0] <= line <= self._line_range[1]:
+ print("%s- %s: %s" % (self._indent, 'arg', self.repr_of(node.arg)))
+ self.indent()
+ self.visitchildren(node.arg)
+ self.unindent()
+ self.unindent()
+ return node
+
+ def _print_node(self, node):
+ line = node.pos[1]
+ if self._line_range is None or self._line_range[0] <= line <= self._line_range[1]:
+ if len(self.access_path) == 0:
+ name = "(root)"
+ else:
+ parent, attr, idx = self.access_path[-1]
+ if idx is not None:
+ name = "%s[%d]" % (attr, idx)
+ else:
+ name = attr
+ print("%s- %s: %s" % (self._indent, name, self.repr_of(node)))
+
def repr_of(self, node):
if node is None:
return "(none)"
diff --git a/contrib/tools/cython/Cython/Coverage.py b/contrib/tools/cython/Cython/Coverage.py
index 5aa9df2ce0..1795790e42 100644
--- a/contrib/tools/cython/Cython/Coverage.py
+++ b/contrib/tools/cython/Cython/Coverage.py
@@ -1,181 +1,181 @@
-"""
-A Cython plugin for coverage.py
-
-Requires the coverage package at least in version 4.0 (which added the plugin API).
-"""
-
-from __future__ import absolute_import
-
-import re
-import os.path
-import sys
-from collections import defaultdict
-
-from coverage.plugin import CoveragePlugin, FileTracer, FileReporter # requires coverage.py 4.0+
+"""
+A Cython plugin for coverage.py
+
+Requires the coverage package at least in version 4.0 (which added the plugin API).
+"""
+
+from __future__ import absolute_import
+
+import re
+import os.path
+import sys
+from collections import defaultdict
+
+from coverage.plugin import CoveragePlugin, FileTracer, FileReporter # requires coverage.py 4.0+
from coverage.files import canonical_filename
-
-from .Utils import find_root_package_dir, is_package_dir, open_source_file
-
-
-from . import __version__
-
-
-C_FILE_EXTENSIONS = ['.c', '.cpp', '.cc', '.cxx']
-MODULE_FILE_EXTENSIONS = set(['.py', '.pyx', '.pxd'] + C_FILE_EXTENSIONS)
-
-
-def _find_c_source(base_path):
- file_exists = os.path.exists
- for ext in C_FILE_EXTENSIONS:
- file_name = base_path + ext
- if file_exists(file_name):
- return file_name
- return None
-
-
+
+from .Utils import find_root_package_dir, is_package_dir, open_source_file
+
+
+from . import __version__
+
+
+C_FILE_EXTENSIONS = ['.c', '.cpp', '.cc', '.cxx']
+MODULE_FILE_EXTENSIONS = set(['.py', '.pyx', '.pxd'] + C_FILE_EXTENSIONS)
+
+
+def _find_c_source(base_path):
+ file_exists = os.path.exists
+ for ext in C_FILE_EXTENSIONS:
+ file_name = base_path + ext
+ if file_exists(file_name):
+ return file_name
+ return None
+
+
def _find_dep_file_path(main_file, file_path, relative_path_search=False):
- abs_path = os.path.abspath(file_path)
+ abs_path = os.path.abspath(file_path)
if not os.path.exists(abs_path) and (file_path.endswith('.pxi') or
relative_path_search):
# files are looked up relative to the main source file
rel_file_path = os.path.join(os.path.dirname(main_file), file_path)
if os.path.exists(rel_file_path):
abs_path = os.path.abspath(rel_file_path)
- # search sys.path for external locations if a valid file hasn't been found
- if not os.path.exists(abs_path):
- for sys_path in sys.path:
- test_path = os.path.realpath(os.path.join(sys_path, file_path))
- if os.path.exists(test_path):
+ # search sys.path for external locations if a valid file hasn't been found
+ if not os.path.exists(abs_path):
+ for sys_path in sys.path:
+ test_path = os.path.realpath(os.path.join(sys_path, file_path))
+ if os.path.exists(test_path):
return canonical_filename(test_path)
return canonical_filename(abs_path)
-
-
-class Plugin(CoveragePlugin):
- # map from traced file paths to absolute file paths
- _file_path_map = None
- # map from traced file paths to corresponding C files
- _c_files_map = None
- # map from parsed C files to their content
- _parsed_c_files = None
-
- def sys_info(self):
- return [('Cython version', __version__)]
-
- def file_tracer(self, filename):
- """
- Try to find a C source file for a file path found by the tracer.
- """
+
+
+class Plugin(CoveragePlugin):
+ # map from traced file paths to absolute file paths
+ _file_path_map = None
+ # map from traced file paths to corresponding C files
+ _c_files_map = None
+ # map from parsed C files to their content
+ _parsed_c_files = None
+
+ def sys_info(self):
+ return [('Cython version', __version__)]
+
+ def file_tracer(self, filename):
+ """
+ Try to find a C source file for a file path found by the tracer.
+ """
# TODO We need to pxd-files to the include map. For more info see pybuild.py
# Currently skip such files, because they are not supported in Arcadia pybuild with coverage.
if os.path.splitext(filename)[-1] not in ('.pyx', '.pxi'):
return None
- if filename.startswith('<') or filename.startswith('memory:'):
- return None
- c_file = py_file = None
+ if filename.startswith('<') or filename.startswith('memory:'):
+ return None
+ c_file = py_file = None
filename = canonical_filename(filename)
- if self._c_files_map and filename in self._c_files_map:
- c_file = self._c_files_map[filename][0]
-
- if c_file is None:
- c_file, py_file = self._find_source_files(filename)
- if not c_file:
- return None # unknown file
-
- # parse all source file paths and lines from C file
- # to learn about all relevant source files right away (pyx/pxi/pxd)
- # FIXME: this might already be too late if the first executed line
- # is not from the main .pyx file but a file with a different
- # name than the .c file (which prevents us from finding the
- # .c file)
- _, code = self._read_source_lines(c_file, filename)
- if code is None:
- return None # no source found
-
- if self._file_path_map is None:
- self._file_path_map = {}
- return CythonModuleTracer(filename, py_file, c_file, self._c_files_map, self._file_path_map)
-
- def file_reporter(self, filename):
- # TODO: let coverage.py handle .py files itself
- #ext = os.path.splitext(filename)[1].lower()
- #if ext == '.py':
- # from coverage.python import PythonFileReporter
- # return PythonFileReporter(filename)
-
+ if self._c_files_map and filename in self._c_files_map:
+ c_file = self._c_files_map[filename][0]
+
+ if c_file is None:
+ c_file, py_file = self._find_source_files(filename)
+ if not c_file:
+ return None # unknown file
+
+ # parse all source file paths and lines from C file
+ # to learn about all relevant source files right away (pyx/pxi/pxd)
+ # FIXME: this might already be too late if the first executed line
+ # is not from the main .pyx file but a file with a different
+ # name than the .c file (which prevents us from finding the
+ # .c file)
+ _, code = self._read_source_lines(c_file, filename)
+ if code is None:
+ return None # no source found
+
+ if self._file_path_map is None:
+ self._file_path_map = {}
+ return CythonModuleTracer(filename, py_file, c_file, self._c_files_map, self._file_path_map)
+
+ def file_reporter(self, filename):
+ # TODO: let coverage.py handle .py files itself
+ #ext = os.path.splitext(filename)[1].lower()
+ #if ext == '.py':
+ # from coverage.python import PythonFileReporter
+ # return PythonFileReporter(filename)
+
filename = canonical_filename(filename)
- if self._c_files_map and filename in self._c_files_map:
- c_file, rel_file_path, code = self._c_files_map[filename]
- else:
- c_file, _ = self._find_source_files(filename)
- if not c_file:
+ if self._c_files_map and filename in self._c_files_map:
+ c_file, rel_file_path, code = self._c_files_map[filename]
+ else:
+ c_file, _ = self._find_source_files(filename)
+ if not c_file:
if standalone():
raise AssertionError(filename)
- return None # unknown file
- rel_file_path, code = self._read_source_lines(c_file, filename)
+ return None # unknown file
+ rel_file_path, code = self._read_source_lines(c_file, filename)
if code is None:
if standalone():
raise AssertionError(filename)
return None # no source found
- return CythonModuleReporter(c_file, filename, rel_file_path, code)
-
- def _find_source_files(self, filename):
- basename, ext = os.path.splitext(filename)
- ext = ext.lower()
- if ext in MODULE_FILE_EXTENSIONS:
- pass
+ return CythonModuleReporter(c_file, filename, rel_file_path, code)
+
+ def _find_source_files(self, filename):
+ basename, ext = os.path.splitext(filename)
+ ext = ext.lower()
+ if ext in MODULE_FILE_EXTENSIONS:
+ pass
elif ext == '.pyd':
# Windows extension module
platform_suffix = re.search(r'[.]cp[0-9]+-win[_a-z0-9]*$', basename, re.I)
- if platform_suffix:
- basename = basename[:platform_suffix.start()]
+ if platform_suffix:
+ basename = basename[:platform_suffix.start()]
elif ext == '.so':
# Linux/Unix/Mac extension module
platform_suffix = re.search(r'[.](?:cpython|pypy)-[0-9]+[-_a-z0-9]*$', basename, re.I)
if platform_suffix:
basename = basename[:platform_suffix.start()]
- elif ext == '.pxi':
- # if we get here, it means that the first traced line of a Cython module was
- # not in the main module but in an include file, so try a little harder to
- # find the main source file
- self._find_c_source_files(os.path.dirname(filename), filename)
- if filename in self._c_files_map:
- return self._c_files_map[filename][0], None
+ elif ext == '.pxi':
+ # if we get here, it means that the first traced line of a Cython module was
+ # not in the main module but in an include file, so try a little harder to
+ # find the main source file
+ self._find_c_source_files(os.path.dirname(filename), filename)
+ if filename in self._c_files_map:
+ return self._c_files_map[filename][0], None
if standalone():
raise AssertionError(filename)
- else:
- # none of our business
- return None, None
-
- c_file = filename if ext in C_FILE_EXTENSIONS else _find_c_source(basename)
- if c_file is None:
- # a module "pkg/mod.so" can have a source file "pkg/pkg.mod.c"
- package_root = find_root_package_dir.uncached(filename)
- package_path = os.path.relpath(basename, package_root).split(os.path.sep)
- if len(package_path) > 1:
- test_basepath = os.path.join(os.path.dirname(filename), '.'.join(package_path))
- c_file = _find_c_source(test_basepath)
-
- py_source_file = None
- if c_file:
- py_source_file = os.path.splitext(c_file)[0] + '.py'
- if not os.path.exists(py_source_file):
- py_source_file = None
-
- try:
+ else:
+ # none of our business
+ return None, None
+
+ c_file = filename if ext in C_FILE_EXTENSIONS else _find_c_source(basename)
+ if c_file is None:
+ # a module "pkg/mod.so" can have a source file "pkg/pkg.mod.c"
+ package_root = find_root_package_dir.uncached(filename)
+ package_path = os.path.relpath(basename, package_root).split(os.path.sep)
+ if len(package_path) > 1:
+ test_basepath = os.path.join(os.path.dirname(filename), '.'.join(package_path))
+ c_file = _find_c_source(test_basepath)
+
+ py_source_file = None
+ if c_file:
+ py_source_file = os.path.splitext(c_file)[0] + '.py'
+ if not os.path.exists(py_source_file):
+ py_source_file = None
+
+ try:
with OpenFile(c_file) as f:
if '/* Generated by Cython ' not in f.read(30):
- return None, None # not a Cython file
- except (IOError, OSError):
- c_file = None
-
- return c_file, py_source_file
-
- def _find_c_source_files(self, dir_path, source_file):
- """
- Desperately parse all C files in the directory or its package parents
- (not re-descending) to find the (included) source file in one of them.
- """
+ return None, None # not a Cython file
+ except (IOError, OSError):
+ c_file = None
+
+ return c_file, py_source_file
+
+ def _find_c_source_files(self, dir_path, source_file):
+ """
+ Desperately parse all C files in the directory or its package parents
+ (not re-descending) to find the (included) source file in one of them.
+ """
if standalone():
if os.environ.get('PYTHON_COVERAGE_CYTHON_BUILD_ROOT'):
broot = os.environ['PYTHON_COVERAGE_CYTHON_BUILD_ROOT']
@@ -190,188 +190,188 @@ class Plugin(CoveragePlugin):
return
raise AssertionError((source_file, os.environ.get('PYTHON_COVERAGE_CYTHON_BUILD_ROOT')))
- if not os.path.isdir(dir_path):
- return
- splitext = os.path.splitext
- for filename in os.listdir(dir_path):
- ext = splitext(filename)[1].lower()
- if ext in C_FILE_EXTENSIONS:
- self._read_source_lines(os.path.join(dir_path, filename), source_file)
- if source_file in self._c_files_map:
- return
- # not found? then try one package up
- if is_package_dir(dir_path):
- self._find_c_source_files(os.path.dirname(dir_path), source_file)
-
- def _read_source_lines(self, c_file, sourcefile):
- """
- Parse a Cython generated C/C++ source file and find the executable lines.
- Each executable line starts with a comment header that states source file
- and line number, as well as the surrounding range of source code lines.
- """
- if self._parsed_c_files is None:
- self._parsed_c_files = {}
- if c_file in self._parsed_c_files:
- code_lines = self._parsed_c_files[c_file]
- else:
- code_lines = self._parse_cfile_lines(c_file)
- self._parsed_c_files[c_file] = code_lines
-
- if self._c_files_map is None:
- self._c_files_map = {}
-
- for filename, code in code_lines.items():
+ if not os.path.isdir(dir_path):
+ return
+ splitext = os.path.splitext
+ for filename in os.listdir(dir_path):
+ ext = splitext(filename)[1].lower()
+ if ext in C_FILE_EXTENSIONS:
+ self._read_source_lines(os.path.join(dir_path, filename), source_file)
+ if source_file in self._c_files_map:
+ return
+ # not found? then try one package up
+ if is_package_dir(dir_path):
+ self._find_c_source_files(os.path.dirname(dir_path), source_file)
+
+ def _read_source_lines(self, c_file, sourcefile):
+ """
+ Parse a Cython generated C/C++ source file and find the executable lines.
+ Each executable line starts with a comment header that states source file
+ and line number, as well as the surrounding range of source code lines.
+ """
+ if self._parsed_c_files is None:
+ self._parsed_c_files = {}
+ if c_file in self._parsed_c_files:
+ code_lines = self._parsed_c_files[c_file]
+ else:
+ code_lines = self._parse_cfile_lines(c_file)
+ self._parsed_c_files[c_file] = code_lines
+
+ if self._c_files_map is None:
+ self._c_files_map = {}
+
+ for filename, code in code_lines.items():
abs_path = _find_dep_file_path(c_file, filename,
relative_path_search=True)
- self._c_files_map[abs_path] = (c_file, filename, code)
-
- if sourcefile not in self._c_files_map:
- return (None,) * 2 # e.g. shared library file
- return self._c_files_map[sourcefile][1:]
-
- def _parse_cfile_lines(self, c_file):
- """
- Parse a C file and extract all source file lines that generated executable code.
- """
- match_source_path_line = re.compile(r' */[*] +"(.*)":([0-9]+)$').match
- match_current_code_line = re.compile(r' *[*] (.*) # <<<<<<+$').match
- match_comment_end = re.compile(r' *[*]/$').match
- match_trace_line = re.compile(r' *__Pyx_TraceLine\(([0-9]+),').match
- not_executable = re.compile(
- r'\s*c(?:type)?def\s+'
- r'(?:(?:public|external)\s+)?'
- r'(?:struct|union|enum|class)'
- r'(\s+[^:]+|)\s*:'
- ).match
-
- code_lines = defaultdict(dict)
- executable_lines = defaultdict(set)
- current_filename = None
-
+ self._c_files_map[abs_path] = (c_file, filename, code)
+
+ if sourcefile not in self._c_files_map:
+ return (None,) * 2 # e.g. shared library file
+ return self._c_files_map[sourcefile][1:]
+
+ def _parse_cfile_lines(self, c_file):
+ """
+ Parse a C file and extract all source file lines that generated executable code.
+ """
+ match_source_path_line = re.compile(r' */[*] +"(.*)":([0-9]+)$').match
+ match_current_code_line = re.compile(r' *[*] (.*) # <<<<<<+$').match
+ match_comment_end = re.compile(r' *[*]/$').match
+ match_trace_line = re.compile(r' *__Pyx_TraceLine\(([0-9]+),').match
+ not_executable = re.compile(
+ r'\s*c(?:type)?def\s+'
+ r'(?:(?:public|external)\s+)?'
+ r'(?:struct|union|enum|class)'
+ r'(\s+[^:]+|)\s*:'
+ ).match
+
+ code_lines = defaultdict(dict)
+ executable_lines = defaultdict(set)
+ current_filename = None
+
with OpenFile(c_file) as lines:
- lines = iter(lines)
- for line in lines:
- match = match_source_path_line(line)
- if not match:
- if '__Pyx_TraceLine(' in line and current_filename is not None:
- trace_line = match_trace_line(line)
- if trace_line:
- executable_lines[current_filename].add(int(trace_line.group(1)))
- continue
- filename, lineno = match.groups()
- current_filename = filename
- lineno = int(lineno)
- for comment_line in lines:
- match = match_current_code_line(comment_line)
- if match:
- code_line = match.group(1).rstrip()
- if not_executable(code_line):
- break
- code_lines[filename][lineno] = code_line
- break
- elif match_comment_end(comment_line):
- # unexpected comment format - false positive?
- break
-
- # Remove lines that generated code but are not traceable.
- for filename, lines in code_lines.items():
- dead_lines = set(lines).difference(executable_lines.get(filename, ()))
- for lineno in dead_lines:
- del lines[lineno]
- return code_lines
-
-
-class CythonModuleTracer(FileTracer):
- """
- Find the Python/Cython source file for a Cython module.
- """
- def __init__(self, module_file, py_file, c_file, c_files_map, file_path_map):
- super(CythonModuleTracer, self).__init__()
- self.module_file = module_file
- self.py_file = py_file
- self.c_file = c_file
- self._c_files_map = c_files_map
- self._file_path_map = file_path_map
-
- def has_dynamic_source_filename(self):
- return True
-
- def dynamic_source_filename(self, filename, frame):
- """
- Determine source file path. Called by the function call tracer.
- """
- source_file = frame.f_code.co_filename
- try:
- return self._file_path_map[source_file]
- except KeyError:
- pass
+ lines = iter(lines)
+ for line in lines:
+ match = match_source_path_line(line)
+ if not match:
+ if '__Pyx_TraceLine(' in line and current_filename is not None:
+ trace_line = match_trace_line(line)
+ if trace_line:
+ executable_lines[current_filename].add(int(trace_line.group(1)))
+ continue
+ filename, lineno = match.groups()
+ current_filename = filename
+ lineno = int(lineno)
+ for comment_line in lines:
+ match = match_current_code_line(comment_line)
+ if match:
+ code_line = match.group(1).rstrip()
+ if not_executable(code_line):
+ break
+ code_lines[filename][lineno] = code_line
+ break
+ elif match_comment_end(comment_line):
+ # unexpected comment format - false positive?
+ break
+
+ # Remove lines that generated code but are not traceable.
+ for filename, lines in code_lines.items():
+ dead_lines = set(lines).difference(executable_lines.get(filename, ()))
+ for lineno in dead_lines:
+ del lines[lineno]
+ return code_lines
+
+
+class CythonModuleTracer(FileTracer):
+ """
+ Find the Python/Cython source file for a Cython module.
+ """
+ def __init__(self, module_file, py_file, c_file, c_files_map, file_path_map):
+ super(CythonModuleTracer, self).__init__()
+ self.module_file = module_file
+ self.py_file = py_file
+ self.c_file = c_file
+ self._c_files_map = c_files_map
+ self._file_path_map = file_path_map
+
+ def has_dynamic_source_filename(self):
+ return True
+
+ def dynamic_source_filename(self, filename, frame):
+ """
+ Determine source file path. Called by the function call tracer.
+ """
+ source_file = frame.f_code.co_filename
+ try:
+ return self._file_path_map[source_file]
+ except KeyError:
+ pass
if standalone():
abs_path = self.module_file
else:
abs_path = _find_dep_file_path(filename, source_file)
-
- if self.py_file and source_file[-3:].lower() == '.py':
- # always let coverage.py handle this case itself
- self._file_path_map[source_file] = self.py_file
- return self.py_file
-
- assert self._c_files_map is not None
- if abs_path not in self._c_files_map:
- self._c_files_map[abs_path] = (self.c_file, source_file, None)
- self._file_path_map[source_file] = abs_path
- return abs_path
-
-
-class CythonModuleReporter(FileReporter):
- """
- Provide detailed trace information for one source file to coverage.py.
- """
- def __init__(self, c_file, source_file, rel_file_path, code):
- super(CythonModuleReporter, self).__init__(source_file)
- self.name = rel_file_path
- self.c_file = c_file
- self._code = code
+
+ if self.py_file and source_file[-3:].lower() == '.py':
+ # always let coverage.py handle this case itself
+ self._file_path_map[source_file] = self.py_file
+ return self.py_file
+
+ assert self._c_files_map is not None
+ if abs_path not in self._c_files_map:
+ self._c_files_map[abs_path] = (self.c_file, source_file, None)
+ self._file_path_map[source_file] = abs_path
+ return abs_path
+
+
+class CythonModuleReporter(FileReporter):
+ """
+ Provide detailed trace information for one source file to coverage.py.
+ """
+ def __init__(self, c_file, source_file, rel_file_path, code):
+ super(CythonModuleReporter, self).__init__(source_file)
+ self.name = rel_file_path
+ self.c_file = c_file
+ self._code = code
self._abs_filename = self._find_abs_filename()
-
- def lines(self):
- """
- Return set of line numbers that are possibly executable.
- """
- return set(self._code)
-
- def _iter_source_tokens(self):
- current_line = 1
- for line_no, code_line in sorted(self._code.items()):
- while line_no > current_line:
- yield []
- current_line += 1
- yield [('txt', code_line)]
- current_line += 1
-
- def source(self):
- """
- Return the source code of the file as a string.
- """
+
+ def lines(self):
+ """
+ Return set of line numbers that are possibly executable.
+ """
+ return set(self._code)
+
+ def _iter_source_tokens(self):
+ current_line = 1
+ for line_no, code_line in sorted(self._code.items()):
+ while line_no > current_line:
+ yield []
+ current_line += 1
+ yield [('txt', code_line)]
+ current_line += 1
+
+ def source(self):
+ """
+ Return the source code of the file as a string.
+ """
if os.path.exists(self._abs_filename):
with open_source_file(self._abs_filename) as f:
- return f.read()
- else:
- return '\n'.join(
- (tokens[0][1] if tokens else '')
- for tokens in self._iter_source_tokens())
-
- def source_token_lines(self):
- """
- Iterate over the source code tokens.
- """
+ return f.read()
+ else:
+ return '\n'.join(
+ (tokens[0][1] if tokens else '')
+ for tokens in self._iter_source_tokens())
+
+ def source_token_lines(self):
+ """
+ Iterate over the source code tokens.
+ """
if os.path.exists(self._abs_filename):
with open_source_file(self._abs_filename) as f:
- for line in f:
- yield [('txt', line.rstrip('\n'))]
- else:
- for line in self._iter_source_tokens():
+ for line in f:
+ yield [('txt', line.rstrip('\n'))]
+ else:
+ for line in self._iter_source_tokens():
yield line
-
+
def _find_abs_filename(self):
for root in [
os.environ.get('PYTHON_COVERAGE_ARCADIA_SOURCE_ROOT'),
@@ -382,10 +382,10 @@ class CythonModuleReporter(FileReporter):
if root and os.path.exists(abs_path):
return abs_path
return self.filename
+
-
-def coverage_init(reg, options):
- reg.add_file_tracer(Plugin())
+def coverage_init(reg, options):
+ reg.add_file_tracer(Plugin())
# ========================== Arcadia specific =================================
diff --git a/contrib/tools/cython/Cython/Debugger/Cygdb.py b/contrib/tools/cython/Cython/Debugger/Cygdb.py
index 45f31ce6f7..029adb1742 100644
--- a/contrib/tools/cython/Cython/Debugger/Cygdb.py
+++ b/contrib/tools/cython/Cython/Debugger/Cygdb.py
@@ -126,7 +126,7 @@ def main(path_to_debug_info=None, gdb_argv=None, no_import=False):
logging_level = logging.WARN
if options.verbosity == 1:
logging_level = logging.INFO
- if options.verbosity >= 2:
+ if options.verbosity >= 2:
logging_level = logging.DEBUG
logging.basicConfig(level=logging_level)
diff --git a/contrib/tools/cython/Cython/Debugger/DebugWriter.py b/contrib/tools/cython/Cython/Debugger/DebugWriter.py
index 876a3a2169..a5f30e8850 100644
--- a/contrib/tools/cython/Cython/Debugger/DebugWriter.py
+++ b/contrib/tools/cython/Cython/Debugger/DebugWriter.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import
import os
import sys
@@ -15,9 +15,9 @@ except ImportError:
try:
from xml.etree import ElementTree as etree
except ImportError:
- etree = None
+ etree = None
-from ..Compiler import Errors
+from ..Compiler import Errors
class CythonDebugWriter(object):
@@ -32,7 +32,7 @@ class CythonDebugWriter(object):
if etree is None:
raise Errors.NoElementTreeInstalledException()
- self.output_dir = os.path.join(output_dir or os.curdir, 'cython_debug')
+ self.output_dir = os.path.join(output_dir or os.curdir, 'cython_debug')
self.tb = etree.TreeBuilder()
# set by Cython.Compiler.ParseTreeTransforms.DebugTransform
self.module_name = None
@@ -44,10 +44,10 @@ class CythonDebugWriter(object):
def end(self, name):
self.tb.end(name)
- def add_entry(self, name, **attrs):
- self.tb.start(name, attrs)
- self.tb.end(name)
-
+ def add_entry(self, name, **attrs):
+ self.tb.start(name, attrs)
+ self.tb.end(name)
+
def serialize(self):
self.tb.end('Module')
self.tb.end('cython_debug')
@@ -55,7 +55,7 @@ class CythonDebugWriter(object):
try:
os.makedirs(self.output_dir)
- except OSError as e:
+ except OSError as e:
if e.errno != errno.EEXIST:
raise
diff --git a/contrib/tools/cython/Cython/Debugger/Tests/TestLibCython.py b/contrib/tools/cython/Cython/Debugger/Tests/TestLibCython.py
index 13560646ff..a23d31f534 100644
--- a/contrib/tools/cython/Cython/Debugger/Tests/TestLibCython.py
+++ b/contrib/tools/cython/Cython/Debugger/Tests/TestLibCython.py
@@ -14,7 +14,7 @@ from distutils import ccompiler
import runtests
import Cython.Distutils.extension
-import Cython.Distutils.old_build_ext as build_ext
+import Cython.Distutils.old_build_ext as build_ext
from Cython.Debugger import Cygdb as cygdb
root = os.path.dirname(os.path.abspath(__file__))
@@ -31,38 +31,38 @@ def test_gdb():
if have_gdb is not None:
return have_gdb
- have_gdb = False
+ have_gdb = False
try:
- p = subprocess.Popen(['gdb', '-nx', '--version'], stdout=subprocess.PIPE)
+ p = subprocess.Popen(['gdb', '-nx', '--version'], stdout=subprocess.PIPE)
except OSError:
- # gdb not found
- gdb_version = None
+ # gdb not found
+ gdb_version = None
else:
- stdout, _ = p.communicate()
+ stdout, _ = p.communicate()
# Based on Lib/test/test_gdb.py
- regex = r"GNU gdb [^\d]*(\d+)\.(\d+)"
- gdb_version = re.match(regex, stdout.decode('ascii', 'ignore'))
+ regex = r"GNU gdb [^\d]*(\d+)\.(\d+)"
+ gdb_version = re.match(regex, stdout.decode('ascii', 'ignore'))
- if gdb_version:
- gdb_version_number = list(map(int, gdb_version.groups()))
+ if gdb_version:
+ gdb_version_number = list(map(int, gdb_version.groups()))
if gdb_version_number >= [7, 2]:
- have_gdb = True
- with tempfile.NamedTemporaryFile(mode='w+') as python_version_script:
+ have_gdb = True
+ with tempfile.NamedTemporaryFile(mode='w+') as python_version_script:
python_version_script.write(
'python import sys; print("%s %s" % sys.version_info[:2])')
python_version_script.flush()
p = subprocess.Popen(['gdb', '-batch', '-x', python_version_script.name],
stdout=subprocess.PIPE)
- stdout, _ = p.communicate()
+ stdout, _ = p.communicate()
try:
- internal_python_version = list(map(int, stdout.decode('ascii', 'ignore').split()))
- if internal_python_version < [2, 6]:
- have_gdb = False
+ internal_python_version = list(map(int, stdout.decode('ascii', 'ignore').split()))
+ if internal_python_version < [2, 6]:
+ have_gdb = False
except ValueError:
have_gdb = False
- if not have_gdb:
- warnings.warn('Skipping gdb tests, need gdb >= 7.2 with Python >= 2.6')
+ if not have_gdb:
+ warnings.warn('Skipping gdb tests, need gdb >= 7.2 with Python >= 2.6')
return have_gdb
diff --git a/contrib/tools/cython/Cython/Debugger/Tests/test_libcython_in_gdb.py b/contrib/tools/cython/Cython/Debugger/Tests/test_libcython_in_gdb.py
index bd7608d607..e798e7564f 100644
--- a/contrib/tools/cython/Cython/Debugger/Tests/test_libcython_in_gdb.py
+++ b/contrib/tools/cython/Cython/Debugger/Tests/test_libcython_in_gdb.py
@@ -5,8 +5,8 @@ Note: debug information is already imported by the file generated by
Cython.Debugger.Cygdb.make_command_file()
"""
-from __future__ import absolute_import
-
+from __future__ import absolute_import
+
import os
import re
import sys
@@ -23,10 +23,10 @@ import itertools
import gdb
-from .. import libcython
-from .. import libpython
-from . import TestLibCython as test_libcython
-from ...Utils import add_metaclass
+from .. import libcython
+from .. import libpython
+from . import TestLibCython as test_libcython
+from ...Utils import add_metaclass
# for some reason sys.argv is missing in gdb
sys.argv = ['gdb']
@@ -48,12 +48,12 @@ def print_on_call_decorator(func):
class TraceMethodCallMeta(type):
def __init__(self, name, bases, dict):
- for func_name, func in dict.items():
+ for func_name, func in dict.items():
if inspect.isfunction(func):
setattr(self, func_name, print_on_call_decorator(func))
-@add_metaclass(TraceMethodCallMeta)
+@add_metaclass(TraceMethodCallMeta)
class DebugTestCase(unittest.TestCase):
"""
Base class for test cases. On teardown it kills the inferior and unsets
diff --git a/contrib/tools/cython/Cython/Debugger/Tests/test_libpython_in_gdb.py b/contrib/tools/cython/Cython/Debugger/Tests/test_libpython_in_gdb.py
index 6f34cee47b..d5e01187ed 100644
--- a/contrib/tools/cython/Cython/Debugger/Tests/test_libpython_in_gdb.py
+++ b/contrib/tools/cython/Cython/Debugger/Tests/test_libpython_in_gdb.py
@@ -14,8 +14,8 @@ import gdb
from Cython.Debugger import libcython
from Cython.Debugger import libpython
-from . import test_libcython_in_gdb
-from .test_libcython_in_gdb import _debug, inferior_python_version
+from . import test_libcython_in_gdb
+from .test_libcython_in_gdb import _debug, inferior_python_version
class TestPrettyPrinters(test_libcython_in_gdb.DebugTestCase):
diff --git a/contrib/tools/cython/Cython/Debugger/libcython.py b/contrib/tools/cython/Cython/Debugger/libcython.py
index 23153789b6..238d578853 100644
--- a/contrib/tools/cython/Cython/Debugger/libcython.py
+++ b/contrib/tools/cython/Cython/Debugger/libcython.py
@@ -4,11 +4,11 @@ GDB extension that adds Cython support.
from __future__ import print_function
-try:
- input = raw_input
-except NameError:
- pass
-
+try:
+ input = raw_input
+except NameError:
+ pass
+
import sys
import textwrap
import traceback
@@ -346,12 +346,12 @@ class CythonBase(object):
except RuntimeError:
func_address = 0
else:
- func_address = gdb_value.address
- if not isinstance(func_address, int):
- # Seriously? Why is the address not an int?
- if not isinstance(func_address, (str, bytes)):
- func_address = str(func_address)
- func_address = int(func_address.split()[0], 0)
+ func_address = gdb_value.address
+ if not isinstance(func_address, int):
+ # Seriously? Why is the address not an int?
+ if not isinstance(func_address, (str, bytes)):
+ func_address = str(func_address)
+ func_address = int(func_address.split()[0], 0)
a = ', '.join('%s=%s' % (name, val) for name, val in func_args)
sys.stdout.write('#%-2d 0x%016x in %s(%s)' % (index, func_address, func_name, a))
@@ -392,7 +392,7 @@ class CythonBase(object):
result = {}
seen = set()
- for k, v in pyobject_dict.items():
+ for k, v in pyobject_dict.items():
result[k.proxyval(seen)] = v
return result
@@ -416,7 +416,7 @@ class CythonBase(object):
# Closed over free variable
if cur_lineno > cython_func.lineno:
if cyvar.type == PythonObject:
- return int(gdb.parse_and_eval(cyvar.cname))
+ return int(gdb.parse_and_eval(cyvar.cname))
return True
return False
@@ -743,7 +743,7 @@ class CyImport(CythonCommand):
for marker in module.find('LineNumberMapping'):
cython_lineno = int(marker.attrib['cython_lineno'])
- c_linenos = list(map(int, marker.attrib['c_linenos'].split()))
+ c_linenos = list(map(int, marker.attrib['c_linenos'].split()))
cython_module.lineno_cy2c[cython_lineno] = min(c_linenos)
for c_lineno in c_linenos:
cython_module.lineno_c2cy[c_lineno] = cython_lineno
@@ -816,7 +816,7 @@ class CyBreak(CythonCommand):
while True:
try:
- result = input(
+ result = input(
"Select a function, press 'a' for all "
"functions or press 'q' or '^D' to quit: ")
except EOFError:
@@ -863,10 +863,10 @@ class CyBreak(CythonCommand):
def complete(self, text, word):
# Filter init-module functions (breakpoints can be set using
# modulename:linenumber).
- names = [n for n, L in self.cy.functions_by_name.items()
- if any(not f.is_initmodule_function for f in L)]
- qnames = [n for n, f in self.cy.functions_by_qualified_name.items()
- if not f.is_initmodule_function]
+ names = [n for n, L in self.cy.functions_by_name.items()
+ if any(not f.is_initmodule_function for f in L)]
+ qnames = [n for n, f in self.cy.functions_by_qualified_name.items()
+ if not f.is_initmodule_function]
if parameters.complete_unqualified:
all_names = itertools.chain(qnames, names)
@@ -1156,7 +1156,7 @@ class CyLocals(CythonCommand):
local_cython_vars = cython_function.locals
max_name_length = len(max(local_cython_vars, key=len))
- for name, cyvar in sorted(local_cython_vars.items(), key=sortkey):
+ for name, cyvar in sorted(local_cython_vars.items(), key=sortkey):
if self.is_initialized(self.get_cython_function(), cyvar.name):
value = gdb.parse_and_eval(cyvar.cname)
if not value.is_optimized_out:
@@ -1189,13 +1189,13 @@ class CyGlobals(CyLocals):
seen = set()
print('Python globals:')
- for k, v in sorted(global_python_dict.items(), key=sortkey):
+ for k, v in sorted(global_python_dict.items(), key=sortkey):
v = v.get_truncated_repr(libpython.MAX_OUTPUT_LEN)
seen.add(k)
print(' %-*s = %s' % (max_name_length, k, v))
print('C globals:')
- for name, cyvar in sorted(module_globals.items(), key=sortkey):
+ for name, cyvar in sorted(module_globals.items(), key=sortkey):
if name not in seen:
try:
value = gdb.parse_and_eval(cyvar.cname)
@@ -1218,8 +1218,8 @@ class EvaluateOrExecuteCodeMixin(object):
"Fill a remotely allocated dict with values from the Cython C stack"
cython_func = self.get_cython_function()
- for name, cyvar in cython_func.locals.items():
- if cyvar.type == PythonObject and self.is_initialized(cython_func, name):
+ for name, cyvar in cython_func.locals.items():
+ if cyvar.type == PythonObject and self.is_initialized(cython_func, name):
try:
val = gdb.parse_and_eval(cyvar.cname)
except RuntimeError:
diff --git a/contrib/tools/cython/Cython/Debugger/libpython.py b/contrib/tools/cython/Cython/Debugger/libpython.py
index fea626dd73..213a60de5a 100644
--- a/contrib/tools/cython/Cython/Debugger/libpython.py
+++ b/contrib/tools/cython/Cython/Debugger/libpython.py
@@ -46,10 +46,10 @@ the type names are known to the debugger
The module also extends gdb with some python-specific commands.
'''
-
+
# NOTE: some gdbs are linked with Python 3, so this file should be dual-syntax
# compatible (2.6+ and 3.0+). See #19308.
-
+
from __future__ import print_function
import gdb
import os
@@ -2486,17 +2486,17 @@ class PyCont(ExecutionControlCommandBase):
def _pointervalue(gdbval):
"""
- Return the value of the pointer as a Python int.
+ Return the value of the pointer as a Python int.
gdbval.type must be a pointer type
"""
# don't convert with int() as it will raise a RuntimeError
if gdbval.address is not None:
- return int(gdbval.address)
+ return int(gdbval.address)
else:
# the address attribute is None sometimes, in which case we can
# still convert the pointer to an int
- return int(gdbval)
+ return int(gdbval)
def pointervalue(gdbval):
@@ -2688,7 +2688,7 @@ class FixGdbCommand(gdb.Command):
warnings.filterwarnings('ignore', r'.*', RuntimeWarning,
re.escape(__name__))
try:
- int(gdb.parse_and_eval("(void *) 0")) == 0
+ int(gdb.parse_and_eval("(void *) 0")) == 0
except RuntimeError:
pass
# warnings.resetwarnings()
@@ -2726,7 +2726,7 @@ class PyExec(gdb.Command):
lines = []
while True:
try:
- line = input('>')
+ line = input('>')
except EOFError:
break
else:
diff --git a/contrib/tools/cython/Cython/Distutils/build_ext.py b/contrib/tools/cython/Cython/Distutils/build_ext.py
index 598bb4a89b..c499bb525a 100644
--- a/contrib/tools/cython/Cython/Distutils/build_ext.py
+++ b/contrib/tools/cython/Cython/Distutils/build_ext.py
@@ -1,25 +1,25 @@
import sys
-if 'setuptools' in sys.modules:
- try:
- from setuptools.command.build_ext import build_ext as _build_ext
- except ImportError:
- # We may be in the process of importing setuptools, which tries
- # to import this.
- from distutils.command.build_ext import build_ext as _build_ext
-else:
- from distutils.command.build_ext import build_ext as _build_ext
+if 'setuptools' in sys.modules:
+ try:
+ from setuptools.command.build_ext import build_ext as _build_ext
+ except ImportError:
+ # We may be in the process of importing setuptools, which tries
+ # to import this.
+ from distutils.command.build_ext import build_ext as _build_ext
+else:
+ from distutils.command.build_ext import build_ext as _build_ext
+
-
-class new_build_ext(_build_ext, object):
- def finalize_options(self):
- if self.distribution.ext_modules:
+class new_build_ext(_build_ext, object):
+ def finalize_options(self):
+ if self.distribution.ext_modules:
nthreads = getattr(self, 'parallel', None) # -j option in Py3.5+
nthreads = int(nthreads) if nthreads else None
- from Cython.Build.Dependencies import cythonize
- self.distribution.ext_modules[:] = cythonize(
+ from Cython.Build.Dependencies import cythonize
+ self.distribution.ext_modules[:] = cythonize(
self.distribution.ext_modules, nthreads=nthreads, force=self.force)
super(new_build_ext, self).finalize_options()
-# This will become new_build_ext in the future.
-from .old_build_ext import old_build_ext as build_ext
+# This will become new_build_ext in the future.
+from .old_build_ext import old_build_ext as build_ext
diff --git a/contrib/tools/cython/Cython/Distutils/extension.py b/contrib/tools/cython/Cython/Distutils/extension.py
index d8bdbf0f5b..bf36ac0e11 100644
--- a/contrib/tools/cython/Cython/Distutils/extension.py
+++ b/contrib/tools/cython/Cython/Distutils/extension.py
@@ -45,7 +45,7 @@ class Extension(_Extension.Extension):
# Translate pyrex_X to cython_X for backwards compatibility.
had_pyrex_options = False
- for key in list(kw):
+ for key in list(kw):
if key.startswith('pyrex_'):
had_pyrex_options = True
kw['cython' + key[5:]] = kw.pop(key)
diff --git a/contrib/tools/cython/Cython/Distutils/old_build_ext.py b/contrib/tools/cython/Cython/Distutils/old_build_ext.py
index aa2a1cf229..ad3b157855 100644
--- a/contrib/tools/cython/Cython/Distutils/old_build_ext.py
+++ b/contrib/tools/cython/Cython/Distutils/old_build_ext.py
@@ -1,355 +1,355 @@
-"""Cython.Distutils.old_build_ext
-
-Implements a version of the Distutils 'build_ext' command, for
+"""Cython.Distutils.old_build_ext
+
+Implements a version of the Distutils 'build_ext' command, for
building Cython extension modules.
-
+
Note that this module is deprecated. Use cythonize() instead.
"""
-
-__revision__ = "$Id:$"
-
-import inspect
-import sys
-import os
-from distutils.errors import DistutilsPlatformError
-from distutils.dep_util import newer, newer_group
-from distutils import log
-from distutils.command import build_ext as _build_ext
-from distutils import sysconfig
-import warnings
-
-
-try:
- from __builtin__ import basestring
-except ImportError:
- basestring = str
-
-
-def _check_stack(path):
- try:
- for frame in inspect.getouterframes(inspect.currentframe(), 0):
- if path in frame[1].replace(os.sep, '/'):
- return True
- except Exception:
- pass
- return False
-
-if (not _check_stack('setuptools/extensions.py')
- and not _check_stack('pyximport/pyxbuild.py')
- and not _check_stack('Cython/Distutils/build_ext.py')):
- warnings.warn(
- "Cython.Distutils.old_build_ext does not properly handle dependencies "
- "and is deprecated.")
-
-
-extension_name_re = _build_ext.extension_name_re
-
-show_compilers = _build_ext.show_compilers
-
-class Optimization(object):
- def __init__(self):
- self.flags = (
- 'OPT',
- 'CFLAGS',
- 'CPPFLAGS',
- 'EXTRA_CFLAGS',
- 'BASECFLAGS',
- 'PY_CFLAGS',
- )
- self.state = sysconfig.get_config_vars(*self.flags)
- self.config_vars = sysconfig.get_config_vars()
-
-
- def disable_optimization(self):
- "disable optimization for the C or C++ compiler"
- badoptions = ('-O1', '-O2', '-O3')
-
- for flag, option in zip(self.flags, self.state):
- if option is not None:
- L = [opt for opt in option.split() if opt not in badoptions]
- self.config_vars[flag] = ' '.join(L)
-
- def restore_state(self):
- "restore the original state"
- for flag, option in zip(self.flags, self.state):
- if option is not None:
- self.config_vars[flag] = option
-
-
-optimization = Optimization()
-
-
-class old_build_ext(_build_ext.build_ext):
-
- description = "build C/C++ and Cython extensions (compile/link to build directory)"
-
- sep_by = _build_ext.build_ext.sep_by
+
+__revision__ = "$Id:$"
+
+import inspect
+import sys
+import os
+from distutils.errors import DistutilsPlatformError
+from distutils.dep_util import newer, newer_group
+from distutils import log
+from distutils.command import build_ext as _build_ext
+from distutils import sysconfig
+import warnings
+
+
+try:
+ from __builtin__ import basestring
+except ImportError:
+ basestring = str
+
+
+def _check_stack(path):
+ try:
+ for frame in inspect.getouterframes(inspect.currentframe(), 0):
+ if path in frame[1].replace(os.sep, '/'):
+ return True
+ except Exception:
+ pass
+ return False
+
+if (not _check_stack('setuptools/extensions.py')
+ and not _check_stack('pyximport/pyxbuild.py')
+ and not _check_stack('Cython/Distutils/build_ext.py')):
+ warnings.warn(
+ "Cython.Distutils.old_build_ext does not properly handle dependencies "
+ "and is deprecated.")
+
+
+extension_name_re = _build_ext.extension_name_re
+
+show_compilers = _build_ext.show_compilers
+
+class Optimization(object):
+ def __init__(self):
+ self.flags = (
+ 'OPT',
+ 'CFLAGS',
+ 'CPPFLAGS',
+ 'EXTRA_CFLAGS',
+ 'BASECFLAGS',
+ 'PY_CFLAGS',
+ )
+ self.state = sysconfig.get_config_vars(*self.flags)
+ self.config_vars = sysconfig.get_config_vars()
+
+
+ def disable_optimization(self):
+ "disable optimization for the C or C++ compiler"
+ badoptions = ('-O1', '-O2', '-O3')
+
+ for flag, option in zip(self.flags, self.state):
+ if option is not None:
+ L = [opt for opt in option.split() if opt not in badoptions]
+ self.config_vars[flag] = ' '.join(L)
+
+ def restore_state(self):
+ "restore the original state"
+ for flag, option in zip(self.flags, self.state):
+ if option is not None:
+ self.config_vars[flag] = option
+
+
+optimization = Optimization()
+
+
+class old_build_ext(_build_ext.build_ext):
+
+ description = "build C/C++ and Cython extensions (compile/link to build directory)"
+
+ sep_by = _build_ext.build_ext.sep_by
user_options = _build_ext.build_ext.user_options[:]
boolean_options = _build_ext.build_ext.boolean_options[:]
help_options = _build_ext.build_ext.help_options[:]
-
- # Add the pyrex specific data.
- user_options.extend([
- ('cython-cplus', None,
- "generate C++ source files"),
- ('cython-create-listing', None,
- "write errors to a listing file"),
- ('cython-line-directives', None,
- "emit source line directives"),
- ('cython-include-dirs=', None,
- "path to the Cython include files" + sep_by),
- ('cython-c-in-temp', None,
- "put generated C files in temp directory"),
- ('cython-gen-pxi', None,
- "generate .pxi file for public declarations"),
- ('cython-directives=', None,
- "compiler directive overrides"),
- ('cython-gdb', None,
- "generate debug information for cygdb"),
- ('cython-compile-time-env', None,
- "cython compile time environment"),
-
- # For backwards compatibility.
- ('pyrex-cplus', None,
- "generate C++ source files"),
- ('pyrex-create-listing', None,
- "write errors to a listing file"),
- ('pyrex-line-directives', None,
- "emit source line directives"),
- ('pyrex-include-dirs=', None,
- "path to the Cython include files" + sep_by),
- ('pyrex-c-in-temp', None,
- "put generated C files in temp directory"),
- ('pyrex-gen-pxi', None,
- "generate .pxi file for public declarations"),
- ('pyrex-directives=', None,
- "compiler directive overrides"),
- ('pyrex-gdb', None,
- "generate debug information for cygdb"),
- ])
-
- boolean_options.extend([
- 'cython-cplus', 'cython-create-listing', 'cython-line-directives',
- 'cython-c-in-temp', 'cython-gdb',
-
- # For backwards compatibility.
- 'pyrex-cplus', 'pyrex-create-listing', 'pyrex-line-directives',
- 'pyrex-c-in-temp', 'pyrex-gdb',
- ])
-
- def initialize_options(self):
- _build_ext.build_ext.initialize_options(self)
- self.cython_cplus = 0
- self.cython_create_listing = 0
- self.cython_line_directives = 0
- self.cython_include_dirs = None
- self.cython_directives = None
- self.cython_c_in_temp = 0
- self.cython_gen_pxi = 0
- self.cython_gdb = False
- self.no_c_in_traceback = 0
- self.cython_compile_time_env = None
-
- def __getattr__(self, name):
- if name[:6] == 'pyrex_':
- return getattr(self, 'cython_' + name[6:])
- else:
- return _build_ext.build_ext.__getattr__(self, name)
-
- def __setattr__(self, name, value):
- if name[:6] == 'pyrex_':
- return setattr(self, 'cython_' + name[6:], value)
- else:
- # _build_ext.build_ext.__setattr__(self, name, value)
- self.__dict__[name] = value
-
- def finalize_options (self):
- _build_ext.build_ext.finalize_options(self)
- if self.cython_include_dirs is None:
- self.cython_include_dirs = []
- elif isinstance(self.cython_include_dirs, basestring):
- self.cython_include_dirs = \
- self.cython_include_dirs.split(os.pathsep)
- if self.cython_directives is None:
- self.cython_directives = {}
- # finalize_options ()
-
- def run(self):
- # We have one shot at this before build_ext initializes the compiler.
- # If --pyrex-gdb is in effect as a command line option or as option
- # of any Extension module, disable optimization for the C or C++
- # compiler.
- if self.cython_gdb or [1 for ext in self.extensions
- if getattr(ext, 'cython_gdb', False)]:
- optimization.disable_optimization()
-
- _build_ext.build_ext.run(self)
-
- def build_extensions(self):
- # First, sanity-check the 'extensions' list
- self.check_extensions_list(self.extensions)
-
- for ext in self.extensions:
- ext.sources = self.cython_sources(ext.sources, ext)
+
+ # Add the pyrex specific data.
+ user_options.extend([
+ ('cython-cplus', None,
+ "generate C++ source files"),
+ ('cython-create-listing', None,
+ "write errors to a listing file"),
+ ('cython-line-directives', None,
+ "emit source line directives"),
+ ('cython-include-dirs=', None,
+ "path to the Cython include files" + sep_by),
+ ('cython-c-in-temp', None,
+ "put generated C files in temp directory"),
+ ('cython-gen-pxi', None,
+ "generate .pxi file for public declarations"),
+ ('cython-directives=', None,
+ "compiler directive overrides"),
+ ('cython-gdb', None,
+ "generate debug information for cygdb"),
+ ('cython-compile-time-env', None,
+ "cython compile time environment"),
+
+ # For backwards compatibility.
+ ('pyrex-cplus', None,
+ "generate C++ source files"),
+ ('pyrex-create-listing', None,
+ "write errors to a listing file"),
+ ('pyrex-line-directives', None,
+ "emit source line directives"),
+ ('pyrex-include-dirs=', None,
+ "path to the Cython include files" + sep_by),
+ ('pyrex-c-in-temp', None,
+ "put generated C files in temp directory"),
+ ('pyrex-gen-pxi', None,
+ "generate .pxi file for public declarations"),
+ ('pyrex-directives=', None,
+ "compiler directive overrides"),
+ ('pyrex-gdb', None,
+ "generate debug information for cygdb"),
+ ])
+
+ boolean_options.extend([
+ 'cython-cplus', 'cython-create-listing', 'cython-line-directives',
+ 'cython-c-in-temp', 'cython-gdb',
+
+ # For backwards compatibility.
+ 'pyrex-cplus', 'pyrex-create-listing', 'pyrex-line-directives',
+ 'pyrex-c-in-temp', 'pyrex-gdb',
+ ])
+
+ def initialize_options(self):
+ _build_ext.build_ext.initialize_options(self)
+ self.cython_cplus = 0
+ self.cython_create_listing = 0
+ self.cython_line_directives = 0
+ self.cython_include_dirs = None
+ self.cython_directives = None
+ self.cython_c_in_temp = 0
+ self.cython_gen_pxi = 0
+ self.cython_gdb = False
+ self.no_c_in_traceback = 0
+ self.cython_compile_time_env = None
+
+ def __getattr__(self, name):
+ if name[:6] == 'pyrex_':
+ return getattr(self, 'cython_' + name[6:])
+ else:
+ return _build_ext.build_ext.__getattr__(self, name)
+
+ def __setattr__(self, name, value):
+ if name[:6] == 'pyrex_':
+ return setattr(self, 'cython_' + name[6:], value)
+ else:
+ # _build_ext.build_ext.__setattr__(self, name, value)
+ self.__dict__[name] = value
+
+ def finalize_options (self):
+ _build_ext.build_ext.finalize_options(self)
+ if self.cython_include_dirs is None:
+ self.cython_include_dirs = []
+ elif isinstance(self.cython_include_dirs, basestring):
+ self.cython_include_dirs = \
+ self.cython_include_dirs.split(os.pathsep)
+ if self.cython_directives is None:
+ self.cython_directives = {}
+ # finalize_options ()
+
+ def run(self):
+ # We have one shot at this before build_ext initializes the compiler.
+ # If --pyrex-gdb is in effect as a command line option or as option
+ # of any Extension module, disable optimization for the C or C++
+ # compiler.
+ if self.cython_gdb or [1 for ext in self.extensions
+ if getattr(ext, 'cython_gdb', False)]:
+ optimization.disable_optimization()
+
+ _build_ext.build_ext.run(self)
+
+ def build_extensions(self):
+ # First, sanity-check the 'extensions' list
+ self.check_extensions_list(self.extensions)
+
+ for ext in self.extensions:
+ ext.sources = self.cython_sources(ext.sources, ext)
# Call original build_extensions
_build_ext.build_ext.build_extensions(self)
-
- def cython_sources(self, sources, extension):
- """
- Walk the list of source files in 'sources', looking for Cython
- source files (.pyx and .py). Run Cython on all that are
- found, and return a modified 'sources' list with Cython source
- files replaced by the generated C (or C++) files.
- """
- try:
- from Cython.Compiler.Main \
- import CompilationOptions, \
- default_options as cython_default_options, \
- compile as cython_compile
- from Cython.Compiler.Errors import PyrexError
- except ImportError:
- e = sys.exc_info()[1]
- print("failed to import Cython: %s" % e)
- raise DistutilsPlatformError("Cython does not appear to be installed")
-
- new_sources = []
- cython_sources = []
- cython_targets = {}
-
- # Setup create_list and cplus from the extension options if
- # Cython.Distutils.extension.Extension is used, otherwise just
- # use what was parsed from the command-line or the configuration file.
- # cplus will also be set to true is extension.language is equal to
- # 'C++' or 'c++'.
- #try:
- # create_listing = self.cython_create_listing or \
- # extension.cython_create_listing
- # cplus = self.cython_cplus or \
- # extension.cython_cplus or \
- # (extension.language != None and \
- # extension.language.lower() == 'c++')
- #except AttributeError:
- # create_listing = self.cython_create_listing
- # cplus = self.cython_cplus or \
- # (extension.language != None and \
- # extension.language.lower() == 'c++')
-
- create_listing = self.cython_create_listing or \
- getattr(extension, 'cython_create_listing', 0)
- line_directives = self.cython_line_directives or \
- getattr(extension, 'cython_line_directives', 0)
- no_c_in_traceback = self.no_c_in_traceback or \
- getattr(extension, 'no_c_in_traceback', 0)
- cplus = self.cython_cplus or getattr(extension, 'cython_cplus', 0) or \
- (extension.language and extension.language.lower() == 'c++')
- cython_gen_pxi = self.cython_gen_pxi or getattr(extension, 'cython_gen_pxi', 0)
- cython_gdb = self.cython_gdb or getattr(extension, 'cython_gdb', False)
- cython_compile_time_env = self.cython_compile_time_env or \
- getattr(extension, 'cython_compile_time_env', None)
-
- # Set up the include_path for the Cython compiler:
- # 1. Start with the command line option.
- # 2. Add in any (unique) paths from the extension
- # cython_include_dirs (if Cython.Distutils.extension is used).
- # 3. Add in any (unique) paths from the extension include_dirs
- includes = self.cython_include_dirs
- try:
- for i in extension.cython_include_dirs:
- if not i in includes:
- includes.append(i)
- except AttributeError:
- pass
-
- # In case extension.include_dirs is a generator, evaluate it and keep
- # result
- extension.include_dirs = list(extension.include_dirs)
- for i in extension.include_dirs:
- if not i in includes:
- includes.append(i)
-
- # Set up Cython compiler directives:
- # 1. Start with the command line option.
- # 2. Add in any (unique) entries from the extension
- # cython_directives (if Cython.Distutils.extension is used).
- directives = self.cython_directives
- if hasattr(extension, "cython_directives"):
- directives.update(extension.cython_directives)
-
- # Set the target_ext to '.c'. Cython will change this to '.cpp' if
- # needed.
- if cplus:
- target_ext = '.cpp'
- else:
- target_ext = '.c'
-
- # Decide whether to drop the generated C files into the temp dir
- # or the source tree.
-
- if not self.inplace and (self.cython_c_in_temp
- or getattr(extension, 'cython_c_in_temp', 0)):
- target_dir = os.path.join(self.build_temp, "pyrex")
- for package_name in extension.name.split('.')[:-1]:
- target_dir = os.path.join(target_dir, package_name)
- else:
- target_dir = None
-
- newest_dependency = None
- for source in sources:
- (base, ext) = os.path.splitext(os.path.basename(source))
- if ext == ".py":
- # FIXME: we might want to special case this some more
- ext = '.pyx'
- if ext == ".pyx": # Cython source file
- output_dir = target_dir or os.path.dirname(source)
- new_sources.append(os.path.join(output_dir, base + target_ext))
- cython_sources.append(source)
- cython_targets[source] = new_sources[-1]
- elif ext == '.pxi' or ext == '.pxd':
- if newest_dependency is None \
- or newer(source, newest_dependency):
- newest_dependency = source
- else:
- new_sources.append(source)
-
- if not cython_sources:
- return new_sources
-
- module_name = extension.name
-
- for source in cython_sources:
- target = cython_targets[source]
- depends = [source] + list(extension.depends or ())
- if(source[-4:].lower()==".pyx" and os.path.isfile(source[:-3]+"pxd")):
- depends += [source[:-3]+"pxd"]
- rebuild = self.force or newer_group(depends, target, 'newer')
- if not rebuild and newest_dependency is not None:
- rebuild = newer(newest_dependency, target)
- if rebuild:
- log.info("cythoning %s to %s", source, target)
- self.mkpath(os.path.dirname(target))
- if self.inplace:
- output_dir = os.curdir
- else:
- output_dir = self.build_lib
- options = CompilationOptions(cython_default_options,
- use_listing_file = create_listing,
- include_path = includes,
- compiler_directives = directives,
- output_file = target,
- cplus = cplus,
- emit_linenums = line_directives,
- c_line_in_traceback = not no_c_in_traceback,
- generate_pxi = cython_gen_pxi,
- output_dir = output_dir,
- gdb_debug = cython_gdb,
- compile_time_env = cython_compile_time_env)
- result = cython_compile(source, options=options,
- full_module_name=module_name)
- else:
- log.info("skipping '%s' Cython extension (up-to-date)", target)
-
- return new_sources
-
- # cython_sources ()
-
-# class build_ext
+
+ def cython_sources(self, sources, extension):
+ """
+ Walk the list of source files in 'sources', looking for Cython
+ source files (.pyx and .py). Run Cython on all that are
+ found, and return a modified 'sources' list with Cython source
+ files replaced by the generated C (or C++) files.
+ """
+ try:
+ from Cython.Compiler.Main \
+ import CompilationOptions, \
+ default_options as cython_default_options, \
+ compile as cython_compile
+ from Cython.Compiler.Errors import PyrexError
+ except ImportError:
+ e = sys.exc_info()[1]
+ print("failed to import Cython: %s" % e)
+ raise DistutilsPlatformError("Cython does not appear to be installed")
+
+ new_sources = []
+ cython_sources = []
+ cython_targets = {}
+
+ # Setup create_list and cplus from the extension options if
+ # Cython.Distutils.extension.Extension is used, otherwise just
+ # use what was parsed from the command-line or the configuration file.
+ # cplus will also be set to true is extension.language is equal to
+ # 'C++' or 'c++'.
+ #try:
+ # create_listing = self.cython_create_listing or \
+ # extension.cython_create_listing
+ # cplus = self.cython_cplus or \
+ # extension.cython_cplus or \
+ # (extension.language != None and \
+ # extension.language.lower() == 'c++')
+ #except AttributeError:
+ # create_listing = self.cython_create_listing
+ # cplus = self.cython_cplus or \
+ # (extension.language != None and \
+ # extension.language.lower() == 'c++')
+
+ create_listing = self.cython_create_listing or \
+ getattr(extension, 'cython_create_listing', 0)
+ line_directives = self.cython_line_directives or \
+ getattr(extension, 'cython_line_directives', 0)
+ no_c_in_traceback = self.no_c_in_traceback or \
+ getattr(extension, 'no_c_in_traceback', 0)
+ cplus = self.cython_cplus or getattr(extension, 'cython_cplus', 0) or \
+ (extension.language and extension.language.lower() == 'c++')
+ cython_gen_pxi = self.cython_gen_pxi or getattr(extension, 'cython_gen_pxi', 0)
+ cython_gdb = self.cython_gdb or getattr(extension, 'cython_gdb', False)
+ cython_compile_time_env = self.cython_compile_time_env or \
+ getattr(extension, 'cython_compile_time_env', None)
+
+ # Set up the include_path for the Cython compiler:
+ # 1. Start with the command line option.
+ # 2. Add in any (unique) paths from the extension
+ # cython_include_dirs (if Cython.Distutils.extension is used).
+ # 3. Add in any (unique) paths from the extension include_dirs
+ includes = self.cython_include_dirs
+ try:
+ for i in extension.cython_include_dirs:
+ if not i in includes:
+ includes.append(i)
+ except AttributeError:
+ pass
+
+ # In case extension.include_dirs is a generator, evaluate it and keep
+ # result
+ extension.include_dirs = list(extension.include_dirs)
+ for i in extension.include_dirs:
+ if not i in includes:
+ includes.append(i)
+
+ # Set up Cython compiler directives:
+ # 1. Start with the command line option.
+ # 2. Add in any (unique) entries from the extension
+ # cython_directives (if Cython.Distutils.extension is used).
+ directives = self.cython_directives
+ if hasattr(extension, "cython_directives"):
+ directives.update(extension.cython_directives)
+
+ # Set the target_ext to '.c'. Cython will change this to '.cpp' if
+ # needed.
+ if cplus:
+ target_ext = '.cpp'
+ else:
+ target_ext = '.c'
+
+ # Decide whether to drop the generated C files into the temp dir
+ # or the source tree.
+
+ if not self.inplace and (self.cython_c_in_temp
+ or getattr(extension, 'cython_c_in_temp', 0)):
+ target_dir = os.path.join(self.build_temp, "pyrex")
+ for package_name in extension.name.split('.')[:-1]:
+ target_dir = os.path.join(target_dir, package_name)
+ else:
+ target_dir = None
+
+ newest_dependency = None
+ for source in sources:
+ (base, ext) = os.path.splitext(os.path.basename(source))
+ if ext == ".py":
+ # FIXME: we might want to special case this some more
+ ext = '.pyx'
+ if ext == ".pyx": # Cython source file
+ output_dir = target_dir or os.path.dirname(source)
+ new_sources.append(os.path.join(output_dir, base + target_ext))
+ cython_sources.append(source)
+ cython_targets[source] = new_sources[-1]
+ elif ext == '.pxi' or ext == '.pxd':
+ if newest_dependency is None \
+ or newer(source, newest_dependency):
+ newest_dependency = source
+ else:
+ new_sources.append(source)
+
+ if not cython_sources:
+ return new_sources
+
+ module_name = extension.name
+
+ for source in cython_sources:
+ target = cython_targets[source]
+ depends = [source] + list(extension.depends or ())
+ if(source[-4:].lower()==".pyx" and os.path.isfile(source[:-3]+"pxd")):
+ depends += [source[:-3]+"pxd"]
+ rebuild = self.force or newer_group(depends, target, 'newer')
+ if not rebuild and newest_dependency is not None:
+ rebuild = newer(newest_dependency, target)
+ if rebuild:
+ log.info("cythoning %s to %s", source, target)
+ self.mkpath(os.path.dirname(target))
+ if self.inplace:
+ output_dir = os.curdir
+ else:
+ output_dir = self.build_lib
+ options = CompilationOptions(cython_default_options,
+ use_listing_file = create_listing,
+ include_path = includes,
+ compiler_directives = directives,
+ output_file = target,
+ cplus = cplus,
+ emit_linenums = line_directives,
+ c_line_in_traceback = not no_c_in_traceback,
+ generate_pxi = cython_gen_pxi,
+ output_dir = output_dir,
+ gdb_debug = cython_gdb,
+ compile_time_env = cython_compile_time_env)
+ result = cython_compile(source, options=options,
+ full_module_name=module_name)
+ else:
+ log.info("skipping '%s' Cython extension (up-to-date)", target)
+
+ return new_sources
+
+ # cython_sources ()
+
+# class build_ext
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python.pxd
index 56236e925c..3b3f7f49ff 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_bool.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_bool.pxd
index 9a6d253f45..01e0463713 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_bool.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_bool.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.bool cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_buffer.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_buffer.pxd
index 2baeaae00c..6a1f84ef6f 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_buffer.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_buffer.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.buffer cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_bytes.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_bytes.pxd
index 87af662de0..e52d2c9bfa 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_bytes.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_bytes.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.bytes cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_cobject.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_cobject.pxd
index ed32c6b878..a8539c3290 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_cobject.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_cobject.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.cobject cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_complex.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_complex.pxd
index 0a780b3b2d..cb944a8a59 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_complex.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_complex.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.complex cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_dict.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_dict.pxd
index 05b5f4796a..231c358cde 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_dict.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_dict.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.dict cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_exc.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_exc.pxd
index 6eb236bccb..58a31ca473 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_exc.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_exc.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.exc cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_float.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_float.pxd
index 7e133ef9bb..64dcff8c83 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_float.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_float.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.float cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_function.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_function.pxd
index 1461c4e635..d81960d768 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_function.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_function.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.function cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_getargs.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_getargs.pxd
index 3852d6a6a1..80e99d3198 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_getargs.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_getargs.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.getargs cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_instance.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_instance.pxd
index 99cb5a9091..f0640b0786 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_instance.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_instance.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.instance cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_int.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_int.pxd
index c1fd5178d6..b83e4c2798 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_int.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_int.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.int cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_iterator.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_iterator.pxd
index e09aad2790..0efcc4176b 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_iterator.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_iterator.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.iterator cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_list.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_list.pxd
index 64febcf969..d70ef91ecf 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_list.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_list.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.list cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_long.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_long.pxd
index 1a24380c4c..34f2d50c85 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_long.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_long.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.long cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_mapping.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_mapping.pxd
index cd01bee015..a1883e9e20 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_mapping.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_mapping.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.mapping cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_mem.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_mem.pxd
index d74429ea36..9d6ec7d281 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_mem.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_mem.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.mem cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_method.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_method.pxd
index e7da5154e4..781a7299d1 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_method.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_method.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.method cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_module.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_module.pxd
index 6310c0247d..adc4e8086f 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_module.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_module.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.module cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_number.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_number.pxd
index ae67da1c38..30a852328d 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_number.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_number.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.number cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_object.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_object.pxd
index 3981bfa44e..a60aec203a 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_object.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_object.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.object cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_oldbuffer.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_oldbuffer.pxd
index e03e66a2e2..c5a7853486 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_oldbuffer.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_oldbuffer.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.oldbuffer cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_pycapsule.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_pycapsule.pxd
index fe9cf8f8d9..8789099181 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_pycapsule.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_pycapsule.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.pycapsule cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_ref.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_ref.pxd
index 9447418198..d8cbae574d 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_ref.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_ref.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.ref cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_sequence.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_sequence.pxd
index fdef5b63eb..c5c422098d 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_sequence.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_sequence.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.sequence cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_set.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_set.pxd
index a2feb93712..63626aa3b3 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_set.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_set.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.set cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_string.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_string.pxd
index 24c818338e..501e18cf32 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_string.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_string.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.string cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_tuple.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_tuple.pxd
index 190713b020..6101315435 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_tuple.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_tuple.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.tuple cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_type.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_type.pxd
index 3ac47d1b3f..94436aa819 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_type.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_type.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.type cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_unicode.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_unicode.pxd
index 2b488b2dc8..9d383ec0b2 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_unicode.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_unicode.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.unicode cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_version.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_version.pxd
index c27ca4df95..0e9c887b9d 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_version.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_version.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.version cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/python_weakref.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/python_weakref.pxd
index 1f84f1a179..c70f44cbe5 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/python_weakref.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/python_weakref.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from cpython.weakref cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/stdio.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/stdio.pxd
index 41a4aebf1d..cd77b499fc 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/stdio.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/stdio.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from libc.stdio cimport *
diff --git a/contrib/tools/cython/Cython/Includes/Deprecated/stdlib.pxd b/contrib/tools/cython/Cython/Includes/Deprecated/stdlib.pxd
index 499511cde9..5f48fbe2c6 100644
--- a/contrib/tools/cython/Cython/Includes/Deprecated/stdlib.pxd
+++ b/contrib/tools/cython/Cython/Includes/Deprecated/stdlib.pxd
@@ -1,2 +1,2 @@
-# Present for backwards compatibility
+# Present for backwards compatibility
from libc.stdlib cimport *
diff --git a/contrib/tools/cython/Cython/Includes/cpython/array.pxd b/contrib/tools/cython/Cython/Includes/cpython/array.pxd
index 19230a0a82..5d37c007df 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/array.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/array.pxd
@@ -52,14 +52,14 @@ from libc.string cimport strcat, strncat, \
from cpython.object cimport Py_SIZE
from cpython.ref cimport PyTypeObject, Py_TYPE
from cpython.exc cimport PyErr_BadArgument
-from cpython.mem cimport PyObject_Malloc, PyObject_Free
+from cpython.mem cimport PyObject_Malloc, PyObject_Free
cdef extern from *: # Hard-coded utility code hack.
ctypedef class array.array [object arrayobject]
ctypedef object GETF(array a, Py_ssize_t ix)
ctypedef object SETF(array a, Py_ssize_t ix, object o)
ctypedef struct arraydescr: # [object arraydescr]:
- char typecode
+ char typecode
int itemsize
GETF getitem # PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
SETF setitem # int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
@@ -104,7 +104,7 @@ cdef extern from *: # Hard-coded utility code hack.
info.itemsize = self.ob_descr.itemsize # e.g. sizeof(float)
info.len = info.itemsize * item_count
- info.shape = <Py_ssize_t*> PyObject_Malloc(sizeof(Py_ssize_t) + 2)
+ info.shape = <Py_ssize_t*> PyObject_Malloc(sizeof(Py_ssize_t) + 2)
if not info.shape:
raise MemoryError()
info.shape[0] = item_count # constant regardless of resizing
@@ -116,7 +116,7 @@ cdef extern from *: # Hard-coded utility code hack.
info.obj = self
def __releasebuffer__(self, Py_buffer* info):
- PyObject_Free(info.shape)
+ PyObject_Free(info.shape)
array newarrayobject(PyTypeObject* type, Py_ssize_t size, arraydescr *descr)
diff --git a/contrib/tools/cython/Cython/Includes/cpython/buffer.pxd b/contrib/tools/cython/Cython/Includes/cpython/buffer.pxd
index 3f1ada774a..2f6158f1f1 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/buffer.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/buffer.pxd
@@ -8,7 +8,7 @@ cdef extern from "Python.h":
cdef enum:
PyBUF_SIMPLE,
PyBUF_WRITABLE,
- PyBUF_WRITEABLE, # backwards compatibility
+ PyBUF_WRITEABLE, # backwards compatibility
PyBUF_FORMAT,
PyBUF_ND,
PyBUF_STRIDES,
diff --git a/contrib/tools/cython/Cython/Includes/cpython/bytearray.pxd b/contrib/tools/cython/Cython/Includes/cpython/bytearray.pxd
index 1af4a6c427..4da41c4a0a 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/bytearray.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/bytearray.pxd
@@ -1,33 +1,33 @@
-from .object cimport PyObject
-
-cdef extern from "Python.h":
- bint PyByteArray_Check(object o)
- # Return true if the object o is a bytearray object or an instance of a subtype of the bytearray type.
-
- bint PyByteArray_CheckExact(object o)
- # Return true if the object o is a bytearray object, but not an instance of a subtype of the bytearray type.
-
- bytearray PyByteArray_FromObject(object o)
- # Return a new bytearray object from any object, o, that implements the buffer protocol.
-
- bytearray PyByteArray_FromStringAndSize(char *string, Py_ssize_t len)
- # Create a new bytearray object from string and its length, len. On failure, NULL is returned.
-
- bytearray PyByteArray_Concat(object a, object b)
- # Concat bytearrays a and b and return a new bytearray with the result.
-
- Py_ssize_t PyByteArray_Size(object bytearray)
- # Return the size of bytearray after checking for a NULL pointer.
-
- char* PyByteArray_AsString(object bytearray)
- # Return the contents of bytearray as a char array after checking for a NULL pointer.
- # The returned array always has an extra null byte appended.
-
- int PyByteArray_Resize(object bytearray, Py_ssize_t len)
- # Resize the internal buffer of bytearray to len.
-
- char* PyByteArray_AS_STRING(object bytearray)
- # Macro version of PyByteArray_AsString().
-
- Py_ssize_t PyByteArray_GET_SIZE(object bytearray)
- # Macro version of PyByteArray_Size().
+from .object cimport PyObject
+
+cdef extern from "Python.h":
+ bint PyByteArray_Check(object o)
+ # Return true if the object o is a bytearray object or an instance of a subtype of the bytearray type.
+
+ bint PyByteArray_CheckExact(object o)
+ # Return true if the object o is a bytearray object, but not an instance of a subtype of the bytearray type.
+
+ bytearray PyByteArray_FromObject(object o)
+ # Return a new bytearray object from any object, o, that implements the buffer protocol.
+
+ bytearray PyByteArray_FromStringAndSize(char *string, Py_ssize_t len)
+ # Create a new bytearray object from string and its length, len. On failure, NULL is returned.
+
+ bytearray PyByteArray_Concat(object a, object b)
+ # Concat bytearrays a and b and return a new bytearray with the result.
+
+ Py_ssize_t PyByteArray_Size(object bytearray)
+ # Return the size of bytearray after checking for a NULL pointer.
+
+ char* PyByteArray_AsString(object bytearray)
+ # Return the contents of bytearray as a char array after checking for a NULL pointer.
+ # The returned array always has an extra null byte appended.
+
+ int PyByteArray_Resize(object bytearray, Py_ssize_t len)
+ # Resize the internal buffer of bytearray to len.
+
+ char* PyByteArray_AS_STRING(object bytearray)
+ # Macro version of PyByteArray_AsString().
+
+ Py_ssize_t PyByteArray_GET_SIZE(object bytearray)
+ # Macro version of PyByteArray_Size().
diff --git a/contrib/tools/cython/Cython/Includes/cpython/bytes.pxd b/contrib/tools/cython/Cython/Includes/cpython/bytes.pxd
index ea72c6aae7..a21cc3baf6 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/bytes.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/bytes.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
ctypedef struct va_list
diff --git a/contrib/tools/cython/Cython/Includes/cpython/ceval.pxd b/contrib/tools/cython/Cython/Includes/cpython/ceval.pxd
index f22191f9fe..51631b0a26 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/ceval.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/ceval.pxd
@@ -1,8 +1,8 @@
-
-cdef extern from "Python.h":
-
- void PyEval_InitThreads()
- # Initialize and acquire the global interpreter lock.
-
- int PyEval_ThreadsInitialized()
- # Returns a non-zero value if PyEval_InitThreads() has been called.
+
+cdef extern from "Python.h":
+
+ void PyEval_InitThreads()
+ # Initialize and acquire the global interpreter lock.
+
+ int PyEval_ThreadsInitialized()
+ # Returns a non-zero value if PyEval_InitThreads() has been called.
diff --git a/contrib/tools/cython/Cython/Includes/cpython/datetime.pxd b/contrib/tools/cython/Cython/Includes/cpython/datetime.pxd
index cd0f90719b..4dbf40d677 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/datetime.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/datetime.pxd
@@ -1,4 +1,4 @@
-from cpython.object cimport PyObject
+from cpython.object cimport PyObject
cdef extern from "Python.h":
ctypedef struct PyTypeObject:
diff --git a/contrib/tools/cython/Cython/Includes/cpython/dict.pxd b/contrib/tools/cython/Cython/Includes/cpython/dict.pxd
index 16dd5e1458..fc531ab7af 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/dict.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/dict.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
@@ -52,7 +52,7 @@ cdef extern from "Python.h":
# be hashable; if it isn't, TypeError will be raised. Return 0 on
# success or -1 on failure.
- int PyDict_SetItemString(object p, const char *key, object val) except -1
+ int PyDict_SetItemString(object p, const char *key, object val) except -1
# Insert value into the dictionary p using key as a key. key
# should be a char*. The key object is created using
# PyString_FromString(key). Return 0 on success or -1 on failure.
@@ -62,7 +62,7 @@ cdef extern from "Python.h":
# hashable; if it isn't, TypeError is raised. Return 0 on success
# or -1 on failure.
- int PyDict_DelItemString(object p, const char *key) except -1
+ int PyDict_DelItemString(object p, const char *key) except -1
# Remove the entry in dictionary p which has a key specified by
# the string key. Return 0 on success or -1 on failure.
@@ -72,7 +72,7 @@ cdef extern from "Python.h":
# NULL if the key key is not present, but without setting an
# exception.
- PyObject* PyDict_GetItemString(object p, const char *key)
+ PyObject* PyDict_GetItemString(object p, const char *key)
# Return value: Borrowed reference.
# This is the same as PyDict_GetItem(), but key is specified as a
# char*, rather than a PyObject*.
diff --git a/contrib/tools/cython/Cython/Includes/cpython/exc.pxd b/contrib/tools/cython/Cython/Includes/cpython/exc.pxd
index bc57c0e571..608fe3e560 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/exc.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/exc.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
@@ -50,7 +50,7 @@ cdef extern from "Python.h":
# return value to a specific exception; use
# PyErr_ExceptionMatches() instead, shown below. (The comparison
# could easily fail since the exception may be an instance instead
- # of a class, in the case of a class exception, or it may be a
+ # of a class, in the case of a class exception, or it may be a
# subclass of the expected exception.)
bint PyErr_ExceptionMatches(object exc)
@@ -153,13 +153,13 @@ cdef extern from "Python.h":
# PyErr_SetFromErrno(type);" when the system call returns an
# error.
- PyObject* PyErr_SetFromErrnoWithFilenameObject(object type, object filenameObject) except NULL
- # Similar to PyErr_SetFromErrno(), with the additional behavior
- # that if filenameObject is not NULL, it is passed to the
- # constructor of type as a third parameter.
- # In the case of OSError exception, this is used to define
- # the filename attribute of the exception instance.
-
+ PyObject* PyErr_SetFromErrnoWithFilenameObject(object type, object filenameObject) except NULL
+ # Similar to PyErr_SetFromErrno(), with the additional behavior
+ # that if filenameObject is not NULL, it is passed to the
+ # constructor of type as a third parameter.
+ # In the case of OSError exception, this is used to define
+ # the filename attribute of the exception instance.
+
PyObject* PyErr_SetFromErrnoWithFilename(object type, char *filename) except NULL
# Return value: Always NULL. Similar to PyErr_SetFromErrno(),
# with the additional behavior that if filename is not NULL, it is
diff --git a/contrib/tools/cython/Cython/Includes/cpython/function.pxd b/contrib/tools/cython/Cython/Includes/cpython/function.pxd
index 0002a3f6cb..8818e1e560 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/function.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/function.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
diff --git a/contrib/tools/cython/Cython/Includes/cpython/int.pxd b/contrib/tools/cython/Cython/Includes/cpython/int.pxd
index 50babff615..e70cb3698f 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/int.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/int.pxd
@@ -46,12 +46,12 @@ cdef extern from "Python.h":
object PyInt_FromSsize_t(Py_ssize_t ival)
# Return value: New reference.
# Create a new integer object with a value of ival. If the value
- # is larger than LONG_MAX or smaller than LONG_MIN, a long integer
- # object is returned.
-
- object PyInt_FromSize_t(size_t ival)
- # Return value: New reference.
- # Create a new integer object with a value of ival. If the value
+ # is larger than LONG_MAX or smaller than LONG_MIN, a long integer
+ # object is returned.
+
+ object PyInt_FromSize_t(size_t ival)
+ # Return value: New reference.
+ # Create a new integer object with a value of ival. If the value
# exceeds LONG_MAX, a long integer object is returned.
long PyInt_AsLong(object io) except? -1
@@ -83,7 +83,7 @@ cdef extern from "Python.h":
long PyInt_GetMax()
# Return the system's idea of the largest integer it can handle
# (LONG_MAX, as defined in the system header files).
-
- int PyInt_ClearFreeList()
- # Clear the integer free list. Return the number of items that could not be freed.
- # New in version 2.6.
+
+ int PyInt_ClearFreeList()
+ # Clear the integer free list. Return the number of items that could not be freed.
+ # New in version 2.6.
diff --git a/contrib/tools/cython/Cython/Includes/cpython/list.pxd b/contrib/tools/cython/Cython/Includes/cpython/list.pxd
index c6a29535c9..0d3d2c95a7 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/list.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/list.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
diff --git a/contrib/tools/cython/Cython/Includes/cpython/long.pxd b/contrib/tools/cython/Cython/Includes/cpython/long.pxd
index eb8140d417..2b70f9bbb1 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/long.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/long.pxd
@@ -146,4 +146,4 @@ cdef extern from "Python.h":
# pointer. If pylong cannot be converted, an OverflowError will be
# raised. This is only assured to produce a usable void pointer
# for values created with PyLong_FromVoidPtr(). For values outside
- # 0..LONG_MAX, both signed and unsigned integers are accepted.
+ # 0..LONG_MAX, both signed and unsigned integers are accepted.
diff --git a/contrib/tools/cython/Cython/Includes/cpython/longintrepr.pxd b/contrib/tools/cython/Cython/Includes/cpython/longintrepr.pxd
index c38c1bff88..12fb7dc0f5 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/longintrepr.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/longintrepr.pxd
@@ -1,19 +1,19 @@
-# Internals of the "long" type (Python 2) or "int" type (Python 3).
-
+# Internals of the "long" type (Python 2) or "int" type (Python 3).
+
cdef extern from "Python.h":
"""
#if PY_MAJOR_VERSION < 3
#include "longintrepr.h"
#endif
"""
- ctypedef unsigned int digit
- ctypedef int sdigit # Python >= 2.7 only
-
- ctypedef class __builtin__.py_long [object PyLongObject]:
- cdef digit* ob_digit
-
- cdef py_long _PyLong_New(Py_ssize_t s)
-
- cdef long PyLong_SHIFT
- cdef digit PyLong_BASE
- cdef digit PyLong_MASK
+ ctypedef unsigned int digit
+ ctypedef int sdigit # Python >= 2.7 only
+
+ ctypedef class __builtin__.py_long [object PyLongObject]:
+ cdef digit* ob_digit
+
+ cdef py_long _PyLong_New(Py_ssize_t s)
+
+ cdef long PyLong_SHIFT
+ cdef digit PyLong_BASE
+ cdef digit PyLong_MASK
diff --git a/contrib/tools/cython/Cython/Includes/cpython/mem.pxd b/contrib/tools/cython/Cython/Includes/cpython/mem.pxd
index af820f2ee0..57b12c9224 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/mem.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/mem.pxd
@@ -27,7 +27,7 @@ cdef extern from "Python.h":
# available for allocating and releasing memory from the Python
# heap:
- void* PyMem_RawMalloc(size_t n) nogil
+ void* PyMem_RawMalloc(size_t n) nogil
void* PyMem_Malloc(size_t n)
# Allocates n bytes and returns a pointer of type void* to the
# allocated memory, or NULL if the request fails. Requesting zero
@@ -35,7 +35,7 @@ cdef extern from "Python.h":
# PyMem_Malloc(1) had been called instead. The memory will not
# have been initialized in any way.
- void* PyMem_RawRealloc(void *p, size_t n) nogil
+ void* PyMem_RawRealloc(void *p, size_t n) nogil
void* PyMem_Realloc(void *p, size_t n)
# Resizes the memory block pointed to by p to n bytes. The
# contents will be unchanged to the minimum of the old and the new
@@ -45,7 +45,7 @@ cdef extern from "Python.h":
# NULL, it must have been returned by a previous call to
# PyMem_Malloc() or PyMem_Realloc().
- void PyMem_RawFree(void *p) nogil
+ void PyMem_RawFree(void *p) nogil
void PyMem_Free(void *p)
# Frees the memory block pointed to by p, which must have been
# returned by a previous call to PyMem_Malloc() or
@@ -76,36 +76,36 @@ cdef extern from "Python.h":
# PyMem_MALLOC(), PyMem_REALLOC(), PyMem_FREE().
# PyMem_NEW(), PyMem_RESIZE(), PyMem_DEL().
-
-
- #####################################################################
- # Raw object memory interface
- #####################################################################
-
- # Functions to call the same malloc/realloc/free as used by Python's
- # object allocator. If WITH_PYMALLOC is enabled, these may differ from
- # the platform malloc/realloc/free. The Python object allocator is
- # designed for fast, cache-conscious allocation of many "small" objects,
- # and with low hidden memory overhead.
- #
- # PyObject_Malloc(0) returns a unique non-NULL pointer if possible.
- #
- # PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n).
- # PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory
- # at p.
- #
- # Returned pointers must be checked for NULL explicitly; no action is
- # performed on failure other than to return NULL (no warning it printed, no
- # exception is set, etc).
- #
- # For allocating objects, use PyObject_{New, NewVar} instead whenever
- # possible. The PyObject_{Malloc, Realloc, Free} family is exposed
- # so that you can exploit Python's small-block allocator for non-object
- # uses. If you must use these routines to allocate object memory, make sure
- # the object gets initialized via PyObject_{Init, InitVar} after obtaining
- # the raw memory.
-
- void* PyObject_Malloc(size_t size)
- void* PyObject_Calloc(size_t nelem, size_t elsize)
- void* PyObject_Realloc(void *ptr, size_t new_size)
- void PyObject_Free(void *ptr)
+
+
+ #####################################################################
+ # Raw object memory interface
+ #####################################################################
+
+ # Functions to call the same malloc/realloc/free as used by Python's
+ # object allocator. If WITH_PYMALLOC is enabled, these may differ from
+ # the platform malloc/realloc/free. The Python object allocator is
+ # designed for fast, cache-conscious allocation of many "small" objects,
+ # and with low hidden memory overhead.
+ #
+ # PyObject_Malloc(0) returns a unique non-NULL pointer if possible.
+ #
+ # PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n).
+ # PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory
+ # at p.
+ #
+ # Returned pointers must be checked for NULL explicitly; no action is
+ # performed on failure other than to return NULL (no warning it printed, no
+ # exception is set, etc).
+ #
+ # For allocating objects, use PyObject_{New, NewVar} instead whenever
+ # possible. The PyObject_{Malloc, Realloc, Free} family is exposed
+ # so that you can exploit Python's small-block allocator for non-object
+ # uses. If you must use these routines to allocate object memory, make sure
+ # the object gets initialized via PyObject_{Init, InitVar} after obtaining
+ # the raw memory.
+
+ void* PyObject_Malloc(size_t size)
+ void* PyObject_Calloc(size_t nelem, size_t elsize)
+ void* PyObject_Realloc(void *ptr, size_t new_size)
+ void PyObject_Free(void *ptr)
diff --git a/contrib/tools/cython/Cython/Includes/cpython/method.pxd b/contrib/tools/cython/Cython/Includes/cpython/method.pxd
index f51ebcc7c7..7866562605 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/method.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/method.pxd
@@ -1,5 +1,5 @@
-from .object cimport PyObject
-
+from .object cimport PyObject
+
cdef extern from "Python.h":
############################################################################
# 7.5.4 Method Objects
diff --git a/contrib/tools/cython/Cython/Includes/cpython/module.pxd b/contrib/tools/cython/Cython/Includes/cpython/module.pxd
index 8eb323b010..d804eea5d1 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/module.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/module.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
ctypedef struct _inittab
@@ -6,7 +6,7 @@ cdef extern from "Python.h":
#####################################################################
# 5.3 Importing Modules
#####################################################################
- object PyImport_ImportModule(const char *name)
+ object PyImport_ImportModule(const char *name)
# Return value: New reference.
# This is a simplified interface to PyImport_ImportModuleEx()
# below, leaving the globals and locals arguments set to
@@ -20,7 +20,7 @@ cdef extern from "Python.h":
# loaded.) Return a new reference to the imported module, or NULL
# with an exception set on failure.
- object PyImport_ImportModuleEx(const char *name, object globals, object locals, object fromlist)
+ object PyImport_ImportModuleEx(const char *name, object globals, object locals, object fromlist)
# Return value: New reference.
# Import a module. This is best described by referring to the
@@ -64,7 +64,7 @@ cdef extern from "Python.h":
# the reloaded module, or NULL with an exception set on failure
# (the module still exists in this case).
- PyObject* PyImport_AddModule(const char *name) except NULL
+ PyObject* PyImport_AddModule(const char *name) except NULL
# Return value: Borrowed reference.
# Return the module object corresponding to a module name. The
# name argument may be of the form package.module. First check the
@@ -145,7 +145,7 @@ cdef extern from "Python.h":
bint PyModule_CheckExact(object p)
# Return true if p is a module object, but not a subtype of PyModule_Type.
- object PyModule_New(const char *name)
+ object PyModule_New(const char *name)
# Return value: New reference.
# Return a new module object with the __name__ attribute set to
# name. Only the module's __doc__ and __name__ attributes are
@@ -170,18 +170,18 @@ cdef extern from "Python.h":
# module's __file__ attribute. If this is not defined, or if it is
# not a string, raise SystemError and return NULL.
- int PyModule_AddObject(object module, const char *name, object value) except -1
+ int PyModule_AddObject(object module, const char *name, object value) except -1
# Add an object to module as name. This is a convenience function
# which can be used from the module's initialization
# function. This steals a reference to value. Return -1 on error,
# 0 on success.
- int PyModule_AddIntConstant(object module, const char *name, long value) except -1
+ int PyModule_AddIntConstant(object module, const char *name, long value) except -1
# Add an integer constant to module as name. This convenience
# function can be used from the module's initialization
# function. Return -1 on error, 0 on success.
- int PyModule_AddStringConstant(object module, const char *name, const char *value) except -1
+ int PyModule_AddStringConstant(object module, const char *name, const char *value) except -1
# Add a string constant to module as name. This convenience
# function can be used from the module's initialization
# function. The string value must be null-terminated. Return -1 on
diff --git a/contrib/tools/cython/Cython/Includes/cpython/number.pxd b/contrib/tools/cython/Cython/Includes/cpython/number.pxd
index ded35c292a..4e926fc3c5 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/number.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/number.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
diff --git a/contrib/tools/cython/Cython/Includes/cpython/object.pxd b/contrib/tools/cython/Cython/Includes/cpython/object.pxd
index 5a81166393..891efb847f 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/object.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/object.pxd
@@ -1,78 +1,78 @@
from libc.stdio cimport FILE
-cimport cpython.type
+cimport cpython.type
cdef extern from "Python.h":
- ctypedef struct PyObject # forward declaration
-
- ctypedef object (*newfunc)(cpython.type.type, object, object) # (type, args, kwargs)
-
- ctypedef object (*unaryfunc)(object)
- ctypedef object (*binaryfunc)(object, object)
- ctypedef object (*ternaryfunc)(object, object, object)
+ ctypedef struct PyObject # forward declaration
+
+ ctypedef object (*newfunc)(cpython.type.type, object, object) # (type, args, kwargs)
+
+ ctypedef object (*unaryfunc)(object)
+ ctypedef object (*binaryfunc)(object, object)
+ ctypedef object (*ternaryfunc)(object, object, object)
ctypedef int (*inquiry)(object) except -1
ctypedef Py_ssize_t (*lenfunc)(object) except -1
- ctypedef object (*ssizeargfunc)(object, Py_ssize_t)
- ctypedef object (*ssizessizeargfunc)(object, Py_ssize_t, Py_ssize_t)
+ ctypedef object (*ssizeargfunc)(object, Py_ssize_t)
+ ctypedef object (*ssizessizeargfunc)(object, Py_ssize_t, Py_ssize_t)
ctypedef int (*ssizeobjargproc)(object, Py_ssize_t, object) except -1
ctypedef int (*ssizessizeobjargproc)(object, Py_ssize_t, Py_ssize_t, object) except -1
ctypedef int (*objobjargproc)(object, object, object) except -1
ctypedef int (*objobjproc)(object, object) except -1
-
+
ctypedef Py_hash_t (*hashfunc)(object) except -1
- ctypedef object (*reprfunc)(object)
-
+ ctypedef object (*reprfunc)(object)
+
ctypedef int (*cmpfunc)(object, object) except -2
- ctypedef object (*richcmpfunc)(object, object, int)
-
- # The following functions use 'PyObject*' as first argument instead of 'object' to prevent
- # accidental reference counting when calling them during a garbage collection run.
- ctypedef void (*destructor)(PyObject*)
+ ctypedef object (*richcmpfunc)(object, object, int)
+
+ # The following functions use 'PyObject*' as first argument instead of 'object' to prevent
+ # accidental reference counting when calling them during a garbage collection run.
+ ctypedef void (*destructor)(PyObject*)
ctypedef int (*visitproc)(PyObject*, void *) except -1
ctypedef int (*traverseproc)(PyObject*, visitproc, void*) except -1
ctypedef void (*freefunc)(void*)
-
- ctypedef object (*descrgetfunc)(object, object, object)
- ctypedef int (*descrsetfunc)(object, object, object) except -1
-
- ctypedef struct PyTypeObject:
- const char* tp_name
- const char* tp_doc
- Py_ssize_t tp_basicsize
- Py_ssize_t tp_itemsize
- Py_ssize_t tp_dictoffset
- unsigned long tp_flags
-
- newfunc tp_new
- destructor tp_dealloc
- traverseproc tp_traverse
- inquiry tp_clear
+
+ ctypedef object (*descrgetfunc)(object, object, object)
+ ctypedef int (*descrsetfunc)(object, object, object) except -1
+
+ ctypedef struct PyTypeObject:
+ const char* tp_name
+ const char* tp_doc
+ Py_ssize_t tp_basicsize
+ Py_ssize_t tp_itemsize
+ Py_ssize_t tp_dictoffset
+ unsigned long tp_flags
+
+ newfunc tp_new
+ destructor tp_dealloc
+ traverseproc tp_traverse
+ inquiry tp_clear
freefunc tp_free
-
- ternaryfunc tp_call
- hashfunc tp_hash
- reprfunc tp_str
- reprfunc tp_repr
-
- cmpfunc tp_compare
- richcmpfunc tp_richcompare
-
- PyTypeObject* tp_base
- PyObject* tp_dict
-
- descrgetfunc tp_descr_get
- descrsetfunc tp_descr_set
-
- ctypedef struct PyObject:
- Py_ssize_t ob_refcnt
- PyTypeObject *ob_type
-
- cdef PyTypeObject *Py_TYPE(object)
-
- void* PyObject_Malloc(size_t)
- void* PyObject_Realloc(void *, size_t)
- void PyObject_Free(void *)
-
+
+ ternaryfunc tp_call
+ hashfunc tp_hash
+ reprfunc tp_str
+ reprfunc tp_repr
+
+ cmpfunc tp_compare
+ richcmpfunc tp_richcompare
+
+ PyTypeObject* tp_base
+ PyObject* tp_dict
+
+ descrgetfunc tp_descr_get
+ descrsetfunc tp_descr_set
+
+ ctypedef struct PyObject:
+ Py_ssize_t ob_refcnt
+ PyTypeObject *ob_type
+
+ cdef PyTypeObject *Py_TYPE(object)
+
+ void* PyObject_Malloc(size_t)
+ void* PyObject_Realloc(void *, size_t)
+ void PyObject_Free(void *)
+
#####################################################################
# 6.1 Object Protocol
#####################################################################
@@ -82,12 +82,12 @@ cdef extern from "Python.h":
# option currently supported is Py_PRINT_RAW; if given, the str()
# of the object is written instead of the repr().
- bint PyObject_HasAttrString(object o, const char *attr_name)
+ bint PyObject_HasAttrString(object o, const char *attr_name)
# Returns 1 if o has the attribute attr_name, and 0
# otherwise. This is equivalent to the Python expression
# "hasattr(o, attr_name)". This function always succeeds.
- object PyObject_GetAttrString(object o, const char *attr_name)
+ object PyObject_GetAttrString(object o, const char *attr_name)
# Return value: New reference. Retrieve an attribute named
# attr_name from object o. Returns the attribute value on success,
# or NULL on failure. This is the equivalent of the Python
@@ -106,7 +106,7 @@ cdef extern from "Python.h":
object PyObject_GenericGetAttr(object o, object attr_name)
- int PyObject_SetAttrString(object o, const char *attr_name, object v) except -1
+ int PyObject_SetAttrString(object o, const char *attr_name, object v) except -1
# Set the value of the attribute named attr_name, for object o, to
# the value v. Returns -1 on failure. This is the equivalent of
# the Python statement "o.attr_name = v".
@@ -118,7 +118,7 @@ cdef extern from "Python.h":
int PyObject_GenericSetAttr(object o, object attr_name, object v) except -1
- int PyObject_DelAttrString(object o, const char *attr_name) except -1
+ int PyObject_DelAttrString(object o, const char *attr_name) except -1
# Delete attribute named attr_name, for object o. Returns -1 on
# failure. This is the equivalent of the Python statement: "del
# o.attr_name".
@@ -364,36 +364,36 @@ cdef extern from "Python.h":
# Takes an arbitrary object and returns the result of calling
# obj.__format__(format_spec).
# Added in Py2.6
-
- # Type flags (tp_flags of PyTypeObject)
- long Py_TPFLAGS_HAVE_GETCHARBUFFER
- long Py_TPFLAGS_HAVE_SEQUENCE_IN
- long Py_TPFLAGS_HAVE_INPLACEOPS
- long Py_TPFLAGS_CHECKTYPES
- long Py_TPFLAGS_HAVE_RICHCOMPARE
- long Py_TPFLAGS_HAVE_WEAKREFS
- long Py_TPFLAGS_HAVE_ITER
- long Py_TPFLAGS_HAVE_CLASS
- long Py_TPFLAGS_HEAPTYPE
- long Py_TPFLAGS_BASETYPE
- long Py_TPFLAGS_READY
- long Py_TPFLAGS_READYING
- long Py_TPFLAGS_HAVE_GC
- long Py_TPFLAGS_HAVE_STACKLESS_EXTENSION
- long Py_TPFLAGS_HAVE_INDEX
- long Py_TPFLAGS_HAVE_VERSION_TAG
- long Py_TPFLAGS_VALID_VERSION_TAG
- long Py_TPFLAGS_IS_ABSTRACT
- long Py_TPFLAGS_HAVE_NEWBUFFER
- long Py_TPFLAGS_INT_SUBCLASS
- long Py_TPFLAGS_LONG_SUBCLASS
- long Py_TPFLAGS_LIST_SUBCLASS
- long Py_TPFLAGS_TUPLE_SUBCLASS
- long Py_TPFLAGS_STRING_SUBCLASS
- long Py_TPFLAGS_UNICODE_SUBCLASS
- long Py_TPFLAGS_DICT_SUBCLASS
- long Py_TPFLAGS_BASE_EXC_SUBCLASS
- long Py_TPFLAGS_TYPE_SUBCLASS
- long Py_TPFLAGS_DEFAULT_EXTERNAL
- long Py_TPFLAGS_DEFAULT_CORE
- long Py_TPFLAGS_DEFAULT
+
+ # Type flags (tp_flags of PyTypeObject)
+ long Py_TPFLAGS_HAVE_GETCHARBUFFER
+ long Py_TPFLAGS_HAVE_SEQUENCE_IN
+ long Py_TPFLAGS_HAVE_INPLACEOPS
+ long Py_TPFLAGS_CHECKTYPES
+ long Py_TPFLAGS_HAVE_RICHCOMPARE
+ long Py_TPFLAGS_HAVE_WEAKREFS
+ long Py_TPFLAGS_HAVE_ITER
+ long Py_TPFLAGS_HAVE_CLASS
+ long Py_TPFLAGS_HEAPTYPE
+ long Py_TPFLAGS_BASETYPE
+ long Py_TPFLAGS_READY
+ long Py_TPFLAGS_READYING
+ long Py_TPFLAGS_HAVE_GC
+ long Py_TPFLAGS_HAVE_STACKLESS_EXTENSION
+ long Py_TPFLAGS_HAVE_INDEX
+ long Py_TPFLAGS_HAVE_VERSION_TAG
+ long Py_TPFLAGS_VALID_VERSION_TAG
+ long Py_TPFLAGS_IS_ABSTRACT
+ long Py_TPFLAGS_HAVE_NEWBUFFER
+ long Py_TPFLAGS_INT_SUBCLASS
+ long Py_TPFLAGS_LONG_SUBCLASS
+ long Py_TPFLAGS_LIST_SUBCLASS
+ long Py_TPFLAGS_TUPLE_SUBCLASS
+ long Py_TPFLAGS_STRING_SUBCLASS
+ long Py_TPFLAGS_UNICODE_SUBCLASS
+ long Py_TPFLAGS_DICT_SUBCLASS
+ long Py_TPFLAGS_BASE_EXC_SUBCLASS
+ long Py_TPFLAGS_TYPE_SUBCLASS
+ long Py_TPFLAGS_DEFAULT_EXTERNAL
+ long Py_TPFLAGS_DEFAULT_CORE
+ long Py_TPFLAGS_DEFAULT
diff --git a/contrib/tools/cython/Cython/Includes/cpython/pylifecycle.pxd b/contrib/tools/cython/Cython/Includes/cpython/pylifecycle.pxd
index 2c71e37163..07f4edd397 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/pylifecycle.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/pylifecycle.pxd
@@ -1,68 +1,68 @@
-# Interfaces to configure, query, create & destroy the Python runtime
-
-from libc.stdio cimport FILE
-from .pystate cimport PyThreadState
-
-
-cdef extern from "Python.h":
- ctypedef int wchar_t
-
- void Py_SetProgramName(wchar_t *)
- wchar_t *Py_GetProgramName()
-
- void Py_SetPythonHome(wchar_t *)
- wchar_t *Py_GetPythonHome()
-
- # Only used by applications that embed the interpreter and need to
- # override the standard encoding determination mechanism
- int Py_SetStandardStreamEncoding(const char *encoding, const char *errors)
-
- void Py_Initialize()
- void Py_InitializeEx(int)
- void _Py_InitializeEx_Private(int, int)
- void Py_Finalize()
- int Py_FinalizeEx()
- int Py_IsInitialized()
- PyThreadState *Py_NewInterpreter()
- void Py_EndInterpreter(PyThreadState *)
-
-
+# Interfaces to configure, query, create & destroy the Python runtime
+
+from libc.stdio cimport FILE
+from .pystate cimport PyThreadState
+
+
+cdef extern from "Python.h":
+ ctypedef int wchar_t
+
+ void Py_SetProgramName(wchar_t *)
+ wchar_t *Py_GetProgramName()
+
+ void Py_SetPythonHome(wchar_t *)
+ wchar_t *Py_GetPythonHome()
+
+ # Only used by applications that embed the interpreter and need to
+ # override the standard encoding determination mechanism
+ int Py_SetStandardStreamEncoding(const char *encoding, const char *errors)
+
+ void Py_Initialize()
+ void Py_InitializeEx(int)
+ void _Py_InitializeEx_Private(int, int)
+ void Py_Finalize()
+ int Py_FinalizeEx()
+ int Py_IsInitialized()
+ PyThreadState *Py_NewInterpreter()
+ void Py_EndInterpreter(PyThreadState *)
+
+
# _Py_PyAtExit is for the atexit module, Py_AtExit is for low-level
- # exit functions.
+ # exit functions.
void _Py_PyAtExit(void (*func)(object), object)
- int Py_AtExit(void (*func)())
-
- void Py_Exit(int)
-
- # Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
- void _Py_RestoreSignals()
-
- int Py_FdIsInteractive(FILE *, const char *)
-
- # Bootstrap __main__ (defined in Modules/main.c)
- int Py_Main(int argc, wchar_t **argv)
-
- # In getpath.c
- wchar_t *Py_GetProgramFullPath()
- wchar_t *Py_GetPrefix()
- wchar_t *Py_GetExecPrefix()
- wchar_t *Py_GetPath()
- void Py_SetPath(const wchar_t *)
- int _Py_CheckPython3()
-
- # In their own files
- const char *Py_GetVersion()
- const char *Py_GetPlatform()
- const char *Py_GetCopyright()
- const char *Py_GetCompiler()
- const char *Py_GetBuildInfo()
- const char *_Py_gitidentifier()
- const char *_Py_gitversion()
-
- ctypedef void (*PyOS_sighandler_t)(int)
- PyOS_sighandler_t PyOS_getsig(int)
- PyOS_sighandler_t PyOS_setsig(int, PyOS_sighandler_t)
-
- # Random
- int _PyOS_URandom(void *buffer, Py_ssize_t size)
- int _PyOS_URandomNonblock(void *buffer, Py_ssize_t size)
+ int Py_AtExit(void (*func)())
+
+ void Py_Exit(int)
+
+ # Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
+ void _Py_RestoreSignals()
+
+ int Py_FdIsInteractive(FILE *, const char *)
+
+ # Bootstrap __main__ (defined in Modules/main.c)
+ int Py_Main(int argc, wchar_t **argv)
+
+ # In getpath.c
+ wchar_t *Py_GetProgramFullPath()
+ wchar_t *Py_GetPrefix()
+ wchar_t *Py_GetExecPrefix()
+ wchar_t *Py_GetPath()
+ void Py_SetPath(const wchar_t *)
+ int _Py_CheckPython3()
+
+ # In their own files
+ const char *Py_GetVersion()
+ const char *Py_GetPlatform()
+ const char *Py_GetCopyright()
+ const char *Py_GetCompiler()
+ const char *Py_GetBuildInfo()
+ const char *_Py_gitidentifier()
+ const char *_Py_gitversion()
+
+ ctypedef void (*PyOS_sighandler_t)(int)
+ PyOS_sighandler_t PyOS_getsig(int)
+ PyOS_sighandler_t PyOS_setsig(int, PyOS_sighandler_t)
+
+ # Random
+ int _PyOS_URandom(void *buffer, Py_ssize_t size)
+ int _PyOS_URandomNonblock(void *buffer, Py_ssize_t size)
diff --git a/contrib/tools/cython/Cython/Includes/cpython/pystate.pxd b/contrib/tools/cython/Cython/Includes/cpython/pystate.pxd
index 1af6307931..07dcfda048 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/pystate.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/pystate.pxd
@@ -1,14 +1,14 @@
# Thread and interpreter state structures and their interfaces
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
- # We make these an opaque types. If the user wants specific attributes,
+ # We make these an opaque types. If the user wants specific attributes,
# they can be declared manually.
- ctypedef long PY_INT64_T # FIXME: Py2.7+, not defined here but used here
-
+ ctypedef long PY_INT64_T # FIXME: Py2.7+, not defined here but used here
+
ctypedef struct PyInterpreterState:
pass
@@ -20,8 +20,8 @@ cdef extern from "Python.h":
# This is not actually a struct, but make sure it can never be coerced to
# an int or used in arithmetic expressions
- ctypedef struct PyGILState_STATE:
- pass
+ ctypedef struct PyGILState_STATE:
+ pass
# The type of the trace function registered using PyEval_SetProfile() and
# PyEval_SetTrace().
@@ -42,14 +42,14 @@ cdef extern from "Python.h":
PyInterpreterState * PyInterpreterState_New()
void PyInterpreterState_Clear(PyInterpreterState *)
void PyInterpreterState_Delete(PyInterpreterState *)
- PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *)
+ PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *)
PyThreadState * PyThreadState_New(PyInterpreterState *)
void PyThreadState_Clear(PyThreadState *)
void PyThreadState_Delete(PyThreadState *)
PyThreadState * PyThreadState_Get()
- PyThreadState * PyThreadState_Swap(PyThreadState *) # NOTE: DO NOT USE IN CYTHON CODE !
+ PyThreadState * PyThreadState_Swap(PyThreadState *) # NOTE: DO NOT USE IN CYTHON CODE !
PyObject * PyThreadState_GetDict()
int PyThreadState_SetAsyncExc(long, PyObject *)
diff --git a/contrib/tools/cython/Cython/Includes/cpython/ref.pxd b/contrib/tools/cython/Cython/Includes/cpython/ref.pxd
index 4bc9a7d7c8..e586ad5b2b 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/ref.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/ref.pxd
@@ -1,5 +1,5 @@
-from .object cimport PyObject, PyTypeObject, Py_TYPE # legacy imports for re-export
-
+from .object cimport PyObject, PyTypeObject, Py_TYPE # legacy imports for re-export
+
cdef extern from "Python.h":
#####################################################################
# 3. Reference Counts
diff --git a/contrib/tools/cython/Cython/Includes/cpython/sequence.pxd b/contrib/tools/cython/Cython/Includes/cpython/sequence.pxd
index eb279968d2..4550d1711b 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/sequence.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/sequence.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
diff --git a/contrib/tools/cython/Cython/Includes/cpython/slice.pxd b/contrib/tools/cython/Cython/Includes/cpython/slice.pxd
index 202dea716c..a4b26f0c81 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/slice.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/slice.pxd
@@ -1,50 +1,50 @@
-cdef extern from "Python.h":
-
- # PyTypeObject PySlice_Type
- #
- # The type object for slice objects. This is the same as slice and types.SliceType
-
- bint PySlice_Check(object ob)
- #
- # Return true if ob is a slice object; ob must not be NULL.
-
- slice PySlice_New(object start, object stop, object step)
- #
- # Return a new slice object with the given values. The start, stop, and step
- # parameters are used as the values of the slice object attributes of the same
- # names. Any of the values may be NULL, in which case the None will be used
- # for the corresponding attribute. Return NULL if the new object could not be
- # allocated.
-
- int PySlice_GetIndices(object slice, Py_ssize_t length,
- Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step) except? -1
- #
- # Retrieve the start, stop and step indices from the slice object slice,
- # assuming a sequence of length length. Treats indices greater than length
- # as errors.
- #
- # Returns 0 on success and -1 on error with no exception set (unless one
- # of the indices was not None and failed to be converted to an integer,
- # in which case -1 is returned with an exception set).
- #
- # You probably do not want to use this function.
- #
- # Changed in version 3.2: The parameter type for the slice parameter was
- # PySliceObject* before.
-
- int PySlice_GetIndicesEx(object slice, Py_ssize_t length,
- Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
- Py_ssize_t *slicelength) except -1
- #
- # Usable replacement for PySlice_GetIndices(). Retrieve the start, stop, and step
- # indices from the slice object slice assuming a sequence of length length, and
- # store the length of the slice in slicelength. Out of bounds indices are clipped
- # in a manner consistent with the handling of normal slices.
- #
- # Returns 0 on success and -1 on error with exception set.
- #
- # Changed in version 3.2: The parameter type for the slice parameter was
- # PySliceObject* before.
+cdef extern from "Python.h":
+
+ # PyTypeObject PySlice_Type
+ #
+ # The type object for slice objects. This is the same as slice and types.SliceType
+
+ bint PySlice_Check(object ob)
+ #
+ # Return true if ob is a slice object; ob must not be NULL.
+
+ slice PySlice_New(object start, object stop, object step)
+ #
+ # Return a new slice object with the given values. The start, stop, and step
+ # parameters are used as the values of the slice object attributes of the same
+ # names. Any of the values may be NULL, in which case the None will be used
+ # for the corresponding attribute. Return NULL if the new object could not be
+ # allocated.
+
+ int PySlice_GetIndices(object slice, Py_ssize_t length,
+ Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step) except? -1
+ #
+ # Retrieve the start, stop and step indices from the slice object slice,
+ # assuming a sequence of length length. Treats indices greater than length
+ # as errors.
+ #
+ # Returns 0 on success and -1 on error with no exception set (unless one
+ # of the indices was not None and failed to be converted to an integer,
+ # in which case -1 is returned with an exception set).
+ #
+ # You probably do not want to use this function.
+ #
+ # Changed in version 3.2: The parameter type for the slice parameter was
+ # PySliceObject* before.
+
+ int PySlice_GetIndicesEx(object slice, Py_ssize_t length,
+ Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
+ Py_ssize_t *slicelength) except -1
+ #
+ # Usable replacement for PySlice_GetIndices(). Retrieve the start, stop, and step
+ # indices from the slice object slice assuming a sequence of length length, and
+ # store the length of the slice in slicelength. Out of bounds indices are clipped
+ # in a manner consistent with the handling of normal slices.
+ #
+ # Returns 0 on success and -1 on error with exception set.
+ #
+ # Changed in version 3.2: The parameter type for the slice parameter was
+ # PySliceObject* before.
int PySlice_Unpack(object slice, Py_ssize_t *start, Py_ssize_t *stop,
Py_ssize_t *step) except -1
diff --git a/contrib/tools/cython/Cython/Includes/cpython/string.pxd b/contrib/tools/cython/Cython/Includes/cpython/string.pxd
index 8af78f3dde..d0476f0fb2 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/string.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/string.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
ctypedef struct va_list
diff --git a/contrib/tools/cython/Cython/Includes/cpython/tuple.pxd b/contrib/tools/cython/Cython/Includes/cpython/tuple.pxd
index 09c46e0b4b..7e30fc796c 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/tuple.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/tuple.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
diff --git a/contrib/tools/cython/Cython/Includes/cpython/unicode.pxd b/contrib/tools/cython/Cython/Includes/cpython/unicode.pxd
index ad01ed64df..a4b6a39b3c 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/unicode.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/unicode.pxd
@@ -36,60 +36,60 @@ cdef extern from *:
char* PyUnicode_AS_DATA(object o)
# Return 1 or 0 depending on whether ch is a whitespace character.
- bint Py_UNICODE_ISSPACE(Py_UCS4 ch)
+ bint Py_UNICODE_ISSPACE(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a lowercase character.
- bint Py_UNICODE_ISLOWER(Py_UCS4 ch)
+ bint Py_UNICODE_ISLOWER(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is an uppercase character.
- bint Py_UNICODE_ISUPPER(Py_UCS4 ch)
+ bint Py_UNICODE_ISUPPER(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a titlecase character.
- bint Py_UNICODE_ISTITLE(Py_UCS4 ch)
+ bint Py_UNICODE_ISTITLE(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a linebreak character.
- bint Py_UNICODE_ISLINEBREAK(Py_UCS4 ch)
+ bint Py_UNICODE_ISLINEBREAK(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a decimal character.
- bint Py_UNICODE_ISDECIMAL(Py_UCS4 ch)
+ bint Py_UNICODE_ISDECIMAL(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a digit character.
- bint Py_UNICODE_ISDIGIT(Py_UCS4 ch)
+ bint Py_UNICODE_ISDIGIT(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a numeric character.
- bint Py_UNICODE_ISNUMERIC(Py_UCS4 ch)
+ bint Py_UNICODE_ISNUMERIC(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is an alphabetic character.
- bint Py_UNICODE_ISALPHA(Py_UCS4 ch)
+ bint Py_UNICODE_ISALPHA(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is an alphanumeric character.
- bint Py_UNICODE_ISALNUM(Py_UCS4 ch)
+ bint Py_UNICODE_ISALNUM(Py_UCS4 ch)
# Return the character ch converted to lower case.
- # Used to return a Py_UNICODE value before Py3.3.
- Py_UCS4 Py_UNICODE_TOLOWER(Py_UCS4 ch)
+ # Used to return a Py_UNICODE value before Py3.3.
+ Py_UCS4 Py_UNICODE_TOLOWER(Py_UCS4 ch)
# Return the character ch converted to upper case.
- # Used to return a Py_UNICODE value before Py3.3.
- Py_UCS4 Py_UNICODE_TOUPPER(Py_UCS4 ch)
+ # Used to return a Py_UNICODE value before Py3.3.
+ Py_UCS4 Py_UNICODE_TOUPPER(Py_UCS4 ch)
# Return the character ch converted to title case.
- # Used to return a Py_UNICODE value before Py3.3.
- Py_UCS4 Py_UNICODE_TOTITLE(Py_UCS4 ch)
+ # Used to return a Py_UNICODE value before Py3.3.
+ Py_UCS4 Py_UNICODE_TOTITLE(Py_UCS4 ch)
# Return the character ch converted to a decimal positive
# integer. Return -1 if this is not possible. This macro does not
# raise exceptions.
- int Py_UNICODE_TODECIMAL(Py_UCS4 ch)
+ int Py_UNICODE_TODECIMAL(Py_UCS4 ch)
# Return the character ch converted to a single digit
# integer. Return -1 if this is not possible. This macro does not
# raise exceptions.
- int Py_UNICODE_TODIGIT(Py_UCS4 ch)
+ int Py_UNICODE_TODIGIT(Py_UCS4 ch)
# Return the character ch converted to a double. Return -1.0 if
# this is not possible. This macro does not raise exceptions.
- double Py_UNICODE_TONUMERIC(Py_UCS4 ch)
+ double Py_UNICODE_TONUMERIC(Py_UCS4 ch)
# To create Unicode objects and access their basic sequence
# properties, use these APIs:
@@ -145,131 +145,131 @@ cdef extern from *:
#Py_ssize_t PyUnicode_AsWideChar(object o, wchar_t *w, Py_ssize_t size)
-
-# Unicode Methods
-
- # Concat two strings giving a new Unicode string.
- # Return value: New reference.
- unicode PyUnicode_Concat(object left, object right)
-
- # Split a string giving a list of Unicode strings. If sep is NULL,
- # splitting will be done at all whitespace substrings. Otherwise,
- # splits occur at the given separator. At most maxsplit splits will
- # be done. If negative, no limit is set. Separators are not included
- # in the resulting list.
- # Return value: New reference.
- list PyUnicode_Split(object s, object sep, Py_ssize_t maxsplit)
-
- # Split a Unicode string at line breaks, returning a list of Unicode
- # strings. CRLF is considered to be one line break. If keepend is 0,
- # the Line break characters are not included in the resulting strings.
- # Return value: New reference.
- list PyUnicode_Splitlines(object s, bint keepend)
-
- # Translate a string by applying a character mapping table to it and
- # return the resulting Unicode object.
- #
- # The mapping table must map Unicode ordinal integers to Unicode ordinal
- # integers or None (causing deletion of the character).
- #
- # Mapping tables need only provide the __getitem__() interface;
- # dictionaries and sequences work well. Unmapped character ordinals (ones
- # which cause a LookupError) are left untouched and are copied as-is.
- #
- # errors has the usual meaning for codecs. It may be NULL which indicates
- # to use the default error handling.
- # Return value: New reference.
- unicode PyUnicode_Translate(object str, object table, const char *errors)
-
- # Join a sequence of strings using the given separator and return the
- # resulting Unicode string.
- # Return value: New reference.
- unicode PyUnicode_Join(object separator, object seq)
-
- # Return 1 if substr matches str[start:end] at the given tail end
- # (direction == -1 means to do a prefix match, direction == 1 a
- # suffix match), 0 otherwise.
- # Return -1 if an error occurred.
- Py_ssize_t PyUnicode_Tailmatch(object str, object substr,
- Py_ssize_t start, Py_ssize_t end, int direction) except -1
-
- # Return the first position of substr in str[start:end] using the given
- # direction (direction == 1 means to do a forward search, direction == -1
- # a backward search). The return value is the index of the first match;
- # a value of -1 indicates that no match was found, and -2 indicates that an
- # error occurred and an exception has been set.
- Py_ssize_t PyUnicode_Find(object str, object substr, Py_ssize_t start, Py_ssize_t end, int direction) except -2
-
- # Return the first position of the character ch in str[start:end] using
- # the given direction (direction == 1 means to do a forward search,
- # direction == -1 a backward search). The return value is the index of
- # the first match; a value of -1 indicates that no match was found, and
- # -2 indicates that an error occurred and an exception has been set.
- # New in version 3.3.
- Py_ssize_t PyUnicode_FindChar(object str, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int direction) except -2
-
- # Return the number of non-overlapping occurrences of substr in
- # str[start:end]. Return -1 if an error occurred.
- Py_ssize_t PyUnicode_Count(object str, object substr, Py_ssize_t start, Py_ssize_t end) except -1
-
- # Replace at most maxcount occurrences of substr in str with replstr and
- # return the resulting Unicode object. maxcount == -1 means replace all
- # occurrences.
- # Return value: New reference.
- unicode PyUnicode_Replace(object str, object substr, object replstr, Py_ssize_t maxcount)
-
- # Compare two strings and return -1, 0, 1 for less than,
- # equal, and greater than, respectively.
- int PyUnicode_Compare(object left, object right) except? -1
-
- # Compare a unicode object, uni, with string and return -1, 0, 1 for less than,
- # equal, and greater than, respectively. It is best to pass only ASCII-encoded
- # strings, but the function interprets the input string as ISO-8859-1 if it
- # contains non-ASCII characters.
+
+# Unicode Methods
+
+ # Concat two strings giving a new Unicode string.
+ # Return value: New reference.
+ unicode PyUnicode_Concat(object left, object right)
+
+ # Split a string giving a list of Unicode strings. If sep is NULL,
+ # splitting will be done at all whitespace substrings. Otherwise,
+ # splits occur at the given separator. At most maxsplit splits will
+ # be done. If negative, no limit is set. Separators are not included
+ # in the resulting list.
+ # Return value: New reference.
+ list PyUnicode_Split(object s, object sep, Py_ssize_t maxsplit)
+
+ # Split a Unicode string at line breaks, returning a list of Unicode
+ # strings. CRLF is considered to be one line break. If keepend is 0,
+ # the Line break characters are not included in the resulting strings.
+ # Return value: New reference.
+ list PyUnicode_Splitlines(object s, bint keepend)
+
+ # Translate a string by applying a character mapping table to it and
+ # return the resulting Unicode object.
+ #
+ # The mapping table must map Unicode ordinal integers to Unicode ordinal
+ # integers or None (causing deletion of the character).
+ #
+ # Mapping tables need only provide the __getitem__() interface;
+ # dictionaries and sequences work well. Unmapped character ordinals (ones
+ # which cause a LookupError) are left untouched and are copied as-is.
+ #
+ # errors has the usual meaning for codecs. It may be NULL which indicates
+ # to use the default error handling.
+ # Return value: New reference.
+ unicode PyUnicode_Translate(object str, object table, const char *errors)
+
+ # Join a sequence of strings using the given separator and return the
+ # resulting Unicode string.
+ # Return value: New reference.
+ unicode PyUnicode_Join(object separator, object seq)
+
+ # Return 1 if substr matches str[start:end] at the given tail end
+ # (direction == -1 means to do a prefix match, direction == 1 a
+ # suffix match), 0 otherwise.
+ # Return -1 if an error occurred.
+ Py_ssize_t PyUnicode_Tailmatch(object str, object substr,
+ Py_ssize_t start, Py_ssize_t end, int direction) except -1
+
+ # Return the first position of substr in str[start:end] using the given
+ # direction (direction == 1 means to do a forward search, direction == -1
+ # a backward search). The return value is the index of the first match;
+ # a value of -1 indicates that no match was found, and -2 indicates that an
+ # error occurred and an exception has been set.
+ Py_ssize_t PyUnicode_Find(object str, object substr, Py_ssize_t start, Py_ssize_t end, int direction) except -2
+
+ # Return the first position of the character ch in str[start:end] using
+ # the given direction (direction == 1 means to do a forward search,
+ # direction == -1 a backward search). The return value is the index of
+ # the first match; a value of -1 indicates that no match was found, and
+ # -2 indicates that an error occurred and an exception has been set.
+ # New in version 3.3.
+ Py_ssize_t PyUnicode_FindChar(object str, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int direction) except -2
+
+ # Return the number of non-overlapping occurrences of substr in
+ # str[start:end]. Return -1 if an error occurred.
+ Py_ssize_t PyUnicode_Count(object str, object substr, Py_ssize_t start, Py_ssize_t end) except -1
+
+ # Replace at most maxcount occurrences of substr in str with replstr and
+ # return the resulting Unicode object. maxcount == -1 means replace all
+ # occurrences.
+ # Return value: New reference.
+ unicode PyUnicode_Replace(object str, object substr, object replstr, Py_ssize_t maxcount)
+
+ # Compare two strings and return -1, 0, 1 for less than,
+ # equal, and greater than, respectively.
+ int PyUnicode_Compare(object left, object right) except? -1
+
+ # Compare a unicode object, uni, with string and return -1, 0, 1 for less than,
+ # equal, and greater than, respectively. It is best to pass only ASCII-encoded
+ # strings, but the function interprets the input string as ISO-8859-1 if it
+ # contains non-ASCII characters.
int PyUnicode_CompareWithASCIIString(object uni, const char *string)
-
- # Rich compare two unicode strings and return one of the following:
- #
- # NULL in case an exception was raised
- # Py_True or Py_False for successful comparisons
- # Py_NotImplemented in case the type combination is unknown
- #
- # Note that Py_EQ and Py_NE comparisons can cause a UnicodeWarning in case
- # the conversion of the arguments to Unicode fails with a UnicodeDecodeError.
- #
- # Possible values for op are Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, and Py_LE.
- object PyUnicode_RichCompare(object left, object right, int op)
-
- # Return a new string object from format and args; this is analogous to
- # format % args.
- # Return value: New reference.
- unicode PyUnicode_Format(object format, object args)
-
- # Check whether element is contained in container and return true or false
- # accordingly.
- #
- # element has to coerce to a one element Unicode string. -1 is returned
- # if there was an error.
- int PyUnicode_Contains(object container, object element) except -1
-
- # Intern the argument *string in place. The argument must be the address
- # of a pointer variable pointing to a Python unicode string object. If
- # there is an existing interned string that is the same as *string, it sets
- # *string to it (decrementing the reference count of the old string object
- # and incrementing the reference count of the interned string object),
- # otherwise it leaves *string alone and interns it (incrementing its reference
- # count). (Clarification: even though there is a lot of talk about reference
- # counts, think of this function as reference-count-neutral; you own the object
- # after the call if and only if you owned it before the call.)
- #void PyUnicode_InternInPlace(PyObject **string)
-
- # A combination of PyUnicode_FromString() and PyUnicode_InternInPlace(),
- # returning either a new unicode string object that has been interned, or
- # a new ("owned") reference to an earlier interned string object with the
- # same value.
- unicode PyUnicode_InternFromString(const char *v)
-
-
+
+ # Rich compare two unicode strings and return one of the following:
+ #
+ # NULL in case an exception was raised
+ # Py_True or Py_False for successful comparisons
+ # Py_NotImplemented in case the type combination is unknown
+ #
+ # Note that Py_EQ and Py_NE comparisons can cause a UnicodeWarning in case
+ # the conversion of the arguments to Unicode fails with a UnicodeDecodeError.
+ #
+ # Possible values for op are Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, and Py_LE.
+ object PyUnicode_RichCompare(object left, object right, int op)
+
+ # Return a new string object from format and args; this is analogous to
+ # format % args.
+ # Return value: New reference.
+ unicode PyUnicode_Format(object format, object args)
+
+ # Check whether element is contained in container and return true or false
+ # accordingly.
+ #
+ # element has to coerce to a one element Unicode string. -1 is returned
+ # if there was an error.
+ int PyUnicode_Contains(object container, object element) except -1
+
+ # Intern the argument *string in place. The argument must be the address
+ # of a pointer variable pointing to a Python unicode string object. If
+ # there is an existing interned string that is the same as *string, it sets
+ # *string to it (decrementing the reference count of the old string object
+ # and incrementing the reference count of the interned string object),
+ # otherwise it leaves *string alone and interns it (incrementing its reference
+ # count). (Clarification: even though there is a lot of talk about reference
+ # counts, think of this function as reference-count-neutral; you own the object
+ # after the call if and only if you owned it before the call.)
+ #void PyUnicode_InternInPlace(PyObject **string)
+
+ # A combination of PyUnicode_FromString() and PyUnicode_InternInPlace(),
+ # returning either a new unicode string object that has been interned, or
+ # a new ("owned") reference to an earlier interned string object with the
+ # same value.
+ unicode PyUnicode_InternFromString(const char *v)
+
+
# Codecs
# Create a Unicode object by decoding size bytes of the encoded
@@ -300,22 +300,22 @@ cdef extern from *:
# Create a Unicode object by decoding size bytes of the UTF-8
# encoded string s. Return NULL if an exception was raised by the
# codec.
- unicode PyUnicode_DecodeUTF8(char *s, Py_ssize_t size, char *errors)
+ unicode PyUnicode_DecodeUTF8(char *s, Py_ssize_t size, char *errors)
# If consumed is NULL, behave like PyUnicode_DecodeUTF8(). If
# consumed is not NULL, trailing incomplete UTF-8 byte sequences
# will not be treated as an error. Those bytes will not be decoded
# and the number of bytes that have been decoded will be stored in
# consumed. New in version 2.4.
- unicode PyUnicode_DecodeUTF8Stateful(char *s, Py_ssize_t size, char *errors, Py_ssize_t *consumed)
+ unicode PyUnicode_DecodeUTF8Stateful(char *s, Py_ssize_t size, char *errors, Py_ssize_t *consumed)
# Encode the Py_UNICODE buffer of the given size using UTF-8 and
# return a Python string object. Return NULL if an exception was
# raised by the codec.
- bytes PyUnicode_EncodeUTF8(Py_UNICODE *s, Py_ssize_t size, char *errors)
+ bytes PyUnicode_EncodeUTF8(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using UTF-8 and return the result as Python string object. Error handling is ``strict''. Return NULL if an exception was raised by the codec.
- bytes PyUnicode_AsUTF8String(object unicode)
+ bytes PyUnicode_AsUTF8String(object unicode)
# These are the UTF-16 codec APIs:
@@ -337,7 +337,7 @@ cdef extern from *:
# order at the.
#
# If byteorder is NULL, the codec starts in native order mode.
- unicode PyUnicode_DecodeUTF16(char *s, Py_ssize_t size, char *errors, int *byteorder)
+ unicode PyUnicode_DecodeUTF16(char *s, Py_ssize_t size, char *errors, int *byteorder)
# If consumed is NULL, behave like PyUnicode_DecodeUTF16(). If
# consumed is not NULL, PyUnicode_DecodeUTF16Stateful() will not
@@ -345,7 +345,7 @@ cdef extern from *:
# number of bytes or a split surrogate pair) as an error. Those
# bytes will not be decoded and the number of bytes that have been
# decoded will be stored in consumed. New in version 2.4.
- unicode PyUnicode_DecodeUTF16Stateful(char *s, Py_ssize_t size, char *errors, int *byteorder, Py_ssize_t *consumed)
+ unicode PyUnicode_DecodeUTF16Stateful(char *s, Py_ssize_t size, char *errors, int *byteorder, Py_ssize_t *consumed)
# Return a Python string object holding the UTF-16 encoded value
# of the Unicode data in s. If byteorder is not 0, output is
@@ -362,13 +362,13 @@ cdef extern from *:
# If Py_UNICODE_WIDE is defined, a single Py_UNICODE value may get
# represented as a surrogate pair. If it is not defined, each
# Py_UNICODE values is interpreted as an UCS-2 character.
- bytes PyUnicode_EncodeUTF16(Py_UNICODE *s, Py_ssize_t size, char *errors, int byteorder)
+ bytes PyUnicode_EncodeUTF16(Py_UNICODE *s, Py_ssize_t size, char *errors, int byteorder)
# Return a Python string using the UTF-16 encoding in native byte
# order. The string always starts with a BOM mark. Error handling
# is ``strict''. Return NULL if an exception was raised by the
# codec.
- bytes PyUnicode_AsUTF16String(object unicode)
+ bytes PyUnicode_AsUTF16String(object unicode)
# These are the ``Unicode Escape'' codec APIs:
@@ -409,17 +409,17 @@ cdef extern from *:
# Create a Unicode object by decoding size bytes of the Latin-1
# encoded string s. Return NULL if an exception was raised by the
# codec.
- unicode PyUnicode_DecodeLatin1(char *s, Py_ssize_t size, char *errors)
+ unicode PyUnicode_DecodeLatin1(char *s, Py_ssize_t size, char *errors)
# Encode the Py_UNICODE buffer of the given size using Latin-1 and
- # return a Python bytes object. Return NULL if an exception was
+ # return a Python bytes object. Return NULL if an exception was
# raised by the codec.
- bytes PyUnicode_EncodeLatin1(Py_UNICODE *s, Py_ssize_t size, char *errors)
+ bytes PyUnicode_EncodeLatin1(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using Latin-1 and return the result as
- # Python bytes object. Error handling is ``strict''. Return NULL
+ # Python bytes object. Error handling is ``strict''. Return NULL
# if an exception was raised by the codec.
- bytes PyUnicode_AsLatin1String(object unicode)
+ bytes PyUnicode_AsLatin1String(object unicode)
# These are the ASCII codec APIs. Only 7-bit ASCII data is
# accepted. All other codes generate errors.
@@ -427,17 +427,17 @@ cdef extern from *:
# Create a Unicode object by decoding size bytes of the ASCII
# encoded string s. Return NULL if an exception was raised by the
# codec.
- unicode PyUnicode_DecodeASCII(char *s, Py_ssize_t size, char *errors)
+ unicode PyUnicode_DecodeASCII(char *s, Py_ssize_t size, char *errors)
# Encode the Py_UNICODE buffer of the given size using ASCII and
- # return a Python bytes object. Return NULL if an exception was
+ # return a Python bytes object. Return NULL if an exception was
# raised by the codec.
- bytes PyUnicode_EncodeASCII(Py_UNICODE *s, Py_ssize_t size, char *errors)
+ bytes PyUnicode_EncodeASCII(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using ASCII and return the result as
- # Python bytes object. Error handling is ``strict''. Return NULL
+ # Python bytes object. Error handling is ``strict''. Return NULL
# if an exception was raised by the codec.
- bytes PyUnicode_AsASCIIString(object o)
+ bytes PyUnicode_AsASCIIString(object o)
# These are the mapping codec APIs:
#
@@ -478,8 +478,8 @@ cdef extern from *:
# Encode the Py_UNICODE buffer of the given size using the given
# mapping object and return a Python string object. Return NULL if
# an exception was raised by the codec.
- #
- # Deprecated since version 3.3, will be removed in version 4.0.
+ #
+ # Deprecated since version 3.3, will be removed in version 4.0.
object PyUnicode_EncodeCharmap(Py_UNICODE *s, Py_ssize_t size, object mapping, char *errors)
# Encode a Unicode objects using the given mapping object and
@@ -500,8 +500,8 @@ cdef extern from *:
# dictionaries and sequences work well. Unmapped character
# ordinals (ones which cause a LookupError) are left untouched and
# are copied as-is.
- #
- # Deprecated since version 3.3, will be removed in version 4.0.
+ #
+ # Deprecated since version 3.3, will be removed in version 4.0.
object PyUnicode_TranslateCharmap(Py_UNICODE *s, Py_ssize_t size,
object table, char *errors)
@@ -514,43 +514,43 @@ cdef extern from *:
# Create a Unicode object by decoding size bytes of the MBCS
# encoded string s. Return NULL if an exception was raised by the
# codec.
- unicode PyUnicode_DecodeMBCS(char *s, Py_ssize_t size, char *errors)
+ unicode PyUnicode_DecodeMBCS(char *s, Py_ssize_t size, char *errors)
# If consumed is NULL, behave like PyUnicode_DecodeMBCS(). If
# consumed is not NULL, PyUnicode_DecodeMBCSStateful() will not
# decode trailing lead byte and the number of bytes that have been
# decoded will be stored in consumed. New in version 2.5.
# NOTE: Python 2.x uses 'int' values for 'size' and 'consumed' (changed in 3.0)
- unicode PyUnicode_DecodeMBCSStateful(char *s, Py_ssize_t size, char *errors, Py_ssize_t *consumed)
+ unicode PyUnicode_DecodeMBCSStateful(char *s, Py_ssize_t size, char *errors, Py_ssize_t *consumed)
# Encode the Py_UNICODE buffer of the given size using MBCS and
# return a Python string object. Return NULL if an exception was
# raised by the codec.
- bytes PyUnicode_EncodeMBCS(Py_UNICODE *s, Py_ssize_t size, char *errors)
+ bytes PyUnicode_EncodeMBCS(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using MBCS and return the result as
# Python string object. Error handling is ``strict''. Return NULL
# if an exception was raised by the codec.
- bytes PyUnicode_AsMBCSString(object o)
-
- # Encode the Unicode object using the specified code page and return
- # a Python bytes object. Return NULL if an exception was raised by the
- # codec. Use CP_ACP code page to get the MBCS encoder.
- #
- # New in version 3.3.
- bytes PyUnicode_EncodeCodePage(int code_page, object unicode, const char *errors)
-
-
-# Py_UCS4 helpers (new in CPython 3.3)
-
- # These utility functions work on strings of Py_UCS4 characters and
- # otherwise behave like the C standard library functions with the same name.
-
- size_t Py_UCS4_strlen(const Py_UCS4 *u)
- Py_UCS4* Py_UCS4_strcpy(Py_UCS4 *s1, const Py_UCS4 *s2)
- Py_UCS4* Py_UCS4_strncpy(Py_UCS4 *s1, const Py_UCS4 *s2, size_t n)
- Py_UCS4* Py_UCS4_strcat(Py_UCS4 *s1, const Py_UCS4 *s2)
- int Py_UCS4_strcmp(const Py_UCS4 *s1, const Py_UCS4 *s2)
- int Py_UCS4_strncmp(const Py_UCS4 *s1, const Py_UCS4 *s2, size_t n)
- Py_UCS4* Py_UCS4_strchr(const Py_UCS4 *s, Py_UCS4 c)
- Py_UCS4* Py_UCS4_strrchr(const Py_UCS4 *s, Py_UCS4 c)
+ bytes PyUnicode_AsMBCSString(object o)
+
+ # Encode the Unicode object using the specified code page and return
+ # a Python bytes object. Return NULL if an exception was raised by the
+ # codec. Use CP_ACP code page to get the MBCS encoder.
+ #
+ # New in version 3.3.
+ bytes PyUnicode_EncodeCodePage(int code_page, object unicode, const char *errors)
+
+
+# Py_UCS4 helpers (new in CPython 3.3)
+
+ # These utility functions work on strings of Py_UCS4 characters and
+ # otherwise behave like the C standard library functions with the same name.
+
+ size_t Py_UCS4_strlen(const Py_UCS4 *u)
+ Py_UCS4* Py_UCS4_strcpy(Py_UCS4 *s1, const Py_UCS4 *s2)
+ Py_UCS4* Py_UCS4_strncpy(Py_UCS4 *s1, const Py_UCS4 *s2, size_t n)
+ Py_UCS4* Py_UCS4_strcat(Py_UCS4 *s1, const Py_UCS4 *s2)
+ int Py_UCS4_strcmp(const Py_UCS4 *s1, const Py_UCS4 *s2)
+ int Py_UCS4_strncmp(const Py_UCS4 *s1, const Py_UCS4 *s2, size_t n)
+ Py_UCS4* Py_UCS4_strchr(const Py_UCS4 *s, Py_UCS4 c)
+ Py_UCS4* Py_UCS4_strrchr(const Py_UCS4 *s, Py_UCS4 c)
diff --git a/contrib/tools/cython/Cython/Includes/cpython/weakref.pxd b/contrib/tools/cython/Cython/Includes/cpython/weakref.pxd
index 9c4b50f564..de5a28027a 100644
--- a/contrib/tools/cython/Cython/Includes/cpython/weakref.pxd
+++ b/contrib/tools/cython/Cython/Includes/cpython/weakref.pxd
@@ -1,4 +1,4 @@
-from .object cimport PyObject
+from .object cimport PyObject
cdef extern from "Python.h":
diff --git a/contrib/tools/cython/Cython/Includes/libc/errno.pxd b/contrib/tools/cython/Cython/Includes/libc/errno.pxd
index 191d47b3dc..a4d0b6951a 100644
--- a/contrib/tools/cython/Cython/Includes/libc/errno.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/errno.pxd
@@ -1,6 +1,6 @@
# 7.5 Errors <errno.h>
-cdef extern from "<errno.h>" nogil:
+cdef extern from "<errno.h>" nogil:
enum:
EPERM
ENOENT
@@ -61,7 +61,7 @@ cdef extern from "<errno.h>" nogil:
EBFONT
ENOSTR
ENODATA
- ENOATTR
+ ENOATTR
ETIME
ENOSR
ENONET
diff --git a/contrib/tools/cython/Cython/Includes/libc/float.pxd b/contrib/tools/cython/Cython/Includes/libc/float.pxd
index 5e4e12d4f4..ce1150d6ca 100644
--- a/contrib/tools/cython/Cython/Includes/libc/float.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/float.pxd
@@ -1,43 +1,43 @@
# 5.2.4.2.2 Characteristics of floating types <float.h>
-cdef extern from "<float.h>":
+cdef extern from "<float.h>":
- const float FLT_RADIX
+ const float FLT_RADIX
- const float FLT_MANT_DIG
- const double DBL_MANT_DIG
- const long double LDBL_MANT_DIG
+ const float FLT_MANT_DIG
+ const double DBL_MANT_DIG
+ const long double LDBL_MANT_DIG
- const double DECIMAL_DIG
+ const double DECIMAL_DIG
- const float FLT_DIG
- const double DBL_DIG
- const long double LDBL_DIG
+ const float FLT_DIG
+ const double DBL_DIG
+ const long double LDBL_DIG
- const float FLT_MIN_EXP
- const double DBL_MIN_EXP
- const long double LDBL_MIN_EXP
+ const float FLT_MIN_EXP
+ const double DBL_MIN_EXP
+ const long double LDBL_MIN_EXP
- const float FLT_MIN_10_EXP
- const double DBL_MIN_10_EXP
- const long double LDBL_MIN_10_EXP
+ const float FLT_MIN_10_EXP
+ const double DBL_MIN_10_EXP
+ const long double LDBL_MIN_10_EXP
- const float FLT_MAX_EXP
- const double DBL_MAX_EXP
- const long double LDBL_MAX_EXP
+ const float FLT_MAX_EXP
+ const double DBL_MAX_EXP
+ const long double LDBL_MAX_EXP
- const float FLT_MAX_10_EXP
- const double DBL_MAX_10_EXP
- const long double LDBL_MAX_10_EXP
+ const float FLT_MAX_10_EXP
+ const double DBL_MAX_10_EXP
+ const long double LDBL_MAX_10_EXP
- const float FLT_MAX
- const double DBL_MAX
- const long double LDBL_MAX
+ const float FLT_MAX
+ const double DBL_MAX
+ const long double LDBL_MAX
- const float FLT_EPSILON
- const double DBL_EPSILON
- const long double LDBL_EPSILON
+ const float FLT_EPSILON
+ const double DBL_EPSILON
+ const long double LDBL_EPSILON
- const float FLT_MIN
- const double DBL_MIN
- const long double LDBL_MIN
+ const float FLT_MIN
+ const double DBL_MIN
+ const long double LDBL_MIN
diff --git a/contrib/tools/cython/Cython/Includes/libc/limits.pxd b/contrib/tools/cython/Cython/Includes/libc/limits.pxd
index 39d10a1ff9..ed035e91fc 100644
--- a/contrib/tools/cython/Cython/Includes/libc/limits.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/limits.pxd
@@ -1,6 +1,6 @@
# 5.2.4.2.1 Sizes of integer types <limits.h>
-cdef extern from "<limits.h>":
+cdef extern from "<limits.h>":
const int CHAR_BIT
const int MB_LEN_MAX
diff --git a/contrib/tools/cython/Cython/Includes/libc/locale.pxd b/contrib/tools/cython/Cython/Includes/libc/locale.pxd
index 5cbec953ef..56af447e4d 100644
--- a/contrib/tools/cython/Cython/Includes/libc/locale.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/locale.pxd
@@ -4,7 +4,7 @@
from libc.string cimport const_char
-cdef extern from "<locale.h>" nogil:
+cdef extern from "<locale.h>" nogil:
struct lconv:
char *decimal_point
diff --git a/contrib/tools/cython/Cython/Includes/libc/math.pxd b/contrib/tools/cython/Cython/Includes/libc/math.pxd
index b002670b22..ef9ef1a916 100644
--- a/contrib/tools/cython/Cython/Includes/libc/math.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/math.pxd
@@ -1,27 +1,27 @@
-cdef extern from "<math.h>" nogil:
- const double M_E
- const double e "M_E" # as in Python's math module
- const double M_LOG2E
- const double M_LOG10E
- const double M_LN2
- const double M_LN10
- const double M_PI
- const double pi "M_PI" # as in Python's math module
- const double M_PI_2
- const double M_PI_4
- const double M_1_PI
- const double M_2_PI
- const double M_2_SQRTPI
- const double M_SQRT2
- const double M_SQRT1_2
+cdef extern from "<math.h>" nogil:
+ const double M_E
+ const double e "M_E" # as in Python's math module
+ const double M_LOG2E
+ const double M_LOG10E
+ const double M_LN2
+ const double M_LN10
+ const double M_PI
+ const double pi "M_PI" # as in Python's math module
+ const double M_PI_2
+ const double M_PI_4
+ const double M_1_PI
+ const double M_2_PI
+ const double M_2_SQRTPI
+ const double M_SQRT2
+ const double M_SQRT1_2
# C99 constants
- const float INFINITY
- const float NAN
- # note: not providing "nan" and "inf" aliases here as nan() is a function in C
- const double HUGE_VAL
- const float HUGE_VALF
- const long double HUGE_VALL
+ const float INFINITY
+ const float NAN
+ # note: not providing "nan" and "inf" aliases here as nan() is a function in C
+ const double HUGE_VAL
+ const float HUGE_VALF
+ const long double HUGE_VALL
double acos(double x)
double asin(double x)
@@ -91,19 +91,19 @@ cdef extern from "<math.h>" nogil:
long double erfcl(long double)
double fdim(double x, double y)
- double fma(double x, double y, double z)
+ double fma(double x, double y, double z)
double fmax(double x, double y)
double fmin(double x, double y)
double scalbln(double x, long n)
double scalbn(double x, int n)
double nan(const char*)
-
- int isinf(long double) # -1 / 0 / 1
+
+ int isinf(long double) # -1 / 0 / 1
bint isfinite(long double)
- bint isnan(long double)
+ bint isnan(long double)
bint isnormal(long double)
- bint signbit(long double)
+ bint signbit(long double)
int fpclassify(long double)
const int FP_NAN
const int FP_INFINITE
diff --git a/contrib/tools/cython/Cython/Includes/libc/setjmp.pxd b/contrib/tools/cython/Cython/Includes/libc/setjmp.pxd
index 6c11a534d4..9e8d47778a 100644
--- a/contrib/tools/cython/Cython/Includes/libc/setjmp.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/setjmp.pxd
@@ -1,10 +1,10 @@
-cdef extern from "<setjmp.h>" nogil:
+cdef extern from "<setjmp.h>" nogil:
ctypedef struct jmp_buf:
pass
int setjmp(jmp_buf state)
void longjmp(jmp_buf state, int value)
-
- ctypedef struct sigjmp_buf:
- pass
- int sigsetjmp(sigjmp_buf state, int savesigs)
- void siglongjmp(sigjmp_buf state, int value)
+
+ ctypedef struct sigjmp_buf:
+ pass
+ int sigsetjmp(sigjmp_buf state, int savesigs)
+ void siglongjmp(sigjmp_buf state, int value)
diff --git a/contrib/tools/cython/Cython/Includes/libc/signal.pxd b/contrib/tools/cython/Cython/Includes/libc/signal.pxd
index 5d34935543..d515ad007e 100644
--- a/contrib/tools/cython/Cython/Includes/libc/signal.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/signal.pxd
@@ -2,7 +2,7 @@
ctypedef void (*sighandler_t)(int SIGNUM) nogil
-cdef extern from "<signal.h>" nogil:
+cdef extern from "<signal.h>" nogil:
ctypedef int sig_atomic_t
diff --git a/contrib/tools/cython/Cython/Includes/libc/stddef.pxd b/contrib/tools/cython/Cython/Includes/libc/stddef.pxd
index 9b0f4c5fd2..61c1e4cc56 100644
--- a/contrib/tools/cython/Cython/Includes/libc/stddef.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/stddef.pxd
@@ -1,6 +1,6 @@
# 7.17 Common definitions <stddef.h>
-cdef extern from "<stddef.h>":
+cdef extern from "<stddef.h>":
ctypedef signed int ptrdiff_t
diff --git a/contrib/tools/cython/Cython/Includes/libc/stdint.pxd b/contrib/tools/cython/Cython/Includes/libc/stdint.pxd
index ced3d46add..6140d6e712 100644
--- a/contrib/tools/cython/Cython/Includes/libc/stdint.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/stdint.pxd
@@ -2,7 +2,7 @@
# Actual compile time size used for conversions.
# 7.18 Integer types <stdint.h>
-cdef extern from "<stdint.h>" nogil:
+cdef extern from "<stdint.h>" nogil:
# 7.18.1 Integer types
# 7.18.1.1 Exact-width integer types
@@ -13,7 +13,7 @@ cdef extern from "<stdint.h>" nogil:
ctypedef unsigned char uint8_t
ctypedef unsigned short uint16_t
ctypedef unsigned int uint32_t
- ctypedef unsigned long long uint64_t
+ ctypedef unsigned long long uint64_t
# 7.18.1.2 Minimum-width integer types
ctypedef signed char int_least8_t
ctypedef signed short int_least16_t
@@ -22,7 +22,7 @@ cdef extern from "<stdint.h>" nogil:
ctypedef unsigned char uint_least8_t
ctypedef unsigned short uint_least16_t
ctypedef unsigned int uint_least32_t
- ctypedef unsigned long long uint_least64_t
+ ctypedef unsigned long long uint_least64_t
# 7.18.1.3 Fastest minimum-width integer types
ctypedef signed char int_fast8_t
ctypedef signed short int_fast16_t
@@ -31,7 +31,7 @@ cdef extern from "<stdint.h>" nogil:
ctypedef unsigned char uint_fast8_t
ctypedef unsigned short uint_fast16_t
ctypedef unsigned int uint_fast32_t
- ctypedef unsigned long long uint_fast64_t
+ ctypedef unsigned long long uint_fast64_t
# 7.18.1.4 Integer types capable of holding object pointers
ctypedef ssize_t intptr_t
ctypedef size_t uintptr_t
diff --git a/contrib/tools/cython/Cython/Includes/libc/stdio.pxd b/contrib/tools/cython/Cython/Includes/libc/stdio.pxd
index 1644a5a0ab..f77418923b 100644
--- a/contrib/tools/cython/Cython/Includes/libc/stdio.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/stdio.pxd
@@ -5,7 +5,7 @@
from libc.string cimport const_char, const_void
-cdef extern from "<stdio.h>" nogil:
+cdef extern from "<stdio.h>" nogil:
ctypedef struct FILE
cdef FILE *stdin
diff --git a/contrib/tools/cython/Cython/Includes/libc/stdlib.pxd b/contrib/tools/cython/Cython/Includes/libc/stdlib.pxd
index e6fac821c7..24d14a46a9 100644
--- a/contrib/tools/cython/Cython/Includes/libc/stdlib.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/stdlib.pxd
@@ -4,7 +4,7 @@
from libc.string cimport const_char, const_void
-cdef extern from "<stdlib.h>" nogil:
+cdef extern from "<stdlib.h>" nogil:
# 7.20.1 Numeric conversion functions
int atoi (const char *string)
diff --git a/contrib/tools/cython/Cython/Includes/libc/string.pxd b/contrib/tools/cython/Cython/Includes/libc/string.pxd
index e6d96183f2..af1b9bf8a3 100644
--- a/contrib/tools/cython/Cython/Includes/libc/string.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/string.pxd
@@ -7,7 +7,7 @@ cdef extern from *:
ctypedef const unsigned char const_uchar "const unsigned char"
ctypedef const void const_void "const void"
-cdef extern from "<string.h>" nogil:
+cdef extern from "<string.h>" nogil:
void *memcpy (void *pto, const void *pfrom, size_t size)
void *memmove (void *pto, const void *pfrom, size_t size)
diff --git a/contrib/tools/cython/Cython/Includes/libc/time.pxd b/contrib/tools/cython/Cython/Includes/libc/time.pxd
index 3aa15a2eee..7c7ea4a987 100644
--- a/contrib/tools/cython/Cython/Includes/libc/time.pxd
+++ b/contrib/tools/cython/Cython/Includes/libc/time.pxd
@@ -1,46 +1,46 @@
-# http://en.wikipedia.org/wiki/C_date_and_time_functions
-
-from libc.stddef cimport wchar_t
-
-cdef extern from "<time.h>" nogil:
- ctypedef long clock_t
- ctypedef long time_t
-
- enum: CLOCKS_PER_SEC
- clock_t clock() # CPU time
- time_t time(time_t *) # wall clock time since Unix epoch
-
- cdef struct tm:
- int tm_sec
- int tm_min
- int tm_hour
- int tm_mday
- int tm_mon
- int tm_year
- int tm_wday
- int tm_yday
- int tm_isdst
- char *tm_zone
- long tm_gmtoff
-
- int daylight # global state
- long timezone
- char *tzname[2]
- void tzset()
-
- char *asctime(const tm *)
- char *asctime_r(const tm *, char *)
- char *ctime(const time_t *)
- char *ctime_r(const time_t *, char *)
- double difftime(time_t, time_t)
- tm *getdate(const char *)
- tm *gmtime(const time_t *)
- tm *gmtime_r(const time_t *, tm *)
- tm *localtime(const time_t *)
- tm *localtime_r(const time_t *, tm *)
- time_t mktime(tm *)
- size_t strftime(char *, size_t, const char *, const tm *)
- size_t wcsftime(wchar_t *str, size_t cnt, const wchar_t *fmt, tm *time)
-
- # POSIX not stdC
- char *strptime(const char *, const char *, tm *)
+# http://en.wikipedia.org/wiki/C_date_and_time_functions
+
+from libc.stddef cimport wchar_t
+
+cdef extern from "<time.h>" nogil:
+ ctypedef long clock_t
+ ctypedef long time_t
+
+ enum: CLOCKS_PER_SEC
+ clock_t clock() # CPU time
+ time_t time(time_t *) # wall clock time since Unix epoch
+
+ cdef struct tm:
+ int tm_sec
+ int tm_min
+ int tm_hour
+ int tm_mday
+ int tm_mon
+ int tm_year
+ int tm_wday
+ int tm_yday
+ int tm_isdst
+ char *tm_zone
+ long tm_gmtoff
+
+ int daylight # global state
+ long timezone
+ char *tzname[2]
+ void tzset()
+
+ char *asctime(const tm *)
+ char *asctime_r(const tm *, char *)
+ char *ctime(const time_t *)
+ char *ctime_r(const time_t *, char *)
+ double difftime(time_t, time_t)
+ tm *getdate(const char *)
+ tm *gmtime(const time_t *)
+ tm *gmtime_r(const time_t *, tm *)
+ tm *localtime(const time_t *)
+ tm *localtime_r(const time_t *, tm *)
+ time_t mktime(tm *)
+ size_t strftime(char *, size_t, const char *, const tm *)
+ size_t wcsftime(wchar_t *str, size_t cnt, const wchar_t *fmt, tm *time)
+
+ # POSIX not stdC
+ char *strptime(const char *, const char *, tm *)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/__init__.pxd b/contrib/tools/cython/Cython/Includes/libcpp/__init__.pxd
index 111ea25c2f..842d72d1f2 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/__init__.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/__init__.pxd
@@ -1,4 +1,4 @@
cdef extern from *:
ctypedef bint bool
- ctypedef void* nullptr_t
- nullptr_t nullptr
+ ctypedef void* nullptr_t
+ nullptr_t nullptr
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/algorithm.pxd b/contrib/tools/cython/Cython/Includes/libcpp/algorithm.pxd
index ec7c3835b4..7acc1b3b64 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/algorithm.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/algorithm.pxd
@@ -1,12 +1,12 @@
-from libcpp cimport bool
-
-
+from libcpp cimport bool
+
+
cdef extern from "<algorithm>" namespace "std" nogil:
- # Sorting and searching
- bool binary_search[Iter, T](Iter first, Iter last, const T& value)
- bool binary_search[Iter, T, Compare](Iter first, Iter last, const T& value,
- Compare comp)
-
+ # Sorting and searching
+ bool binary_search[Iter, T](Iter first, Iter last, const T& value)
+ bool binary_search[Iter, T, Compare](Iter first, Iter last, const T& value,
+ Compare comp)
+
Iter lower_bound[Iter, T](Iter first, Iter last, const T& value)
Iter lower_bound[Iter, T, Compare](Iter first, Iter last, const T& value,
Compare comp)
@@ -15,18 +15,18 @@ cdef extern from "<algorithm>" namespace "std" nogil:
Iter upper_bound[Iter, T, Compare](Iter first, Iter last, const T& value,
Compare comp)
- void partial_sort[Iter](Iter first, Iter middle, Iter last)
- void partial_sort[Iter, Compare](Iter first, Iter middle, Iter last,
- Compare comp)
-
- void sort[Iter](Iter first, Iter last)
- void sort[Iter, Compare](Iter first, Iter last, Compare comp)
-
+ void partial_sort[Iter](Iter first, Iter middle, Iter last)
+ void partial_sort[Iter, Compare](Iter first, Iter middle, Iter last,
+ Compare comp)
+
+ void sort[Iter](Iter first, Iter last)
+ void sort[Iter, Compare](Iter first, Iter last, Compare comp)
+
# Removing duplicates
Iter unique[Iter](Iter first, Iter last)
Iter unique[Iter, BinaryPredicate](Iter first, Iter last, BinaryPredicate p)
- # Binary heaps (priority queues)
+ # Binary heaps (priority queues)
void make_heap[Iter](Iter first, Iter last)
void make_heap[Iter, Compare](Iter first, Iter last, Compare comp)
@@ -38,6 +38,6 @@ cdef extern from "<algorithm>" namespace "std" nogil:
void sort_heap[Iter](Iter first, Iter last)
void sort_heap[Iter, Compare](Iter first, Iter last, Compare comp)
-
- # Copy
- OutputIter copy[InputIter,OutputIter](InputIter,InputIter,OutputIter)
+
+ # Copy
+ OutputIter copy[InputIter,OutputIter](InputIter,InputIter,OutputIter)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/cast.pxd b/contrib/tools/cython/Cython/Includes/libcpp/cast.pxd
index c3a4d8978f..b9b2e73ee5 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/cast.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/cast.pxd
@@ -5,7 +5,7 @@
# than the standard C cast operator which can be written "<T>(expression)" in
# Cython.
-cdef extern from * nogil:
+cdef extern from * nogil:
cdef T dynamic_cast[T](void *) except + # nullptr may also indicate failure
cdef T static_cast[T](void *)
cdef T reinterpret_cast[T](void *)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/complex.pxd b/contrib/tools/cython/Cython/Includes/libcpp/complex.pxd
index c875d5e5bd..2c912e5f3a 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/complex.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/complex.pxd
@@ -39,63 +39,63 @@ cdef extern from "<complex>" namespace "std" nogil:
void imag(T)
# Return real part
- T real[T](complex[T]&)
+ T real[T](complex[T]&)
long double real(long double)
double real(double)
float real(float)
# Return imaginary part
- T imag[T](complex[T]&)
+ T imag[T](complex[T]&)
long double imag(long double)
double imag(double)
float imag(float)
- T abs[T](complex[T]&)
- T arg[T](complex[T]&)
+ T abs[T](complex[T]&)
+ T arg[T](complex[T]&)
long double arg(long double)
double arg(double)
float arg(float)
- T norm[T](complex[T])
+ T norm[T](complex[T])
long double norm(long double)
double norm(double)
float norm(float)
- complex[T] conj[T](complex[T]&)
+ complex[T] conj[T](complex[T]&)
complex[long double] conj(long double)
complex[double] conj(double)
complex[float] conj(float)
- complex[T] proj[T](complex[T])
+ complex[T] proj[T](complex[T])
complex[long double] proj(long double)
complex[double] proj(double)
complex[float] proj(float)
- complex[T] polar[T](T&, T&)
- complex[T] ploar[T](T&)
+ complex[T] polar[T](T&, T&)
+ complex[T] ploar[T](T&)
- complex[T] exp[T](complex[T]&)
- complex[T] log[T](complex[T]&)
- complex[T] log10[T](complex[T]&)
+ complex[T] exp[T](complex[T]&)
+ complex[T] log[T](complex[T]&)
+ complex[T] log10[T](complex[T]&)
- complex[T] pow[T](complex[T]&, complex[T]&)
- complex[T] pow[T](complex[T]&, T&)
- complex[T] pow[T](T&, complex[T]&)
+ complex[T] pow[T](complex[T]&, complex[T]&)
+ complex[T] pow[T](complex[T]&, T&)
+ complex[T] pow[T](T&, complex[T]&)
# There are some promotion versions too
- complex[T] sqrt[T](complex[T]&)
+ complex[T] sqrt[T](complex[T]&)
- complex[T] sin[T](complex[T]&)
- complex[T] cos[T](complex[T]&)
- complex[T] tan[T](complex[T]&)
- complex[T] asin[T](complex[T]&)
- complex[T] acos[T](complex[T]&)
- complex[T] atan[T](complex[T]&)
+ complex[T] sin[T](complex[T]&)
+ complex[T] cos[T](complex[T]&)
+ complex[T] tan[T](complex[T]&)
+ complex[T] asin[T](complex[T]&)
+ complex[T] acos[T](complex[T]&)
+ complex[T] atan[T](complex[T]&)
- complex[T] sinh[T](complex[T]&)
- complex[T] cosh[T](complex[T]&)
- complex[T] tanh[T](complex[T]&)
+ complex[T] sinh[T](complex[T]&)
+ complex[T] cosh[T](complex[T]&)
+ complex[T] tanh[T](complex[T]&)
- complex[T] asinh[T](complex[T]&)
- complex[T] acosh[T](complex[T]&)
- complex[T] atanh[T](complex[T]&)
+ complex[T] asinh[T](complex[T]&)
+ complex[T] acosh[T](complex[T]&)
+ complex[T] atanh[T](complex[T]&)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/deque.pxd b/contrib/tools/cython/Cython/Includes/libcpp/deque.pxd
index 9e2b2291d0..9b5ba89ae3 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/deque.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/deque.pxd
@@ -1,11 +1,11 @@
cdef extern from "<deque>" namespace "std" nogil:
- cdef cppclass deque[T,ALLOCATOR=*]:
+ cdef cppclass deque[T,ALLOCATOR=*]:
ctypedef T value_type
ctypedef ALLOCATOR allocator_type
# these should really be allocator_type.size_type and
# allocator_type.difference_type to be true to the C++ definition
- # but cython doesn't support deferred access on template arguments
+ # but cython doesn't support deferred access on template arguments
ctypedef size_t size_type
ctypedef ptrdiff_t difference_type
@@ -35,8 +35,8 @@ cdef extern from "<deque>" namespace "std" nogil:
bint operator>(reverse_iterator)
bint operator<=(reverse_iterator)
bint operator>=(reverse_iterator)
- cppclass const_iterator(iterator):
- pass
+ cppclass const_iterator(iterator):
+ pass
cppclass const_reverse_iterator(reverse_iterator):
pass
deque() except +
@@ -57,11 +57,11 @@ cdef extern from "<deque>" namespace "std" nogil:
T& at(size_t)
T& back()
iterator begin()
- const_iterator const_begin "begin"()
+ const_iterator const_begin "begin"()
void clear()
bint empty()
iterator end()
- const_iterator const_end "end"()
+ const_iterator const_end "end"()
iterator erase(iterator)
iterator erase(iterator, iterator)
T& front()
@@ -81,6 +81,6 @@ cdef extern from "<deque>" namespace "std" nogil:
void resize(size_t, T&)
size_t size()
void swap(deque&)
-
- # C++11 methods
- void shrink_to_fit()
+
+ # C++11 methods
+ void shrink_to_fit()
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/forward_list.pxd b/contrib/tools/cython/Cython/Includes/libcpp/forward_list.pxd
index 8c3b240d04..b8c7ba19c2 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/forward_list.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/forward_list.pxd
@@ -1,62 +1,62 @@
-cdef extern from "<forward_list>" namespace "std" nogil:
- cdef cppclass forward_list[T,ALLOCATOR=*]:
- ctypedef T value_type
- ctypedef ALLOCATOR allocator_type
-
- # these should really be allocator_type.size_type and
- # allocator_type.difference_type to be true to the C++ definition
- # but cython doesn't support deferred access on template arguments
- ctypedef size_t size_type
- ctypedef ptrdiff_t difference_type
-
- cppclass iterator:
- iterator()
- iterator(iterator &)
- T& operator*()
- iterator operator++()
- bint operator==(iterator)
- bint operator!=(iterator)
- cppclass const_iterator(iterator):
- pass
- forward_list() except +
- forward_list(forward_list&) except +
- forward_list(size_t, T&) except +
- #forward_list& operator=(forward_list&)
- bint operator==(forward_list&, forward_list&)
- bint operator!=(forward_list&, forward_list&)
- bint operator<(forward_list&, forward_list&)
- bint operator>(forward_list&, forward_list&)
- bint operator<=(forward_list&, forward_list&)
- bint operator>=(forward_list&, forward_list&)
- void assign(size_t, T&)
- T& front()
- iterator before_begin()
- const_iterator const_before_begin "before_begin"()
- iterator begin()
- const_iterator const_begin "begin"()
- iterator end()
- const_iterator const_end "end"()
- bint empty()
- size_t max_size()
- void clear()
- iterator insert_after(iterator, T&)
- void insert_after(iterator, size_t, T&)
- iterator erase_after(iterator)
- iterator erase_after(iterator, iterator)
- void push_front(T&)
- void pop_front()
- void resize(size_t)
- void resize(size_t, T&)
- void swap(forward_list&)
- void merge(forward_list&)
- void merge[Compare](forward_list&, Compare)
- void splice_after(iterator, forward_list&)
- void splice_after(iterator, forward_list&, iterator)
- void splice_after(iterator, forward_list&, iterator, iterator)
- void remove(const T&)
- void remove_if[Predicate](Predicate)
- void reverse()
- void unique()
- void unique[Predicate](Predicate)
- void sort()
- void sort[Compare](Compare)
+cdef extern from "<forward_list>" namespace "std" nogil:
+ cdef cppclass forward_list[T,ALLOCATOR=*]:
+ ctypedef T value_type
+ ctypedef ALLOCATOR allocator_type
+
+ # these should really be allocator_type.size_type and
+ # allocator_type.difference_type to be true to the C++ definition
+ # but cython doesn't support deferred access on template arguments
+ ctypedef size_t size_type
+ ctypedef ptrdiff_t difference_type
+
+ cppclass iterator:
+ iterator()
+ iterator(iterator &)
+ T& operator*()
+ iterator operator++()
+ bint operator==(iterator)
+ bint operator!=(iterator)
+ cppclass const_iterator(iterator):
+ pass
+ forward_list() except +
+ forward_list(forward_list&) except +
+ forward_list(size_t, T&) except +
+ #forward_list& operator=(forward_list&)
+ bint operator==(forward_list&, forward_list&)
+ bint operator!=(forward_list&, forward_list&)
+ bint operator<(forward_list&, forward_list&)
+ bint operator>(forward_list&, forward_list&)
+ bint operator<=(forward_list&, forward_list&)
+ bint operator>=(forward_list&, forward_list&)
+ void assign(size_t, T&)
+ T& front()
+ iterator before_begin()
+ const_iterator const_before_begin "before_begin"()
+ iterator begin()
+ const_iterator const_begin "begin"()
+ iterator end()
+ const_iterator const_end "end"()
+ bint empty()
+ size_t max_size()
+ void clear()
+ iterator insert_after(iterator, T&)
+ void insert_after(iterator, size_t, T&)
+ iterator erase_after(iterator)
+ iterator erase_after(iterator, iterator)
+ void push_front(T&)
+ void pop_front()
+ void resize(size_t)
+ void resize(size_t, T&)
+ void swap(forward_list&)
+ void merge(forward_list&)
+ void merge[Compare](forward_list&, Compare)
+ void splice_after(iterator, forward_list&)
+ void splice_after(iterator, forward_list&, iterator)
+ void splice_after(iterator, forward_list&, iterator, iterator)
+ void remove(const T&)
+ void remove_if[Predicate](Predicate)
+ void reverse()
+ void unique()
+ void unique[Predicate](Predicate)
+ void sort()
+ void sort[Compare](Compare)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/iterator.pxd b/contrib/tools/cython/Cython/Includes/libcpp/iterator.pxd
index e0f8bd8d6e..8ce29b25e0 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/iterator.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/iterator.pxd
@@ -1,32 +1,32 @@
-#Basic reference: http://www.cplusplus.com/reference/iterator/
-#Most of these classes are in fact empty structs
-
-cdef extern from "<iterator>" namespace "std" nogil:
- cdef cppclass iterator[Category,T,Distance,Pointer,Reference]:
- pass
- cdef cppclass output_iterator_tag:
- pass
- cdef cppclass input_iterator_tag:
- pass
- cdef cppclass forward_iterator_tag(input_iterator_tag):
- pass
- cdef cppclass bidirectional_iterator_tag(forward_iterator_tag):
- pass
- cdef cppclass random_access_iterator_tag(bidirectional_iterator_tag):
- pass
-
- cdef cppclass back_insert_iterator[T](iterator[output_iterator_tag,void,void,void,void]):
- pass
- cdef cppclass front_insert_iterator[T](iterator[output_iterator_tag,void,void,void,void]):
- pass
- cdef cppclass insert_iterator[T](iterator[output_iterator_tag,void,void,void,void]):
- pass
- back_insert_iterator[CONTAINER] back_inserter[CONTAINER](CONTAINER &)
- front_insert_iterator[CONTAINER] front_inserter[CONTAINER](CONTAINER &)
- ##Note: this is the C++98 version of inserter.
- ##The C++11 versions's prototype relies on typedef members of classes, which Cython doesn't currently support:
- ##template <class Container>
- ##insert_iterator<Container> inserter (Container& x, typename Container::iterator it)
- insert_iterator[CONTAINER] inserter[CONTAINER,ITERATOR](CONTAINER &, ITERATOR)
+#Basic reference: http://www.cplusplus.com/reference/iterator/
+#Most of these classes are in fact empty structs
+
+cdef extern from "<iterator>" namespace "std" nogil:
+ cdef cppclass iterator[Category,T,Distance,Pointer,Reference]:
+ pass
+ cdef cppclass output_iterator_tag:
+ pass
+ cdef cppclass input_iterator_tag:
+ pass
+ cdef cppclass forward_iterator_tag(input_iterator_tag):
+ pass
+ cdef cppclass bidirectional_iterator_tag(forward_iterator_tag):
+ pass
+ cdef cppclass random_access_iterator_tag(bidirectional_iterator_tag):
+ pass
+ cdef cppclass back_insert_iterator[T](iterator[output_iterator_tag,void,void,void,void]):
+ pass
+ cdef cppclass front_insert_iterator[T](iterator[output_iterator_tag,void,void,void,void]):
+ pass
+ cdef cppclass insert_iterator[T](iterator[output_iterator_tag,void,void,void,void]):
+ pass
+ back_insert_iterator[CONTAINER] back_inserter[CONTAINER](CONTAINER &)
+ front_insert_iterator[CONTAINER] front_inserter[CONTAINER](CONTAINER &)
+ ##Note: this is the C++98 version of inserter.
+ ##The C++11 versions's prototype relies on typedef members of classes, which Cython doesn't currently support:
+ ##template <class Container>
+ ##insert_iterator<Container> inserter (Container& x, typename Container::iterator it)
+ insert_iterator[CONTAINER] inserter[CONTAINER,ITERATOR](CONTAINER &, ITERATOR)
+
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/limits.pxd b/contrib/tools/cython/Cython/Includes/libcpp/limits.pxd
index c325263b72..a26bb20244 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/limits.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/limits.pxd
@@ -1,61 +1,61 @@
-cdef extern from "<limits>" namespace "std" nogil:
- enum float_round_style:
- round_indeterminate = -1
- round_toward_zero = 0
- round_to_nearest = 1
- round_toward_infinity = 2
- round_toward_neg_infinity = 3
+cdef extern from "<limits>" namespace "std" nogil:
+ enum float_round_style:
+ round_indeterminate = -1
+ round_toward_zero = 0
+ round_to_nearest = 1
+ round_toward_infinity = 2
+ round_toward_neg_infinity = 3
- enum float_denorm_style:
- denorm_indeterminate = -1
- denorm_absent = 0
- denorm_present = 1
+ enum float_denorm_style:
+ denorm_indeterminate = -1
+ denorm_absent = 0
+ denorm_present = 1
+
+ #The static methods can be called as, e.g. numeric_limits[int].round_error(), etc.
+ #The const data members should be declared as static. Cython currently doesn't allow that
+ #and/or I can't figure it out, so you must instantiate an object to access, e.g.
+ #cdef numeric_limits[double] lm
+ #print lm.round_style
+ cdef cppclass numeric_limits[T]:
+ const bint is_specialized
+ @staticmethod
+ T min()
+ @staticmethod
+ T max()
+ const int digits
+ const int digits10
+ const bint is_signed
+ const bint is_integer
+ const bint is_exact
+ const int radix
+ @staticmethod
+ T epsilon()
+ @staticmethod
+ T round_error()
+
+ const int min_exponent
+ const int min_exponent10
+ const int max_exponent
+ const int max_exponent10
- #The static methods can be called as, e.g. numeric_limits[int].round_error(), etc.
- #The const data members should be declared as static. Cython currently doesn't allow that
- #and/or I can't figure it out, so you must instantiate an object to access, e.g.
- #cdef numeric_limits[double] lm
- #print lm.round_style
- cdef cppclass numeric_limits[T]:
- const bint is_specialized
- @staticmethod
- T min()
- @staticmethod
- T max()
- const int digits
- const int digits10
- const bint is_signed
- const bint is_integer
- const bint is_exact
- const int radix
- @staticmethod
- T epsilon()
- @staticmethod
- T round_error()
-
- const int min_exponent
- const int min_exponent10
- const int max_exponent
- const int max_exponent10
-
- const bint has_infinity
- const bint has_quiet_NaN
- const bint has_signaling_NaN
- const float_denorm_style has_denorm
- const bint has_denorm_loss
- @staticmethod
- T infinity()
- @staticmethod
- T quiet_NaN()
- @staticmethod
- T signaling_NaN()
- @staticmethod
- T denorm_min()
-
- const bint is_iec559
- const bint is_bounded
- const bint is_modulo
-
- const bint traps
- const bint tinyness_before
- const float_round_style round_style
+ const bint has_infinity
+ const bint has_quiet_NaN
+ const bint has_signaling_NaN
+ const float_denorm_style has_denorm
+ const bint has_denorm_loss
+ @staticmethod
+ T infinity()
+ @staticmethod
+ T quiet_NaN()
+ @staticmethod
+ T signaling_NaN()
+ @staticmethod
+ T denorm_min()
+
+ const bint is_iec559
+ const bint is_bounded
+ const bint is_modulo
+
+ const bint traps
+ const bint tinyness_before
+ const float_round_style round_style
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/list.pxd b/contrib/tools/cython/Cython/Includes/libcpp/list.pxd
index b5b0410ad8..e350694da3 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/list.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/list.pxd
@@ -1,14 +1,14 @@
cdef extern from "<list>" namespace "std" nogil:
- cdef cppclass list[T,ALLOCATOR=*]:
- ctypedef T value_type
- ctypedef ALLOCATOR allocator_type
-
- # these should really be allocator_type.size_type and
- # allocator_type.difference_type to be true to the C++ definition
- # but cython doesn't support deferred access on template arguments
- ctypedef size_t size_type
- ctypedef ptrdiff_t difference_type
-
+ cdef cppclass list[T,ALLOCATOR=*]:
+ ctypedef T value_type
+ ctypedef ALLOCATOR allocator_type
+
+ # these should really be allocator_type.size_type and
+ # allocator_type.difference_type to be true to the C++ definition
+ # but cython doesn't support deferred access on template arguments
+ ctypedef size_t size_type
+ ctypedef ptrdiff_t difference_type
+
cppclass iterator:
iterator()
iterator(iterator &)
@@ -25,10 +25,10 @@ cdef extern from "<list>" namespace "std" nogil:
reverse_iterator operator--()
bint operator==(reverse_iterator)
bint operator!=(reverse_iterator)
- cppclass const_iterator(iterator):
- pass
- cppclass const_reverse_iterator(reverse_iterator):
- pass
+ cppclass const_iterator(iterator):
+ pass
+ cppclass const_reverse_iterator(reverse_iterator):
+ pass
list() except +
list(list&) except +
list(size_t, T&) except +
@@ -42,11 +42,11 @@ cdef extern from "<list>" namespace "std" nogil:
void assign(size_t, T&)
T& back()
iterator begin()
- const_iterator const_begin "begin"()
+ const_iterator const_begin "begin"()
void clear()
bint empty()
iterator end()
- const_iterator const_end "end"()
+ const_iterator const_end "end"()
iterator erase(iterator)
iterator erase(iterator, iterator)
T& front()
@@ -60,11 +60,11 @@ cdef extern from "<list>" namespace "std" nogil:
void push_back(T&)
void push_front(T&)
reverse_iterator rbegin()
- const_reverse_iterator const_rbegin "rbegin"()
+ const_reverse_iterator const_rbegin "rbegin"()
void remove(T&)
#void remove_if(UnPred)
reverse_iterator rend()
- const_reverse_iterator const_rend "rend"()
+ const_reverse_iterator const_rend "rend"()
void resize(size_t, T&)
void reverse()
size_t size()
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/map.pxd b/contrib/tools/cython/Cython/Includes/libcpp/map.pxd
index 624a7ac026..4507baf2a6 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/map.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/map.pxd
@@ -1,12 +1,12 @@
from .utility cimport pair
cdef extern from "<map>" namespace "std" nogil:
- cdef cppclass map[T, U, COMPARE=*, ALLOCATOR=*]:
- ctypedef T key_type
- ctypedef U mapped_type
- ctypedef pair[const T, U] value_type
- ctypedef COMPARE key_compare
- ctypedef ALLOCATOR allocator_type
+ cdef cppclass map[T, U, COMPARE=*, ALLOCATOR=*]:
+ ctypedef T key_type
+ ctypedef U mapped_type
+ ctypedef pair[const T, U] value_type
+ ctypedef COMPARE key_compare
+ ctypedef ALLOCATOR allocator_type
cppclass iterator:
pair[T, U]& operator*()
iterator operator++()
@@ -19,10 +19,10 @@ cdef extern from "<map>" namespace "std" nogil:
iterator operator--()
bint operator==(reverse_iterator)
bint operator!=(reverse_iterator)
- cppclass const_iterator(iterator):
- pass
- cppclass const_reverse_iterator(reverse_iterator):
- pass
+ cppclass const_iterator(iterator):
+ pass
+ cppclass const_reverse_iterator(reverse_iterator):
+ pass
map() except +
map(map&) except +
#map(key_compare&)
@@ -34,35 +34,35 @@ cdef extern from "<map>" namespace "std" nogil:
bint operator>(map&, map&)
bint operator<=(map&, map&)
bint operator>=(map&, map&)
- U& at(const T&) except +
- const U& const_at "at"(const T&) except +
+ U& at(const T&) except +
+ const U& const_at "at"(const T&) except +
iterator begin()
const_iterator const_begin "begin" ()
void clear()
- size_t count(const T&)
+ size_t count(const T&)
bint empty()
iterator end()
const_iterator const_end "end" ()
- pair[iterator, iterator] equal_range(const T&)
+ pair[iterator, iterator] equal_range(const T&)
#pair[const_iterator, const_iterator] equal_range(key_type&)
void erase(iterator)
void erase(iterator, iterator)
- size_t erase(const T&)
- iterator find(const T&)
- const_iterator const_find "find" (const T&)
- pair[iterator, bint] insert(pair[T, U]) except + # XXX pair[T,U]&
- iterator insert(iterator, pair[T, U]) except + # XXX pair[T,U]&
+ size_t erase(const T&)
+ iterator find(const T&)
+ const_iterator const_find "find" (const T&)
+ pair[iterator, bint] insert(pair[T, U]) except + # XXX pair[T,U]&
+ iterator insert(iterator, pair[T, U]) except + # XXX pair[T,U]&
#void insert(input_iterator, input_iterator)
#key_compare key_comp()
- iterator lower_bound(const T&)
- const_iterator const_lower_bound "lower_bound"(const T&)
+ iterator lower_bound(const T&)
+ const_iterator const_lower_bound "lower_bound"(const T&)
size_t max_size()
reverse_iterator rbegin()
- const_reverse_iterator const_rbegin "rbegin"()
+ const_reverse_iterator const_rbegin "rbegin"()
reverse_iterator rend()
- const_reverse_iterator const_rend "rend"()
+ const_reverse_iterator const_rend "rend"()
size_t size()
void swap(map&)
- iterator upper_bound(const T&)
- const_iterator const_upper_bound "upper_bound"(const T&)
+ iterator upper_bound(const T&)
+ const_iterator const_upper_bound "upper_bound"(const T&)
#value_compare value_comp()
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/memory.pxd b/contrib/tools/cython/Cython/Includes/libcpp/memory.pxd
index 2151c1ec7f..f8548011e4 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/memory.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/memory.pxd
@@ -1,115 +1,115 @@
-from libcpp cimport bool, nullptr_t, nullptr
-
-cdef extern from "<memory>" namespace "std" nogil:
- cdef cppclass default_delete[T]:
- default_delete()
-
- cdef cppclass allocator[T]:
- allocator()
- allocator(const allocator &)
- #allocator(const allocator[U] &) #unique_ptr unit tests fail w/this
- T * address(T &)
- const T * address(const T &) const
- T * allocate( size_t n ) # Not to standard. should be a second default argument
- void deallocate(T * , size_t)
- size_t max_size() const
- void construct( T *, const T &) #C++98. The C++11 version is variadic AND perfect-forwarding
- void destroy(T *) #C++98
- void destroy[U](U *) #unique_ptr unit tests fail w/this
-
-
- cdef cppclass unique_ptr[T,DELETER=*]:
- unique_ptr()
- unique_ptr(nullptr_t)
- unique_ptr(T*)
- unique_ptr(unique_ptr[T]&)
-
- # Modifiers
- T* release()
- void reset()
- void reset(nullptr_t)
- void reset(T*)
- void swap(unique_ptr&)
-
- # Observers
- T* get()
- T& operator*()
- #T* operator->() # Not Supported
- bool operator bool()
- bool operator!()
-
- bool operator==(const unique_ptr&)
- bool operator!=(const unique_ptr&)
- bool operator<(const unique_ptr&)
- bool operator>(const unique_ptr&)
- bool operator<=(const unique_ptr&)
- bool operator>=(const unique_ptr&)
-
- bool operator==(nullptr_t)
- bool operator!=(nullptr_t)
-
- # Forward Declaration not working ("Compiler crash in AnalyseDeclarationsTransform")
- #cdef cppclass weak_ptr[T]
-
- cdef cppclass shared_ptr[T]:
- shared_ptr()
- shared_ptr(nullptr_t)
- shared_ptr(T*)
- shared_ptr(shared_ptr[T]&)
- shared_ptr(shared_ptr[T]&, T*)
- shared_ptr(unique_ptr[T]&)
- #shared_ptr(weak_ptr[T]&) # Not Supported
-
- # Modifiers
- void reset()
- void reset(T*)
- void swap(shared_ptr&)
-
- # Observers
- T* get()
- T& operator*()
- #T* operator->() # Not Supported
- long use_count()
- bool unique()
- bool operator bool()
- bool operator!()
- #bool owner_before[Y](const weak_ptr[Y]&) # Not Supported
- bool owner_before[Y](const shared_ptr[Y]&)
-
- bool operator==(const shared_ptr&)
- bool operator!=(const shared_ptr&)
- bool operator<(const shared_ptr&)
- bool operator>(const shared_ptr&)
- bool operator<=(const shared_ptr&)
- bool operator>=(const shared_ptr&)
-
- bool operator==(nullptr_t)
- bool operator!=(nullptr_t)
-
- cdef cppclass weak_ptr[T]:
- weak_ptr()
- weak_ptr(weak_ptr[T]&)
- weak_ptr(shared_ptr[T]&)
-
- # Modifiers
- void reset()
- void swap(weak_ptr&)
-
- # Observers
- long use_count()
- bool expired()
- shared_ptr[T] lock()
- bool owner_before[Y](const weak_ptr[Y]&)
- bool owner_before[Y](const shared_ptr[Y]&)
-
- # Smart pointer non-member operations
- shared_ptr[T] make_shared[T](...) except +
-
- # Temporaries used for exception handling break generated code
- unique_ptr[T] make_unique[T](...) # except +
-
- # No checking on the compatibility of T and U.
- cdef shared_ptr[T] static_pointer_cast[T, U](const shared_ptr[U]&)
- cdef shared_ptr[T] dynamic_pointer_cast[T, U](const shared_ptr[U]&)
- cdef shared_ptr[T] const_pointer_cast[T, U](const shared_ptr[U]&)
- cdef shared_ptr[T] reinterpret_pointer_cast[T, U](const shared_ptr[U]&)
+from libcpp cimport bool, nullptr_t, nullptr
+
+cdef extern from "<memory>" namespace "std" nogil:
+ cdef cppclass default_delete[T]:
+ default_delete()
+
+ cdef cppclass allocator[T]:
+ allocator()
+ allocator(const allocator &)
+ #allocator(const allocator[U] &) #unique_ptr unit tests fail w/this
+ T * address(T &)
+ const T * address(const T &) const
+ T * allocate( size_t n ) # Not to standard. should be a second default argument
+ void deallocate(T * , size_t)
+ size_t max_size() const
+ void construct( T *, const T &) #C++98. The C++11 version is variadic AND perfect-forwarding
+ void destroy(T *) #C++98
+ void destroy[U](U *) #unique_ptr unit tests fail w/this
+
+
+ cdef cppclass unique_ptr[T,DELETER=*]:
+ unique_ptr()
+ unique_ptr(nullptr_t)
+ unique_ptr(T*)
+ unique_ptr(unique_ptr[T]&)
+
+ # Modifiers
+ T* release()
+ void reset()
+ void reset(nullptr_t)
+ void reset(T*)
+ void swap(unique_ptr&)
+
+ # Observers
+ T* get()
+ T& operator*()
+ #T* operator->() # Not Supported
+ bool operator bool()
+ bool operator!()
+
+ bool operator==(const unique_ptr&)
+ bool operator!=(const unique_ptr&)
+ bool operator<(const unique_ptr&)
+ bool operator>(const unique_ptr&)
+ bool operator<=(const unique_ptr&)
+ bool operator>=(const unique_ptr&)
+
+ bool operator==(nullptr_t)
+ bool operator!=(nullptr_t)
+
+ # Forward Declaration not working ("Compiler crash in AnalyseDeclarationsTransform")
+ #cdef cppclass weak_ptr[T]
+
+ cdef cppclass shared_ptr[T]:
+ shared_ptr()
+ shared_ptr(nullptr_t)
+ shared_ptr(T*)
+ shared_ptr(shared_ptr[T]&)
+ shared_ptr(shared_ptr[T]&, T*)
+ shared_ptr(unique_ptr[T]&)
+ #shared_ptr(weak_ptr[T]&) # Not Supported
+
+ # Modifiers
+ void reset()
+ void reset(T*)
+ void swap(shared_ptr&)
+
+ # Observers
+ T* get()
+ T& operator*()
+ #T* operator->() # Not Supported
+ long use_count()
+ bool unique()
+ bool operator bool()
+ bool operator!()
+ #bool owner_before[Y](const weak_ptr[Y]&) # Not Supported
+ bool owner_before[Y](const shared_ptr[Y]&)
+
+ bool operator==(const shared_ptr&)
+ bool operator!=(const shared_ptr&)
+ bool operator<(const shared_ptr&)
+ bool operator>(const shared_ptr&)
+ bool operator<=(const shared_ptr&)
+ bool operator>=(const shared_ptr&)
+
+ bool operator==(nullptr_t)
+ bool operator!=(nullptr_t)
+
+ cdef cppclass weak_ptr[T]:
+ weak_ptr()
+ weak_ptr(weak_ptr[T]&)
+ weak_ptr(shared_ptr[T]&)
+
+ # Modifiers
+ void reset()
+ void swap(weak_ptr&)
+
+ # Observers
+ long use_count()
+ bool expired()
+ shared_ptr[T] lock()
+ bool owner_before[Y](const weak_ptr[Y]&)
+ bool owner_before[Y](const shared_ptr[Y]&)
+
+ # Smart pointer non-member operations
+ shared_ptr[T] make_shared[T](...) except +
+
+ # Temporaries used for exception handling break generated code
+ unique_ptr[T] make_unique[T](...) # except +
+
+ # No checking on the compatibility of T and U.
+ cdef shared_ptr[T] static_pointer_cast[T, U](const shared_ptr[U]&)
+ cdef shared_ptr[T] dynamic_pointer_cast[T, U](const shared_ptr[U]&)
+ cdef shared_ptr[T] const_pointer_cast[T, U](const shared_ptr[U]&)
+ cdef shared_ptr[T] reinterpret_pointer_cast[T, U](const shared_ptr[U]&)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/queue.pxd b/contrib/tools/cython/Cython/Includes/libcpp/queue.pxd
index 578cbd9159..f610249c52 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/queue.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/queue.pxd
@@ -9,9 +9,9 @@ cdef extern from "<queue>" namespace "std" nogil:
void pop()
void push(T&)
size_t size()
- # C++11 methods
- void swap(queue&)
-
+ # C++11 methods
+ void swap(queue&)
+
cdef cppclass priority_queue[T]:
priority_queue() except +
priority_queue(priority_queue&) except +
@@ -21,5 +21,5 @@ cdef extern from "<queue>" namespace "std" nogil:
void push(T&)
size_t size()
T& top()
- # C++11 methods
- void swap(priority_queue&)
+ # C++11 methods
+ void swap(priority_queue&)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/set.pxd b/contrib/tools/cython/Cython/Includes/libcpp/set.pxd
index 1069be7466..2de86db1ea 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/set.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/set.pxd
@@ -2,7 +2,7 @@ from .utility cimport pair
cdef extern from "<set>" namespace "std" nogil:
cdef cppclass set[T]:
- ctypedef T value_type
+ ctypedef T value_type
cppclass iterator:
T& operator*()
iterator operator++()
@@ -15,10 +15,10 @@ cdef extern from "<set>" namespace "std" nogil:
iterator operator--()
bint operator==(reverse_iterator)
bint operator!=(reverse_iterator)
- cppclass const_iterator(iterator):
- pass
- cppclass const_reverse_iterator(reverse_iterator):
- pass
+ cppclass const_iterator(iterator):
+ pass
+ cppclass const_reverse_iterator(reverse_iterator):
+ pass
set() except +
set(set&) except +
#set(key_compare&)
@@ -30,32 +30,32 @@ cdef extern from "<set>" namespace "std" nogil:
bint operator<=(set&, set&)
bint operator>=(set&, set&)
iterator begin()
- const_iterator const_begin "begin"()
+ const_iterator const_begin "begin"()
void clear()
- size_t count(const T&)
+ size_t count(const T&)
bint empty()
iterator end()
- const_iterator const_end "end"()
- pair[iterator, iterator] equal_range(const T&)
+ const_iterator const_end "end"()
+ pair[iterator, iterator] equal_range(const T&)
#pair[const_iterator, const_iterator] equal_range(T&)
- iterator erase(iterator)
- iterator erase(iterator, iterator)
+ iterator erase(iterator)
+ iterator erase(iterator, iterator)
size_t erase(T&)
iterator find(T&)
- const_iterator const_find "find"(T&)
- pair[iterator, bint] insert(const T&) except +
- iterator insert(iterator, const T&) except +
- void insert(iterator, iterator) except +
+ const_iterator const_find "find"(T&)
+ pair[iterator, bint] insert(const T&) except +
+ iterator insert(iterator, const T&) except +
+ void insert(iterator, iterator) except +
#key_compare key_comp()
iterator lower_bound(T&)
- const_iterator const_lower_bound "lower_bound"(T&)
+ const_iterator const_lower_bound "lower_bound"(T&)
size_t max_size()
reverse_iterator rbegin()
- const_reverse_iterator const_rbegin "rbegin"()
+ const_reverse_iterator const_rbegin "rbegin"()
reverse_iterator rend()
- const_reverse_iterator const_rend "rend"()
+ const_reverse_iterator const_rend "rend"()
size_t size()
void swap(set&)
- iterator upper_bound(const T&)
- const_iterator const_upper_bound "upper_bound"(const T&)
+ iterator upper_bound(const T&)
+ const_iterator const_upper_bound "upper_bound"(const T&)
#value_compare value_comp()
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/stack.pxd b/contrib/tools/cython/Cython/Includes/libcpp/stack.pxd
index 2dc80992b7..4bfcf0593a 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/stack.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/stack.pxd
@@ -1,6 +1,6 @@
cdef extern from "<stack>" namespace "std" nogil:
cdef cppclass stack[T]:
- ctypedef T value_type
+ ctypedef T value_type
stack() except +
stack(stack&) except +
#stack(Container&)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/string.pxd b/contrib/tools/cython/Cython/Includes/libcpp/string.pxd
index a894144f1f..1214a2a7c3 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/string.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/string.pxd
@@ -8,34 +8,34 @@ cdef extern from "<string>" namespace "std::string" nogil:
cdef extern from "<string>" namespace "std" nogil:
cdef cppclass string:
- cppclass iterator:
- iterator()
- char& operator*()
+ cppclass iterator:
+ iterator()
+ char& operator*()
iterator(iterator&)
- iterator operator++()
- iterator operator--()
- bint operator==(iterator)
- bint operator!=(iterator)
-
- cppclass reverse_iterator:
- char& operator*()
- iterator operator++()
- iterator operator--()
- iterator operator+(size_t)
- iterator operator-(size_t)
- bint operator==(reverse_iterator)
- bint operator!=(reverse_iterator)
- bint operator<(reverse_iterator)
- bint operator>(reverse_iterator)
- bint operator<=(reverse_iterator)
- bint operator>=(reverse_iterator)
-
- cppclass const_iterator(iterator):
- pass
-
- cppclass const_reverse_iterator(reverse_iterator):
- pass
-
+ iterator operator++()
+ iterator operator--()
+ bint operator==(iterator)
+ bint operator!=(iterator)
+
+ cppclass reverse_iterator:
+ char& operator*()
+ iterator operator++()
+ iterator operator--()
+ iterator operator+(size_t)
+ iterator operator-(size_t)
+ bint operator==(reverse_iterator)
+ bint operator!=(reverse_iterator)
+ bint operator<(reverse_iterator)
+ bint operator>(reverse_iterator)
+ bint operator<=(reverse_iterator)
+ bint operator>=(reverse_iterator)
+
+ cppclass const_iterator(iterator):
+ pass
+
+ cppclass const_reverse_iterator(reverse_iterator):
+ pass
+
string() except +
string(const string& s) except +
string(const string& s, size_t pos) except +
@@ -45,15 +45,15 @@ cdef extern from "<string>" namespace "std" nogil:
string(size_t n, char c) except +
string(iterator first, iterator last) except +
- iterator begin()
- const_iterator const_begin "begin"()
- iterator end()
- const_iterator const_end "end"()
- reverse_iterator rbegin()
- const_reverse_iterator const_rbegin "rbegin"()
- reverse_iterator rend()
- const_reverse_iterator const_rend "rend"()
-
+ iterator begin()
+ const_iterator const_begin "begin"()
+ iterator end()
+ const_iterator const_end "end"()
+ reverse_iterator rbegin()
+ const_reverse_iterator const_rbegin "rbegin"()
+ reverse_iterator rend()
+ const_reverse_iterator const_rend "rend"()
+
const char* c_str()
const char* data()
size_t size()
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/typeindex.pxd b/contrib/tools/cython/Cython/Includes/libcpp/typeindex.pxd
index d5b7e9149f..73f94e93a0 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/typeindex.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/typeindex.pxd
@@ -1,15 +1,15 @@
-from libcpp cimport bool
-from .typeinfo cimport type_info
-
-# This class is C++11-only
-cdef extern from "<typeindex>" namespace "std" nogil:
- cdef cppclass type_index:
- type_index(const type_info &)
- const char* name()
- size_t hash_code()
- bool operator==(const type_index &)
- bool operator!=(const type_index &)
- bool operator<(const type_index &)
- bool operator<=(const type_index &)
- bool operator>(const type_index &)
- bool operator>=(const type_index &)
+from libcpp cimport bool
+from .typeinfo cimport type_info
+
+# This class is C++11-only
+cdef extern from "<typeindex>" namespace "std" nogil:
+ cdef cppclass type_index:
+ type_index(const type_info &)
+ const char* name()
+ size_t hash_code()
+ bool operator==(const type_index &)
+ bool operator!=(const type_index &)
+ bool operator<(const type_index &)
+ bool operator<=(const type_index &)
+ bool operator>(const type_index &)
+ bool operator>=(const type_index &)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/typeinfo.pxd b/contrib/tools/cython/Cython/Includes/libcpp/typeinfo.pxd
index 9118e00649..989bce171c 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/typeinfo.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/typeinfo.pxd
@@ -1,10 +1,10 @@
-from libcpp cimport bool
-
-cdef extern from "<typeinfo>" namespace "std" nogil:
- cdef cppclass type_info:
- const char* name()
- int before(const type_info&)
- bool operator==(const type_info&)
- bool operator!=(const type_info&)
- # C++11-only
- size_t hash_code()
+from libcpp cimport bool
+
+cdef extern from "<typeinfo>" namespace "std" nogil:
+ cdef cppclass type_info:
+ const char* name()
+ int before(const type_info&)
+ bool operator==(const type_info&)
+ bool operator!=(const type_info&)
+ # C++11-only
+ size_t hash_code()
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/unordered_map.pxd b/contrib/tools/cython/Cython/Includes/libcpp/unordered_map.pxd
index a00fbbed28..7db3ba0544 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/unordered_map.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/unordered_map.pxd
@@ -2,9 +2,9 @@ from .utility cimport pair
cdef extern from "<unordered_map>" namespace "std" nogil:
cdef cppclass unordered_map[T, U, HASH=*, PRED=*, ALLOCATOR=*]:
- ctypedef T key_type
- ctypedef U mapped_type
- ctypedef pair[const T, U] value_type
+ ctypedef T key_type
+ ctypedef U mapped_type
+ ctypedef pair[const T, U] value_type
cppclass iterator:
pair[T, U]& operator*()
iterator operator++()
@@ -17,10 +17,10 @@ cdef extern from "<unordered_map>" namespace "std" nogil:
iterator operator--()
bint operator==(reverse_iterator)
bint operator!=(reverse_iterator)
- cppclass const_iterator(iterator):
- pass
- cppclass const_reverse_iterator(reverse_iterator):
- pass
+ cppclass const_iterator(iterator):
+ pass
+ cppclass const_reverse_iterator(reverse_iterator):
+ pass
unordered_map() except +
unordered_map(unordered_map&) except +
#unordered_map(key_compare&)
@@ -32,43 +32,43 @@ cdef extern from "<unordered_map>" namespace "std" nogil:
bint operator>(unordered_map&, unordered_map&)
bint operator<=(unordered_map&, unordered_map&)
bint operator>=(unordered_map&, unordered_map&)
- U& at(const T&)
- const U& const_at "at"(const T&)
+ U& at(const T&)
+ const U& const_at "at"(const T&)
iterator begin()
- const_iterator const_begin "begin"()
+ const_iterator const_begin "begin"()
void clear()
size_t count(T&)
bint empty()
iterator end()
- const_iterator const_end "end"()
+ const_iterator const_end "end"()
pair[iterator, iterator] equal_range(T&)
- pair[const_iterator, const_iterator] const_equal_range "equal_range"(const T&)
+ pair[const_iterator, const_iterator] const_equal_range "equal_range"(const T&)
iterator erase(iterator)
iterator erase(iterator, iterator)
size_t erase(T&)
iterator find(T&)
- const_iterator const_find "find"(T&)
+ const_iterator const_find "find"(T&)
pair[iterator, bint] insert(pair[T, U]) # XXX pair[T,U]&
iterator insert(iterator, pair[T, U]) # XXX pair[T,U]&
- iterator insert(iterator, iterator)
+ iterator insert(iterator, iterator)
#key_compare key_comp()
iterator lower_bound(T&)
- const_iterator const_lower_bound "lower_bound"(T&)
+ const_iterator const_lower_bound "lower_bound"(T&)
size_t max_size()
reverse_iterator rbegin()
- const_reverse_iterator const_rbegin "rbegin"()
+ const_reverse_iterator const_rbegin "rbegin"()
reverse_iterator rend()
- const_reverse_iterator const_rend "rend"()
+ const_reverse_iterator const_rend "rend"()
size_t size()
void swap(unordered_map&)
iterator upper_bound(T&)
- const_iterator const_upper_bound "upper_bound"(T&)
+ const_iterator const_upper_bound "upper_bound"(T&)
#value_compare value_comp()
- void max_load_factor(float)
- float max_load_factor()
- void rehash(size_t)
- void reserve(size_t)
- size_t bucket_count()
- size_t max_bucket_count()
- size_t bucket_size(size_t)
- size_t bucket(const T&)
+ void max_load_factor(float)
+ float max_load_factor()
+ void rehash(size_t)
+ void reserve(size_t)
+ size_t bucket_count()
+ size_t max_bucket_count()
+ size_t bucket_size(size_t)
+ size_t bucket(const T&)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/unordered_set.pxd b/contrib/tools/cython/Cython/Includes/libcpp/unordered_set.pxd
index 5aa2417528..47101fb29f 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/unordered_set.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/unordered_set.pxd
@@ -1,8 +1,8 @@
from .utility cimport pair
cdef extern from "<unordered_set>" namespace "std" nogil:
- cdef cppclass unordered_set[T,HASH=*,PRED=*,ALLOCATOR=*]:
- ctypedef T value_type
+ cdef cppclass unordered_set[T,HASH=*,PRED=*,ALLOCATOR=*]:
+ ctypedef T value_type
cppclass iterator:
T& operator*()
iterator operator++()
@@ -15,10 +15,10 @@ cdef extern from "<unordered_set>" namespace "std" nogil:
iterator operator--()
bint operator==(reverse_iterator)
bint operator!=(reverse_iterator)
- cppclass const_iterator(iterator):
- pass
- cppclass const_reverse_iterator(reverse_iterator):
- pass
+ cppclass const_iterator(iterator):
+ pass
+ cppclass const_reverse_iterator(reverse_iterator):
+ pass
unordered_set() except +
unordered_set(unordered_set&) except +
#unordered_set(key_compare&)
@@ -30,40 +30,40 @@ cdef extern from "<unordered_set>" namespace "std" nogil:
bint operator<=(unordered_set&, unordered_set&)
bint operator>=(unordered_set&, unordered_set&)
iterator begin()
- const_iterator const_begin "begin"()
+ const_iterator const_begin "begin"()
void clear()
size_t count(T&)
bint empty()
iterator end()
- const_iterator const_end "end"()
+ const_iterator const_end "end"()
pair[iterator, iterator] equal_range(T&)
- pair[const_iterator, const_iterator] const_equal_range "equal_range"(T&)
- iterator erase(iterator)
- iterator erase(iterator, iterator)
+ pair[const_iterator, const_iterator] const_equal_range "equal_range"(T&)
+ iterator erase(iterator)
+ iterator erase(iterator, iterator)
size_t erase(T&)
iterator find(T&)
- const_iterator const_find "find"(T&)
+ const_iterator const_find "find"(T&)
pair[iterator, bint] insert(T&)
iterator insert(iterator, T&)
#key_compare key_comp()
- iterator insert(iterator, iterator)
+ iterator insert(iterator, iterator)
iterator lower_bound(T&)
- const_iterator const_lower_bound "lower_bound"(T&)
+ const_iterator const_lower_bound "lower_bound"(T&)
size_t max_size()
reverse_iterator rbegin()
- const_reverse_iterator const_rbegin "rbegin"()
+ const_reverse_iterator const_rbegin "rbegin"()
reverse_iterator rend()
- const_reverse_iterator const_rend "rend"()
+ const_reverse_iterator const_rend "rend"()
size_t size()
void swap(unordered_set&)
iterator upper_bound(T&)
- const_iterator const_upper_bound "upper_bound"(T&)
+ const_iterator const_upper_bound "upper_bound"(T&)
#value_compare value_comp()
- void max_load_factor(float)
- float max_load_factor()
- void rehash(size_t)
- void reserve(size_t)
- size_t bucket_count()
- size_t max_bucket_count()
- size_t bucket_size(size_t)
- size_t bucket(const T&)
+ void max_load_factor(float)
+ float max_load_factor()
+ void rehash(size_t)
+ void reserve(size_t)
+ size_t bucket_count()
+ size_t max_bucket_count()
+ size_t bucket_size(size_t)
+ size_t bucket(const T&)
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/utility.pxd b/contrib/tools/cython/Cython/Includes/libcpp/utility.pxd
index e0df69b166..fd306e0eeb 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/utility.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/utility.pxd
@@ -1,7 +1,7 @@
cdef extern from "<utility>" namespace "std" nogil:
cdef cppclass pair[T, U]:
- ctypedef T first_type
- ctypedef U second_type
+ ctypedef T first_type
+ ctypedef U second_type
T first
U second
pair() except +
diff --git a/contrib/tools/cython/Cython/Includes/libcpp/vector.pxd b/contrib/tools/cython/Cython/Includes/libcpp/vector.pxd
index 9b007dd0c7..02f772326c 100644
--- a/contrib/tools/cython/Cython/Includes/libcpp/vector.pxd
+++ b/contrib/tools/cython/Cython/Includes/libcpp/vector.pxd
@@ -1,11 +1,11 @@
cdef extern from "<vector>" namespace "std" nogil:
- cdef cppclass vector[T,ALLOCATOR=*]:
- ctypedef T value_type
- ctypedef ALLOCATOR allocator_type
+ cdef cppclass vector[T,ALLOCATOR=*]:
+ ctypedef T value_type
+ ctypedef ALLOCATOR allocator_type
# these should really be allocator_type.size_type and
# allocator_type.difference_type to be true to the C++ definition
- # but cython doesn't support deferred access on template arguments
+ # but cython doesn't support deferred access on template arguments
ctypedef size_t size_type
ctypedef ptrdiff_t difference_type
@@ -35,10 +35,10 @@ cdef extern from "<vector>" namespace "std" nogil:
bint operator>(reverse_iterator)
bint operator<=(reverse_iterator)
bint operator>=(reverse_iterator)
- cppclass const_iterator(iterator):
- pass
- cppclass const_reverse_iterator(reverse_iterator):
- pass
+ cppclass const_iterator(iterator):
+ pass
+ cppclass const_reverse_iterator(reverse_iterator):
+ pass
vector() except +
vector(vector&) except +
vector(size_type) except +
@@ -53,25 +53,25 @@ cdef extern from "<vector>" namespace "std" nogil:
bint operator<=(vector&, vector&)
bint operator>=(vector&, vector&)
void assign(size_type, const T&)
- void assign[input_iterator](input_iterator, input_iterator) except +
+ void assign[input_iterator](input_iterator, input_iterator) except +
T& at(size_type) except +
T& back()
iterator begin()
- const_iterator const_begin "begin"()
+ const_iterator const_begin "begin"()
size_type capacity()
void clear()
bint empty()
iterator end()
- const_iterator const_end "end"()
+ const_iterator const_end "end"()
iterator erase(iterator)
iterator erase(iterator, iterator)
T& front()
- iterator insert(iterator, const T&) except +
+ iterator insert(iterator, const T&) except +
iterator insert(iterator, size_type, const T&) except +
iterator insert[Iter](iterator, Iter, Iter) except +
size_type max_size()
void pop_back()
- void push_back(T&) except +
+ void push_back(T&) except +
reverse_iterator rbegin()
const_reverse_iterator const_rbegin "crbegin"()
reverse_iterator rend()
@@ -81,8 +81,8 @@ cdef extern from "<vector>" namespace "std" nogil:
void resize(size_type, T&) except +
size_type size()
void swap(vector&)
-
- # C++11 methods
+
+ # C++11 methods
T* data()
- const T* const_data "data"()
+ const T* const_data "data"()
void shrink_to_fit()
diff --git a/contrib/tools/cython/Cython/Includes/numpy.pxd b/contrib/tools/cython/Cython/Includes/numpy.pxd
index 789669dac1..603c08b4f2 100644
--- a/contrib/tools/cython/Cython/Includes/numpy.pxd
+++ b/contrib/tools/cython/Cython/Includes/numpy.pxd
@@ -3,7 +3,7 @@
# If any of the PyArray_* functions are called, import_array must be
# called first.
#
-# This also defines backwards-compatibility buffer acquisition
+# This also defines backwards-compatibility buffer acquisition
# code for use in Python 2.x (or Python <= 2.5 when NumPy starts
# implementing PEP-3118 directly).
#
@@ -17,9 +17,9 @@
DEF _buffer_format_string_len = 255
cimport cpython.buffer as pybuf
-from cpython.ref cimport Py_INCREF
-from cpython.mem cimport PyObject_Malloc, PyObject_Free
-from cpython.object cimport PyObject, PyTypeObject
+from cpython.ref cimport Py_INCREF
+from cpython.mem cimport PyObject_Malloc, PyObject_Free
+from cpython.object cimport PyObject, PyTypeObject
from cpython.type cimport type
cimport libc.stdio as stdio
@@ -52,8 +52,8 @@ cdef extern from "numpy/arrayobject.h":
NPY_STRING
NPY_UNICODE
NPY_VOID
- NPY_DATETIME
- NPY_TIMEDELTA
+ NPY_DATETIME
+ NPY_TIMEDELTA
NPY_NTYPES
NPY_NOTYPE
@@ -90,15 +90,15 @@ cdef extern from "numpy/arrayobject.h":
NPY_ANYORDER
NPY_CORDER
NPY_FORTRANORDER
- NPY_KEEPORDER
-
- ctypedef enum NPY_CASTING:
- NPY_NO_CASTING
- NPY_EQUIV_CASTING
- NPY_SAFE_CASTING
- NPY_SAME_KIND_CASTING
- NPY_UNSAFE_CASTING
-
+ NPY_KEEPORDER
+
+ ctypedef enum NPY_CASTING:
+ NPY_NO_CASTING
+ NPY_EQUIV_CASTING
+ NPY_SAFE_CASTING
+ NPY_SAME_KIND_CASTING
+ NPY_UNSAFE_CASTING
+
ctypedef enum NPY_CLIPMODE:
NPY_CLIP
NPY_WRAP
@@ -123,7 +123,7 @@ cdef extern from "numpy/arrayobject.h":
NPY_SEARCHRIGHT
enum:
- # DEPRECATED since NumPy 1.7 ! Do not use in new code!
+ # DEPRECATED since NumPy 1.7 ! Do not use in new code!
NPY_C_CONTIGUOUS
NPY_F_CONTIGUOUS
NPY_CONTIGUOUS
@@ -156,37 +156,37 @@ cdef extern from "numpy/arrayobject.h":
NPY_UPDATE_ALL
- enum:
- # Added in NumPy 1.7 to replace the deprecated enums above.
- NPY_ARRAY_C_CONTIGUOUS
- NPY_ARRAY_F_CONTIGUOUS
- NPY_ARRAY_OWNDATA
- NPY_ARRAY_FORCECAST
- NPY_ARRAY_ENSURECOPY
- NPY_ARRAY_ENSUREARRAY
- NPY_ARRAY_ELEMENTSTRIDES
- NPY_ARRAY_ALIGNED
- NPY_ARRAY_NOTSWAPPED
- NPY_ARRAY_WRITEABLE
- NPY_ARRAY_UPDATEIFCOPY
-
- NPY_ARRAY_BEHAVED
- NPY_ARRAY_BEHAVED_NS
- NPY_ARRAY_CARRAY
- NPY_ARRAY_CARRAY_RO
- NPY_ARRAY_FARRAY
- NPY_ARRAY_FARRAY_RO
- NPY_ARRAY_DEFAULT
-
- NPY_ARRAY_IN_ARRAY
- NPY_ARRAY_OUT_ARRAY
- NPY_ARRAY_INOUT_ARRAY
- NPY_ARRAY_IN_FARRAY
- NPY_ARRAY_OUT_FARRAY
- NPY_ARRAY_INOUT_FARRAY
-
- NPY_ARRAY_UPDATE_ALL
-
+ enum:
+ # Added in NumPy 1.7 to replace the deprecated enums above.
+ NPY_ARRAY_C_CONTIGUOUS
+ NPY_ARRAY_F_CONTIGUOUS
+ NPY_ARRAY_OWNDATA
+ NPY_ARRAY_FORCECAST
+ NPY_ARRAY_ENSURECOPY
+ NPY_ARRAY_ENSUREARRAY
+ NPY_ARRAY_ELEMENTSTRIDES
+ NPY_ARRAY_ALIGNED
+ NPY_ARRAY_NOTSWAPPED
+ NPY_ARRAY_WRITEABLE
+ NPY_ARRAY_UPDATEIFCOPY
+
+ NPY_ARRAY_BEHAVED
+ NPY_ARRAY_BEHAVED_NS
+ NPY_ARRAY_CARRAY
+ NPY_ARRAY_CARRAY_RO
+ NPY_ARRAY_FARRAY
+ NPY_ARRAY_FARRAY_RO
+ NPY_ARRAY_DEFAULT
+
+ NPY_ARRAY_IN_ARRAY
+ NPY_ARRAY_OUT_ARRAY
+ NPY_ARRAY_INOUT_ARRAY
+ NPY_ARRAY_IN_FARRAY
+ NPY_ARRAY_OUT_FARRAY
+ NPY_ARRAY_INOUT_FARRAY
+
+ NPY_ARRAY_UPDATE_ALL
+
cdef enum:
NPY_MAXDIMS
@@ -194,37 +194,37 @@ cdef extern from "numpy/arrayobject.h":
ctypedef void (*PyArray_VectorUnaryFunc)(void *, void *, npy_intp, void *, void *)
- ctypedef struct PyArray_ArrayDescr:
- # shape is a tuple, but Cython doesn't support "tuple shape"
- # inside a non-PyObject declaration, so we have to declare it
- # as just a PyObject*.
- PyObject* shape
-
- ctypedef struct PyArray_Descr:
- pass
-
- ctypedef class numpy.dtype [object PyArray_Descr, check_size ignore]:
+ ctypedef struct PyArray_ArrayDescr:
+ # shape is a tuple, but Cython doesn't support "tuple shape"
+ # inside a non-PyObject declaration, so we have to declare it
+ # as just a PyObject*.
+ PyObject* shape
+
+ ctypedef struct PyArray_Descr:
+ pass
+
+ ctypedef class numpy.dtype [object PyArray_Descr, check_size ignore]:
# Use PyDataType_* macros when possible, however there are no macros
- # for accessing some of the fields, so some are defined.
- cdef PyTypeObject* typeobj
- cdef char kind
- cdef char type
- # Numpy sometimes mutates this without warning (e.g. it'll
- # sometimes change "|" to "<" in shared dtype objects on
- # little-endian machines). If this matters to you, use
- # PyArray_IsNativeByteOrder(dtype.byteorder) instead of
- # directly accessing this field.
- cdef char byteorder
- cdef char flags
+ # for accessing some of the fields, so some are defined.
+ cdef PyTypeObject* typeobj
+ cdef char kind
+ cdef char type
+ # Numpy sometimes mutates this without warning (e.g. it'll
+ # sometimes change "|" to "<" in shared dtype objects on
+ # little-endian machines). If this matters to you, use
+ # PyArray_IsNativeByteOrder(dtype.byteorder) instead of
+ # directly accessing this field.
+ cdef char byteorder
+ cdef char flags
cdef int type_num
cdef int itemsize "elsize"
- cdef int alignment
- cdef dict fields
+ cdef int alignment
+ cdef dict fields
cdef tuple names
- # Use PyDataType_HASSUBARRAY to test whether this field is
- # valid (the pointer can be NULL). Most users should access
- # this field via the inline helper method PyDataType_SHAPE.
- cdef PyArray_ArrayDescr* subarray
+ # Use PyDataType_HASSUBARRAY to test whether this field is
+ # valid (the pointer can be NULL). Most users should access
+ # this field via the inline helper method PyDataType_SHAPE.
+ cdef PyArray_ArrayDescr* subarray
ctypedef extern class numpy.flatiter [object PyArrayIterObject]:
# Use through macros
@@ -239,7 +239,7 @@ cdef extern from "numpy/arrayobject.h":
# like PyArrayObject**.
pass
- ctypedef class numpy.ndarray [object PyArrayObject, check_size ignore]:
+ ctypedef class numpy.ndarray [object PyArrayObject, check_size ignore]:
cdef __cythonbufferdefaults__ = {"mode": "strided"}
cdef:
@@ -249,7 +249,7 @@ cdef extern from "numpy/arrayobject.h":
int ndim "nd"
npy_intp *shape "dimensions"
npy_intp *strides
- dtype descr # deprecated since NumPy 1.7 !
+ dtype descr # deprecated since NumPy 1.7 !
PyObject* base
# Note: This syntax (function definition in pxd files) is an
@@ -257,30 +257,30 @@ cdef extern from "numpy/arrayobject.h":
# -- the details of this may change.
def __getbuffer__(ndarray self, Py_buffer* info, int flags):
# This implementation of getbuffer is geared towards Cython
- # requirements, and does not yet fulfill the PEP.
+ # requirements, and does not yet fulfill the PEP.
# In particular strided access is always provided regardless
# of flags
- cdef int i, ndim
+ cdef int i, ndim
cdef int endian_detector = 1
cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
ndim = PyArray_NDIM(self)
if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
- and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)):
+ and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)):
raise ValueError(u"ndarray is not C contiguous")
if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
- and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)):
+ and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)):
raise ValueError(u"ndarray is not Fortran contiguous")
info.buf = PyArray_DATA(self)
info.ndim = ndim
- if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ if sizeof(npy_intp) != sizeof(Py_ssize_t):
# Allocate new buffer for strides and shape info.
# This is allocated as one block, strides first.
- info.strides = <Py_ssize_t*>PyObject_Malloc(sizeof(Py_ssize_t) * 2 * <size_t>ndim)
+ info.strides = <Py_ssize_t*>PyObject_Malloc(sizeof(Py_ssize_t) * 2 * <size_t>ndim)
info.shape = info.strides + ndim
for i in range(ndim):
info.strides[i] = PyArray_STRIDES(self)[i]
@@ -294,12 +294,12 @@ cdef extern from "numpy/arrayobject.h":
cdef int t
cdef char* f = NULL
- cdef dtype descr = <dtype>PyArray_DESCR(self)
+ cdef dtype descr = <dtype>PyArray_DESCR(self)
cdef int offset
- info.obj = self
+ info.obj = self
- if not PyDataType_HASFIELDS(descr):
+ if not PyDataType_HASFIELDS(descr):
t = descr.type_num
if ((descr.byteorder == c'>' and little_endian) or
(descr.byteorder == c'<' and not little_endian)):
@@ -326,7 +326,7 @@ cdef extern from "numpy/arrayobject.h":
info.format = f
return
else:
- info.format = <char*>PyObject_Malloc(_buffer_format_string_len)
+ info.format = <char*>PyObject_Malloc(_buffer_format_string_len)
info.format[0] = c'^' # Native data types, manual alignment
offset = 0
f = _util_dtypestring(descr, info.format + 1,
@@ -336,13 +336,13 @@ cdef extern from "numpy/arrayobject.h":
def __releasebuffer__(ndarray self, Py_buffer* info):
if PyArray_HASFIELDS(self):
- PyObject_Free(info.format)
+ PyObject_Free(info.format)
if sizeof(npy_intp) != sizeof(Py_ssize_t):
- PyObject_Free(info.strides)
+ PyObject_Free(info.strides)
# info.shape was stored after info.strides in the same block
- ctypedef unsigned char npy_bool
+ ctypedef unsigned char npy_bool
ctypedef signed char npy_byte
ctypedef signed short npy_short
@@ -389,41 +389,41 @@ cdef extern from "numpy/arrayobject.h":
double imag
ctypedef struct npy_clongdouble:
- long double real
- long double imag
+ long double real
+ long double imag
ctypedef struct npy_complex64:
- float real
- float imag
+ float real
+ float imag
ctypedef struct npy_complex128:
double real
double imag
ctypedef struct npy_complex160:
- long double real
- long double imag
+ long double real
+ long double imag
ctypedef struct npy_complex192:
- long double real
- long double imag
+ long double real
+ long double imag
ctypedef struct npy_complex256:
- long double real
- long double imag
+ long double real
+ long double imag
ctypedef struct PyArray_Dims:
npy_intp *ptr
int len
- int _import_array() except -1
+ int _import_array() except -1
#
# Macros from ndarrayobject.h
#
bint PyArray_CHKFLAGS(ndarray m, int flags)
- bint PyArray_IS_C_CONTIGUOUS(ndarray arr)
- bint PyArray_IS_F_CONTIGUOUS(ndarray arr)
+ bint PyArray_IS_C_CONTIGUOUS(ndarray arr)
+ bint PyArray_IS_F_CONTIGUOUS(ndarray arr)
bint PyArray_ISCONTIGUOUS(ndarray m)
bint PyArray_ISWRITEABLE(ndarray m)
bint PyArray_ISALIGNED(ndarray m)
@@ -440,8 +440,8 @@ cdef extern from "numpy/arrayobject.h":
npy_intp PyArray_DIM(ndarray, size_t)
npy_intp PyArray_STRIDE(ndarray, size_t)
- PyObject *PyArray_BASE(ndarray) # returns borrowed reference!
- PyArray_Descr *PyArray_DESCR(ndarray) # returns borrowed reference to dtype!
+ PyObject *PyArray_BASE(ndarray) # returns borrowed reference!
+ PyArray_Descr *PyArray_DESCR(ndarray) # returns borrowed reference to dtype!
int PyArray_FLAGS(ndarray)
npy_intp PyArray_ITEMSIZE(ndarray)
int PyArray_TYPE(ndarray arr)
@@ -477,7 +477,7 @@ cdef extern from "numpy/arrayobject.h":
bint PyDataType_ISEXTENDED(dtype)
bint PyDataType_ISOBJECT(dtype)
bint PyDataType_HASFIELDS(dtype)
- bint PyDataType_HASSUBARRAY(dtype)
+ bint PyDataType_HASSUBARRAY(dtype)
bint PyArray_ISBOOL(ndarray)
bint PyArray_ISUNSIGNED(ndarray)
@@ -497,8 +497,8 @@ cdef extern from "numpy/arrayobject.h":
bint PyArray_ISVARIABLE(ndarray)
bint PyArray_SAFEALIGNEDCOPY(ndarray)
- bint PyArray_ISNBO(char) # works on ndarray.byteorder
- bint PyArray_IsNativeByteOrder(char) # works on ndarray.byteorder
+ bint PyArray_ISNBO(char) # works on ndarray.byteorder
+ bint PyArray_IsNativeByteOrder(char) # works on ndarray.byteorder
bint PyArray_ISNOTSWAPPED(ndarray)
bint PyArray_ISBYTESWAPPED(ndarray)
@@ -540,8 +540,8 @@ cdef extern from "numpy/arrayobject.h":
object PyArray_FROM_O(object)
object PyArray_FROM_OF(object m, int flags)
- object PyArray_FROM_OT(object m, int type)
- object PyArray_FROM_OTF(object m, int type, int flags)
+ object PyArray_FROM_OT(object m, int type)
+ object PyArray_FROM_OTF(object m, int type, int flags)
object PyArray_FROMANY(object m, int type, int min, int max, int flags)
object PyArray_ZEROS(int nd, npy_intp* dims, int type, int fortran)
object PyArray_EMPTY(int nd, npy_intp* dims, int type, int fortran)
@@ -764,7 +764,7 @@ cdef extern from "numpy/arrayobject.h":
object PyArray_CheckAxis (ndarray, int *, int)
npy_intp PyArray_OverflowMultiplyList (npy_intp *, int)
int PyArray_CompareString (char *, char *, size_t)
- int PyArray_SetBaseObject(ndarray, base) # NOTE: steals a reference to base! Use "set_array_base()" instead.
+ int PyArray_SetBaseObject(ndarray, base) # NOTE: steals a reference to base! Use "set_array_base()" instead.
# Typedefs that matches the runtime dtype objects in
@@ -833,12 +833,12 @@ cdef inline object PyArray_MultiIterNew4(a, b, c, d):
cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
-cdef inline tuple PyDataType_SHAPE(dtype d):
- if PyDataType_HASSUBARRAY(d):
- return <tuple>d.subarray.shape
- else:
- return ()
-
+cdef inline tuple PyDataType_SHAPE(dtype d):
+ if PyDataType_HASSUBARRAY(d):
+ return <tuple>d.subarray.shape
+ else:
+ return ()
+
cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
# Recursive utility function used in __getbuffer__ to get format
# string. The new location in the format string is returned.
@@ -852,7 +852,7 @@ cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset
fields = descr.fields[childname]
child, new_offset = fields
- if (end - f) - <int>(new_offset - offset[0]) < 15:
+ if (end - f) - <int>(new_offset - offset[0]) < 15:
raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
if ((child.byteorder == c'>' and little_endian) or
@@ -1017,34 +1017,34 @@ cdef extern from "numpy/ufuncobject.h":
(PyUFuncGenericFunction *, void **, char *, int, int, int,
int, char *, char *, int, char *)
- int _import_umath() except -1
+ int _import_umath() except -1
cdef inline void set_array_base(ndarray arr, object base):
- Py_INCREF(base) # important to do this before stealing the reference below!
- PyArray_SetBaseObject(arr, base)
+ Py_INCREF(base) # important to do this before stealing the reference below!
+ PyArray_SetBaseObject(arr, base)
cdef inline object get_array_base(ndarray arr):
- base = PyArray_BASE(arr)
- if base is NULL:
+ base = PyArray_BASE(arr)
+ if base is NULL:
return None
- return <object>base
-
-# Versions of the import_* functions which are more suitable for
-# Cython code.
-cdef inline int import_array() except -1:
- try:
- _import_array()
- except Exception:
- raise ImportError("numpy.core.multiarray failed to import")
-
-cdef inline int import_umath() except -1:
- try:
- _import_umath()
- except Exception:
- raise ImportError("numpy.core.umath failed to import")
-
-cdef inline int import_ufunc() except -1:
- try:
- _import_umath()
- except Exception:
- raise ImportError("numpy.core.umath failed to import")
+ return <object>base
+
+# Versions of the import_* functions which are more suitable for
+# Cython code.
+cdef inline int import_array() except -1:
+ try:
+ _import_array()
+ except Exception:
+ raise ImportError("numpy.core.multiarray failed to import")
+
+cdef inline int import_umath() except -1:
+ try:
+ _import_umath()
+ except Exception:
+ raise ImportError("numpy.core.umath failed to import")
+
+cdef inline int import_ufunc() except -1:
+ try:
+ _import_umath()
+ except Exception:
+ raise ImportError("numpy.core.umath failed to import")
diff --git a/contrib/tools/cython/Cython/Includes/numpy/__init__.pxd b/contrib/tools/cython/Cython/Includes/numpy/__init__.pxd
index 15700c05ef..fa8c763de2 100644
--- a/contrib/tools/cython/Cython/Includes/numpy/__init__.pxd
+++ b/contrib/tools/cython/Cython/Includes/numpy/__init__.pxd
@@ -3,7 +3,7 @@
# If any of the PyArray_* functions are called, import_array must be
# called first.
#
-# This also defines backwards-compatibility buffer acquisition
+# This also defines backwards-compatibility buffer acquisition
# code for use in Python 2.x (or Python <= 2.5 when NumPy starts
# implementing PEP-3118 directly).
#
@@ -17,9 +17,9 @@
DEF _buffer_format_string_len = 255
cimport cpython.buffer as pybuf
-from cpython.ref cimport Py_INCREF
+from cpython.ref cimport Py_INCREF
from cpython.mem cimport PyObject_Malloc, PyObject_Free
-from cpython.object cimport PyObject, PyTypeObject
+from cpython.object cimport PyObject, PyTypeObject
from cpython.type cimport type
cimport libc.stdio as stdio
@@ -92,13 +92,13 @@ cdef extern from "numpy/arrayobject.h":
NPY_FORTRANORDER
NPY_KEEPORDER
- ctypedef enum NPY_CASTING:
- NPY_NO_CASTING
- NPY_EQUIV_CASTING
- NPY_SAFE_CASTING
- NPY_SAME_KIND_CASTING
- NPY_UNSAFE_CASTING
-
+ ctypedef enum NPY_CASTING:
+ NPY_NO_CASTING
+ NPY_EQUIV_CASTING
+ NPY_SAFE_CASTING
+ NPY_SAME_KIND_CASTING
+ NPY_UNSAFE_CASTING
+
ctypedef enum NPY_CLIPMODE:
NPY_CLIP
NPY_WRAP
@@ -123,7 +123,7 @@ cdef extern from "numpy/arrayobject.h":
NPY_SEARCHRIGHT
enum:
- # DEPRECATED since NumPy 1.7 ! Do not use in new code!
+ # DEPRECATED since NumPy 1.7 ! Do not use in new code!
NPY_C_CONTIGUOUS
NPY_F_CONTIGUOUS
NPY_CONTIGUOUS
@@ -156,37 +156,37 @@ cdef extern from "numpy/arrayobject.h":
NPY_UPDATE_ALL
- enum:
- # Added in NumPy 1.7 to replace the deprecated enums above.
- NPY_ARRAY_C_CONTIGUOUS
- NPY_ARRAY_F_CONTIGUOUS
- NPY_ARRAY_OWNDATA
- NPY_ARRAY_FORCECAST
- NPY_ARRAY_ENSURECOPY
- NPY_ARRAY_ENSUREARRAY
- NPY_ARRAY_ELEMENTSTRIDES
- NPY_ARRAY_ALIGNED
- NPY_ARRAY_NOTSWAPPED
- NPY_ARRAY_WRITEABLE
- NPY_ARRAY_UPDATEIFCOPY
-
- NPY_ARRAY_BEHAVED
- NPY_ARRAY_BEHAVED_NS
- NPY_ARRAY_CARRAY
- NPY_ARRAY_CARRAY_RO
- NPY_ARRAY_FARRAY
- NPY_ARRAY_FARRAY_RO
- NPY_ARRAY_DEFAULT
-
- NPY_ARRAY_IN_ARRAY
- NPY_ARRAY_OUT_ARRAY
- NPY_ARRAY_INOUT_ARRAY
- NPY_ARRAY_IN_FARRAY
- NPY_ARRAY_OUT_FARRAY
- NPY_ARRAY_INOUT_FARRAY
-
- NPY_ARRAY_UPDATE_ALL
-
+ enum:
+ # Added in NumPy 1.7 to replace the deprecated enums above.
+ NPY_ARRAY_C_CONTIGUOUS
+ NPY_ARRAY_F_CONTIGUOUS
+ NPY_ARRAY_OWNDATA
+ NPY_ARRAY_FORCECAST
+ NPY_ARRAY_ENSURECOPY
+ NPY_ARRAY_ENSUREARRAY
+ NPY_ARRAY_ELEMENTSTRIDES
+ NPY_ARRAY_ALIGNED
+ NPY_ARRAY_NOTSWAPPED
+ NPY_ARRAY_WRITEABLE
+ NPY_ARRAY_UPDATEIFCOPY
+
+ NPY_ARRAY_BEHAVED
+ NPY_ARRAY_BEHAVED_NS
+ NPY_ARRAY_CARRAY
+ NPY_ARRAY_CARRAY_RO
+ NPY_ARRAY_FARRAY
+ NPY_ARRAY_FARRAY_RO
+ NPY_ARRAY_DEFAULT
+
+ NPY_ARRAY_IN_ARRAY
+ NPY_ARRAY_OUT_ARRAY
+ NPY_ARRAY_INOUT_ARRAY
+ NPY_ARRAY_IN_FARRAY
+ NPY_ARRAY_OUT_FARRAY
+ NPY_ARRAY_INOUT_FARRAY
+
+ NPY_ARRAY_UPDATE_ALL
+
cdef enum:
NPY_MAXDIMS
@@ -200,26 +200,26 @@ cdef extern from "numpy/arrayobject.h":
# as just a PyObject*.
PyObject* shape
- ctypedef struct PyArray_Descr:
- pass
-
- ctypedef class numpy.dtype [object PyArray_Descr, check_size ignore]:
+ ctypedef struct PyArray_Descr:
+ pass
+
+ ctypedef class numpy.dtype [object PyArray_Descr, check_size ignore]:
# Use PyDataType_* macros when possible, however there are no macros
- # for accessing some of the fields, so some are defined.
- cdef PyTypeObject* typeobj
- cdef char kind
- cdef char type
+ # for accessing some of the fields, so some are defined.
+ cdef PyTypeObject* typeobj
+ cdef char kind
+ cdef char type
# Numpy sometimes mutates this without warning (e.g. it'll
# sometimes change "|" to "<" in shared dtype objects on
# little-endian machines). If this matters to you, use
# PyArray_IsNativeByteOrder(dtype.byteorder) instead of
# directly accessing this field.
- cdef char byteorder
- cdef char flags
+ cdef char byteorder
+ cdef char flags
cdef int type_num
cdef int itemsize "elsize"
- cdef int alignment
- cdef dict fields
+ cdef int alignment
+ cdef dict fields
cdef tuple names
# Use PyDataType_HASSUBARRAY to test whether this field is
# valid (the pointer can be NULL). Most users should access
@@ -239,7 +239,7 @@ cdef extern from "numpy/arrayobject.h":
# like PyArrayObject**.
pass
- ctypedef class numpy.ndarray [object PyArrayObject, check_size ignore]:
+ ctypedef class numpy.ndarray [object PyArrayObject, check_size ignore]:
cdef __cythonbufferdefaults__ = {"mode": "strided"}
cdef:
@@ -249,7 +249,7 @@ cdef extern from "numpy/arrayobject.h":
int ndim "nd"
npy_intp *shape "dimensions"
npy_intp *strides
- dtype descr # deprecated since NumPy 1.7 !
+ dtype descr # deprecated since NumPy 1.7 !
PyObject* base
# Note: This syntax (function definition in pxd files) is an
@@ -268,11 +268,11 @@ cdef extern from "numpy/arrayobject.h":
ndim = PyArray_NDIM(self)
if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
- and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)):
+ and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)):
raise ValueError(u"ndarray is not C contiguous")
if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
- and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)):
+ and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)):
raise ValueError(u"ndarray is not Fortran contiguous")
info.buf = PyArray_DATA(self)
@@ -294,7 +294,7 @@ cdef extern from "numpy/arrayobject.h":
cdef int t
cdef char* f = NULL
- cdef dtype descr = <dtype>PyArray_DESCR(self)
+ cdef dtype descr = <dtype>PyArray_DESCR(self)
cdef int offset
info.obj = self
@@ -415,14 +415,14 @@ cdef extern from "numpy/arrayobject.h":
npy_intp *ptr
int len
- int _import_array() except -1
+ int _import_array() except -1
#
# Macros from ndarrayobject.h
#
bint PyArray_CHKFLAGS(ndarray m, int flags)
- bint PyArray_IS_C_CONTIGUOUS(ndarray arr)
- bint PyArray_IS_F_CONTIGUOUS(ndarray arr)
+ bint PyArray_IS_C_CONTIGUOUS(ndarray arr)
+ bint PyArray_IS_F_CONTIGUOUS(ndarray arr)
bint PyArray_ISCONTIGUOUS(ndarray m)
bint PyArray_ISWRITEABLE(ndarray m)
bint PyArray_ISALIGNED(ndarray m)
@@ -439,8 +439,8 @@ cdef extern from "numpy/arrayobject.h":
npy_intp PyArray_DIM(ndarray, size_t)
npy_intp PyArray_STRIDE(ndarray, size_t)
- PyObject *PyArray_BASE(ndarray) # returns borrowed reference!
- PyArray_Descr *PyArray_DESCR(ndarray) # returns borrowed reference to dtype!
+ PyObject *PyArray_BASE(ndarray) # returns borrowed reference!
+ PyArray_Descr *PyArray_DESCR(ndarray) # returns borrowed reference to dtype!
int PyArray_FLAGS(ndarray)
npy_intp PyArray_ITEMSIZE(ndarray)
int PyArray_TYPE(ndarray arr)
@@ -763,7 +763,7 @@ cdef extern from "numpy/arrayobject.h":
object PyArray_CheckAxis (ndarray, int *, int)
npy_intp PyArray_OverflowMultiplyList (npy_intp *, int)
int PyArray_CompareString (char *, char *, size_t)
- int PyArray_SetBaseObject(ndarray, base) # NOTE: steals a reference to base! Use "set_array_base()" instead.
+ int PyArray_SetBaseObject(ndarray, base) # NOTE: steals a reference to base! Use "set_array_base()" instead.
# Typedefs that matches the runtime dtype objects in
@@ -1016,34 +1016,34 @@ cdef extern from "numpy/ufuncobject.h":
(PyUFuncGenericFunction *, void **, char *, int, int, int,
int, char *, char *, int, char *)
- int _import_umath() except -1
+ int _import_umath() except -1
cdef inline void set_array_base(ndarray arr, object base):
- Py_INCREF(base) # important to do this before stealing the reference below!
- PyArray_SetBaseObject(arr, base)
+ Py_INCREF(base) # important to do this before stealing the reference below!
+ PyArray_SetBaseObject(arr, base)
cdef inline object get_array_base(ndarray arr):
- base = PyArray_BASE(arr)
- if base is NULL:
+ base = PyArray_BASE(arr)
+ if base is NULL:
return None
- return <object>base
-
-# Versions of the import_* functions which are more suitable for
-# Cython code.
-cdef inline int import_array() except -1:
- try:
- _import_array()
- except Exception:
- raise ImportError("numpy.core.multiarray failed to import")
-
-cdef inline int import_umath() except -1:
- try:
- _import_umath()
- except Exception:
- raise ImportError("numpy.core.umath failed to import")
-
-cdef inline int import_ufunc() except -1:
- try:
- _import_umath()
- except Exception:
- raise ImportError("numpy.core.umath failed to import")
+ return <object>base
+
+# Versions of the import_* functions which are more suitable for
+# Cython code.
+cdef inline int import_array() except -1:
+ try:
+ _import_array()
+ except Exception:
+ raise ImportError("numpy.core.multiarray failed to import")
+
+cdef inline int import_umath() except -1:
+ try:
+ _import_umath()
+ except Exception:
+ raise ImportError("numpy.core.umath failed to import")
+
+cdef inline int import_ufunc() except -1:
+ try:
+ _import_umath()
+ except Exception:
+ raise ImportError("numpy.core.umath failed to import")
diff --git a/contrib/tools/cython/Cython/Includes/numpy/math.pxd b/contrib/tools/cython/Cython/Includes/numpy/math.pxd
index c16df1c51a..20cbe9f5f9 100644
--- a/contrib/tools/cython/Cython/Includes/numpy/math.pxd
+++ b/contrib/tools/cython/Cython/Includes/numpy/math.pxd
@@ -25,7 +25,7 @@ cdef extern from "numpy/npy_math.h" nogil:
long double NZERO "NPY_NZERO" # negative zero
# These four are actually macros and work on any floating-point type.
- int isinf "npy_isinf"(long double) # -1 / 0 / 1
+ int isinf "npy_isinf"(long double) # -1 / 0 / 1
bint isfinite "npy_isfinite"(long double)
bint isnan "npy_isnan"(long double)
bint signbit "npy_signbit"(long double)
@@ -79,11 +79,11 @@ cdef extern from "numpy/npy_math.h" nogil:
float log1pf "npy_log1pf"(float x)
float exp2f "npy_exp2f"(float x)
float log2f "npy_log2f"(float x)
- float atan2f "npy_atan2f"(float x, float y)
- float hypotf "npy_hypotf"(float x, float y)
- float powf "npy_powf"(float x, float y)
- float fmodf "npy_fmodf"(float x, float y)
- float modff "npy_modff"(float x, float* y)
+ float atan2f "npy_atan2f"(float x, float y)
+ float hypotf "npy_hypotf"(float x, float y)
+ float powf "npy_powf"(float x, float y)
+ float fmodf "npy_fmodf"(float x, float y)
+ float modff "npy_modff"(float x, float* y)
# Long double C99 functions
long double sinl "npy_sinl"(long double x)
@@ -110,24 +110,24 @@ cdef extern from "numpy/npy_math.h" nogil:
long double log1pl "npy_log1pl"(long double x)
long double exp2l "npy_exp2l"(long double x)
long double log2l "npy_log2l"(long double x)
- long double atan2l "npy_atan2l"(long double x, long double y)
- long double hypotl "npy_hypotl"(long double x, long double y)
- long double powl "npy_powl"(long double x, long double y)
- long double fmodl "npy_fmodl"(long double x, long double y)
- long double modfl "npy_modfl"(long double x, long double* y)
+ long double atan2l "npy_atan2l"(long double x, long double y)
+ long double hypotl "npy_hypotl"(long double x, long double y)
+ long double powl "npy_powl"(long double x, long double y)
+ long double fmodl "npy_fmodl"(long double x, long double y)
+ long double modfl "npy_modfl"(long double x, long double* y)
# NumPy extensions
float deg2radf "npy_deg2radf"(float x)
float rad2degf "npy_rad2degf"(float x)
- float logaddexpf "npy_logaddexpf"(float x, float y)
- float logaddexp2f "npy_logaddexp2f"(float x, float y)
+ float logaddexpf "npy_logaddexpf"(float x, float y)
+ float logaddexp2f "npy_logaddexp2f"(float x, float y)
double deg2rad "npy_deg2rad"(double x)
double rad2deg "npy_rad2deg"(double x)
- double logaddexp "npy_logaddexp"(double x, double y)
- double logaddexp2 "npy_logaddexp2"(double x, double y)
+ double logaddexp "npy_logaddexp"(double x, double y)
+ double logaddexp2 "npy_logaddexp2"(double x, double y)
long double deg2radl "npy_deg2radl"(long double x)
long double rad2degl "npy_rad2degl"(long double x)
- long double logaddexpl "npy_logaddexpl"(long double x, long double y)
- long double logaddexp2l "npy_logaddexp2l"(long double x, long double y)
+ long double logaddexpl "npy_logaddexpl"(long double x, long double y)
+ long double logaddexp2l "npy_logaddexp2l"(long double x, long double y)
diff --git a/contrib/tools/cython/Cython/Includes/openmp.pxd b/contrib/tools/cython/Cython/Includes/openmp.pxd
index 30873a588b..767dcf6efd 100644
--- a/contrib/tools/cython/Cython/Includes/openmp.pxd
+++ b/contrib/tools/cython/Cython/Includes/openmp.pxd
@@ -1,4 +1,4 @@
-cdef extern from "<omp.h>":
+cdef extern from "<omp.h>":
ctypedef struct omp_lock_t:
pass
ctypedef struct omp_nest_lock_t:
diff --git a/contrib/tools/cython/Cython/Includes/posix/dlfcn.pxd b/contrib/tools/cython/Cython/Includes/posix/dlfcn.pxd
index cff5bea15a..cc0b6ab93a 100644
--- a/contrib/tools/cython/Cython/Includes/posix/dlfcn.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/dlfcn.pxd
@@ -1,14 +1,14 @@
-# POSIX dynamic linking/loading interface.
-# http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dlfcn.h.html
-
-cdef extern from "<dlfcn.h>" nogil:
- void *dlopen(const char *, int)
- char *dlerror()
- void *dlsym(void *, const char *)
- int dlclose(void *)
-
- enum:
- RTLD_LAZY
- RTLD_NOW
- RTLD_GLOBAL
- RTLD_LOCAL
+# POSIX dynamic linking/loading interface.
+# http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dlfcn.h.html
+
+cdef extern from "<dlfcn.h>" nogil:
+ void *dlopen(const char *, int)
+ char *dlerror()
+ void *dlsym(void *, const char *)
+ int dlclose(void *)
+
+ enum:
+ RTLD_LAZY
+ RTLD_NOW
+ RTLD_GLOBAL
+ RTLD_LOCAL
diff --git a/contrib/tools/cython/Cython/Includes/posix/fcntl.pxd b/contrib/tools/cython/Cython/Includes/posix/fcntl.pxd
index 9afc33a368..889b2d9b96 100644
--- a/contrib/tools/cython/Cython/Includes/posix/fcntl.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/fcntl.pxd
@@ -1,6 +1,6 @@
# http://www.opengroup.org/onlinepubs/009695399/basedefs/fcntl.h.html
-cdef extern from "<fcntl.h>" nogil:
+cdef extern from "<fcntl.h>" nogil:
enum: F_DUPFD
enum: F_GETFD
diff --git a/contrib/tools/cython/Cython/Includes/posix/ioctl.pxd b/contrib/tools/cython/Cython/Includes/posix/ioctl.pxd
index dacbc307f3..b9e8814b8f 100644
--- a/contrib/tools/cython/Cython/Includes/posix/ioctl.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/ioctl.pxd
@@ -1,4 +1,4 @@
-cdef extern from "<sys/ioctl.h>" nogil:
+cdef extern from "<sys/ioctl.h>" nogil:
enum: FIONBIO
int ioctl(int fd, int request, ...)
diff --git a/contrib/tools/cython/Cython/Includes/posix/mman.pxd b/contrib/tools/cython/Cython/Includes/posix/mman.pxd
index c810f431b3..483547621a 100644
--- a/contrib/tools/cython/Cython/Includes/posix/mman.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/mman.pxd
@@ -1,99 +1,99 @@
-# http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/mman.h.html
-
-from posix.types cimport off_t, mode_t
-
-cdef extern from "<sys/mman.h>" nogil:
- enum: PROT_EXEC # protection bits for mmap/mprotect
- enum: PROT_READ
- enum: PROT_WRITE
- enum: PROT_NONE
-
- enum: MAP_PRIVATE # flag bits for mmap
- enum: MAP_SHARED
- enum: MAP_FIXED
- enum: MAP_ANON # These three are not in POSIX, but are
- enum: MAP_ANONYMOUS # fairly common in spelling/semantics
- enum: MAP_STACK
-
- enum: MAP_LOCKED # Typically available only on Linux
- enum: MAP_HUGETLB
- enum: MAP_POPULATE
- enum: MAP_NORESERVE
- enum: MAP_GROWSDOWN
-
- enum: MAP_NOCORE # Typically available only on BSD
- enum: MAP_NOSYNC
-
- void *MAP_FAILED
-
- void *mmap(void *addr, size_t Len, int prot, int flags, int fd, off_t off)
- int munmap(void *addr, size_t Len)
- int mprotect(void *addr, size_t Len, int prot)
-
- enum: MS_ASYNC
- enum: MS_SYNC
- enum: MS_INVALIDATE
- int msync(void *addr, size_t Len, int flags)
-
- enum: POSIX_MADV_NORMAL # POSIX advice flags
- enum: POSIX_MADV_SEQUENTIAL
- enum: POSIX_MADV_RANDOM
- enum: POSIX_MADV_WILLNEED
- enum: POSIX_MADV_DONTNEED
- int posix_madvise(void *addr, size_t Len, int advice)
-
- enum: MCL_CURRENT
- enum: MCL_FUTURE
- int mlock(const void *addr, size_t Len)
- int munlock(const void *addr, size_t Len)
- int mlockall(int flags)
- int munlockall()
- # Linux-specific
- enum: MLOCK_ONFAULT
- enum: MCL_ONFAULT
- int mlock2(const void *addr, size_t len, int flags)
-
- int shm_open(const char *name, int oflag, mode_t mode)
- int shm_unlink(const char *name)
-
- # often available
- enum: MADV_NORMAL # pre-POSIX advice flags; should translate 1-1 to POSIX_*
- enum: MADV_RANDOM # but in practice it is not always the same.
- enum: MADV_SEQUENTIAL
- enum: MADV_WILLNEED
- enum: MADV_DONTNEED
- enum: MADV_REMOVE # other pre-POSIX advice flags; often available
- enum: MADV_DONTFORK
- enum: MADV_DOFORK
- enum: MADV_HWPOISON
- enum: MADV_MERGEABLE,
- enum: MADV_UNMERGEABLE
- enum: MADV_SOFT_OFFLINE
- enum: MADV_HUGEPAGE
- enum: MADV_NOHUGEPAGE
- enum: MADV_DONTDUMP
- enum: MADV_DODUMP
- enum: MADV_FREE
- enum: MADV_WIPEONFORK
- enum: MADV_KEEPONFORK
- int madvise(void *addr, size_t Len, int advice)
-
- # sometimes available
- int mincore(void *addr, size_t Len, unsigned char *vec)
-
- # These two are Linux specific but sometimes very efficient
- void *mremap(void *old_addr, size_t old_len, size_t new_len, int flags, ...)
- int remap_file_pages(void *addr, size_t Len, int prot,
- size_t pgoff, int flags)
-
- # The rare but standardized typed memory option
- enum: POSIX_TYPED_MEM_ALLOCATE
- enum: POSIX_TYPED_MEM_ALLOCATE_CONTIG
- enum: POSIX_TYPED_MEM_MAP_ALLOCATABLE
- int posix_typed_mem_open(const char *name, int oflag, int tflag)
- int posix_mem_offset(const void *addr, size_t Len, off_t *off,
- size_t *contig_len, int *fildes)
-
- cdef struct posix_typed_mem_info:
- size_t posix_tmi_length
- int posix_typed_mem_get_info(int fildes, posix_typed_mem_info *info)
+# http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/mman.h.html
+
+from posix.types cimport off_t, mode_t
+
+cdef extern from "<sys/mman.h>" nogil:
+ enum: PROT_EXEC # protection bits for mmap/mprotect
+ enum: PROT_READ
+ enum: PROT_WRITE
+ enum: PROT_NONE
+
+ enum: MAP_PRIVATE # flag bits for mmap
+ enum: MAP_SHARED
+ enum: MAP_FIXED
+ enum: MAP_ANON # These three are not in POSIX, but are
+ enum: MAP_ANONYMOUS # fairly common in spelling/semantics
+ enum: MAP_STACK
+
+ enum: MAP_LOCKED # Typically available only on Linux
+ enum: MAP_HUGETLB
+ enum: MAP_POPULATE
+ enum: MAP_NORESERVE
+ enum: MAP_GROWSDOWN
+
+ enum: MAP_NOCORE # Typically available only on BSD
+ enum: MAP_NOSYNC
+
+ void *MAP_FAILED
+
+ void *mmap(void *addr, size_t Len, int prot, int flags, int fd, off_t off)
+ int munmap(void *addr, size_t Len)
+ int mprotect(void *addr, size_t Len, int prot)
+
+ enum: MS_ASYNC
+ enum: MS_SYNC
+ enum: MS_INVALIDATE
+ int msync(void *addr, size_t Len, int flags)
+
+ enum: POSIX_MADV_NORMAL # POSIX advice flags
+ enum: POSIX_MADV_SEQUENTIAL
+ enum: POSIX_MADV_RANDOM
+ enum: POSIX_MADV_WILLNEED
+ enum: POSIX_MADV_DONTNEED
+ int posix_madvise(void *addr, size_t Len, int advice)
+
+ enum: MCL_CURRENT
+ enum: MCL_FUTURE
+ int mlock(const void *addr, size_t Len)
+ int munlock(const void *addr, size_t Len)
+ int mlockall(int flags)
+ int munlockall()
+ # Linux-specific
+ enum: MLOCK_ONFAULT
+ enum: MCL_ONFAULT
+ int mlock2(const void *addr, size_t len, int flags)
+
+ int shm_open(const char *name, int oflag, mode_t mode)
+ int shm_unlink(const char *name)
+
+ # often available
+ enum: MADV_NORMAL # pre-POSIX advice flags; should translate 1-1 to POSIX_*
+ enum: MADV_RANDOM # but in practice it is not always the same.
+ enum: MADV_SEQUENTIAL
+ enum: MADV_WILLNEED
+ enum: MADV_DONTNEED
+ enum: MADV_REMOVE # other pre-POSIX advice flags; often available
+ enum: MADV_DONTFORK
+ enum: MADV_DOFORK
+ enum: MADV_HWPOISON
+ enum: MADV_MERGEABLE,
+ enum: MADV_UNMERGEABLE
+ enum: MADV_SOFT_OFFLINE
+ enum: MADV_HUGEPAGE
+ enum: MADV_NOHUGEPAGE
+ enum: MADV_DONTDUMP
+ enum: MADV_DODUMP
+ enum: MADV_FREE
+ enum: MADV_WIPEONFORK
+ enum: MADV_KEEPONFORK
+ int madvise(void *addr, size_t Len, int advice)
+
+ # sometimes available
+ int mincore(void *addr, size_t Len, unsigned char *vec)
+
+ # These two are Linux specific but sometimes very efficient
+ void *mremap(void *old_addr, size_t old_len, size_t new_len, int flags, ...)
+ int remap_file_pages(void *addr, size_t Len, int prot,
+ size_t pgoff, int flags)
+
+ # The rare but standardized typed memory option
+ enum: POSIX_TYPED_MEM_ALLOCATE
+ enum: POSIX_TYPED_MEM_ALLOCATE_CONTIG
+ enum: POSIX_TYPED_MEM_MAP_ALLOCATABLE
+ int posix_typed_mem_open(const char *name, int oflag, int tflag)
+ int posix_mem_offset(const void *addr, size_t Len, off_t *off,
+ size_t *contig_len, int *fildes)
+
+ cdef struct posix_typed_mem_info:
+ size_t posix_tmi_length
+ int posix_typed_mem_get_info(int fildes, posix_typed_mem_info *info)
diff --git a/contrib/tools/cython/Cython/Includes/posix/resource.pxd b/contrib/tools/cython/Cython/Includes/posix/resource.pxd
index 9f55c6ab4e..1227724323 100644
--- a/contrib/tools/cython/Cython/Includes/posix/resource.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/resource.pxd
@@ -1,9 +1,9 @@
# http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/resource.h.html
-from posix.time cimport timeval
+from posix.time cimport timeval
from posix.types cimport id_t
-cdef extern from "<sys/resource.h>" nogil:
+cdef extern from "<sys/resource.h>" nogil:
enum: PRIO_PROCESS
enum: PRIO_PGRP
diff --git a/contrib/tools/cython/Cython/Includes/posix/select.pxd b/contrib/tools/cython/Cython/Includes/posix/select.pxd
index 46703df104..af9509ea43 100644
--- a/contrib/tools/cython/Cython/Includes/posix/select.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/select.pxd
@@ -1,19 +1,19 @@
-from .types cimport sigset_t
-from .time cimport timeval, timespec
-
-cdef extern from "<sys/select.h>" nogil:
- ctypedef struct fd_set:
- pass
-
- int FD_SETSIZE
- void FD_SET(int, fd_set*)
- void FD_CLR(int, fd_set*)
- bint FD_ISSET(int, fd_set*)
- void FD_ZERO(fd_set*)
-
- int select(int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, const timeval *timeout)
-
- int pselect(int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, const timespec *timeout,
- const sigset_t *sigmask)
+from .types cimport sigset_t
+from .time cimport timeval, timespec
+
+cdef extern from "<sys/select.h>" nogil:
+ ctypedef struct fd_set:
+ pass
+
+ int FD_SETSIZE
+ void FD_SET(int, fd_set*)
+ void FD_CLR(int, fd_set*)
+ bint FD_ISSET(int, fd_set*)
+ void FD_ZERO(fd_set*)
+
+ int select(int nfds, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds, const timeval *timeout)
+
+ int pselect(int nfds, fd_set *readfds, fd_set *writefds,
+ fd_set *exceptfds, const timespec *timeout,
+ const sigset_t *sigmask)
diff --git a/contrib/tools/cython/Cython/Includes/posix/signal.pxd b/contrib/tools/cython/Cython/Includes/posix/signal.pxd
index 9fe7d9c36c..eafb164313 100644
--- a/contrib/tools/cython/Cython/Includes/posix/signal.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/signal.pxd
@@ -2,7 +2,7 @@
from posix.types cimport pid_t, sigset_t, uid_t
-cdef extern from "<signal.h>" nogil:
+cdef extern from "<signal.h>" nogil:
cdef union sigval:
int sival_int
@@ -12,7 +12,7 @@ cdef extern from "<signal.h>" nogil:
int sigev_notify
int sigev_signo
sigval sigev_value
- void sigev_notify_function(sigval)
+ void sigev_notify_function(sigval)
ctypedef struct siginfo_t:
int si_signo
@@ -26,8 +26,8 @@ cdef extern from "<signal.h>" nogil:
sigval si_value
cdef struct sigaction_t "sigaction":
- void sa_handler(int)
- void sa_sigaction(int, siginfo_t *, void *)
+ void sa_handler(int)
+ void sa_sigaction(int, siginfo_t *, void *)
sigset_t sa_mask
int sa_flags
@@ -68,6 +68,6 @@ cdef extern from "<signal.h>" nogil:
int sigdelset (sigset_t *, int)
int sigemptyset (sigset_t *)
int sigfillset (sigset_t *)
- int sigismember (const sigset_t *, int)
+ int sigismember (const sigset_t *, int)
int sigaltstack(const stack_t *, stack_t *)
diff --git a/contrib/tools/cython/Cython/Includes/posix/stat.pxd b/contrib/tools/cython/Cython/Includes/posix/stat.pxd
index 69c2eca166..30f1791ba5 100644
--- a/contrib/tools/cython/Cython/Includes/posix/stat.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/stat.pxd
@@ -2,7 +2,7 @@ from posix.types cimport (blkcnt_t, blksize_t, dev_t, gid_t, ino_t, mode_t,
nlink_t, off_t, time_t, uid_t)
-cdef extern from "<sys/stat.h>" nogil:
+cdef extern from "<sys/stat.h>" nogil:
cdef struct struct_stat "stat":
dev_t st_dev
ino_t st_ino
@@ -24,7 +24,7 @@ cdef extern from "<sys/stat.h>" nogil:
time_t st_birthtime
# POSIX prescribes including both <sys/stat.h> and <unistd.h> for these
-cdef extern from "<unistd.h>" nogil:
+cdef extern from "<unistd.h>" nogil:
int fchmod(int, mode_t)
int chmod(const char *, mode_t)
diff --git a/contrib/tools/cython/Cython/Includes/posix/stdio.pxd b/contrib/tools/cython/Cython/Includes/posix/stdio.pxd
index 53913fdf45..327fbb3cb6 100644
--- a/contrib/tools/cython/Cython/Includes/posix/stdio.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/stdio.pxd
@@ -1,37 +1,37 @@
-# POSIX additions to <stdio.h>.
-# http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdio.h.html
-
-from libc.stdio cimport FILE
-from libc.stddef cimport wchar_t
-from posix.types cimport off_t
-
-cdef extern from "<stdio.h>" nogil:
- # File descriptors
- FILE *fdopen(int, const char *)
- int fileno(FILE *)
-
- # Pipes
- FILE *popen(const char *, const char *)
- int pclose(FILE *)
-
- # Memory streams (POSIX.2008)
- FILE *fmemopen(void *, size_t, const char *)
- FILE *open_memstream(char **, size_t *)
- FILE *open_wmemstream(wchar_t **, size_t *)
-
- # Seek and tell with off_t
- int fseeko(FILE *, off_t, int)
- off_t ftello(FILE *)
-
- # Locking (for multithreading)
- void flockfile(FILE *)
- int ftrylockfile(FILE *)
- void funlockfile(FILE *)
- int getc_unlocked(FILE *)
- int getchar_unlocked()
- int putc_unlocked(int, FILE *)
- int putchar_unlocked(int)
-
- # Reading lines and records (POSIX.2008)
- ssize_t getline(char **, size_t *, FILE *)
- ssize_t getdelim(char **, size_t *, int, FILE *)
+# POSIX additions to <stdio.h>.
+# http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdio.h.html
+
+from libc.stdio cimport FILE
+from libc.stddef cimport wchar_t
+from posix.types cimport off_t
+
+cdef extern from "<stdio.h>" nogil:
+ # File descriptors
+ FILE *fdopen(int, const char *)
+ int fileno(FILE *)
+
+ # Pipes
+ FILE *popen(const char *, const char *)
+ int pclose(FILE *)
+
+ # Memory streams (POSIX.2008)
+ FILE *fmemopen(void *, size_t, const char *)
+ FILE *open_memstream(char **, size_t *)
+ FILE *open_wmemstream(wchar_t **, size_t *)
+
+ # Seek and tell with off_t
+ int fseeko(FILE *, off_t, int)
+ off_t ftello(FILE *)
+
+ # Locking (for multithreading)
+ void flockfile(FILE *)
+ int ftrylockfile(FILE *)
+ void funlockfile(FILE *)
+ int getc_unlocked(FILE *)
+ int getchar_unlocked()
+ int putc_unlocked(int, FILE *)
+ int putchar_unlocked(int)
+
+ # Reading lines and records (POSIX.2008)
+ ssize_t getline(char **, size_t *, FILE *)
+ ssize_t getdelim(char **, size_t *, int, FILE *)
diff --git a/contrib/tools/cython/Cython/Includes/posix/stdlib.pxd b/contrib/tools/cython/Cython/Includes/posix/stdlib.pxd
index 513de938a8..e276ddac92 100644
--- a/contrib/tools/cython/Cython/Includes/posix/stdlib.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/stdlib.pxd
@@ -1,7 +1,7 @@
# POSIX additions to <stdlib.h>
# http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html
-cdef extern from "<stdlib.h>" nogil:
+cdef extern from "<stdlib.h>" nogil:
void _Exit(int)
double drand48()
double erand48(unsigned short *)
diff --git a/contrib/tools/cython/Cython/Includes/posix/strings.pxd b/contrib/tools/cython/Cython/Includes/posix/strings.pxd
index 6ee48491eb..40d33e11eb 100644
--- a/contrib/tools/cython/Cython/Includes/posix/strings.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/strings.pxd
@@ -1,9 +1,9 @@
-cdef extern from "<strings.h>" nogil:
- int bcmp(const void *, const void *, size_t)
- void bcopy(const void *, void *, size_t)
- void bzero(void *, size_t)
- int ffs(int)
- char *index(const char *, int)
- char *rindex(const char *, int)
- int strcasecmp(const char *, const char *)
- int strncasecmp(const char *, const char *, size_t)
+cdef extern from "<strings.h>" nogil:
+ int bcmp(const void *, const void *, size_t)
+ void bcopy(const void *, void *, size_t)
+ void bzero(void *, size_t)
+ int ffs(int)
+ char *index(const char *, int)
+ char *rindex(const char *, int)
+ int strcasecmp(const char *, const char *)
+ int strncasecmp(const char *, const char *, size_t)
diff --git a/contrib/tools/cython/Cython/Includes/posix/time.pxd b/contrib/tools/cython/Cython/Includes/posix/time.pxd
index 6bc81bfea0..0c67ddc3a4 100644
--- a/contrib/tools/cython/Cython/Includes/posix/time.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/time.pxd
@@ -1,9 +1,9 @@
# http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/time.h.html
-from posix.types cimport suseconds_t, time_t, clockid_t, timer_t
+from posix.types cimport suseconds_t, time_t, clockid_t, timer_t
from posix.signal cimport sigevent
-cdef extern from "<sys/time.h>" nogil:
+cdef extern from "<sys/time.h>" nogil:
enum: CLOCK_REALTIME
enum: TIMER_ABSTIME
enum: CLOCK_MONOTONIC
@@ -32,18 +32,18 @@ cdef extern from "<sys/time.h>" nogil:
enum: ITIMER_VIRTUAL
enum: ITIMER_PROF
- cdef struct timezone:
- int tz_minuteswest
- int dsttime
-
+ cdef struct timezone:
+ int tz_minuteswest
+ int dsttime
+
cdef struct timeval:
time_t tv_sec
suseconds_t tv_usec
- cdef struct timespec:
- time_t tv_sec
- long tv_nsec
-
+ cdef struct timespec:
+ time_t tv_sec
+ long tv_nsec
+
cdef struct itimerval:
timeval it_interval
timeval it_value
@@ -52,20 +52,20 @@ cdef extern from "<sys/time.h>" nogil:
timespec it_interval
timespec it_value
- int nanosleep(const timespec *, timespec *)
-
- int getitimer(int, itimerval *)
- int gettimeofday(timeval *tp, timezone *tzp)
- int setitimer(int, const itimerval *, itimerval *)
+ int nanosleep(const timespec *, timespec *)
- int clock_getcpuclockid(pid_t, clockid_t *)
- int clock_getres(clockid_t, timespec *)
- int clock_gettime(clockid_t, timespec *)
- int clock_nanosleep(clockid_t, int, const timespec *, timespec *)
- int clock_settime(clockid_t, const timespec *)
+ int getitimer(int, itimerval *)
+ int gettimeofday(timeval *tp, timezone *tzp)
+ int setitimer(int, const itimerval *, itimerval *)
- int timer_create(clockid_t, sigevent *, timer_t *)
- int timer_delete(timer_t)
- int timer_gettime(timer_t, itimerspec *)
- int timer_getoverrun(timer_t)
- int timer_settime(timer_t, int, const itimerspec *, itimerspec *)
+ int clock_getcpuclockid(pid_t, clockid_t *)
+ int clock_getres(clockid_t, timespec *)
+ int clock_gettime(clockid_t, timespec *)
+ int clock_nanosleep(clockid_t, int, const timespec *, timespec *)
+ int clock_settime(clockid_t, const timespec *)
+
+ int timer_create(clockid_t, sigevent *, timer_t *)
+ int timer_delete(timer_t)
+ int timer_gettime(timer_t, itimerspec *)
+ int timer_getoverrun(timer_t)
+ int timer_settime(timer_t, int, const itimerspec *, itimerspec *)
diff --git a/contrib/tools/cython/Cython/Includes/posix/types.pxd b/contrib/tools/cython/Cython/Includes/posix/types.pxd
index 308f2954ee..b74bba3a8f 100644
--- a/contrib/tools/cython/Cython/Includes/posix/types.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/types.pxd
@@ -1,23 +1,23 @@
-# Note that the actual size of these types is system-dependent, and
-# can't be detected at C compile time. However, the generated C code
-# will correctly use the actual size of these types *except* for
-# determining promotion in binary arithmetic expressions involving
-# mixed types. In this case, operands are promoted to the declared
-# larger type, with a bias towards typedef types. Thus, with the
-# declarations below, long + time_t will result in a time_t whereas
-# long long + time_t will result in a long long which should be
-# acceptable for either 32-bit or 64-bit signed time_t (though admittedly
-# the POSIX standard doesn't even specify that time_t must be an integral
-# type).
-
-cdef extern from "<sys/types.h>":
+# Note that the actual size of these types is system-dependent, and
+# can't be detected at C compile time. However, the generated C code
+# will correctly use the actual size of these types *except* for
+# determining promotion in binary arithmetic expressions involving
+# mixed types. In this case, operands are promoted to the declared
+# larger type, with a bias towards typedef types. Thus, with the
+# declarations below, long + time_t will result in a time_t whereas
+# long long + time_t will result in a long long which should be
+# acceptable for either 32-bit or 64-bit signed time_t (though admittedly
+# the POSIX standard doesn't even specify that time_t must be an integral
+# type).
+
+cdef extern from "<sys/types.h>":
ctypedef long blkcnt_t
ctypedef long blksize_t
ctypedef long clockid_t
ctypedef long dev_t
ctypedef long gid_t
ctypedef long id_t
- ctypedef unsigned long ino_t
+ ctypedef unsigned long ino_t
ctypedef long mode_t
ctypedef long nlink_t
ctypedef long off_t
diff --git a/contrib/tools/cython/Cython/Includes/posix/unistd.pxd b/contrib/tools/cython/Cython/Includes/posix/unistd.pxd
index 1afeca3854..bd7c3daa49 100644
--- a/contrib/tools/cython/Cython/Includes/posix/unistd.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/unistd.pxd
@@ -2,7 +2,7 @@
from posix.types cimport gid_t, pid_t, off_t, uid_t
-cdef extern from "<unistd.h>" nogil:
+cdef extern from "<unistd.h>" nogil:
#:NULL
diff --git a/contrib/tools/cython/Cython/Includes/posix/wait.pxd b/contrib/tools/cython/Cython/Includes/posix/wait.pxd
index d18cff9cf8..6041d02eb1 100644
--- a/contrib/tools/cython/Cython/Includes/posix/wait.pxd
+++ b/contrib/tools/cython/Cython/Includes/posix/wait.pxd
@@ -1,38 +1,38 @@
-# http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/wait.h.html
-
-from posix.types cimport pid_t, id_t
-from posix.signal cimport siginfo_t
-from posix.resource cimport rusage
-
-cdef extern from "<sys/wait.h>" nogil:
- enum: WNOHANG
- enum: WUNTRACED
- enum: WCONTINUED
- enum: WEXITED
- enum: WSTOPPED
- enum: WNOWAIT
-
- int WEXITSTATUS(int status)
- int WIFCONTINUED(int status)
- int WIFEXITED(int status)
- int WIFSIGNALED(int status)
- int WIFSTOPPED(int status)
- int WSTOPSIG(int status)
- int WTERMSIG(int status)
-
- ctypedef int idtype_t
- enum: P_ALL # idtype_t values
- enum: P_PID
- enum: P_PGID
-
- pid_t wait(int *stat_loc)
- pid_t waitpid(pid_t pid, int *status, int options)
- int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options)
-
-# wait3 was in POSIX until 2008 while wait4 was never standardized.
-# Even so, these calls are in almost every Unix, always in sys/wait.h.
-# Hence, posix.wait is the least surprising place to declare them for Cython.
-# libc may require _XXX_SOURCE to be defined at C-compile time to provide them.
-
- pid_t wait3(int *status, int options, rusage *rusage)
- pid_t wait4(pid_t pid, int *status, int options, rusage *rusage)
+# http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/wait.h.html
+
+from posix.types cimport pid_t, id_t
+from posix.signal cimport siginfo_t
+from posix.resource cimport rusage
+
+cdef extern from "<sys/wait.h>" nogil:
+ enum: WNOHANG
+ enum: WUNTRACED
+ enum: WCONTINUED
+ enum: WEXITED
+ enum: WSTOPPED
+ enum: WNOWAIT
+
+ int WEXITSTATUS(int status)
+ int WIFCONTINUED(int status)
+ int WIFEXITED(int status)
+ int WIFSIGNALED(int status)
+ int WIFSTOPPED(int status)
+ int WSTOPSIG(int status)
+ int WTERMSIG(int status)
+
+ ctypedef int idtype_t
+ enum: P_ALL # idtype_t values
+ enum: P_PID
+ enum: P_PGID
+
+ pid_t wait(int *stat_loc)
+ pid_t waitpid(pid_t pid, int *status, int options)
+ int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options)
+
+# wait3 was in POSIX until 2008 while wait4 was never standardized.
+# Even so, these calls are in almost every Unix, always in sys/wait.h.
+# Hence, posix.wait is the least surprising place to declare them for Cython.
+# libc may require _XXX_SOURCE to be defined at C-compile time to provide them.
+
+ pid_t wait3(int *status, int options, rusage *rusage)
+ pid_t wait4(pid_t pid, int *status, int options, rusage *rusage)
diff --git a/contrib/tools/cython/Cython/Parser/ConcreteSyntaxTree.pyx b/contrib/tools/cython/Cython/Parser/ConcreteSyntaxTree.pyx
index f9888c561c..c6196d8892 100644
--- a/contrib/tools/cython/Cython/Parser/ConcreteSyntaxTree.pyx
+++ b/contrib/tools/cython/Cython/Parser/ConcreteSyntaxTree.pyx
@@ -1,88 +1,88 @@
-cdef extern from "graminit.c":
- ctypedef struct grammar:
- pass
- cdef grammar _PyParser_Grammar
- cdef int Py_file_input
-
-cdef extern from "node.h":
- ctypedef struct node
- void PyNode_Free(node* n)
- int NCH(node* n)
- node* CHILD(node* n, int ix)
- node* RCHILD(node* n, int ix)
- short TYPE(node* n)
- char* STR(node* n)
-
-cdef extern from "parsetok.h":
- ctypedef struct perrdetail:
- pass
- cdef void PyParser_SetError(perrdetail *err) except *
- cdef node * PyParser_ParseStringFlagsFilenameEx(
- const char * s,
- const char * filename,
- grammar * g,
- int start,
- perrdetail * err_ret,
- int * flags)
-
-import distutils.sysconfig
-import os
-import re
-
-def extract_names(path):
- # All parse tree types are #defined in these files as ints.
- type_names = {}
- for line in open(path):
- if line.startswith('#define'):
- try:
- _, name, value = line.strip().split()
- type_names[int(value)] = name
- except:
- pass
- return type_names
-
-cdef dict type_names = {}
-
-cdef print_tree(node* n, indent=""):
- if not type_names:
- type_names.update(extract_names(
- os.path.join(distutils.sysconfig.get_python_inc(), 'token.h')))
- type_names.update(extract_names(
- os.path.join(os.path.dirname(__file__), 'graminit.h')))
-
- print indent, type_names.get(TYPE(n), 'unknown'), <object>STR(n) if NCH(n) == 0 else NCH(n)
- indent += " "
- for i in range(NCH(n)):
- print_tree(CHILD(n, i), indent)
-
-def handle_includes(source, path):
- # TODO: Use include directory.
- def include_here(include_line):
- included = os.path.join(os.path.dirname(path), include_line.group(1)[1:-1])
- if not os.path.exists(included):
- return include_line.group(0) + ' # no such path: ' + included
- return handle_includes(open(included).read(), path)
- # TODO: Proper string tokenizing.
- return re.sub(r'^include\s+([^\n]+[\'"])\s*(#.*)?$', include_here, source, flags=re.M)
-
-def p_module(path):
- cdef perrdetail err
- cdef int flags
- cdef node* n
- source = open(path).read()
- if '\ninclude ' in source:
- # TODO: Tokanizer needs to understand includes.
- source = handle_includes(source, path)
- path = "preparse(%s)" % path
- n = PyParser_ParseStringFlagsFilenameEx(
- source,
- path,
- &_PyParser_Grammar,
- Py_file_input,
- &err,
- &flags)
- if n:
-# print_tree(n)
- PyNode_Free(n)
- else:
- PyParser_SetError(&err)
+cdef extern from "graminit.c":
+ ctypedef struct grammar:
+ pass
+ cdef grammar _PyParser_Grammar
+ cdef int Py_file_input
+
+cdef extern from "node.h":
+ ctypedef struct node
+ void PyNode_Free(node* n)
+ int NCH(node* n)
+ node* CHILD(node* n, int ix)
+ node* RCHILD(node* n, int ix)
+ short TYPE(node* n)
+ char* STR(node* n)
+
+cdef extern from "parsetok.h":
+ ctypedef struct perrdetail:
+ pass
+ cdef void PyParser_SetError(perrdetail *err) except *
+ cdef node * PyParser_ParseStringFlagsFilenameEx(
+ const char * s,
+ const char * filename,
+ grammar * g,
+ int start,
+ perrdetail * err_ret,
+ int * flags)
+
+import distutils.sysconfig
+import os
+import re
+
+def extract_names(path):
+ # All parse tree types are #defined in these files as ints.
+ type_names = {}
+ for line in open(path):
+ if line.startswith('#define'):
+ try:
+ _, name, value = line.strip().split()
+ type_names[int(value)] = name
+ except:
+ pass
+ return type_names
+
+cdef dict type_names = {}
+
+cdef print_tree(node* n, indent=""):
+ if not type_names:
+ type_names.update(extract_names(
+ os.path.join(distutils.sysconfig.get_python_inc(), 'token.h')))
+ type_names.update(extract_names(
+ os.path.join(os.path.dirname(__file__), 'graminit.h')))
+
+ print indent, type_names.get(TYPE(n), 'unknown'), <object>STR(n) if NCH(n) == 0 else NCH(n)
+ indent += " "
+ for i in range(NCH(n)):
+ print_tree(CHILD(n, i), indent)
+
+def handle_includes(source, path):
+ # TODO: Use include directory.
+ def include_here(include_line):
+ included = os.path.join(os.path.dirname(path), include_line.group(1)[1:-1])
+ if not os.path.exists(included):
+ return include_line.group(0) + ' # no such path: ' + included
+ return handle_includes(open(included).read(), path)
+ # TODO: Proper string tokenizing.
+ return re.sub(r'^include\s+([^\n]+[\'"])\s*(#.*)?$', include_here, source, flags=re.M)
+
+def p_module(path):
+ cdef perrdetail err
+ cdef int flags
+ cdef node* n
+ source = open(path).read()
+ if '\ninclude ' in source:
+ # TODO: Tokanizer needs to understand includes.
+ source = handle_includes(source, path)
+ path = "preparse(%s)" % path
+ n = PyParser_ParseStringFlagsFilenameEx(
+ source,
+ path,
+ &_PyParser_Grammar,
+ Py_file_input,
+ &err,
+ &flags)
+ if n:
+# print_tree(n)
+ PyNode_Free(n)
+ else:
+ PyParser_SetError(&err)
diff --git a/contrib/tools/cython/Cython/Parser/Grammar b/contrib/tools/cython/Cython/Parser/Grammar
index 214e36d5a3..97e16386e4 100644
--- a/contrib/tools/cython/Cython/Parser/Grammar
+++ b/contrib/tools/cython/Cython/Parser/Grammar
@@ -1,214 +1,214 @@
-# Grammar for Cython, based on the Grammar for Python 3
-
-# Note: This grammar is not yet used by the Cython parser and is subject to change.
-
-# Start symbols for the grammar:
-# single_input is a single interactive statement;
-# file_input is a module or sequence of commands read from an input file;
-# eval_input is the input for the eval() functions.
-# NB: compound_stmt in single_input is followed by extra NEWLINE!
-single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
-file_input: (NEWLINE | stmt)* ENDMARKER
-eval_input: testlist NEWLINE* ENDMARKER
-
-decorator: '@' dotted_PY_NAME [ '(' [arglist] ')' ] NEWLINE
-decorators: decorator+
-decorated: decorators (classdef | funcdef | async_funcdef | cdef_stmt)
-async_funcdef: 'async' funcdef
-funcdef: 'def' PY_NAME parameters ['->' test] ':' suite
-parameters: '(' [typedargslist] ')'
-typedargslist: (tfpdef ['=' (test | '*')] (',' tfpdef ['=' (test | '*')])* [','
- ['*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef]]
- | '*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef) [',' ellipsis]
-tfpdef: maybe_typed_name [('not' | 'or') 'None'] [':' test]
-varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [','
- ['*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef]]
- | '*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef)
-vfpdef: maybe_typed_name ['not' 'None']
-
-stmt: simple_stmt | compound_stmt | cdef_stmt | ctypedef_stmt | DEF_stmt | IF_stmt
-simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
-small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
- import_stmt | global_stmt | nonlocal_stmt | assert_stmt | print_stmt)
-expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) |
- ('=' (yield_expr|testlist_star_expr))*)
-testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
-augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |
- '<<=' | '>>=' | '**=' | '//=')
-print_stmt: 'print' ( [ test (',' test)* [','] ] |
- '>>' test [ (',' test)+ [','] ] )
-# For normal assignments, additional restrictions enforced by the interpreter
-del_stmt: 'del' exprlist
-pass_stmt: 'pass'
-flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt
-break_stmt: 'break'
-continue_stmt: 'continue'
-return_stmt: 'return' [testlist]
-yield_stmt: yield_expr
-raise_stmt: 'raise' [test ['from' test]]
-# raise_stmt: 'raise' [test [',' test [',' test]]]
-import_stmt: import_PY_NAME | import_from
-import_PY_NAME: ('import' | 'cimport') dotted_as_PY_NAMEs
-# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS
-import_from: ('from' (('.' | '...')* dotted_PY_NAME | ('.' | '...')+)
- ('import' | 'cimport') ('*' | '(' import_as_PY_NAMEs ')' | import_as_PY_NAMEs))
-import_as_PY_NAME: PY_NAME ['as' PY_NAME]
-dotted_as_PY_NAME: dotted_PY_NAME ['as' PY_NAME]
-import_as_PY_NAMEs: import_as_PY_NAME (',' import_as_PY_NAME)* [',']
-dotted_as_PY_NAMEs: dotted_as_PY_NAME (',' dotted_as_PY_NAME)*
-dotted_PY_NAME: PY_NAME ('.' PY_NAME)*
-global_stmt: 'global' PY_NAME (',' PY_NAME)*
-nonlocal_stmt: 'nonlocal' PY_NAME (',' PY_NAME)*
-exec_stmt: 'exec' expr ['in' test [',' test]]
-assert_stmt: 'assert' test [',' test]
-
-compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated
-if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
-while_stmt: 'while' test ':' suite ['else' ':' suite]
-for_stmt: 'for' exprlist ('in' testlist | for_from_clause)':' suite ['else' ':' suite]
-for_from_clause: 'from' expr comp_op PY_NAME comp_op expr ['by' expr]
-try_stmt: ('try' ':' suite
- ((except_clause ':' suite)+
- ['else' ':' suite]
- ['finally' ':' suite] |
- 'finally' ':' suite))
-with_stmt: 'with' with_item (',' with_item)* ':' suite
-with_item: test ['as' expr]
-# NB compile.c makes sure that the default except clause is last
-except_clause: 'except' [test [('as' | ',') test]]
-suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
-
-test: or_test ['if' or_test 'else' test] | lambdef
-test_nocond: or_test | lambdef_nocond
-lambdef: 'lambda' [varargslist] ':' test
-lambdef_nocond: 'lambda' [varargslist] ':' test_nocond
-or_test: and_test ('or' and_test)*
-and_test: not_test ('and' not_test)*
-not_test: 'not' not_test | comparison
-comparison: expr (comp_op expr)*
-# <> isn't actually a valid comparison operator in Python. It's here for the
-# sake of a __future__ import described in PEP 401
-comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
-star_expr: '*' expr
-expr: xor_expr ('|' xor_expr)*
-xor_expr: and_expr ('^' and_expr)*
-and_expr: shift_expr ('&' shift_expr)*
-shift_expr: arith_expr (('<<'|'>>') arith_expr)*
-arith_expr: term (('+'|'-') term)*
-term: factor (('*'|'/'|'%'|'//') factor)*
-factor: ('+'|'-'|'~') factor | power | address | size_of | cast
-power: atom_expr ['**' factor]
-atom_expr: ['await'] atom trailer*
-atom: ('(' [yield_expr|testlist_comp] ')' |
- '[' [testlist_comp] ']' |
- '{' [dictorsetmaker] '}' |
- new_expr |
- PY_NAME | NUMBER | STRING+ | ellipsis | 'None' | 'True' | 'False')
-testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
-trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' (PY_NAME | 'sizeof')
-subscriptlist: subscript (',' subscript)* [',']
-subscript: test | [test] ':' [test] [sliceop]
-sliceop: ':' [test]
-exprlist: (expr|star_expr) (',' (expr|star_expr))* [',']
-testlist: test (',' test)* [',']
-dictorsetmaker: ( ((test ':' test | '**' expr)
- (comp_for | (',' (test ':' test | '**' expr))* [','])) |
- ((test | star_expr)
- (comp_for | (',' (test | star_expr))* [','])) )
-
-classdef: 'class' PY_NAME ['(' [arglist] ')'] ':' suite
-
-arglist: argument (',' argument)* [',']
-
-# The reason that keywords are test nodes instead of NAME is that using NAME
-# results in an ambiguity. ast.c makes sure it's a NAME.
-# "test '=' test" is really "keyword '=' test", but we have no such token.
-# These need to be in a single rule to avoid grammar that is ambiguous
-# to our LL(1) parser. Even though 'test' includes '*expr' in star_expr,
-# we explicitly match '*' here, too, to give it proper precedence.
-# Illegal combinations and orderings are blocked in ast.c:
+# Grammar for Cython, based on the Grammar for Python 3
+
+# Note: This grammar is not yet used by the Cython parser and is subject to change.
+
+# Start symbols for the grammar:
+# single_input is a single interactive statement;
+# file_input is a module or sequence of commands read from an input file;
+# eval_input is the input for the eval() functions.
+# NB: compound_stmt in single_input is followed by extra NEWLINE!
+single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
+file_input: (NEWLINE | stmt)* ENDMARKER
+eval_input: testlist NEWLINE* ENDMARKER
+
+decorator: '@' dotted_PY_NAME [ '(' [arglist] ')' ] NEWLINE
+decorators: decorator+
+decorated: decorators (classdef | funcdef | async_funcdef | cdef_stmt)
+async_funcdef: 'async' funcdef
+funcdef: 'def' PY_NAME parameters ['->' test] ':' suite
+parameters: '(' [typedargslist] ')'
+typedargslist: (tfpdef ['=' (test | '*')] (',' tfpdef ['=' (test | '*')])* [','
+ ['*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef]]
+ | '*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef) [',' ellipsis]
+tfpdef: maybe_typed_name [('not' | 'or') 'None'] [':' test]
+varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [','
+ ['*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef]]
+ | '*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef)
+vfpdef: maybe_typed_name ['not' 'None']
+
+stmt: simple_stmt | compound_stmt | cdef_stmt | ctypedef_stmt | DEF_stmt | IF_stmt
+simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
+small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
+ import_stmt | global_stmt | nonlocal_stmt | assert_stmt | print_stmt)
+expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) |
+ ('=' (yield_expr|testlist_star_expr))*)
+testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
+augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |
+ '<<=' | '>>=' | '**=' | '//=')
+print_stmt: 'print' ( [ test (',' test)* [','] ] |
+ '>>' test [ (',' test)+ [','] ] )
+# For normal assignments, additional restrictions enforced by the interpreter
+del_stmt: 'del' exprlist
+pass_stmt: 'pass'
+flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt
+break_stmt: 'break'
+continue_stmt: 'continue'
+return_stmt: 'return' [testlist]
+yield_stmt: yield_expr
+raise_stmt: 'raise' [test ['from' test]]
+# raise_stmt: 'raise' [test [',' test [',' test]]]
+import_stmt: import_PY_NAME | import_from
+import_PY_NAME: ('import' | 'cimport') dotted_as_PY_NAMEs
+# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS
+import_from: ('from' (('.' | '...')* dotted_PY_NAME | ('.' | '...')+)
+ ('import' | 'cimport') ('*' | '(' import_as_PY_NAMEs ')' | import_as_PY_NAMEs))
+import_as_PY_NAME: PY_NAME ['as' PY_NAME]
+dotted_as_PY_NAME: dotted_PY_NAME ['as' PY_NAME]
+import_as_PY_NAMEs: import_as_PY_NAME (',' import_as_PY_NAME)* [',']
+dotted_as_PY_NAMEs: dotted_as_PY_NAME (',' dotted_as_PY_NAME)*
+dotted_PY_NAME: PY_NAME ('.' PY_NAME)*
+global_stmt: 'global' PY_NAME (',' PY_NAME)*
+nonlocal_stmt: 'nonlocal' PY_NAME (',' PY_NAME)*
+exec_stmt: 'exec' expr ['in' test [',' test]]
+assert_stmt: 'assert' test [',' test]
+
+compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated
+if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
+while_stmt: 'while' test ':' suite ['else' ':' suite]
+for_stmt: 'for' exprlist ('in' testlist | for_from_clause)':' suite ['else' ':' suite]
+for_from_clause: 'from' expr comp_op PY_NAME comp_op expr ['by' expr]
+try_stmt: ('try' ':' suite
+ ((except_clause ':' suite)+
+ ['else' ':' suite]
+ ['finally' ':' suite] |
+ 'finally' ':' suite))
+with_stmt: 'with' with_item (',' with_item)* ':' suite
+with_item: test ['as' expr]
+# NB compile.c makes sure that the default except clause is last
+except_clause: 'except' [test [('as' | ',') test]]
+suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
+
+test: or_test ['if' or_test 'else' test] | lambdef
+test_nocond: or_test | lambdef_nocond
+lambdef: 'lambda' [varargslist] ':' test
+lambdef_nocond: 'lambda' [varargslist] ':' test_nocond
+or_test: and_test ('or' and_test)*
+and_test: not_test ('and' not_test)*
+not_test: 'not' not_test | comparison
+comparison: expr (comp_op expr)*
+# <> isn't actually a valid comparison operator in Python. It's here for the
+# sake of a __future__ import described in PEP 401
+comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
+star_expr: '*' expr
+expr: xor_expr ('|' xor_expr)*
+xor_expr: and_expr ('^' and_expr)*
+and_expr: shift_expr ('&' shift_expr)*
+shift_expr: arith_expr (('<<'|'>>') arith_expr)*
+arith_expr: term (('+'|'-') term)*
+term: factor (('*'|'/'|'%'|'//') factor)*
+factor: ('+'|'-'|'~') factor | power | address | size_of | cast
+power: atom_expr ['**' factor]
+atom_expr: ['await'] atom trailer*
+atom: ('(' [yield_expr|testlist_comp] ')' |
+ '[' [testlist_comp] ']' |
+ '{' [dictorsetmaker] '}' |
+ new_expr |
+ PY_NAME | NUMBER | STRING+ | ellipsis | 'None' | 'True' | 'False')
+testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
+trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' (PY_NAME | 'sizeof')
+subscriptlist: subscript (',' subscript)* [',']
+subscript: test | [test] ':' [test] [sliceop]
+sliceop: ':' [test]
+exprlist: (expr|star_expr) (',' (expr|star_expr))* [',']
+testlist: test (',' test)* [',']
+dictorsetmaker: ( ((test ':' test | '**' expr)
+ (comp_for | (',' (test ':' test | '**' expr))* [','])) |
+ ((test | star_expr)
+ (comp_for | (',' (test | star_expr))* [','])) )
+
+classdef: 'class' PY_NAME ['(' [arglist] ')'] ':' suite
+
+arglist: argument (',' argument)* [',']
+
+# The reason that keywords are test nodes instead of NAME is that using NAME
+# results in an ambiguity. ast.c makes sure it's a NAME.
+# "test '=' test" is really "keyword '=' test", but we have no such token.
+# These need to be in a single rule to avoid grammar that is ambiguous
+# to our LL(1) parser. Even though 'test' includes '*expr' in star_expr,
+# we explicitly match '*' here, too, to give it proper precedence.
+# Illegal combinations and orderings are blocked in ast.c:
# multiple (test comp_for) arguments are blocked; keyword unpackings
-# that precede iterable unpackings are blocked; etc.
-argument: ( test [comp_for] |
- test '=' test |
- '**' expr |
- star_expr )
-
-comp_iter: comp_for | comp_if
-comp_for: 'for' exprlist ('in' or_test | for_from_clause) [comp_iter]
-comp_if: 'if' test_nocond [comp_iter]
-
-# not used in grammar, but may appear in "node" passed from Parser to Compiler
-encoding_decl: NAME
-
-yield_expr: 'yield' [yield_arg]
-yield_arg: 'from' test | testlist
-
-
-# Cython extensions
-
-# Accommodate to Py2 tokenizer.
-ellipsis: '...' | '.' '.' '.'
-
-signedness: 'unsigned' | 'signed'
-longness: 'char' | 'short' | 'long' | 'long' 'long'
-# TODO: [unsigned] double doesn't make sens, but we need long double
-int_type: signedness [longness] | longness | [signedness] [longness] ('int' | 'double') | 'complex'
-
-type: ['const'] (NAME ('.' PY_NAME)* | int_type | '(' type ')') ['complex'] [type_qualifiers]
-maybe_typed_name: ['const'] (NAME [('.' PY_NAME)* ['complex'] [type_qualifiers] NAME] | (int_type | '(' type ')') ['complex'] [type_qualifiers] NAME)
-teplate_params: '[' NAME (',' NAME)* ']'
-type_qualifiers: type_qualifier+
-type_qualifier: '*' | '**' | '&' | type_index ('.' NAME [type_index])*
-# TODO: old buffer syntax
-type_index: '[' [(NUMBER | type (',' type)* | (memory_view_index (',' memory_view_index)*))] ']'
-memory_view_index: ':' [':'] [NUMBER]
-
-address: '&' factor
-cast: '<' type ['?'] '>' factor
-size_of: 'sizeof' '(' (type) ')'
-type_id: 'typeid' '(' (type) ')'
-new_expr: 'new' type '(' [arglist] ')'
-
-# TODO: Restrict cdef_stmt to "top-level" statements.
-cdef_stmt: ('cdef' | 'cpdef') (cvar_def | cdef_type_decl | extern_block)
-cdef_type_decl: ctype_decl | fused | cclass
-ctype_decl: struct | enum | cppclass
-# TODO: Does the cdef/ctypedef distinction even make sense for fused?
-ctypedef_stmt: 'ctypedef' (cvar_decl | struct | enum | fused)
-
-# Note: these two are similar but can't be used in an or clause
-# as it would cause ambiguity in the LL(1) parser.
-# Requires a type
-cvar_decl: [visibility] type cname (NEWLINE | cfunc)
-# Allows an assignment
-cvar_def: [visibility] maybe_typed_name (['=' test] (',' PY_NAME ['=' test])* NEWLINE | cfunc)
-
-visibility: 'public' | 'api' | 'readonly'
-# TODO: Standardize gil_spec first or last.
-cfunc: [teplate_params] parameters [gil_spec] [exception_value] [gil_spec] (':' suite | NEWLINE)
-exception_value: 'except' (['?'] expr | '*' | '+' [PY_NAME])
-gil_spec: 'with' ('gil' | 'nogil') | 'nogil'
-
-cname: NAME [STRING]
-cclass: classdef
-fused: 'fused' PY_NAME ':' NEWLINE INDENT ( type NEWLINE)+ DEDENT
-enum: 'enum' [cname] (NEWLINE | ':' enum_suite)
-enum_suite: NEWLINE INDENT (cname ['=' NUMBER] NEWLINE | pass_stmt NEWLINE)+ DEDENT
-struct: ('struct' | 'union') cname (NEWLINE | (':' struct_suite))
-struct_suite: NEWLINE INDENT (cvar_decl | pass_stmt NEWLINE)+ DEDENT
-cppclass: 'cppclass' cname [teplate_params] [cppclass_bases] (NEWLINE | ':' cppclass_suite)
-cppclass_bases: '(' dotted_PY_NAME (',' dotted_PY_NAME [teplate_params])*')'
-cppclass_suite: NEWLINE INDENT (cvar_decl | ctype_decl | pass_stmt NEWLINE)+ DEDENT
-# TODO: C++ constructors, operators
-
-extern_block: 'extern' (cvar_decl | 'from' ('*' | STRING) ['namespace' STRING] [gil_spec] ':' (pass_stmt | extern_suite))
-extern_suite: NEWLINE INDENT (['cdef' | 'cpdef'] (cvar_decl | cdef_type_decl) | ctypedef_stmt)+ DEDENT
-
-cy_type_kwd: 'struct' | 'union' | 'fused' | 'cppclass' | 'int' | 'double' | 'complex'
-cy_kwd: cy_type_kwd | signedness | longness | visibility | 'gil' | 'nogil' | 'namespace' | 'const' | 'by' | 'extern'
-PY_NAME: NAME | cy_kwd
-
-# TODO: Do we really want these? Don't play well with include...
-DEF_stmt: 'DEF' NAME '=' testlist
-IF_stmt: 'IF' test ':' suite ('ELIF' test ':' suite)* ['ELSE' ':' suite]
+# that precede iterable unpackings are blocked; etc.
+argument: ( test [comp_for] |
+ test '=' test |
+ '**' expr |
+ star_expr )
+
+comp_iter: comp_for | comp_if
+comp_for: 'for' exprlist ('in' or_test | for_from_clause) [comp_iter]
+comp_if: 'if' test_nocond [comp_iter]
+
+# not used in grammar, but may appear in "node" passed from Parser to Compiler
+encoding_decl: NAME
+
+yield_expr: 'yield' [yield_arg]
+yield_arg: 'from' test | testlist
+
+
+# Cython extensions
+
+# Accommodate to Py2 tokenizer.
+ellipsis: '...' | '.' '.' '.'
+
+signedness: 'unsigned' | 'signed'
+longness: 'char' | 'short' | 'long' | 'long' 'long'
+# TODO: [unsigned] double doesn't make sens, but we need long double
+int_type: signedness [longness] | longness | [signedness] [longness] ('int' | 'double') | 'complex'
+
+type: ['const'] (NAME ('.' PY_NAME)* | int_type | '(' type ')') ['complex'] [type_qualifiers]
+maybe_typed_name: ['const'] (NAME [('.' PY_NAME)* ['complex'] [type_qualifiers] NAME] | (int_type | '(' type ')') ['complex'] [type_qualifiers] NAME)
+teplate_params: '[' NAME (',' NAME)* ']'
+type_qualifiers: type_qualifier+
+type_qualifier: '*' | '**' | '&' | type_index ('.' NAME [type_index])*
+# TODO: old buffer syntax
+type_index: '[' [(NUMBER | type (',' type)* | (memory_view_index (',' memory_view_index)*))] ']'
+memory_view_index: ':' [':'] [NUMBER]
+
+address: '&' factor
+cast: '<' type ['?'] '>' factor
+size_of: 'sizeof' '(' (type) ')'
+type_id: 'typeid' '(' (type) ')'
+new_expr: 'new' type '(' [arglist] ')'
+
+# TODO: Restrict cdef_stmt to "top-level" statements.
+cdef_stmt: ('cdef' | 'cpdef') (cvar_def | cdef_type_decl | extern_block)
+cdef_type_decl: ctype_decl | fused | cclass
+ctype_decl: struct | enum | cppclass
+# TODO: Does the cdef/ctypedef distinction even make sense for fused?
+ctypedef_stmt: 'ctypedef' (cvar_decl | struct | enum | fused)
+
+# Note: these two are similar but can't be used in an or clause
+# as it would cause ambiguity in the LL(1) parser.
+# Requires a type
+cvar_decl: [visibility] type cname (NEWLINE | cfunc)
+# Allows an assignment
+cvar_def: [visibility] maybe_typed_name (['=' test] (',' PY_NAME ['=' test])* NEWLINE | cfunc)
+
+visibility: 'public' | 'api' | 'readonly'
+# TODO: Standardize gil_spec first or last.
+cfunc: [teplate_params] parameters [gil_spec] [exception_value] [gil_spec] (':' suite | NEWLINE)
+exception_value: 'except' (['?'] expr | '*' | '+' [PY_NAME])
+gil_spec: 'with' ('gil' | 'nogil') | 'nogil'
+
+cname: NAME [STRING]
+cclass: classdef
+fused: 'fused' PY_NAME ':' NEWLINE INDENT ( type NEWLINE)+ DEDENT
+enum: 'enum' [cname] (NEWLINE | ':' enum_suite)
+enum_suite: NEWLINE INDENT (cname ['=' NUMBER] NEWLINE | pass_stmt NEWLINE)+ DEDENT
+struct: ('struct' | 'union') cname (NEWLINE | (':' struct_suite))
+struct_suite: NEWLINE INDENT (cvar_decl | pass_stmt NEWLINE)+ DEDENT
+cppclass: 'cppclass' cname [teplate_params] [cppclass_bases] (NEWLINE | ':' cppclass_suite)
+cppclass_bases: '(' dotted_PY_NAME (',' dotted_PY_NAME [teplate_params])*')'
+cppclass_suite: NEWLINE INDENT (cvar_decl | ctype_decl | pass_stmt NEWLINE)+ DEDENT
+# TODO: C++ constructors, operators
+
+extern_block: 'extern' (cvar_decl | 'from' ('*' | STRING) ['namespace' STRING] [gil_spec] ':' (pass_stmt | extern_suite))
+extern_suite: NEWLINE INDENT (['cdef' | 'cpdef'] (cvar_decl | cdef_type_decl) | ctypedef_stmt)+ DEDENT
+
+cy_type_kwd: 'struct' | 'union' | 'fused' | 'cppclass' | 'int' | 'double' | 'complex'
+cy_kwd: cy_type_kwd | signedness | longness | visibility | 'gil' | 'nogil' | 'namespace' | 'const' | 'by' | 'extern'
+PY_NAME: NAME | cy_kwd
+
+# TODO: Do we really want these? Don't play well with include...
+DEF_stmt: 'DEF' NAME '=' testlist
+IF_stmt: 'IF' test ':' suite ('ELIF' test ':' suite)* ['ELSE' ':' suite]
diff --git a/contrib/tools/cython/Cython/Plex/Actions.py b/contrib/tools/cython/Cython/Plex/Actions.py
index c88176e716..5b978623f9 100644
--- a/contrib/tools/cython/Cython/Plex/Actions.py
+++ b/contrib/tools/cython/Cython/Plex/Actions.py
@@ -1,4 +1,4 @@
-# cython: auto_pickle=False
+# cython: auto_pickle=False
#=======================================================================
#
# Python Lexical Analyser
@@ -8,102 +8,102 @@
#=======================================================================
class Action(object):
- def perform(self, token_stream, text):
- pass # abstract
+ def perform(self, token_stream, text):
+ pass # abstract
- def same_as(self, other):
- return self is other
+ def same_as(self, other):
+ return self is other
class Return(Action):
- """
- Internal Plex action which causes |value| to
- be returned as the value of the associated token
- """
+ """
+ Internal Plex action which causes |value| to
+ be returned as the value of the associated token
+ """
- def __init__(self, value):
- self.value = value
+ def __init__(self, value):
+ self.value = value
- def perform(self, token_stream, text):
- return self.value
+ def perform(self, token_stream, text):
+ return self.value
- def same_as(self, other):
- return isinstance(other, Return) and self.value == other.value
+ def same_as(self, other):
+ return isinstance(other, Return) and self.value == other.value
- def __repr__(self):
- return "Return(%s)" % repr(self.value)
+ def __repr__(self):
+ return "Return(%s)" % repr(self.value)
class Call(Action):
- """
- Internal Plex action which causes a function to be called.
- """
+ """
+ Internal Plex action which causes a function to be called.
+ """
- def __init__(self, function):
- self.function = function
+ def __init__(self, function):
+ self.function = function
- def perform(self, token_stream, text):
- return self.function(token_stream, text)
+ def perform(self, token_stream, text):
+ return self.function(token_stream, text)
- def __repr__(self):
- return "Call(%s)" % self.function.__name__
+ def __repr__(self):
+ return "Call(%s)" % self.function.__name__
- def same_as(self, other):
- return isinstance(other, Call) and self.function is other.function
+ def same_as(self, other):
+ return isinstance(other, Call) and self.function is other.function
class Begin(Action):
- """
- Begin(state_name) is a Plex action which causes the Scanner to
- enter the state |state_name|. See the docstring of Plex.Lexicon
- for more information.
- """
+ """
+ Begin(state_name) is a Plex action which causes the Scanner to
+ enter the state |state_name|. See the docstring of Plex.Lexicon
+ for more information.
+ """
- def __init__(self, state_name):
- self.state_name = state_name
+ def __init__(self, state_name):
+ self.state_name = state_name
- def perform(self, token_stream, text):
- token_stream.begin(self.state_name)
+ def perform(self, token_stream, text):
+ token_stream.begin(self.state_name)
- def __repr__(self):
- return "Begin(%s)" % self.state_name
+ def __repr__(self):
+ return "Begin(%s)" % self.state_name
- def same_as(self, other):
- return isinstance(other, Begin) and self.state_name == other.state_name
+ def same_as(self, other):
+ return isinstance(other, Begin) and self.state_name == other.state_name
class Ignore(Action):
- """
- IGNORE is a Plex action which causes its associated token
- to be ignored. See the docstring of Plex.Lexicon for more
- information.
- """
-
- def perform(self, token_stream, text):
- return None
-
- def __repr__(self):
- return "IGNORE"
-
-
+ """
+ IGNORE is a Plex action which causes its associated token
+ to be ignored. See the docstring of Plex.Lexicon for more
+ information.
+ """
+
+ def perform(self, token_stream, text):
+ return None
+
+ def __repr__(self):
+ return "IGNORE"
+
+
IGNORE = Ignore()
#IGNORE.__doc__ = Ignore.__doc__
-
+
class Text(Action):
- """
- TEXT is a Plex action which causes the text of a token to
- be returned as the value of the token. See the docstring of
- Plex.Lexicon for more information.
- """
-
- def perform(self, token_stream, text):
- return text
+ """
+ TEXT is a Plex action which causes the text of a token to
+ be returned as the value of the token. See the docstring of
+ Plex.Lexicon for more information.
+ """
- def __repr__(self):
- return "TEXT"
+ def perform(self, token_stream, text):
+ return text
+ def __repr__(self):
+ return "TEXT"
+
TEXT = Text()
#TEXT.__doc__ = Text.__doc__
diff --git a/contrib/tools/cython/Cython/Plex/DFA.py b/contrib/tools/cython/Cython/Plex/DFA.py
index 76324621fc..039f0d8786 100644
--- a/contrib/tools/cython/Cython/Plex/DFA.py
+++ b/contrib/tools/cython/Cython/Plex/DFA.py
@@ -13,152 +13,152 @@ from .Machines import LOWEST_PRIORITY
from .Transitions import TransitionMap
-def nfa_to_dfa(old_machine, debug=None):
- """
- Given a nondeterministic Machine, return a new equivalent
- Machine which is deterministic.
- """
- # We build a new machine whose states correspond to sets of states
- # in the old machine. Initially we add a new state corresponding to
- # the epsilon-closure of each initial old state. Then we give transitions
- # to each new state which are the union of all transitions out of any
- # of the corresponding old states. The new state reached on a given
- # character is the one corresponding to the set of states reachable
- # on that character from any of the old states. As new combinations of
- # old states are created, new states are added as needed until closure
- # is reached.
- new_machine = Machines.FastMachine()
- state_map = StateMap(new_machine)
- # Seed the process using the initial states of the old machine.
- # Make the corresponding new states into initial states of the new
- # machine with the same names.
- for (key, old_state) in old_machine.initial_states.items():
- new_state = state_map.old_to_new(epsilon_closure(old_state))
- new_machine.make_initial_state(key, new_state)
- # Tricky bit here: we add things to the end of this list while we're
- # iterating over it. The iteration stops when closure is achieved.
- for new_state in new_machine.states:
- transitions = TransitionMap()
- for old_state in state_map.new_to_old(new_state):
- for event, old_target_states in old_state.transitions.items():
- if event and old_target_states:
- transitions.add_set(event, set_epsilon_closure(old_target_states))
- for event, old_states in transitions.items():
- new_machine.add_transitions(new_state, event, state_map.old_to_new(old_states))
- if debug:
- debug.write("\n===== State Mapping =====\n")
- state_map.dump(debug)
- return new_machine
-
-
+def nfa_to_dfa(old_machine, debug=None):
+ """
+ Given a nondeterministic Machine, return a new equivalent
+ Machine which is deterministic.
+ """
+ # We build a new machine whose states correspond to sets of states
+ # in the old machine. Initially we add a new state corresponding to
+ # the epsilon-closure of each initial old state. Then we give transitions
+ # to each new state which are the union of all transitions out of any
+ # of the corresponding old states. The new state reached on a given
+ # character is the one corresponding to the set of states reachable
+ # on that character from any of the old states. As new combinations of
+ # old states are created, new states are added as needed until closure
+ # is reached.
+ new_machine = Machines.FastMachine()
+ state_map = StateMap(new_machine)
+ # Seed the process using the initial states of the old machine.
+ # Make the corresponding new states into initial states of the new
+ # machine with the same names.
+ for (key, old_state) in old_machine.initial_states.items():
+ new_state = state_map.old_to_new(epsilon_closure(old_state))
+ new_machine.make_initial_state(key, new_state)
+ # Tricky bit here: we add things to the end of this list while we're
+ # iterating over it. The iteration stops when closure is achieved.
+ for new_state in new_machine.states:
+ transitions = TransitionMap()
+ for old_state in state_map.new_to_old(new_state):
+ for event, old_target_states in old_state.transitions.items():
+ if event and old_target_states:
+ transitions.add_set(event, set_epsilon_closure(old_target_states))
+ for event, old_states in transitions.items():
+ new_machine.add_transitions(new_state, event, state_map.old_to_new(old_states))
+ if debug:
+ debug.write("\n===== State Mapping =====\n")
+ state_map.dump(debug)
+ return new_machine
+
+
def set_epsilon_closure(state_set):
- """
- Given a set of states, return the union of the epsilon
- closures of its member states.
- """
- result = {}
- for state1 in state_set:
- for state2 in epsilon_closure(state1):
- result[state2] = 1
- return result
-
-
+ """
+ Given a set of states, return the union of the epsilon
+ closures of its member states.
+ """
+ result = {}
+ for state1 in state_set:
+ for state2 in epsilon_closure(state1):
+ result[state2] = 1
+ return result
+
+
def epsilon_closure(state):
- """
- Return the set of states reachable from the given state
- by epsilon moves.
- """
- # Cache the result
- result = state.epsilon_closure
- if result is None:
- result = {}
- state.epsilon_closure = result
- add_to_epsilon_closure(result, state)
- return result
-
-
+ """
+ Return the set of states reachable from the given state
+ by epsilon moves.
+ """
+ # Cache the result
+ result = state.epsilon_closure
+ if result is None:
+ result = {}
+ state.epsilon_closure = result
+ add_to_epsilon_closure(result, state)
+ return result
+
+
def add_to_epsilon_closure(state_set, state):
- """
- Recursively add to |state_set| states reachable from the given state
- by epsilon moves.
- """
- if not state_set.get(state, 0):
- state_set[state] = 1
- state_set_2 = state.transitions.get_epsilon()
- if state_set_2:
- for state2 in state_set_2:
- add_to_epsilon_closure(state_set, state2)
-
-
+ """
+ Recursively add to |state_set| states reachable from the given state
+ by epsilon moves.
+ """
+ if not state_set.get(state, 0):
+ state_set[state] = 1
+ state_set_2 = state.transitions.get_epsilon()
+ if state_set_2:
+ for state2 in state_set_2:
+ add_to_epsilon_closure(state_set, state2)
+
+
class StateMap(object):
"""
- Helper class used by nfa_to_dfa() to map back and forth between
- sets of states from the old machine and states of the new machine.
+ Helper class used by nfa_to_dfa() to map back and forth between
+ sets of states from the old machine and states of the new machine.
"""
- new_machine = None # Machine
- old_to_new_dict = None # {(old_state,...) : new_state}
- new_to_old_dict = None # {id(new_state) : old_state_set}
-
- def __init__(self, new_machine):
- self.new_machine = new_machine
- self.old_to_new_dict = {}
- self.new_to_old_dict = {}
-
- def old_to_new(self, old_state_set):
- """
- Return the state of the new machine corresponding to the
- set of old machine states represented by |state_set|. A new
- state will be created if necessary. If any of the old states
- are accepting states, the new state will be an accepting state
- with the highest priority action from the old states.
- """
- key = self.make_key(old_state_set)
- new_state = self.old_to_new_dict.get(key, None)
- if not new_state:
- action = self.highest_priority_action(old_state_set)
- new_state = self.new_machine.new_state(action)
- self.old_to_new_dict[key] = new_state
- self.new_to_old_dict[id(new_state)] = old_state_set
- #for old_state in old_state_set.keys():
- #new_state.merge_actions(old_state)
- return new_state
-
- def highest_priority_action(self, state_set):
- best_action = None
- best_priority = LOWEST_PRIORITY
- for state in state_set:
- priority = state.action_priority
- if priority > best_priority:
- best_action = state.action
- best_priority = priority
- return best_action
-
- # def old_to_new_set(self, old_state_set):
- # """
- # Return the new state corresponding to a set of old states as
- # a singleton set.
- # """
- # return {self.old_to_new(old_state_set):1}
-
- def new_to_old(self, new_state):
- """Given a new state, return a set of corresponding old states."""
- return self.new_to_old_dict[id(new_state)]
-
- def make_key(self, state_set):
- """
- Convert a set of states into a uniquified
- sorted tuple suitable for use as a dictionary key.
- """
- lst = list(state_set)
- lst.sort()
- return tuple(lst)
-
- def dump(self, file):
- from .Transitions import state_set_str
-
- for new_state in self.new_machine.states:
- old_state_set = self.new_to_old_dict[id(new_state)]
- file.write(" State %s <-- %s\n" % (
- new_state['number'], state_set_str(old_state_set)))
-
-
+ new_machine = None # Machine
+ old_to_new_dict = None # {(old_state,...) : new_state}
+ new_to_old_dict = None # {id(new_state) : old_state_set}
+
+ def __init__(self, new_machine):
+ self.new_machine = new_machine
+ self.old_to_new_dict = {}
+ self.new_to_old_dict = {}
+
+ def old_to_new(self, old_state_set):
+ """
+ Return the state of the new machine corresponding to the
+ set of old machine states represented by |state_set|. A new
+ state will be created if necessary. If any of the old states
+ are accepting states, the new state will be an accepting state
+ with the highest priority action from the old states.
+ """
+ key = self.make_key(old_state_set)
+ new_state = self.old_to_new_dict.get(key, None)
+ if not new_state:
+ action = self.highest_priority_action(old_state_set)
+ new_state = self.new_machine.new_state(action)
+ self.old_to_new_dict[key] = new_state
+ self.new_to_old_dict[id(new_state)] = old_state_set
+ #for old_state in old_state_set.keys():
+ #new_state.merge_actions(old_state)
+ return new_state
+
+ def highest_priority_action(self, state_set):
+ best_action = None
+ best_priority = LOWEST_PRIORITY
+ for state in state_set:
+ priority = state.action_priority
+ if priority > best_priority:
+ best_action = state.action
+ best_priority = priority
+ return best_action
+
+ # def old_to_new_set(self, old_state_set):
+ # """
+ # Return the new state corresponding to a set of old states as
+ # a singleton set.
+ # """
+ # return {self.old_to_new(old_state_set):1}
+
+ def new_to_old(self, new_state):
+ """Given a new state, return a set of corresponding old states."""
+ return self.new_to_old_dict[id(new_state)]
+
+ def make_key(self, state_set):
+ """
+ Convert a set of states into a uniquified
+ sorted tuple suitable for use as a dictionary key.
+ """
+ lst = list(state_set)
+ lst.sort()
+ return tuple(lst)
+
+ def dump(self, file):
+ from .Transitions import state_set_str
+
+ for new_state in self.new_machine.states:
+ old_state_set = self.new_to_old_dict[id(new_state)]
+ file.write(" State %s <-- %s\n" % (
+ new_state['number'], state_set_str(old_state_set)))
+
+
diff --git a/contrib/tools/cython/Cython/Plex/Errors.py b/contrib/tools/cython/Cython/Plex/Errors.py
index f460100d77..21e2d2ac3e 100644
--- a/contrib/tools/cython/Cython/Plex/Errors.py
+++ b/contrib/tools/cython/Cython/Plex/Errors.py
@@ -6,49 +6,49 @@
#
#=======================================================================
-
+
class PlexError(Exception):
- message = ""
-
+ message = ""
+
class PlexTypeError(PlexError, TypeError):
- pass
-
+ pass
+
class PlexValueError(PlexError, ValueError):
- pass
-
+ pass
+
class InvalidRegex(PlexError):
- pass
-
+ pass
+
class InvalidToken(PlexError):
- def __init__(self, token_number, message):
- PlexError.__init__(self, "Token number %d: %s" % (token_number, message))
+ def __init__(self, token_number, message):
+ PlexError.__init__(self, "Token number %d: %s" % (token_number, message))
class InvalidScanner(PlexError):
- pass
-
+ pass
+
class AmbiguousAction(PlexError):
- message = "Two tokens with different actions can match the same string"
-
- def __init__(self):
- pass
+ message = "Two tokens with different actions can match the same string"
+ def __init__(self):
+ pass
+
class UnrecognizedInput(PlexError):
- scanner = None
- position = None
- state_name = None
-
- def __init__(self, scanner, state_name):
- self.scanner = scanner
- self.position = scanner.get_position()
- self.state_name = state_name
-
- def __str__(self):
- return ("'%s', line %d, char %d: Token not recognised in state %r" % (
- self.position + (self.state_name,)))
+ scanner = None
+ position = None
+ state_name = None
+
+ def __init__(self, scanner, state_name):
+ self.scanner = scanner
+ self.position = scanner.get_position()
+ self.state_name = state_name
+
+ def __str__(self):
+ return ("'%s', line %d, char %d: Token not recognised in state %r" % (
+ self.position + (self.state_name,)))
diff --git a/contrib/tools/cython/Cython/Plex/Lexicons.py b/contrib/tools/cython/Cython/Plex/Lexicons.py
index 787f5854b8..eaacbc9c54 100644
--- a/contrib/tools/cython/Cython/Plex/Lexicons.py
+++ b/contrib/tools/cython/Cython/Plex/Lexicons.py
@@ -22,179 +22,179 @@ DUMP_DFA = 2
class State(object):
- """
- This class is used as part of a Plex.Lexicon specification to
- introduce a user-defined state.
+ """
+ This class is used as part of a Plex.Lexicon specification to
+ introduce a user-defined state.
- Constructor:
+ Constructor:
- State(name, token_specifications)
- """
+ State(name, token_specifications)
+ """
- name = None
- tokens = None
-
- def __init__(self, name, tokens):
- self.name = name
- self.tokens = tokens
+ name = None
+ tokens = None
+ def __init__(self, name, tokens):
+ self.name = name
+ self.tokens = tokens
+
class Lexicon(object):
- """
- Lexicon(specification) builds a lexical analyser from the given
- |specification|. The specification consists of a list of
- specification items. Each specification item may be either:
+ """
+ Lexicon(specification) builds a lexical analyser from the given
+ |specification|. The specification consists of a list of
+ specification items. Each specification item may be either:
- 1) A token definition, which is a tuple:
+ 1) A token definition, which is a tuple:
- (pattern, action)
-
- The |pattern| is a regular axpression built using the
- constructors defined in the Plex module.
-
- The |action| is the action to be performed when this pattern
- is recognised (see below).
-
- 2) A state definition:
-
- State(name, tokens)
-
- where |name| is a character string naming the state,
- and |tokens| is a list of token definitions as
- above. The meaning and usage of states is described
- below.
-
- Actions
- -------
-
- The |action| in a token specication may be one of three things:
-
- 1) A function, which is called as follows:
-
- function(scanner, text)
-
- where |scanner| is the relevant Scanner instance, and |text|
- is the matched text. If the function returns anything
- other than None, that value is returned as the value of the
- token. If it returns None, scanning continues as if the IGNORE
- action were specified (see below).
-
- 2) One of the following special actions:
-
- IGNORE means that the recognised characters will be treated as
- white space and ignored. Scanning will continue until
- the next non-ignored token is recognised before returning.
-
- TEXT causes the scanned text itself to be returned as the
- value of the token.
-
- 3) Any other value, which is returned as the value of the token.
-
- States
- ------
-
- At any given time, the scanner is in one of a number of states.
- Associated with each state is a set of possible tokens. When scanning,
- only tokens associated with the current state are recognised.
-
- There is a default state, whose name is the empty string. Token
- definitions which are not inside any State definition belong to
- the default state.
-
- The initial state of the scanner is the default state. The state can
- be changed in one of two ways:
-
- 1) Using Begin(state_name) as the action of a token.
-
- 2) Calling the begin(state_name) method of the Scanner.
-
- To change back to the default state, use '' as the state name.
- """
-
- machine = None # Machine
- tables = None # StateTableMachine
-
- def __init__(self, specifications, debug=None, debug_flags=7, timings=None):
- if not isinstance(specifications, list):
- raise Errors.InvalidScanner("Scanner definition is not a list")
- if timings:
- from .Timing import time
-
- total_time = 0.0
- time1 = time()
- nfa = Machines.Machine()
- default_initial_state = nfa.new_initial_state('')
- token_number = 1
- for spec in specifications:
- if isinstance(spec, State):
- user_initial_state = nfa.new_initial_state(spec.name)
- for token in spec.tokens:
- self.add_token_to_machine(
- nfa, user_initial_state, token, token_number)
- token_number += 1
- elif isinstance(spec, tuple):
- self.add_token_to_machine(
- nfa, default_initial_state, spec, token_number)
- token_number += 1
- else:
- raise Errors.InvalidToken(
- token_number,
- "Expected a token definition (tuple) or State instance")
- if timings:
- time2 = time()
- total_time = total_time + (time2 - time1)
- time3 = time()
- if debug and (debug_flags & 1):
- debug.write("\n============= NFA ===========\n")
- nfa.dump(debug)
- dfa = DFA.nfa_to_dfa(nfa, debug=(debug_flags & 3) == 3 and debug)
- if timings:
- time4 = time()
- total_time = total_time + (time4 - time3)
- if debug and (debug_flags & 2):
- debug.write("\n============= DFA ===========\n")
- dfa.dump(debug)
- if timings:
- timings.write("Constructing NFA : %5.2f\n" % (time2 - time1))
- timings.write("Converting to DFA: %5.2f\n" % (time4 - time3))
- timings.write("TOTAL : %5.2f\n" % total_time)
- self.machine = dfa
-
- def add_token_to_machine(self, machine, initial_state, token_spec, token_number):
+ (pattern, action)
+
+ The |pattern| is a regular axpression built using the
+ constructors defined in the Plex module.
+
+ The |action| is the action to be performed when this pattern
+ is recognised (see below).
+
+ 2) A state definition:
+
+ State(name, tokens)
+
+ where |name| is a character string naming the state,
+ and |tokens| is a list of token definitions as
+ above. The meaning and usage of states is described
+ below.
+
+ Actions
+ -------
+
+ The |action| in a token specication may be one of three things:
+
+ 1) A function, which is called as follows:
+
+ function(scanner, text)
+
+ where |scanner| is the relevant Scanner instance, and |text|
+ is the matched text. If the function returns anything
+ other than None, that value is returned as the value of the
+ token. If it returns None, scanning continues as if the IGNORE
+ action were specified (see below).
+
+ 2) One of the following special actions:
+
+ IGNORE means that the recognised characters will be treated as
+ white space and ignored. Scanning will continue until
+ the next non-ignored token is recognised before returning.
+
+ TEXT causes the scanned text itself to be returned as the
+ value of the token.
+
+ 3) Any other value, which is returned as the value of the token.
+
+ States
+ ------
+
+ At any given time, the scanner is in one of a number of states.
+ Associated with each state is a set of possible tokens. When scanning,
+ only tokens associated with the current state are recognised.
+
+ There is a default state, whose name is the empty string. Token
+ definitions which are not inside any State definition belong to
+ the default state.
+
+ The initial state of the scanner is the default state. The state can
+ be changed in one of two ways:
+
+ 1) Using Begin(state_name) as the action of a token.
+
+ 2) Calling the begin(state_name) method of the Scanner.
+
+ To change back to the default state, use '' as the state name.
+ """
+
+ machine = None # Machine
+ tables = None # StateTableMachine
+
+ def __init__(self, specifications, debug=None, debug_flags=7, timings=None):
+ if not isinstance(specifications, list):
+ raise Errors.InvalidScanner("Scanner definition is not a list")
+ if timings:
+ from .Timing import time
+
+ total_time = 0.0
+ time1 = time()
+ nfa = Machines.Machine()
+ default_initial_state = nfa.new_initial_state('')
+ token_number = 1
+ for spec in specifications:
+ if isinstance(spec, State):
+ user_initial_state = nfa.new_initial_state(spec.name)
+ for token in spec.tokens:
+ self.add_token_to_machine(
+ nfa, user_initial_state, token, token_number)
+ token_number += 1
+ elif isinstance(spec, tuple):
+ self.add_token_to_machine(
+ nfa, default_initial_state, spec, token_number)
+ token_number += 1
+ else:
+ raise Errors.InvalidToken(
+ token_number,
+ "Expected a token definition (tuple) or State instance")
+ if timings:
+ time2 = time()
+ total_time = total_time + (time2 - time1)
+ time3 = time()
+ if debug and (debug_flags & 1):
+ debug.write("\n============= NFA ===========\n")
+ nfa.dump(debug)
+ dfa = DFA.nfa_to_dfa(nfa, debug=(debug_flags & 3) == 3 and debug)
+ if timings:
+ time4 = time()
+ total_time = total_time + (time4 - time3)
+ if debug and (debug_flags & 2):
+ debug.write("\n============= DFA ===========\n")
+ dfa.dump(debug)
+ if timings:
+ timings.write("Constructing NFA : %5.2f\n" % (time2 - time1))
+ timings.write("Converting to DFA: %5.2f\n" % (time4 - time3))
+ timings.write("TOTAL : %5.2f\n" % total_time)
+ self.machine = dfa
+
+ def add_token_to_machine(self, machine, initial_state, token_spec, token_number):
try:
- (re, action_spec) = self.parse_token_definition(token_spec)
- # Disabled this -- matching empty strings can be useful
- #if re.nullable:
- # raise Errors.InvalidToken(
- # token_number, "Pattern can match 0 input symbols")
- if isinstance(action_spec, Actions.Action):
- action = action_spec
- else:
- try:
- action_spec.__call__
- except AttributeError:
- action = Actions.Return(action_spec)
- else:
- action = Actions.Call(action_spec)
- final_state = machine.new_state()
- re.build_machine(machine, initial_state, final_state,
- match_bol=1, nocase=0)
- final_state.set_action(action, priority=-token_number)
- except Errors.PlexError as e:
- raise e.__class__("Token number %d: %s" % (token_number, e))
-
- def parse_token_definition(self, token_spec):
- if not isinstance(token_spec, tuple):
- raise Errors.InvalidToken("Token definition is not a tuple")
- if len(token_spec) != 2:
- raise Errors.InvalidToken("Wrong number of items in token definition")
- pattern, action = token_spec
- if not isinstance(pattern, Regexps.RE):
- raise Errors.InvalidToken("Pattern is not an RE instance")
- return (pattern, action)
-
- def get_initial_state(self, name):
- return self.machine.get_initial_state(name)
+ (re, action_spec) = self.parse_token_definition(token_spec)
+ # Disabled this -- matching empty strings can be useful
+ #if re.nullable:
+ # raise Errors.InvalidToken(
+ # token_number, "Pattern can match 0 input symbols")
+ if isinstance(action_spec, Actions.Action):
+ action = action_spec
+ else:
+ try:
+ action_spec.__call__
+ except AttributeError:
+ action = Actions.Return(action_spec)
+ else:
+ action = Actions.Call(action_spec)
+ final_state = machine.new_state()
+ re.build_machine(machine, initial_state, final_state,
+ match_bol=1, nocase=0)
+ final_state.set_action(action, priority=-token_number)
+ except Errors.PlexError as e:
+ raise e.__class__("Token number %d: %s" % (token_number, e))
+
+ def parse_token_definition(self, token_spec):
+ if not isinstance(token_spec, tuple):
+ raise Errors.InvalidToken("Token definition is not a tuple")
+ if len(token_spec) != 2:
+ raise Errors.InvalidToken("Wrong number of items in token definition")
+ pattern, action = token_spec
+ if not isinstance(pattern, Regexps.RE):
+ raise Errors.InvalidToken("Pattern is not an RE instance")
+ return (pattern, action)
+
+ def get_initial_state(self, name):
+ return self.machine.get_initial_state(name)
diff --git a/contrib/tools/cython/Cython/Plex/Machines.py b/contrib/tools/cython/Cython/Plex/Machines.py
index 398850976b..062e8087e6 100644
--- a/contrib/tools/cython/Cython/Plex/Machines.py
+++ b/contrib/tools/cython/Cython/Plex/Machines.py
@@ -12,244 +12,244 @@ import sys
from .Transitions import TransitionMap
-try:
- from sys import maxsize as maxint
-except ImportError:
- from sys import maxint
-
-try:
- unichr
-except NameError:
- unichr = chr
-
-LOWEST_PRIORITY = -maxint
-
-
+try:
+ from sys import maxsize as maxint
+except ImportError:
+ from sys import maxint
+
+try:
+ unichr
+except NameError:
+ unichr = chr
+
+LOWEST_PRIORITY = -maxint
+
+
class Machine(object):
- """A collection of Nodes representing an NFA or DFA."""
- states = None # [Node]
- next_state_number = 1
- initial_states = None # {(name, bol): Node}
-
- def __init__(self):
- self.states = []
- self.initial_states = {}
-
- def __del__(self):
- #print "Destroying", self ###
- for state in self.states:
- state.destroy()
-
- def new_state(self):
- """Add a new state to the machine and return it."""
- s = Node()
- n = self.next_state_number
- self.next_state_number = n + 1
- s.number = n
- self.states.append(s)
- return s
-
- def new_initial_state(self, name):
- state = self.new_state()
- self.make_initial_state(name, state)
- return state
-
- def make_initial_state(self, name, state):
- self.initial_states[name] = state
-
- def get_initial_state(self, name):
- return self.initial_states[name]
-
- def dump(self, file):
- file.write("Plex.Machine:\n")
- if self.initial_states is not None:
- file.write(" Initial states:\n")
- for (name, state) in sorted(self.initial_states.items()):
- file.write(" '%s': %d\n" % (name, state.number))
- for s in self.states:
- s.dump(file)
-
-
+ """A collection of Nodes representing an NFA or DFA."""
+ states = None # [Node]
+ next_state_number = 1
+ initial_states = None # {(name, bol): Node}
+
+ def __init__(self):
+ self.states = []
+ self.initial_states = {}
+
+ def __del__(self):
+ #print "Destroying", self ###
+ for state in self.states:
+ state.destroy()
+
+ def new_state(self):
+ """Add a new state to the machine and return it."""
+ s = Node()
+ n = self.next_state_number
+ self.next_state_number = n + 1
+ s.number = n
+ self.states.append(s)
+ return s
+
+ def new_initial_state(self, name):
+ state = self.new_state()
+ self.make_initial_state(name, state)
+ return state
+
+ def make_initial_state(self, name, state):
+ self.initial_states[name] = state
+
+ def get_initial_state(self, name):
+ return self.initial_states[name]
+
+ def dump(self, file):
+ file.write("Plex.Machine:\n")
+ if self.initial_states is not None:
+ file.write(" Initial states:\n")
+ for (name, state) in sorted(self.initial_states.items()):
+ file.write(" '%s': %d\n" % (name, state.number))
+ for s in self.states:
+ s.dump(file)
+
+
class Node(object):
- """A state of an NFA or DFA."""
- transitions = None # TransitionMap
- action = None # Action
- action_priority = None # integer
- number = 0 # for debug output
- epsilon_closure = None # used by nfa_to_dfa()
-
- def __init__(self):
- # Preinitialise the list of empty transitions, because
- # the nfa-to-dfa algorithm needs it
- #self.transitions = {'':[]}
- self.transitions = TransitionMap()
- self.action_priority = LOWEST_PRIORITY
-
- def destroy(self):
- #print "Destroying", self ###
- self.transitions = None
- self.action = None
- self.epsilon_closure = None
-
- def add_transition(self, event, new_state):
- self.transitions.add(event, new_state)
-
- def link_to(self, state):
- """Add an epsilon-move from this state to another state."""
- self.add_transition('', state)
-
- def set_action(self, action, priority):
- """Make this an accepting state with the given action. If
- there is already an action, choose the action with highest
- priority."""
- if priority > self.action_priority:
- self.action = action
- self.action_priority = priority
-
- def get_action(self):
- return self.action
-
- def get_action_priority(self):
- return self.action_priority
-
- def is_accepting(self):
- return self.action is not None
-
- def __str__(self):
- return "State %d" % self.number
-
- def dump(self, file):
- # Header
- file.write(" State %d:\n" % self.number)
- # Transitions
- # self.dump_transitions(file)
- self.transitions.dump(file)
- # Action
- action = self.action
- priority = self.action_priority
- if action is not None:
- file.write(" %s [priority %d]\n" % (action, priority))
-
- def __lt__(self, other):
- return self.number < other.number
-
-
+ """A state of an NFA or DFA."""
+ transitions = None # TransitionMap
+ action = None # Action
+ action_priority = None # integer
+ number = 0 # for debug output
+ epsilon_closure = None # used by nfa_to_dfa()
+
+ def __init__(self):
+ # Preinitialise the list of empty transitions, because
+ # the nfa-to-dfa algorithm needs it
+ #self.transitions = {'':[]}
+ self.transitions = TransitionMap()
+ self.action_priority = LOWEST_PRIORITY
+
+ def destroy(self):
+ #print "Destroying", self ###
+ self.transitions = None
+ self.action = None
+ self.epsilon_closure = None
+
+ def add_transition(self, event, new_state):
+ self.transitions.add(event, new_state)
+
+ def link_to(self, state):
+ """Add an epsilon-move from this state to another state."""
+ self.add_transition('', state)
+
+ def set_action(self, action, priority):
+ """Make this an accepting state with the given action. If
+ there is already an action, choose the action with highest
+ priority."""
+ if priority > self.action_priority:
+ self.action = action
+ self.action_priority = priority
+
+ def get_action(self):
+ return self.action
+
+ def get_action_priority(self):
+ return self.action_priority
+
+ def is_accepting(self):
+ return self.action is not None
+
+ def __str__(self):
+ return "State %d" % self.number
+
+ def dump(self, file):
+ # Header
+ file.write(" State %d:\n" % self.number)
+ # Transitions
+ # self.dump_transitions(file)
+ self.transitions.dump(file)
+ # Action
+ action = self.action
+ priority = self.action_priority
+ if action is not None:
+ file.write(" %s [priority %d]\n" % (action, priority))
+
+ def __lt__(self, other):
+ return self.number < other.number
+
+
class FastMachine(object):
- """
- FastMachine is a deterministic machine represented in a way that
- allows fast scanning.
- """
- initial_states = None # {state_name:state}
- states = None # [state] where state = {event:state, 'else':state, 'action':Action}
- next_number = 1 # for debugging
-
- new_state_template = {
- '': None, 'bol': None, 'eol': None, 'eof': None, 'else': None
- }
-
- def __init__(self):
- self.initial_states = {}
- self.states = []
-
- def __del__(self):
- for state in self.states:
- state.clear()
-
- def new_state(self, action=None):
- number = self.next_number
- self.next_number = number + 1
- result = self.new_state_template.copy()
- result['number'] = number
- result['action'] = action
- self.states.append(result)
- return result
-
- def make_initial_state(self, name, state):
- self.initial_states[name] = state
-
- def add_transitions(self, state, event, new_state, maxint=maxint):
- if type(event) is tuple:
- code0, code1 = event
- if code0 == -maxint:
- state['else'] = new_state
- elif code1 != maxint:
- while code0 < code1:
- state[unichr(code0)] = new_state
- code0 += 1
- else:
- state[event] = new_state
-
- def get_initial_state(self, name):
- return self.initial_states[name]
-
- def dump(self, file):
- file.write("Plex.FastMachine:\n")
- file.write(" Initial states:\n")
- for name, state in sorted(self.initial_states.items()):
- file.write(" %s: %s\n" % (repr(name), state['number']))
- for state in self.states:
- self.dump_state(state, file)
-
- def dump_state(self, state, file):
- # Header
- file.write(" State %d:\n" % state['number'])
- # Transitions
- self.dump_transitions(state, file)
- # Action
- action = state['action']
- if action is not None:
- file.write(" %s\n" % action)
-
- def dump_transitions(self, state, file):
- chars_leading_to_state = {}
- special_to_state = {}
- for (c, s) in state.items():
- if len(c) == 1:
- chars = chars_leading_to_state.get(id(s), None)
- if chars is None:
- chars = []
- chars_leading_to_state[id(s)] = chars
- chars.append(c)
- elif len(c) <= 4:
- special_to_state[c] = s
- ranges_to_state = {}
- for state in self.states:
- char_list = chars_leading_to_state.get(id(state), None)
- if char_list:
- ranges = self.chars_to_ranges(char_list)
- ranges_to_state[ranges] = state
- ranges_list = ranges_to_state.keys()
- ranges_list.sort()
- for ranges in ranges_list:
- key = self.ranges_to_string(ranges)
- state = ranges_to_state[ranges]
- file.write(" %s --> State %d\n" % (key, state['number']))
- for key in ('bol', 'eol', 'eof', 'else'):
- state = special_to_state.get(key, None)
- if state:
- file.write(" %s --> State %d\n" % (key, state['number']))
-
- def chars_to_ranges(self, char_list):
- char_list.sort()
- i = 0
- n = len(char_list)
- result = []
- while i < n:
- c1 = ord(char_list[i])
- c2 = c1
- i += 1
- while i < n and ord(char_list[i]) == c2 + 1:
- i += 1
- c2 += 1
- result.append((chr(c1), chr(c2)))
- return tuple(result)
-
- def ranges_to_string(self, range_list):
- return ','.join(map(self.range_to_string, range_list))
-
- def range_to_string(self, range_tuple):
- (c1, c2) = range_tuple
- if c1 == c2:
- return repr(c1)
- else:
- return "%s..%s" % (repr(c1), repr(c2))
+ """
+ FastMachine is a deterministic machine represented in a way that
+ allows fast scanning.
+ """
+ initial_states = None # {state_name:state}
+ states = None # [state] where state = {event:state, 'else':state, 'action':Action}
+ next_number = 1 # for debugging
+
+ new_state_template = {
+ '': None, 'bol': None, 'eol': None, 'eof': None, 'else': None
+ }
+
+ def __init__(self):
+ self.initial_states = {}
+ self.states = []
+
+ def __del__(self):
+ for state in self.states:
+ state.clear()
+
+ def new_state(self, action=None):
+ number = self.next_number
+ self.next_number = number + 1
+ result = self.new_state_template.copy()
+ result['number'] = number
+ result['action'] = action
+ self.states.append(result)
+ return result
+
+ def make_initial_state(self, name, state):
+ self.initial_states[name] = state
+
+ def add_transitions(self, state, event, new_state, maxint=maxint):
+ if type(event) is tuple:
+ code0, code1 = event
+ if code0 == -maxint:
+ state['else'] = new_state
+ elif code1 != maxint:
+ while code0 < code1:
+ state[unichr(code0)] = new_state
+ code0 += 1
+ else:
+ state[event] = new_state
+
+ def get_initial_state(self, name):
+ return self.initial_states[name]
+
+ def dump(self, file):
+ file.write("Plex.FastMachine:\n")
+ file.write(" Initial states:\n")
+ for name, state in sorted(self.initial_states.items()):
+ file.write(" %s: %s\n" % (repr(name), state['number']))
+ for state in self.states:
+ self.dump_state(state, file)
+
+ def dump_state(self, state, file):
+ # Header
+ file.write(" State %d:\n" % state['number'])
+ # Transitions
+ self.dump_transitions(state, file)
+ # Action
+ action = state['action']
+ if action is not None:
+ file.write(" %s\n" % action)
+
+ def dump_transitions(self, state, file):
+ chars_leading_to_state = {}
+ special_to_state = {}
+ for (c, s) in state.items():
+ if len(c) == 1:
+ chars = chars_leading_to_state.get(id(s), None)
+ if chars is None:
+ chars = []
+ chars_leading_to_state[id(s)] = chars
+ chars.append(c)
+ elif len(c) <= 4:
+ special_to_state[c] = s
+ ranges_to_state = {}
+ for state in self.states:
+ char_list = chars_leading_to_state.get(id(state), None)
+ if char_list:
+ ranges = self.chars_to_ranges(char_list)
+ ranges_to_state[ranges] = state
+ ranges_list = ranges_to_state.keys()
+ ranges_list.sort()
+ for ranges in ranges_list:
+ key = self.ranges_to_string(ranges)
+ state = ranges_to_state[ranges]
+ file.write(" %s --> State %d\n" % (key, state['number']))
+ for key in ('bol', 'eol', 'eof', 'else'):
+ state = special_to_state.get(key, None)
+ if state:
+ file.write(" %s --> State %d\n" % (key, state['number']))
+
+ def chars_to_ranges(self, char_list):
+ char_list.sort()
+ i = 0
+ n = len(char_list)
+ result = []
+ while i < n:
+ c1 = ord(char_list[i])
+ c2 = c1
+ i += 1
+ while i < n and ord(char_list[i]) == c2 + 1:
+ i += 1
+ c2 += 1
+ result.append((chr(c1), chr(c2)))
+ return tuple(result)
+
+ def ranges_to_string(self, range_list):
+ return ','.join(map(self.range_to_string, range_list))
+
+ def range_to_string(self, range_tuple):
+ (c1, c2) = range_tuple
+ if c1 == c2:
+ return repr(c1)
+ else:
+ return "%s..%s" % (repr(c1), repr(c2))
diff --git a/contrib/tools/cython/Cython/Plex/Regexps.py b/contrib/tools/cython/Cython/Plex/Regexps.py
index 41816c939a..ffa3ded1d7 100644
--- a/contrib/tools/cython/Cython/Plex/Regexps.py
+++ b/contrib/tools/cython/Cython/Plex/Regexps.py
@@ -9,10 +9,10 @@
from __future__ import absolute_import
import types
-try:
- from sys import maxsize as maxint
-except ImportError:
- from sys import maxint
+try:
+ from sys import maxsize as maxint
+except ImportError:
+ from sys import maxint
from . import Errors
@@ -45,15 +45,15 @@ def chars_to_ranges(s):
while i < n:
code1 = ord(char_list[i])
code2 = code1 + 1
- i += 1
+ i += 1
while i < n and code2 >= ord(char_list[i]):
- code2 += 1
- i += 1
+ code2 += 1
+ i += 1
result.append(code1)
result.append(code2)
return result
-
+
def uppercase_range(code1, code2):
"""
If the range of characters from code1 to code2-1 includes any
@@ -67,7 +67,7 @@ def uppercase_range(code1, code2):
else:
return None
-
+
def lowercase_range(code1, code2):
"""
If the range of characters from code1 to code2-1 includes any
@@ -81,16 +81,16 @@ def lowercase_range(code1, code2):
else:
return None
-
+
def CodeRanges(code_list):
"""
Given a list of codes as returned by chars_to_ranges, return
an RE which will match a character in any of the ranges.
"""
- re_list = [CodeRange(code_list[i], code_list[i + 1]) for i in range(0, len(code_list), 2)]
+ re_list = [CodeRange(code_list[i], code_list[i + 1]) for i in range(0, len(code_list), 2)]
return Alt(*re_list)
-
+
def CodeRange(code1, code2):
"""
CodeRange(code1, code2) is an RE which matches any character
@@ -98,12 +98,12 @@ def CodeRange(code1, code2):
"""
if code1 <= nl_code < code2:
return Alt(RawCodeRange(code1, nl_code),
- RawNewline,
- RawCodeRange(nl_code + 1, code2))
+ RawNewline,
+ RawCodeRange(nl_code + 1, code2))
else:
return RawCodeRange(code1, code2)
-
+
#
# Abstract classes
#
@@ -116,12 +116,12 @@ class RE(object):
re1 | re2 is an RE which matches either |re1| or |re2|
"""
- nullable = 1 # True if this RE can match 0 input symbols
- match_nl = 1 # True if this RE can match a string ending with '\n'
- str = None # Set to a string to override the class's __str__ result
+ nullable = 1 # True if this RE can match 0 input symbols
+ match_nl = 1 # True if this RE can match a string ending with '\n'
+ str = None # Set to a string to override the class's __str__ result
def build_machine(self, machine, initial_state, final_state,
- match_bol, nocase):
+ match_bol, nocase):
"""
This method should add states to |machine| to implement this
RE, starting at |initial_state| and ending at |final_state|.
@@ -130,7 +130,7 @@ class RE(object):
letters should be treated as equivalent.
"""
raise NotImplementedError("%s.build_machine not implemented" %
- self.__class__.__name__)
+ self.__class__.__name__)
def build_opt(self, m, initial_state, c):
"""
@@ -166,18 +166,18 @@ class RE(object):
self.check_string(num, value)
if len(value) != 1:
raise Errors.PlexValueError("Invalid value for argument %d of Plex.%s."
- "Expected a string of length 1, got: %s" % (
- num, self.__class__.__name__, repr(value)))
+ "Expected a string of length 1, got: %s" % (
+ num, self.__class__.__name__, repr(value)))
def wrong_type(self, num, value, expected):
if type(value) == types.InstanceType:
- got = "%s.%s instance" % (
- value.__class__.__module__, value.__class__.__name__)
+ got = "%s.%s instance" % (
+ value.__class__.__module__, value.__class__.__name__)
else:
got = type(value).__name__
raise Errors.PlexTypeError("Invalid type for argument %d of Plex.%s "
- "(expected %s, got %s" % (
- num, self.__class__.__name__, expected, got))
+ "(expected %s, got %s" % (
+ num, self.__class__.__name__, expected, got))
#
# Primitive RE constructors
@@ -217,7 +217,7 @@ class RE(object):
## def calc_str(self):
## return "Char(%s)" % repr(self.char)
-
+
def Char(c):
"""
Char(c) is an RE which matches the character |c|.
@@ -229,7 +229,7 @@ def Char(c):
result.str = "Char(%s)" % repr(c)
return result
-
+
class RawCodeRange(RE):
"""
RawCodeRange(code1, code2) is a low-level RE which matches any character
@@ -238,9 +238,9 @@ class RawCodeRange(RE):
"""
nullable = 0
match_nl = 0
- range = None # (code, code)
- uppercase_range = None # (code, code) or None
- lowercase_range = None # (code, code) or None
+ range = None # (code, code)
+ uppercase_range = None # (code, code) or None
+ lowercase_range = None # (code, code) or None
def __init__(self, code1, code2):
self.range = (code1, code2)
@@ -260,7 +260,7 @@ class RawCodeRange(RE):
def calc_str(self):
return "CodeRange(%d,%d)" % (self.code1, self.code2)
-
+
class _RawNewline(RE):
"""
RawNewline is a low-level RE which matches a newline character.
@@ -275,7 +275,7 @@ class _RawNewline(RE):
s = self.build_opt(m, initial_state, EOL)
s.add_transition((nl_code, nl_code + 1), final_state)
-
+
RawNewline = _RawNewline()
@@ -305,7 +305,7 @@ class Seq(RE):
def __init__(self, *re_list):
nullable = 1
- for i, re in enumerate(re_list):
+ for i, re in enumerate(re_list):
self.check_re(i, re)
nullable = nullable and re.nullable
self.re_list = re_list
@@ -313,7 +313,7 @@ class Seq(RE):
i = len(re_list)
match_nl = 0
while i:
- i -= 1
+ i -= 1
re = re_list[i]
if re.match_nl:
match_nl = 1
@@ -329,7 +329,7 @@ class Seq(RE):
else:
s1 = initial_state
n = len(re_list)
- for i, re in enumerate(re_list):
+ for i, re in enumerate(re_list):
if i < n - 1:
s2 = m.new_state()
else:
@@ -362,7 +362,7 @@ class Alt(RE):
non_nullable_res.append(re)
if re.match_nl:
match_nl = 1
- i += 1
+ i += 1
self.nullable_res = nullable_res
self.non_nullable_res = non_nullable_res
self.nullable = nullable
@@ -419,7 +419,7 @@ class SwitchCase(RE):
def build_machine(self, m, initial_state, final_state, match_bol, nocase):
self.re.build_machine(m, initial_state, final_state, match_bol,
- self.nocase)
+ self.nocase)
def calc_str(self):
if self.nocase:
@@ -442,7 +442,7 @@ Empty.__doc__ = \
"""
Empty.str = "Empty"
-
+
def Str1(s):
"""
Str1(s) is an RE which matches the literal string |s|.
@@ -451,7 +451,7 @@ def Str1(s):
result.str = "Str(%s)" % repr(s)
return result
-
+
def Str(*strs):
"""
Str(s) is an RE which matches the literal string |s|.
@@ -464,7 +464,7 @@ def Str(*strs):
result.str = "Str(%s)" % ','.join(map(repr, strs))
return result
-
+
def Any(s):
"""
Any(s) is an RE which matches any character in the string |s|.
@@ -474,7 +474,7 @@ def Any(s):
result.str = "Any(%s)" % repr(s)
return result
-
+
def AnyBut(s):
"""
AnyBut(s) is an RE which matches any character (including
@@ -487,7 +487,7 @@ def AnyBut(s):
result.str = "AnyBut(%s)" % repr(s)
return result
-
+
AnyChar = AnyBut("")
AnyChar.__doc__ = \
"""
@@ -495,8 +495,8 @@ AnyChar.__doc__ = \
"""
AnyChar.str = "AnyChar"
-
-def Range(s1, s2=None):
+
+def Range(s1, s2=None):
"""
Range(c1, c2) is an RE which matches any single character in the range
|c1| to |c2| inclusive.
@@ -509,12 +509,12 @@ def Range(s1, s2=None):
else:
ranges = []
for i in range(0, len(s1), 2):
- ranges.append(CodeRange(ord(s1[i]), ord(s1[i + 1]) + 1))
+ ranges.append(CodeRange(ord(s1[i]), ord(s1[i + 1]) + 1))
result = Alt(*ranges)
result.str = "Range(%s)" % repr(s1)
return result
-
+
def Opt(re):
"""
Opt(re) is an RE which matches either |re| or the empty string.
@@ -523,7 +523,7 @@ def Opt(re):
result.str = "Opt(%s)" % re
return result
-
+
def Rep(re):
"""
Rep(re) is an RE which matches zero or more repetitions of |re|.
@@ -532,22 +532,22 @@ def Rep(re):
result.str = "Rep(%s)" % re
return result
-
+
def NoCase(re):
"""
NoCase(re) is an RE which matches the same strings as RE, but treating
upper and lower case letters as equivalent.
"""
- return SwitchCase(re, nocase=1)
-
+ return SwitchCase(re, nocase=1)
+
def Case(re):
"""
Case(re) is an RE which matches the same strings as RE, but treating
upper and lower case letters as distinct, i.e. it cancels the effect
of any enclosing NoCase().
"""
- return SwitchCase(re, nocase=0)
+ return SwitchCase(re, nocase=0)
#
# RE Constants
diff --git a/contrib/tools/cython/Cython/Plex/Scanners.pxd b/contrib/tools/cython/Cython/Plex/Scanners.pxd
index 6e75f55e61..6c22c0b208 100644
--- a/contrib/tools/cython/Cython/Plex/Scanners.pxd
+++ b/contrib/tools/cython/Cython/Plex/Scanners.pxd
@@ -28,23 +28,23 @@ cdef class Scanner:
cdef public level
- @cython.final
+ @cython.final
@cython.locals(input_state=long)
cdef next_char(self)
@cython.locals(action=Action)
- cpdef tuple read(self)
- @cython.final
+ cpdef tuple read(self)
+ @cython.final
cdef tuple scan_a_token(self)
- ##cdef tuple position(self) # used frequently by Parsing.py
+ ##cdef tuple position(self) # used frequently by Parsing.py
- @cython.final
+ @cython.final
@cython.locals(cur_pos=Py_ssize_t, cur_line=Py_ssize_t, cur_line_start=Py_ssize_t,
input_state=long, next_pos=Py_ssize_t, state=dict,
buf_start_pos=Py_ssize_t, buf_len=Py_ssize_t, buf_index=Py_ssize_t,
trace=bint, discard=Py_ssize_t, data=unicode, buffer=unicode)
cdef run_machine_inlined(self)
- @cython.final
+ @cython.final
cdef begin(self, state)
- @cython.final
+ @cython.final
cdef produce(self, value, text = *)
diff --git a/contrib/tools/cython/Cython/Plex/Scanners.py b/contrib/tools/cython/Cython/Plex/Scanners.py
index 88f7e2da3b..668bb488a8 100644
--- a/contrib/tools/cython/Cython/Plex/Scanners.py
+++ b/contrib/tools/cython/Cython/Plex/Scanners.py
@@ -1,4 +1,4 @@
-# cython: auto_pickle=False
+# cython: auto_pickle=False
#=======================================================================
#
# Python Lexical Analyser
@@ -11,7 +11,7 @@
from __future__ import absolute_import
import cython
-
+
cython.declare(BOL=object, EOL=object, EOF=object, NOT_FOUND=object)
from . import Errors
@@ -21,318 +21,318 @@ NOT_FOUND = object()
class Scanner(object):
- """
- A Scanner is used to read tokens from a stream of characters
- using the token set specified by a Plex.Lexicon.
-
- Constructor:
-
- Scanner(lexicon, stream, name = '')
-
- See the docstring of the __init__ method for details.
-
- Methods:
-
- See the docstrings of the individual methods for more
- information.
-
- read() --> (value, text)
- Reads the next lexical token from the stream.
-
- position() --> (name, line, col)
- Returns the position of the last token read using the
- read() method.
-
- begin(state_name)
- Causes scanner to change state.
-
- produce(value [, text])
- Causes return of a token value to the caller of the
- Scanner.
-
- """
-
- # lexicon = None # Lexicon
- # stream = None # file-like object
- # name = ''
- # buffer = ''
- # buf_start_pos = 0 # position in input of start of buffer
- # next_pos = 0 # position in input of next char to read
- # cur_pos = 0 # position in input of current char
- # cur_line = 1 # line number of current char
- # cur_line_start = 0 # position in input of start of current line
- # start_pos = 0 # position in input of start of token
- # start_line = 0 # line number of start of token
- # start_col = 0 # position in line of start of token
- # text = None # text of last token read
- # initial_state = None # Node
- # state_name = '' # Name of initial state
- # queue = None # list of tokens to be returned
- # trace = 0
-
- def __init__(self, lexicon, stream, name='', initial_pos=None):
- """
- Scanner(lexicon, stream, name = '')
-
- |lexicon| is a Plex.Lexicon instance specifying the lexical tokens
- to be recognised.
-
- |stream| can be a file object or anything which implements a
- compatible read() method.
-
- |name| is optional, and may be the name of the file being
- scanned or any other identifying string.
- """
- self.trace = 0
-
- self.buffer = u''
- self.buf_start_pos = 0
- self.next_pos = 0
- self.cur_pos = 0
- self.cur_line = 1
- self.start_pos = 0
- self.start_line = 0
- self.start_col = 0
- self.text = None
- self.state_name = None
-
- self.lexicon = lexicon
- self.stream = stream
- self.name = name
- self.queue = []
- self.initial_state = None
- self.begin('')
- self.next_pos = 0
- self.cur_pos = 0
- self.cur_line_start = 0
- self.cur_char = BOL
- self.input_state = 1
- if initial_pos is not None:
- self.cur_line, self.cur_line_start = initial_pos[1], -initial_pos[2]
-
- def read(self):
- """
- Read the next lexical token from the stream and return a
- tuple (value, text), where |value| is the value associated with
- the token as specified by the Lexicon, and |text| is the actual
- string read from the stream. Returns (None, '') on end of file.
- """
- queue = self.queue
- while not queue:
- self.text, action = self.scan_a_token()
- if action is None:
- self.produce(None)
- self.eof()
- else:
- value = action.perform(self, self.text)
- if value is not None:
- self.produce(value)
- result = queue[0]
- del queue[0]
- return result
-
- def scan_a_token(self):
- """
- Read the next input sequence recognised by the machine
- and return (text, action). Returns ('', None) on end of
- file.
- """
- self.start_pos = self.cur_pos
- self.start_line = self.cur_line
- self.start_col = self.cur_pos - self.cur_line_start
- action = self.run_machine_inlined()
- if action is not None:
- if self.trace:
- print("Scanner: read: Performing %s %d:%d" % (
- action, self.start_pos, self.cur_pos))
- text = self.buffer[
- self.start_pos - self.buf_start_pos:
- self.cur_pos - self.buf_start_pos]
- return (text, action)
- else:
- if self.cur_pos == self.start_pos:
- if self.cur_char is EOL:
- self.next_char()
- if self.cur_char is None or self.cur_char is EOF:
- return (u'', None)
- raise Errors.UnrecognizedInput(self, self.state_name)
-
- def run_machine_inlined(self):
- """
- Inlined version of run_machine for speed.
- """
- state = self.initial_state
- cur_pos = self.cur_pos
- cur_line = self.cur_line
- cur_line_start = self.cur_line_start
- cur_char = self.cur_char
- input_state = self.input_state
- next_pos = self.next_pos
- buffer = self.buffer
- buf_start_pos = self.buf_start_pos
- buf_len = len(buffer)
+ """
+ A Scanner is used to read tokens from a stream of characters
+ using the token set specified by a Plex.Lexicon.
+
+ Constructor:
+
+ Scanner(lexicon, stream, name = '')
+
+ See the docstring of the __init__ method for details.
+
+ Methods:
+
+ See the docstrings of the individual methods for more
+ information.
+
+ read() --> (value, text)
+ Reads the next lexical token from the stream.
+
+ position() --> (name, line, col)
+ Returns the position of the last token read using the
+ read() method.
+
+ begin(state_name)
+ Causes scanner to change state.
+
+ produce(value [, text])
+ Causes return of a token value to the caller of the
+ Scanner.
+
+ """
+
+ # lexicon = None # Lexicon
+ # stream = None # file-like object
+ # name = ''
+ # buffer = ''
+ # buf_start_pos = 0 # position in input of start of buffer
+ # next_pos = 0 # position in input of next char to read
+ # cur_pos = 0 # position in input of current char
+ # cur_line = 1 # line number of current char
+ # cur_line_start = 0 # position in input of start of current line
+ # start_pos = 0 # position in input of start of token
+ # start_line = 0 # line number of start of token
+ # start_col = 0 # position in line of start of token
+ # text = None # text of last token read
+ # initial_state = None # Node
+ # state_name = '' # Name of initial state
+ # queue = None # list of tokens to be returned
+ # trace = 0
+
+ def __init__(self, lexicon, stream, name='', initial_pos=None):
+ """
+ Scanner(lexicon, stream, name = '')
+
+ |lexicon| is a Plex.Lexicon instance specifying the lexical tokens
+ to be recognised.
+
+ |stream| can be a file object or anything which implements a
+ compatible read() method.
+
+ |name| is optional, and may be the name of the file being
+ scanned or any other identifying string.
+ """
+ self.trace = 0
+
+ self.buffer = u''
+ self.buf_start_pos = 0
+ self.next_pos = 0
+ self.cur_pos = 0
+ self.cur_line = 1
+ self.start_pos = 0
+ self.start_line = 0
+ self.start_col = 0
+ self.text = None
+ self.state_name = None
+
+ self.lexicon = lexicon
+ self.stream = stream
+ self.name = name
+ self.queue = []
+ self.initial_state = None
+ self.begin('')
+ self.next_pos = 0
+ self.cur_pos = 0
+ self.cur_line_start = 0
+ self.cur_char = BOL
+ self.input_state = 1
+ if initial_pos is not None:
+ self.cur_line, self.cur_line_start = initial_pos[1], -initial_pos[2]
+
+ def read(self):
+ """
+ Read the next lexical token from the stream and return a
+ tuple (value, text), where |value| is the value associated with
+ the token as specified by the Lexicon, and |text| is the actual
+ string read from the stream. Returns (None, '') on end of file.
+ """
+ queue = self.queue
+ while not queue:
+ self.text, action = self.scan_a_token()
+ if action is None:
+ self.produce(None)
+ self.eof()
+ else:
+ value = action.perform(self, self.text)
+ if value is not None:
+ self.produce(value)
+ result = queue[0]
+ del queue[0]
+ return result
+
+ def scan_a_token(self):
+ """
+ Read the next input sequence recognised by the machine
+ and return (text, action). Returns ('', None) on end of
+ file.
+ """
+ self.start_pos = self.cur_pos
+ self.start_line = self.cur_line
+ self.start_col = self.cur_pos - self.cur_line_start
+ action = self.run_machine_inlined()
+ if action is not None:
+ if self.trace:
+ print("Scanner: read: Performing %s %d:%d" % (
+ action, self.start_pos, self.cur_pos))
+ text = self.buffer[
+ self.start_pos - self.buf_start_pos:
+ self.cur_pos - self.buf_start_pos]
+ return (text, action)
+ else:
+ if self.cur_pos == self.start_pos:
+ if self.cur_char is EOL:
+ self.next_char()
+ if self.cur_char is None or self.cur_char is EOF:
+ return (u'', None)
+ raise Errors.UnrecognizedInput(self, self.state_name)
+
+ def run_machine_inlined(self):
+ """
+ Inlined version of run_machine for speed.
+ """
+ state = self.initial_state
+ cur_pos = self.cur_pos
+ cur_line = self.cur_line
+ cur_line_start = self.cur_line_start
+ cur_char = self.cur_char
+ input_state = self.input_state
+ next_pos = self.next_pos
+ buffer = self.buffer
+ buf_start_pos = self.buf_start_pos
+ buf_len = len(buffer)
b_action, b_cur_pos, b_cur_line, b_cur_line_start, b_cur_char, b_input_state, b_next_pos = \
- None, 0, 0, 0, u'', 0, 0
- trace = self.trace
- while 1:
- if trace: #TRACE#
- print("State %d, %d/%d:%s -->" % ( #TRACE#
- state['number'], input_state, cur_pos, repr(cur_char))) #TRACE#
- # Begin inlined self.save_for_backup()
- #action = state.action #@slow
- action = state['action'] #@fast
- if action is not None:
- b_action, b_cur_pos, b_cur_line, b_cur_line_start, b_cur_char, b_input_state, b_next_pos = \
- action, cur_pos, cur_line, cur_line_start, cur_char, input_state, next_pos
- # End inlined self.save_for_backup()
- c = cur_char
- #new_state = state.new_state(c) #@slow
- new_state = state.get(c, NOT_FOUND) #@fast
- if new_state is NOT_FOUND: #@fast
- new_state = c and state.get('else') #@fast
- if new_state:
- if trace: #TRACE#
- print("State %d" % new_state['number']) #TRACE#
- state = new_state
- # Begin inlined: self.next_char()
- if input_state == 1:
- cur_pos = next_pos
- # Begin inlined: c = self.read_char()
- buf_index = next_pos - buf_start_pos
- if buf_index < buf_len:
- c = buffer[buf_index]
- next_pos += 1
- else:
- discard = self.start_pos - buf_start_pos
- data = self.stream.read(0x1000)
- buffer = self.buffer[discard:] + data
- self.buffer = buffer
- buf_start_pos += discard
- self.buf_start_pos = buf_start_pos
- buf_len = len(buffer)
- buf_index -= discard
- if data:
- c = buffer[buf_index]
- next_pos += 1
- else:
- c = u''
- # End inlined: c = self.read_char()
- if c == u'\n':
- cur_char = EOL
- input_state = 2
- elif not c:
- cur_char = EOL
- input_state = 4
- else:
- cur_char = c
- elif input_state == 2:
- cur_char = u'\n'
- input_state = 3
- elif input_state == 3:
- cur_line += 1
- cur_line_start = cur_pos = next_pos
- cur_char = BOL
- input_state = 1
- elif input_state == 4:
- cur_char = EOF
- input_state = 5
- else: # input_state = 5
- cur_char = u''
- # End inlined self.next_char()
- else: # not new_state
- if trace: #TRACE#
- print("blocked") #TRACE#
- # Begin inlined: action = self.back_up()
- if b_action is not None:
- (action, cur_pos, cur_line, cur_line_start,
- cur_char, input_state, next_pos) = \
- (b_action, b_cur_pos, b_cur_line, b_cur_line_start,
- b_cur_char, b_input_state, b_next_pos)
- else:
- action = None
- break # while 1
- # End inlined: action = self.back_up()
- self.cur_pos = cur_pos
- self.cur_line = cur_line
- self.cur_line_start = cur_line_start
- self.cur_char = cur_char
- self.input_state = input_state
- self.next_pos = next_pos
- if trace: #TRACE#
- if action is not None: #TRACE#
- print("Doing %s" % action) #TRACE#
- return action
-
- def next_char(self):
- input_state = self.input_state
- if self.trace:
- print("Scanner: next: %s [%d] %d" % (" " * 20, input_state, self.cur_pos))
+ None, 0, 0, 0, u'', 0, 0
+ trace = self.trace
+ while 1:
+ if trace: #TRACE#
+ print("State %d, %d/%d:%s -->" % ( #TRACE#
+ state['number'], input_state, cur_pos, repr(cur_char))) #TRACE#
+ # Begin inlined self.save_for_backup()
+ #action = state.action #@slow
+ action = state['action'] #@fast
+ if action is not None:
+ b_action, b_cur_pos, b_cur_line, b_cur_line_start, b_cur_char, b_input_state, b_next_pos = \
+ action, cur_pos, cur_line, cur_line_start, cur_char, input_state, next_pos
+ # End inlined self.save_for_backup()
+ c = cur_char
+ #new_state = state.new_state(c) #@slow
+ new_state = state.get(c, NOT_FOUND) #@fast
+ if new_state is NOT_FOUND: #@fast
+ new_state = c and state.get('else') #@fast
+ if new_state:
+ if trace: #TRACE#
+ print("State %d" % new_state['number']) #TRACE#
+ state = new_state
+ # Begin inlined: self.next_char()
+ if input_state == 1:
+ cur_pos = next_pos
+ # Begin inlined: c = self.read_char()
+ buf_index = next_pos - buf_start_pos
+ if buf_index < buf_len:
+ c = buffer[buf_index]
+ next_pos += 1
+ else:
+ discard = self.start_pos - buf_start_pos
+ data = self.stream.read(0x1000)
+ buffer = self.buffer[discard:] + data
+ self.buffer = buffer
+ buf_start_pos += discard
+ self.buf_start_pos = buf_start_pos
+ buf_len = len(buffer)
+ buf_index -= discard
+ if data:
+ c = buffer[buf_index]
+ next_pos += 1
+ else:
+ c = u''
+ # End inlined: c = self.read_char()
+ if c == u'\n':
+ cur_char = EOL
+ input_state = 2
+ elif not c:
+ cur_char = EOL
+ input_state = 4
+ else:
+ cur_char = c
+ elif input_state == 2:
+ cur_char = u'\n'
+ input_state = 3
+ elif input_state == 3:
+ cur_line += 1
+ cur_line_start = cur_pos = next_pos
+ cur_char = BOL
+ input_state = 1
+ elif input_state == 4:
+ cur_char = EOF
+ input_state = 5
+ else: # input_state = 5
+ cur_char = u''
+ # End inlined self.next_char()
+ else: # not new_state
+ if trace: #TRACE#
+ print("blocked") #TRACE#
+ # Begin inlined: action = self.back_up()
+ if b_action is not None:
+ (action, cur_pos, cur_line, cur_line_start,
+ cur_char, input_state, next_pos) = \
+ (b_action, b_cur_pos, b_cur_line, b_cur_line_start,
+ b_cur_char, b_input_state, b_next_pos)
+ else:
+ action = None
+ break # while 1
+ # End inlined: action = self.back_up()
+ self.cur_pos = cur_pos
+ self.cur_line = cur_line
+ self.cur_line_start = cur_line_start
+ self.cur_char = cur_char
+ self.input_state = input_state
+ self.next_pos = next_pos
+ if trace: #TRACE#
+ if action is not None: #TRACE#
+ print("Doing %s" % action) #TRACE#
+ return action
+
+ def next_char(self):
+ input_state = self.input_state
+ if self.trace:
+ print("Scanner: next: %s [%d] %d" % (" " * 20, input_state, self.cur_pos))
if input_state == 1:
- self.cur_pos = self.next_pos
- c = self.read_char()
- if c == u'\n':
- self.cur_char = EOL
- self.input_state = 2
- elif not c:
- self.cur_char = EOL
- self.input_state = 4
+ self.cur_pos = self.next_pos
+ c = self.read_char()
+ if c == u'\n':
+ self.cur_char = EOL
+ self.input_state = 2
+ elif not c:
+ self.cur_char = EOL
+ self.input_state = 4
else:
- self.cur_char = c
+ self.cur_char = c
elif input_state == 2:
- self.cur_char = u'\n'
- self.input_state = 3
+ self.cur_char = u'\n'
+ self.input_state = 3
elif input_state == 3:
- self.cur_line += 1
- self.cur_line_start = self.cur_pos = self.next_pos
- self.cur_char = BOL
- self.input_state = 1
+ self.cur_line += 1
+ self.cur_line_start = self.cur_pos = self.next_pos
+ self.cur_char = BOL
+ self.input_state = 1
elif input_state == 4:
- self.cur_char = EOF
- self.input_state = 5
- else: # input_state = 5
- self.cur_char = u''
- if self.trace:
- print("--> [%d] %d %r" % (input_state, self.cur_pos, self.cur_char))
-
- def position(self):
- """
- Return a tuple (name, line, col) representing the location of
- the last token read using the read() method. |name| is the
- name that was provided to the Scanner constructor; |line|
- is the line number in the stream (1-based); |col| is the
- position within the line of the first character of the token
- (0-based).
- """
- return (self.name, self.start_line, self.start_col)
-
- def get_position(self):
- """Python accessible wrapper around position(), only for error reporting.
- """
- return self.position()
-
- def begin(self, state_name):
- """Set the current state of the scanner to the named state."""
- self.initial_state = (
- self.lexicon.get_initial_state(state_name))
- self.state_name = state_name
-
- def produce(self, value, text=None):
- """
- Called from an action procedure, causes |value| to be returned
- as the token value from read(). If |text| is supplied, it is
- returned in place of the scanned text.
-
- produce() can be called more than once during a single call to an action
- procedure, in which case the tokens are queued up and returned one
- at a time by subsequent calls to read(), until the queue is empty,
- whereupon scanning resumes.
- """
- if text is None:
- text = self.text
- self.queue.append((value, text))
-
- def eof(self):
- """
- Override this method if you want something to be done at
- end of file.
- """
+ self.cur_char = EOF
+ self.input_state = 5
+ else: # input_state = 5
+ self.cur_char = u''
+ if self.trace:
+ print("--> [%d] %d %r" % (input_state, self.cur_pos, self.cur_char))
+
+ def position(self):
+ """
+ Return a tuple (name, line, col) representing the location of
+ the last token read using the read() method. |name| is the
+ name that was provided to the Scanner constructor; |line|
+ is the line number in the stream (1-based); |col| is the
+ position within the line of the first character of the token
+ (0-based).
+ """
+ return (self.name, self.start_line, self.start_col)
+
+ def get_position(self):
+ """Python accessible wrapper around position(), only for error reporting.
+ """
+ return self.position()
+
+ def begin(self, state_name):
+ """Set the current state of the scanner to the named state."""
+ self.initial_state = (
+ self.lexicon.get_initial_state(state_name))
+ self.state_name = state_name
+
+ def produce(self, value, text=None):
+ """
+ Called from an action procedure, causes |value| to be returned
+ as the token value from read(). If |text| is supplied, it is
+ returned in place of the scanned text.
+
+ produce() can be called more than once during a single call to an action
+ procedure, in which case the tokens are queued up and returned one
+ at a time by subsequent calls to read(), until the queue is empty,
+ whereupon scanning resumes.
+ """
+ if text is None:
+ text = self.text
+ self.queue.append((value, text))
+
+ def eof(self):
+ """
+ Override this method if you want something to be done at
+ end of file.
+ """
diff --git a/contrib/tools/cython/Cython/Plex/Traditional.py b/contrib/tools/cython/Cython/Plex/Traditional.py
index ec7252daed..f9198a8b18 100644
--- a/contrib/tools/cython/Cython/Plex/Traditional.py
+++ b/contrib/tools/cython/Cython/Plex/Traditional.py
@@ -13,146 +13,146 @@ from .Errors import PlexError
class RegexpSyntaxError(PlexError):
- pass
+ pass
def re(s):
- """
- Convert traditional string representation of regular expression |s|
- into Plex representation.
- """
- return REParser(s).parse_re()
+ """
+ Convert traditional string representation of regular expression |s|
+ into Plex representation.
+ """
+ return REParser(s).parse_re()
class REParser(object):
- def __init__(self, s):
- self.s = s
- self.i = -1
- self.end = 0
- self.next()
-
- def parse_re(self):
- re = self.parse_alt()
- if not self.end:
- self.error("Unexpected %s" % repr(self.c))
- return re
-
- def parse_alt(self):
- """Parse a set of alternative regexps."""
- re = self.parse_seq()
- if self.c == '|':
- re_list = [re]
- while self.c == '|':
- self.next()
- re_list.append(self.parse_seq())
- re = Alt(*re_list)
- return re
-
- def parse_seq(self):
- """Parse a sequence of regexps."""
- re_list = []
- while not self.end and not self.c in "|)":
- re_list.append(self.parse_mod())
- return Seq(*re_list)
-
- def parse_mod(self):
- """Parse a primitive regexp followed by *, +, ? modifiers."""
- re = self.parse_prim()
- while not self.end and self.c in "*+?":
- if self.c == '*':
- re = Rep(re)
- elif self.c == '+':
- re = Rep1(re)
- else: # self.c == '?'
- re = Opt(re)
- self.next()
- return re
-
- def parse_prim(self):
- """Parse a primitive regexp."""
+ def __init__(self, s):
+ self.s = s
+ self.i = -1
+ self.end = 0
+ self.next()
+
+ def parse_re(self):
+ re = self.parse_alt()
+ if not self.end:
+ self.error("Unexpected %s" % repr(self.c))
+ return re
+
+ def parse_alt(self):
+ """Parse a set of alternative regexps."""
+ re = self.parse_seq()
+ if self.c == '|':
+ re_list = [re]
+ while self.c == '|':
+ self.next()
+ re_list.append(self.parse_seq())
+ re = Alt(*re_list)
+ return re
+
+ def parse_seq(self):
+ """Parse a sequence of regexps."""
+ re_list = []
+ while not self.end and not self.c in "|)":
+ re_list.append(self.parse_mod())
+ return Seq(*re_list)
+
+ def parse_mod(self):
+ """Parse a primitive regexp followed by *, +, ? modifiers."""
+ re = self.parse_prim()
+ while not self.end and self.c in "*+?":
+ if self.c == '*':
+ re = Rep(re)
+ elif self.c == '+':
+ re = Rep1(re)
+ else: # self.c == '?'
+ re = Opt(re)
+ self.next()
+ return re
+
+ def parse_prim(self):
+ """Parse a primitive regexp."""
c = self.get()
- if c == '.':
- re = AnyBut("\n")
- elif c == '^':
- re = Bol
- elif c == '$':
- re = Eol
- elif c == '(':
- re = self.parse_alt()
- self.expect(')')
- elif c == '[':
- re = self.parse_charset()
- self.expect(']')
- else:
- if c == '\\':
- c = self.get()
- re = Char(c)
- return re
-
- def parse_charset(self):
- """Parse a charset. Does not include the surrounding []."""
- char_list = []
- invert = 0
- if self.c == '^':
- invert = 1
- self.next()
- if self.c == ']':
- char_list.append(']')
- self.next()
- while not self.end and self.c != ']':
- c1 = self.get()
- if self.c == '-' and self.lookahead(1) != ']':
- self.next()
- c2 = self.get()
- for a in range(ord(c1), ord(c2) + 1):
- char_list.append(chr(a))
- else:
- char_list.append(c1)
- chars = ''.join(char_list)
- if invert:
- return AnyBut(chars)
- else:
- return Any(chars)
-
- def next(self):
- """Advance to the next char."""
- s = self.s
- i = self.i = self.i + 1
- if i < len(s):
- self.c = s[i]
- else:
- self.c = ''
- self.end = 1
-
- def get(self):
- if self.end:
- self.error("Premature end of string")
- c = self.c
- self.next()
- return c
-
- def lookahead(self, n):
- """Look ahead n chars."""
- j = self.i + n
- if j < len(self.s):
- return self.s[j]
- else:
- return ''
-
- def expect(self, c):
- """
- Expect to find character |c| at current position.
- Raises an exception otherwise.
- """
- if self.c == c:
- self.next()
- else:
- self.error("Missing %s" % repr(c))
-
- def error(self, mess):
- """Raise exception to signal syntax error in regexp."""
- raise RegexpSyntaxError("Syntax error in regexp %s at position %d: %s" % (
- repr(self.s), self.i, mess))
+ if c == '.':
+ re = AnyBut("\n")
+ elif c == '^':
+ re = Bol
+ elif c == '$':
+ re = Eol
+ elif c == '(':
+ re = self.parse_alt()
+ self.expect(')')
+ elif c == '[':
+ re = self.parse_charset()
+ self.expect(']')
+ else:
+ if c == '\\':
+ c = self.get()
+ re = Char(c)
+ return re
+
+ def parse_charset(self):
+ """Parse a charset. Does not include the surrounding []."""
+ char_list = []
+ invert = 0
+ if self.c == '^':
+ invert = 1
+ self.next()
+ if self.c == ']':
+ char_list.append(']')
+ self.next()
+ while not self.end and self.c != ']':
+ c1 = self.get()
+ if self.c == '-' and self.lookahead(1) != ']':
+ self.next()
+ c2 = self.get()
+ for a in range(ord(c1), ord(c2) + 1):
+ char_list.append(chr(a))
+ else:
+ char_list.append(c1)
+ chars = ''.join(char_list)
+ if invert:
+ return AnyBut(chars)
+ else:
+ return Any(chars)
+
+ def next(self):
+ """Advance to the next char."""
+ s = self.s
+ i = self.i = self.i + 1
+ if i < len(s):
+ self.c = s[i]
+ else:
+ self.c = ''
+ self.end = 1
+
+ def get(self):
+ if self.end:
+ self.error("Premature end of string")
+ c = self.c
+ self.next()
+ return c
+
+ def lookahead(self, n):
+ """Look ahead n chars."""
+ j = self.i + n
+ if j < len(self.s):
+ return self.s[j]
+ else:
+ return ''
+
+ def expect(self, c):
+ """
+ Expect to find character |c| at current position.
+ Raises an exception otherwise.
+ """
+ if self.c == c:
+ self.next()
+ else:
+ self.error("Missing %s" % repr(c))
+
+ def error(self, mess):
+ """Raise exception to signal syntax error in regexp."""
+ raise RegexpSyntaxError("Syntax error in regexp %s at position %d: %s" % (
+ repr(self.s), self.i, mess))
diff --git a/contrib/tools/cython/Cython/Plex/Transitions.py b/contrib/tools/cython/Cython/Plex/Transitions.py
index 3833817946..92c8a34df5 100644
--- a/contrib/tools/cython/Cython/Plex/Transitions.py
+++ b/contrib/tools/cython/Cython/Plex/Transitions.py
@@ -1,242 +1,242 @@
#
-# Plex - Transition Maps
+# Plex - Transition Maps
#
-# This version represents state sets directly as dicts for speed.
+# This version represents state sets directly as dicts for speed.
#
from __future__ import absolute_import
-try:
- from sys import maxsize as maxint
-except ImportError:
- from sys import maxint
+try:
+ from sys import maxsize as maxint
+except ImportError:
+ from sys import maxint
class TransitionMap(object):
- """
- A TransitionMap maps an input event to a set of states.
- An input event is one of: a range of character codes,
- the empty string (representing an epsilon move), or one
- of the special symbols BOL, EOL, EOF.
-
- For characters, this implementation compactly represents
- the map by means of a list:
-
- [code_0, states_0, code_1, states_1, code_2, states_2,
- ..., code_n-1, states_n-1, code_n]
-
- where |code_i| is a character code, and |states_i| is a
- set of states corresponding to characters with codes |c|
- in the range |code_i| <= |c| <= |code_i+1|.
-
- The following invariants hold:
- n >= 1
- code_0 == -maxint
- code_n == maxint
- code_i < code_i+1 for i in 0..n-1
- states_0 == states_n-1
-
- Mappings for the special events '', BOL, EOL, EOF are
- kept separately in a dictionary.
- """
-
- map = None # The list of codes and states
- special = None # Mapping for special events
-
- def __init__(self, map=None, special=None):
- if not map:
- map = [-maxint, {}, maxint]
- if not special:
- special = {}
- self.map = map
- self.special = special
- #self.check() ###
-
- def add(self, event, new_state,
- TupleType=tuple):
- """
- Add transition to |new_state| on |event|.
- """
- if type(event) is TupleType:
- code0, code1 = event
- i = self.split(code0)
- j = self.split(code1)
- map = self.map
- while i < j:
- map[i + 1][new_state] = 1
- i += 2
+ """
+ A TransitionMap maps an input event to a set of states.
+ An input event is one of: a range of character codes,
+ the empty string (representing an epsilon move), or one
+ of the special symbols BOL, EOL, EOF.
+
+ For characters, this implementation compactly represents
+ the map by means of a list:
+
+ [code_0, states_0, code_1, states_1, code_2, states_2,
+ ..., code_n-1, states_n-1, code_n]
+
+ where |code_i| is a character code, and |states_i| is a
+ set of states corresponding to characters with codes |c|
+ in the range |code_i| <= |c| <= |code_i+1|.
+
+ The following invariants hold:
+ n >= 1
+ code_0 == -maxint
+ code_n == maxint
+ code_i < code_i+1 for i in 0..n-1
+ states_0 == states_n-1
+
+ Mappings for the special events '', BOL, EOL, EOF are
+ kept separately in a dictionary.
+ """
+
+ map = None # The list of codes and states
+ special = None # Mapping for special events
+
+ def __init__(self, map=None, special=None):
+ if not map:
+ map = [-maxint, {}, maxint]
+ if not special:
+ special = {}
+ self.map = map
+ self.special = special
+ #self.check() ###
+
+ def add(self, event, new_state,
+ TupleType=tuple):
+ """
+ Add transition to |new_state| on |event|.
+ """
+ if type(event) is TupleType:
+ code0, code1 = event
+ i = self.split(code0)
+ j = self.split(code1)
+ map = self.map
+ while i < j:
+ map[i + 1][new_state] = 1
+ i += 2
+ else:
+ self.get_special(event)[new_state] = 1
+
+ def add_set(self, event, new_set,
+ TupleType=tuple):
+ """
+ Add transitions to the states in |new_set| on |event|.
+ """
+ if type(event) is TupleType:
+ code0, code1 = event
+ i = self.split(code0)
+ j = self.split(code1)
+ map = self.map
+ while i < j:
+ map[i + 1].update(new_set)
+ i += 2
+ else:
+ self.get_special(event).update(new_set)
+
+ def get_epsilon(self,
+ none=None):
+ """
+ Return the mapping for epsilon, or None.
+ """
+ return self.special.get('', none)
+
+ def iteritems(self,
+ len=len):
+ """
+ Return the mapping as an iterable of ((code1, code2), state_set) and
+ (special_event, state_set) pairs.
+ """
+ result = []
+ map = self.map
+ else_set = map[1]
+ i = 0
+ n = len(map) - 1
+ code0 = map[0]
+ while i < n:
+ set = map[i + 1]
+ code1 = map[i + 2]
+ if set or else_set:
+ result.append(((code0, code1), set))
+ code0 = code1
+ i += 2
+ for event, set in self.special.items():
+ if set:
+ result.append((event, set))
+ return iter(result)
+
+ items = iteritems
+
+ # ------------------- Private methods --------------------
+
+ def split(self, code,
+ len=len, maxint=maxint):
+ """
+ Search the list for the position of the split point for |code|,
+ inserting a new split point if necessary. Returns index |i| such
+ that |code| == |map[i]|.
+ """
+ # We use a funky variation on binary search.
+ map = self.map
+ hi = len(map) - 1
+ # Special case: code == map[-1]
+ if code == maxint:
+ return hi
+ # General case
+ lo = 0
+ # loop invariant: map[lo] <= code < map[hi] and hi - lo >= 2
+ while hi - lo >= 4:
+ # Find midpoint truncated to even index
+ mid = ((lo + hi) // 2) & ~1
+ if code < map[mid]:
+ hi = mid
+ else:
+ lo = mid
+ # map[lo] <= code < map[hi] and hi - lo == 2
+ if map[lo] == code:
+ return lo
+ else:
+ map[hi:hi] = [code, map[hi - 1].copy()]
+ #self.check() ###
+ return hi
+
+ def get_special(self, event):
+ """
+ Get state set for special event, adding a new entry if necessary.
+ """
+ special = self.special
+ set = special.get(event, None)
+ if not set:
+ set = {}
+ special[event] = set
+ return set
+
+ # --------------------- Conversion methods -----------------------
+
+ def __str__(self):
+ map_strs = []
+ map = self.map
+ n = len(map)
+ i = 0
+ while i < n:
+ code = map[i]
+ if code == -maxint:
+ code_str = "-inf"
+ elif code == maxint:
+ code_str = "inf"
+ else:
+ code_str = str(code)
+ map_strs.append(code_str)
+ i += 1
+ if i < n:
+ map_strs.append(state_set_str(map[i]))
+ i += 1
+ special_strs = {}
+ for event, set in self.special.items():
+ special_strs[event] = state_set_str(set)
+ return "[%s]+%s" % (
+ ','.join(map_strs),
+ special_strs
+ )
+
+ # --------------------- Debugging methods -----------------------
+
+ def check(self):
+ """Check data structure integrity."""
+ if not self.map[-3] < self.map[-1]:
+ print(self)
+ assert 0
+
+ def dump(self, file):
+ map = self.map
+ i = 0
+ n = len(map) - 1
+ while i < n:
+ self.dump_range(map[i], map[i + 2], map[i + 1], file)
+ i += 2
+ for event, set in self.special.items():
+ if set:
+ if not event:
+ event = 'empty'
+ self.dump_trans(event, set, file)
+
+ def dump_range(self, code0, code1, set, file):
+ if set:
+ if code0 == -maxint:
+ if code1 == maxint:
+ k = "any"
+ else:
+ k = "< %s" % self.dump_char(code1)
+ elif code1 == maxint:
+ k = "> %s" % self.dump_char(code0 - 1)
+ elif code0 == code1 - 1:
+ k = self.dump_char(code0)
+ else:
+ k = "%s..%s" % (self.dump_char(code0),
+ self.dump_char(code1 - 1))
+ self.dump_trans(k, set, file)
+
+ def dump_char(self, code):
+ if 0 <= code <= 255:
+ return repr(chr(code))
else:
- self.get_special(event)[new_state] = 1
-
- def add_set(self, event, new_set,
- TupleType=tuple):
- """
- Add transitions to the states in |new_set| on |event|.
- """
- if type(event) is TupleType:
- code0, code1 = event
- i = self.split(code0)
- j = self.split(code1)
- map = self.map
- while i < j:
- map[i + 1].update(new_set)
- i += 2
- else:
- self.get_special(event).update(new_set)
-
- def get_epsilon(self,
- none=None):
- """
- Return the mapping for epsilon, or None.
- """
- return self.special.get('', none)
-
- def iteritems(self,
- len=len):
- """
- Return the mapping as an iterable of ((code1, code2), state_set) and
- (special_event, state_set) pairs.
- """
- result = []
- map = self.map
- else_set = map[1]
- i = 0
- n = len(map) - 1
- code0 = map[0]
- while i < n:
- set = map[i + 1]
- code1 = map[i + 2]
- if set or else_set:
- result.append(((code0, code1), set))
- code0 = code1
- i += 2
- for event, set in self.special.items():
- if set:
- result.append((event, set))
- return iter(result)
-
- items = iteritems
-
- # ------------------- Private methods --------------------
-
- def split(self, code,
- len=len, maxint=maxint):
- """
- Search the list for the position of the split point for |code|,
- inserting a new split point if necessary. Returns index |i| such
- that |code| == |map[i]|.
- """
- # We use a funky variation on binary search.
- map = self.map
- hi = len(map) - 1
- # Special case: code == map[-1]
- if code == maxint:
- return hi
- # General case
- lo = 0
- # loop invariant: map[lo] <= code < map[hi] and hi - lo >= 2
- while hi - lo >= 4:
- # Find midpoint truncated to even index
- mid = ((lo + hi) // 2) & ~1
- if code < map[mid]:
- hi = mid
- else:
- lo = mid
- # map[lo] <= code < map[hi] and hi - lo == 2
- if map[lo] == code:
- return lo
- else:
- map[hi:hi] = [code, map[hi - 1].copy()]
- #self.check() ###
- return hi
-
- def get_special(self, event):
- """
- Get state set for special event, adding a new entry if necessary.
- """
- special = self.special
- set = special.get(event, None)
- if not set:
- set = {}
- special[event] = set
- return set
-
- # --------------------- Conversion methods -----------------------
-
- def __str__(self):
- map_strs = []
- map = self.map
- n = len(map)
- i = 0
- while i < n:
- code = map[i]
- if code == -maxint:
- code_str = "-inf"
- elif code == maxint:
- code_str = "inf"
- else:
- code_str = str(code)
- map_strs.append(code_str)
- i += 1
- if i < n:
- map_strs.append(state_set_str(map[i]))
- i += 1
- special_strs = {}
- for event, set in self.special.items():
- special_strs[event] = state_set_str(set)
- return "[%s]+%s" % (
- ','.join(map_strs),
- special_strs
- )
-
- # --------------------- Debugging methods -----------------------
-
- def check(self):
- """Check data structure integrity."""
- if not self.map[-3] < self.map[-1]:
- print(self)
- assert 0
-
- def dump(self, file):
- map = self.map
- i = 0
- n = len(map) - 1
- while i < n:
- self.dump_range(map[i], map[i + 2], map[i + 1], file)
- i += 2
- for event, set in self.special.items():
- if set:
- if not event:
- event = 'empty'
- self.dump_trans(event, set, file)
-
- def dump_range(self, code0, code1, set, file):
- if set:
- if code0 == -maxint:
- if code1 == maxint:
- k = "any"
- else:
- k = "< %s" % self.dump_char(code1)
- elif code1 == maxint:
- k = "> %s" % self.dump_char(code0 - 1)
- elif code0 == code1 - 1:
- k = self.dump_char(code0)
- else:
- k = "%s..%s" % (self.dump_char(code0),
- self.dump_char(code1 - 1))
- self.dump_trans(k, set, file)
-
- def dump_char(self, code):
- if 0 <= code <= 255:
- return repr(chr(code))
- else:
- return "chr(%d)" % code
+ return "chr(%d)" % code
- def dump_trans(self, key, set, file):
- file.write(" %s --> %s\n" % (key, self.dump_set(set)))
+ def dump_trans(self, key, set, file):
+ file.write(" %s --> %s\n" % (key, self.dump_set(set)))
- def dump_set(self, set):
- return state_set_str(set)
+ def dump_set(self, set):
+ return state_set_str(set)
#
@@ -248,4 +248,4 @@ class TransitionMap(object):
# set1[state] = 1
def state_set_str(set):
- return "[%s]" % ','.join(["S%d" % state.number for state in set])
+ return "[%s]" % ','.join(["S%d" % state.number for state in set])
diff --git a/contrib/tools/cython/Cython/Runtime/refnanny.pyx b/contrib/tools/cython/Cython/Runtime/refnanny.pyx
index d4b873fe97..bafda31cfa 100644
--- a/contrib/tools/cython/Cython/Runtime/refnanny.pyx
+++ b/contrib/tools/cython/Cython/Runtime/refnanny.pyx
@@ -1,5 +1,5 @@
# cython: language_level=3, auto_pickle=False
-
+
from cpython.ref cimport PyObject, Py_INCREF, Py_DECREF, Py_XDECREF, Py_XINCREF
from cpython.exc cimport PyErr_Fetch, PyErr_Restore
from cpython.pystate cimport PyThreadState_Get
@@ -32,7 +32,7 @@ cdef class Context(object):
cdef regref(self, obj, lineno, bint is_null):
log(LOG_ALL, u'regref', u"<NULL>" if is_null else obj, lineno)
if is_null:
- self.errors.append(f"NULL argument on line {lineno}")
+ self.errors.append(f"NULL argument on line {lineno}")
return
id_ = id(obj)
count, linenumbers = self.refs.get(id_, (0, []))
@@ -43,12 +43,12 @@ cdef class Context(object):
# returns whether it is ok to do the decref operation
log(LOG_ALL, u'delref', u"<NULL>" if is_null else obj, lineno)
if is_null:
- self.errors.append(f"NULL argument on line {lineno}")
+ self.errors.append(f"NULL argument on line {lineno}")
return False
id_ = id(obj)
count, linenumbers = self.refs.get(id_, (0, []))
if count == 0:
- self.errors.append(f"Too many decrefs on line {lineno}, reference acquired on lines {linenumbers!r}")
+ self.errors.append(f"Too many decrefs on line {lineno}, reference acquired on lines {linenumbers!r}")
return False
elif count == 1:
del self.refs[id_]
@@ -61,7 +61,7 @@ cdef class Context(object):
if self.refs:
msg = u"References leaked:"
for count, linenos in self.refs.itervalues():
- msg += f"\n ({count}) acquired on lines: {u', '.join([f'{x}' for x in linenos])}"
+ msg += f"\n ({count}) acquired on lines: {u', '.join([f'{x}' for x in linenos])}"
self.errors.append(msg)
if self.errors:
return u"\n".join([u'REFNANNY: '+error for error in self.errors])
@@ -73,7 +73,7 @@ cdef void report_unraisable(object e=None):
if e is None:
import sys
e = sys.exc_info()[1]
- print(f"refnanny raised an exception: {e}")
+ print(f"refnanny raised an exception: {e}")
except:
pass # We absolutely cannot exit with an exception
@@ -160,8 +160,8 @@ cdef void FinishContext(PyObject** ctx):
context = <Context>ctx[0]
errors = context.end()
if errors:
- print(f"{context.filename.decode('latin1')}: {context.name.decode('latin1')}()")
- print(errors)
+ print(f"{context.filename.decode('latin1')}: {context.name.decode('latin1')}()")
+ print(errors)
context = None
except:
report_unraisable()
diff --git a/contrib/tools/cython/Cython/Shadow.py b/contrib/tools/cython/Cython/Shadow.py
index e7b9e4f612..751808d1c6 100644
--- a/contrib/tools/cython/Cython/Shadow.py
+++ b/contrib/tools/cython/Cython/Shadow.py
@@ -1,14 +1,14 @@
# cython.* namespace for pure mode.
-from __future__ import absolute_import
+from __future__ import absolute_import
__version__ = "0.29.27"
-try:
- from __builtin__ import basestring
-except ImportError:
- basestring = str
-
-
+try:
+ from __builtin__ import basestring
+except ImportError:
+ basestring = str
+
+
# BEGIN shameless copy from Cython/minivect/minitypes.py
class _ArrayType(object):
@@ -65,13 +65,13 @@ def index_type(base_type, item):
return _ArrayType(base_type, len(item),
is_c_contig=step_idx == len(item) - 1,
is_f_contig=step_idx == 0)
- elif isinstance(item, slice):
+ elif isinstance(item, slice):
verify_slice(item)
return _ArrayType(base_type, 1, is_c_contig=bool(item.step))
- else:
- # int[8] etc.
- assert int(item) == item # array size must be a plain integer
- array(base_type, item)
+ else:
+ # int[8] etc.
+ assert int(item) == item # array size must be a plain integer
+ array(base_type, item)
# END shameless copy
@@ -102,47 +102,47 @@ class _EmptyDecoratorAndManager(object):
def __exit__(self, exc_type, exc_value, traceback):
pass
-class _Optimization(object):
- pass
-
+class _Optimization(object):
+ pass
+
cclass = ccall = cfunc = _EmptyDecoratorAndManager()
-returns = wraparound = boundscheck = initializedcheck = nonecheck = \
- embedsignature = cdivision = cdivision_warnings = \
+returns = wraparound = boundscheck = initializedcheck = nonecheck = \
+ embedsignature = cdivision = cdivision_warnings = \
always_allows_keywords = profile = linetrace = infer_types = \
- unraisable_tracebacks = freelist = \
+ unraisable_tracebacks = freelist = \
lambda _: _EmptyDecoratorAndManager()
exceptval = lambda _=None, check=True: _EmptyDecoratorAndManager()
-overflowcheck = lambda _: _EmptyDecoratorAndManager()
-optimization = _Optimization()
-
-overflowcheck.fold = optimization.use_switch = \
- optimization.unpack_method_calls = lambda arg: _EmptyDecoratorAndManager()
-
-final = internal = type_version_tag = no_gc_clear = no_gc = _empty_decorator
+overflowcheck = lambda _: _EmptyDecoratorAndManager()
+optimization = _Optimization()
+overflowcheck.fold = optimization.use_switch = \
+ optimization.unpack_method_calls = lambda arg: _EmptyDecoratorAndManager()
+
+final = internal = type_version_tag = no_gc_clear = no_gc = _empty_decorator
+
binding = lambda _: _empty_decorator
+
-
-_cython_inline = None
+_cython_inline = None
def inline(f, *args, **kwds):
- if isinstance(f, basestring):
- global _cython_inline
- if _cython_inline is None:
- from Cython.Build.Inline import cython_inline as _cython_inline
- return _cython_inline(f, *args, **kwds)
- else:
- assert len(args) == len(kwds) == 0
- return f
-
-
+ if isinstance(f, basestring):
+ global _cython_inline
+ if _cython_inline is None:
+ from Cython.Build.Inline import cython_inline as _cython_inline
+ return _cython_inline(f, *args, **kwds)
+ else:
+ assert len(args) == len(kwds) == 0
+ return f
+
+
def compile(f):
from Cython.Build.Inline import RuntimeCompiledFunction
return RuntimeCompiledFunction(f)
-
+
# Special functions
def cdiv(a, b):
@@ -160,9 +160,9 @@ def cmod(a, b):
# Emulated language constructs
-def cast(type, *args, **kwargs):
- kwargs.pop('typecheck', None)
- assert not kwargs
+def cast(type, *args, **kwargs):
+ kwargs.pop('typecheck', None)
+ assert not kwargs
if hasattr(type, '__call__'):
return type(*args)
else:
@@ -188,15 +188,15 @@ def declare(type=None, value=_Unspecified, **kwds):
return value
class _nogil(object):
- """Support for 'with nogil' statement and @nogil decorator.
+ """Support for 'with nogil' statement and @nogil decorator.
"""
- def __call__(self, x):
- if callable(x):
- # Used as function decorator => return the function unchanged.
- return x
- # Used as conditional context manager or to create an "@nogil(True/False)" decorator => keep going.
- return self
-
+ def __call__(self, x):
+ if callable(x):
+ # Used as function decorator => return the function unchanged.
+ return x
+ # Used as conditional context manager or to create an "@nogil(True/False)" decorator => keep going.
+ return self
+
def __enter__(self):
pass
def __exit__(self, exc_class, exc, tb):
@@ -206,7 +206,7 @@ nogil = _nogil()
gil = _nogil()
del _nogil
-
+
# Emulated types
class CythonMetaType(type):
@@ -274,7 +274,7 @@ class StructType(CythonType):
for key, value in cast_from.__dict__.items():
setattr(self, key, value)
else:
- for key, value in data.items():
+ for key, value in data.items():
setattr(self, key, value)
def __setattr__(self, key, value):
@@ -301,7 +301,7 @@ class UnionType(CythonType):
datadict = data
if len(datadict) > 1:
raise AttributeError("Union can only store one field at a time.")
- for key, value in datadict.items():
+ for key, value in datadict.items():
setattr(self, key, value)
def __setattr__(self, key, value):
@@ -385,7 +385,7 @@ def _specialized_from_args(signatures, args, kwargs):
py_int = typedef(int, "int")
try:
py_long = typedef(long, "long")
-except NameError: # Py3
+except NameError: # Py3
py_long = typedef(int, "long")
py_float = typedef(float, "float")
py_complex = typedef(complex, "double complex")
@@ -408,15 +408,15 @@ to_repr = {
gs = globals()
-# note: cannot simply name the unicode type here as 2to3 gets in the way and replaces it by str
-try:
- import __builtin__ as builtins
-except ImportError: # Py3
- import builtins
-
-gs['unicode'] = typedef(getattr(builtins, 'unicode', str), 'unicode')
-del builtins
-
+# note: cannot simply name the unicode type here as 2to3 gets in the way and replaces it by str
+try:
+ import __builtin__ as builtins
+except ImportError: # Py3
+ import builtins
+
+gs['unicode'] = typedef(getattr(builtins, 'unicode', str), 'unicode')
+del builtins
+
for name in int_types:
reprname = to_repr(name, name)
gs[name] = typedef(py_int, reprname)
@@ -457,7 +457,7 @@ class CythonDotParallel(object):
def parallel(self, num_threads=None):
return nogil
- def prange(self, start=0, stop=None, step=1, nogil=False, schedule=None, chunksize=None, num_threads=None):
+ def prange(self, start=0, stop=None, step=1, nogil=False, schedule=None, chunksize=None, num_threads=None):
if stop is None:
stop = start
start = 0
diff --git a/contrib/tools/cython/Cython/StringIOTree.py b/contrib/tools/cython/Cython/StringIOTree.py
index d8239efeda..f9a8e4bd47 100644
--- a/contrib/tools/cython/Cython/StringIOTree.py
+++ b/contrib/tools/cython/Cython/StringIOTree.py
@@ -1,5 +1,5 @@
-# cython: auto_pickle=False
-
+# cython: auto_pickle=False
+
r"""
Implements a buffer with insertion points. When you know you need to
"get back" to a place and write more later, simply call insertion_point()
@@ -34,13 +34,13 @@ EXAMPLE:
from __future__ import absolute_import #, unicode_literals
-try:
+try:
# Prefer cStringIO since io.StringIO() does not support writing 'str' in Py2.
- from cStringIO import StringIO
-except ImportError:
+ from cStringIO import StringIO
+except ImportError:
from io import StringIO
-
+
class StringIOTree(object):
"""
See module docs.
diff --git a/contrib/tools/cython/Cython/Tempita/__init__.py b/contrib/tools/cython/Cython/Tempita/__init__.py
index 41a0ce3d0e..b5014481d4 100644
--- a/contrib/tools/cython/Cython/Tempita/__init__.py
+++ b/contrib/tools/cython/Cython/Tempita/__init__.py
@@ -1,4 +1,4 @@
# The original Tempita implements all of its templating code here.
# Moved it to _tempita.py to make the compilation portable.
-from ._tempita import *
+from ._tempita import *
diff --git a/contrib/tools/cython/Cython/Tempita/_tempita.py b/contrib/tools/cython/Cython/Tempita/_tempita.py
index 587f6e4841..f836a63345 100644
--- a/contrib/tools/cython/Cython/Tempita/_tempita.py
+++ b/contrib/tools/cython/Cython/Tempita/_tempita.py
@@ -29,8 +29,8 @@ can use ``__name='tmpl.html'`` to set the name of the template.
If there are syntax errors ``TemplateError`` will be raised.
"""
-from __future__ import absolute_import
-
+from __future__ import absolute_import
+
import re
import sys
try:
@@ -46,11 +46,11 @@ except ImportError: # Py3
pass
import os
import tokenize
-from io import StringIO
-
-from ._looper import looper
-from .compat3 import bytes, unicode_, basestring_, next, is_unicode, coerce_text
+from io import StringIO
+from ._looper import looper
+from .compat3 import bytes, unicode_, basestring_, next, is_unicode, coerce_text
+
__all__ = ['TemplateError', 'Template', 'sub', 'HTMLTemplate',
'sub_html', 'html', 'bunch']
@@ -208,7 +208,7 @@ class Template(object):
position=None, name=self.name)
templ = self.get_template(inherit_template, self)
self_ = TemplateObject(self.name)
- for name, value in defs.items():
+ for name, value in defs.items():
setattr(self_, name, value)
self_.body = body
ns = ns.copy()
@@ -304,28 +304,28 @@ class Template(object):
try:
try:
value = eval(code, self.default_namespace, ns)
- except SyntaxError as e:
+ except SyntaxError as e:
raise SyntaxError(
'invalid syntax in expression: %s' % code)
return value
- except Exception as e:
+ except Exception as e:
if getattr(e, 'args', None):
arg0 = e.args[0]
else:
arg0 = coerce_text(e)
e.args = (self._add_line_info(arg0, pos),)
- raise
+ raise
def _exec(self, code, ns, pos):
__traceback_hide__ = True
try:
- exec(code, self.default_namespace, ns)
- except Exception as e:
+ exec(code, self.default_namespace, ns)
+ except Exception as e:
if e.args:
e.args = (self._add_line_info(e.args[0], pos),)
else:
e.args = (self._add_line_info(None, pos),)
- raise
+ raise
def _repr(self, value, pos):
__traceback_hide__ = True
@@ -334,7 +334,7 @@ class Template(object):
return ''
if self._unicode:
try:
- value = unicode_(value)
+ value = unicode_(value)
except UnicodeDecodeError:
value = bytes(value)
else:
@@ -343,9 +343,9 @@ class Template(object):
if (is_unicode(value)
and self.default_encoding):
value = value.encode(self.default_encoding)
- except Exception as e:
+ except Exception as e:
e.args = (self._add_line_info(e.args[0], pos),)
- raise
+ raise
else:
if self._unicode and isinstance(value, bytes):
if not self.default_encoding:
@@ -354,7 +354,7 @@ class Template(object):
'(no default_encoding provided)' % value)
try:
value = value.decode(self.default_encoding)
- except UnicodeDecodeError as e:
+ except UnicodeDecodeError as e:
raise UnicodeDecodeError(
e.encoding,
e.object,
@@ -391,7 +391,7 @@ def paste_script_template_renderer(content, vars, filename=None):
class bunch(dict):
def __init__(self, **kw):
- for name, value in kw.items():
+ for name, value in kw.items():
setattr(self, name, value)
def __setattr__(self, name, value):
@@ -415,7 +415,7 @@ class bunch(dict):
def __repr__(self):
return '<%s %s>' % (
self.__class__.__name__,
- ' '.join(['%s=%r' % (k, v) for k, v in sorted(self.items())]))
+ ' '.join(['%s=%r' % (k, v) for k, v in sorted(self.items())]))
############################################################
## HTML Templating
@@ -465,7 +465,7 @@ def url(v):
def attr(**kw):
parts = []
- for name, value in sorted(kw.items()):
+ for name, value in sorted(kw.items()):
if value is None:
continue
if name.endswith('_'):
@@ -544,7 +544,7 @@ class TemplateDef(object):
values = {}
sig_args, var_args, var_kw, defaults = self._func_signature
extra_kw = {}
- for name, value in kw.items():
+ for name, value in kw.items():
if not var_kw and name not in sig_args:
raise TypeError(
'Unexpected argument %s' % name)
@@ -567,7 +567,7 @@ class TemplateDef(object):
raise TypeError(
'Extra position arguments: %s'
% ', '.join([repr(v) for v in args]))
- for name, value_expr in defaults.items():
+ for name, value_expr in defaults.items():
if name not in values:
values[name] = self._template._eval(
value_expr, self._ns, self._pos)
diff --git a/contrib/tools/cython/Cython/Tempita/compat3.py b/contrib/tools/cython/Cython/Tempita/compat3.py
index 9905530757..20aefddb20 100644
--- a/contrib/tools/cython/Cython/Tempita/compat3.py
+++ b/contrib/tools/cython/Cython/Tempita/compat3.py
@@ -1,11 +1,11 @@
import sys
-__all__ = ['b', 'basestring_', 'bytes', 'unicode_', 'next', 'is_unicode']
+__all__ = ['b', 'basestring_', 'bytes', 'unicode_', 'next', 'is_unicode']
if sys.version < "3":
b = bytes = str
basestring_ = basestring
- unicode_ = unicode
+ unicode_ = unicode
else:
def b(s):
@@ -14,7 +14,7 @@ else:
return bytes(s)
basestring_ = (bytes, str)
bytes = bytes
- unicode_ = str
+ unicode_ = str
text = str
if sys.version < "3":
diff --git a/contrib/tools/cython/Cython/TestUtils.py b/contrib/tools/cython/Cython/TestUtils.py
index 9d6eb67fc3..847647b157 100644
--- a/contrib/tools/cython/Cython/TestUtils.py
+++ b/contrib/tools/cython/Cython/TestUtils.py
@@ -1,16 +1,16 @@
-from __future__ import absolute_import
+from __future__ import absolute_import
-import os
+import os
import unittest
import tempfile
-from .Compiler import Errors
-from .CodeWriter import CodeWriter
-from .Compiler.TreeFragment import TreeFragment, strip_common_indent
-from .Compiler.Visitor import TreeVisitor, VisitorTransform
-from .Compiler import TreePath
-
+from .Compiler import Errors
+from .CodeWriter import CodeWriter
+from .Compiler.TreeFragment import TreeFragment, strip_common_indent
+from .Compiler.Visitor import TreeVisitor, VisitorTransform
+from .Compiler import TreePath
+
class NodeTypeWriter(TreeVisitor):
def __init__(self):
super(NodeTypeWriter, self).__init__()
@@ -57,15 +57,15 @@ class CythonTest(unittest.TestCase):
def assertLines(self, expected, result):
"Checks that the given strings or lists of strings are equal line by line"
- if not isinstance(expected, list):
- expected = expected.split(u"\n")
- if not isinstance(result, list):
- result = result.split(u"\n")
+ if not isinstance(expected, list):
+ expected = expected.split(u"\n")
+ if not isinstance(result, list):
+ result = result.split(u"\n")
for idx, (expected_line, result_line) in enumerate(zip(expected, result)):
- self.assertEqual(expected_line, result_line,
- "Line %d:\nExp: %s\nGot: %s" % (idx, expected_line, result_line))
+ self.assertEqual(expected_line, result_line,
+ "Line %d:\nExp: %s\nGot: %s" % (idx, expected_line, result_line))
self.assertEqual(len(expected), len(result),
- "Unmatched lines. Got:\n%s\nExpected:\n%s" % ("\n".join(expected), u"\n".join(result)))
+ "Unmatched lines. Got:\n%s\nExpected:\n%s" % ("\n".join(expected), u"\n".join(result)))
def codeToLines(self, tree):
writer = CodeWriter()
@@ -81,24 +81,24 @@ class CythonTest(unittest.TestCase):
expected_lines = strip_common_indent(expected.split("\n"))
for idx, (line, expected_line) in enumerate(zip(result_lines, expected_lines)):
- self.assertEqual(expected_line, line,
- "Line %d:\nGot: %s\nExp: %s" % (idx, line, expected_line))
+ self.assertEqual(expected_line, line,
+ "Line %d:\nGot: %s\nExp: %s" % (idx, line, expected_line))
self.assertEqual(len(result_lines), len(expected_lines),
- "Unmatched lines. Got:\n%s\nExpected:\n%s" % ("\n".join(result_lines), expected))
+ "Unmatched lines. Got:\n%s\nExpected:\n%s" % ("\n".join(result_lines), expected))
def assertNodeExists(self, path, result_tree):
self.assertNotEqual(TreePath.find_first(result_tree, path), None,
"Path '%s' not found in result tree" % path)
- def fragment(self, code, pxds=None, pipeline=None):
+ def fragment(self, code, pxds=None, pipeline=None):
"Simply create a tree fragment using the name of the test-case in parse errors."
- if pxds is None:
- pxds = {}
- if pipeline is None:
- pipeline = []
+ if pxds is None:
+ pxds = {}
+ if pipeline is None:
+ pipeline = []
name = self.id()
- if name.startswith("__main__."):
- name = name[len("__main__."):]
+ if name.startswith("__main__."):
+ name = name[len("__main__."):]
name = name.replace(".", "_")
return TreeFragment(code, name, pxds, pipeline=pipeline)
@@ -112,8 +112,8 @@ class CythonTest(unittest.TestCase):
try:
func()
self.fail("Expected an exception of type %r" % exc_type)
- except exc_type as e:
- self.assertTrue(isinstance(e, exc_type))
+ except exc_type as e:
+ self.assertTrue(isinstance(e, exc_type))
return e
def should_not_fail(self, func):
@@ -122,8 +122,8 @@ class CythonTest(unittest.TestCase):
the return value of func."""
try:
return func()
- except Exception as exc:
- self.fail(str(exc))
+ except Exception as exc:
+ self.fail(str(exc))
class TransformTest(CythonTest):
@@ -150,9 +150,9 @@ class TransformTest(CythonTest):
Plans: One could have a pxd dictionary parameter to run_pipeline.
"""
- def run_pipeline(self, pipeline, pyx, pxds=None):
- if pxds is None:
- pxds = {}
+ def run_pipeline(self, pipeline, pyx, pxds=None):
+ if pxds is None:
+ pxds = {}
tree = self.fragment(pyx, pxds).root
# Run pipeline
for T in pipeline:
diff --git a/contrib/tools/cython/Cython/Tests/TestCythonUtils.py b/contrib/tools/cython/Cython/Tests/TestCythonUtils.py
index 2641900c01..ed0ea9593b 100644
--- a/contrib/tools/cython/Cython/Tests/TestCythonUtils.py
+++ b/contrib/tools/cython/Cython/Tests/TestCythonUtils.py
@@ -1,11 +1,11 @@
-import unittest
-
-from ..Utils import build_hex_version
-
-class TestCythonUtils(unittest.TestCase):
- def test_build_hex_version(self):
- self.assertEqual('0x001D00A1', build_hex_version('0.29a1'))
- self.assertEqual('0x001D00A1', build_hex_version('0.29a1'))
- self.assertEqual('0x001D03C4', build_hex_version('0.29.3rc4'))
- self.assertEqual('0x001D00F0', build_hex_version('0.29'))
- self.assertEqual('0x040000F0', build_hex_version('4.0'))
+import unittest
+
+from ..Utils import build_hex_version
+
+class TestCythonUtils(unittest.TestCase):
+ def test_build_hex_version(self):
+ self.assertEqual('0x001D00A1', build_hex_version('0.29a1'))
+ self.assertEqual('0x001D00A1', build_hex_version('0.29a1'))
+ self.assertEqual('0x001D03C4', build_hex_version('0.29.3rc4'))
+ self.assertEqual('0x001D00F0', build_hex_version('0.29'))
+ self.assertEqual('0x040000F0', build_hex_version('4.0'))
diff --git a/contrib/tools/cython/Cython/Tests/TestJediTyper.py b/contrib/tools/cython/Cython/Tests/TestJediTyper.py
index 253adef171..2409f0b9cc 100644
--- a/contrib/tools/cython/Cython/Tests/TestJediTyper.py
+++ b/contrib/tools/cython/Cython/Tests/TestJediTyper.py
@@ -20,7 +20,7 @@ TOOLS_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..',
@contextmanager
def _tempfile(code):
code = dedent(code)
- if not isinstance(code, bytes):
+ if not isinstance(code, bytes):
code = code.encode('utf8')
with NamedTemporaryFile(suffix='.py') as f:
@@ -32,14 +32,14 @@ def _tempfile(code):
def _test_typing(code, inject=False):
sys.path.insert(0, TOOLS_DIR)
try:
- import jedityper
+ import jedityper
finally:
sys.path.remove(TOOLS_DIR)
lines = []
with _tempfile(code) as f:
- types = jedityper.analyse(f.name)
+ types = jedityper.analyse(f.name)
if inject:
- lines = jedityper.inject_types(f.name, types)
+ lines = jedityper.inject_types(f.name, types)
return types, lines
@@ -84,7 +84,7 @@ class TestJediTyper(TransformTest):
self.assertFalse(types)
self.assertEqual({'a': set(['int']), 'i': set(['int'])}, variables)
- def test_conflicting_types_in_function(self):
+ def test_conflicting_types_in_function(self):
code = '''\
def func(a, b):
print(a)
@@ -99,7 +99,7 @@ class TestJediTyper(TransformTest):
self.assertIn(('func', (1, 0)), types)
variables = types.pop(('func', (1, 0)))
self.assertFalse(types)
- self.assertEqual({'a': set(['float', 'int', 'str']), 'b': set(['int'])}, variables)
+ self.assertEqual({'a': set(['float', 'int', 'str']), 'b': set(['int'])}, variables)
def _test_typing_function_char_loop(self):
code = '''\
@@ -117,93 +117,93 @@ class TestJediTyper(TransformTest):
self.assertFalse(types)
self.assertEqual({'a': set(['int']), 'i': set(['int'])}, variables)
- def test_typing_global_list(self):
- code = '''\
- a = [x for x in range(10)]
- b = list(range(10))
- c = a + b
- d = [0]*10
- '''
- types = self._test(code)
- self.assertIn((None, (1, 0)), types)
- variables = types.pop((None, (1, 0)))
- self.assertFalse(types)
- self.assertEqual({'a': set(['list']), 'b': set(['list']), 'c': set(['list']), 'd': set(['list'])}, variables)
-
- def test_typing_function_list(self):
- code = '''\
- def func(x):
- a = [[], []]
- b = [0]* 10 + a
- c = a[0]
-
- print(func([0]*100))
- '''
- types = self._test(code)
- self.assertIn(('func', (1, 0)), types)
- variables = types.pop(('func', (1, 0)))
- self.assertFalse(types)
- self.assertEqual({'a': set(['list']), 'b': set(['list']), 'c': set(['list']), 'x': set(['list'])}, variables)
-
- def test_typing_global_dict(self):
- code = '''\
- a = dict()
- b = {i: i**2 for i in range(10)}
+ def test_typing_global_list(self):
+ code = '''\
+ a = [x for x in range(10)]
+ b = list(range(10))
+ c = a + b
+ d = [0]*10
+ '''
+ types = self._test(code)
+ self.assertIn((None, (1, 0)), types)
+ variables = types.pop((None, (1, 0)))
+ self.assertFalse(types)
+ self.assertEqual({'a': set(['list']), 'b': set(['list']), 'c': set(['list']), 'd': set(['list'])}, variables)
+
+ def test_typing_function_list(self):
+ code = '''\
+ def func(x):
+ a = [[], []]
+ b = [0]* 10 + a
+ c = a[0]
+
+ print(func([0]*100))
+ '''
+ types = self._test(code)
+ self.assertIn(('func', (1, 0)), types)
+ variables = types.pop(('func', (1, 0)))
+ self.assertFalse(types)
+ self.assertEqual({'a': set(['list']), 'b': set(['list']), 'c': set(['list']), 'x': set(['list'])}, variables)
+
+ def test_typing_global_dict(self):
+ code = '''\
+ a = dict()
+ b = {i: i**2 for i in range(10)}
c = a
- '''
- types = self._test(code)
- self.assertIn((None, (1, 0)), types)
- variables = types.pop((None, (1, 0)))
- self.assertFalse(types)
- self.assertEqual({'a': set(['dict']), 'b': set(['dict']), 'c': set(['dict'])}, variables)
-
- def test_typing_function_dict(self):
- code = '''\
- def func(x):
- a = dict()
- b = {i: i**2 for i in range(10)}
- c = x
-
- print(func({1:2, 'x':7}))
- '''
- types = self._test(code)
- self.assertIn(('func', (1, 0)), types)
- variables = types.pop(('func', (1, 0)))
- self.assertFalse(types)
- self.assertEqual({'a': set(['dict']), 'b': set(['dict']), 'c': set(['dict']), 'x': set(['dict'])}, variables)
-
-
- def test_typing_global_set(self):
- code = '''\
- a = set()
- # b = {i for i in range(10)} # jedi does not support set comprehension yet
- c = a
- d = {1,2,3}
- e = a | b
- '''
- types = self._test(code)
- self.assertIn((None, (1, 0)), types)
- variables = types.pop((None, (1, 0)))
- self.assertFalse(types)
- self.assertEqual({'a': set(['set']), 'c': set(['set']), 'd': set(['set']), 'e': set(['set'])}, variables)
-
- def test_typing_function_set(self):
- code = '''\
- def func(x):
- a = set()
- # b = {i for i in range(10)} # jedi does not support set comprehension yet
- c = a
- d = a | b
-
- print(func({1,2,3}))
- '''
- types = self._test(code)
- self.assertIn(('func', (1, 0)), types)
- variables = types.pop(('func', (1, 0)))
- self.assertFalse(types)
- self.assertEqual({'a': set(['set']), 'c': set(['set']), 'd': set(['set']), 'x': set(['set'])}, variables)
-
-
+ '''
+ types = self._test(code)
+ self.assertIn((None, (1, 0)), types)
+ variables = types.pop((None, (1, 0)))
+ self.assertFalse(types)
+ self.assertEqual({'a': set(['dict']), 'b': set(['dict']), 'c': set(['dict'])}, variables)
+
+ def test_typing_function_dict(self):
+ code = '''\
+ def func(x):
+ a = dict()
+ b = {i: i**2 for i in range(10)}
+ c = x
+
+ print(func({1:2, 'x':7}))
+ '''
+ types = self._test(code)
+ self.assertIn(('func', (1, 0)), types)
+ variables = types.pop(('func', (1, 0)))
+ self.assertFalse(types)
+ self.assertEqual({'a': set(['dict']), 'b': set(['dict']), 'c': set(['dict']), 'x': set(['dict'])}, variables)
+
+
+ def test_typing_global_set(self):
+ code = '''\
+ a = set()
+ # b = {i for i in range(10)} # jedi does not support set comprehension yet
+ c = a
+ d = {1,2,3}
+ e = a | b
+ '''
+ types = self._test(code)
+ self.assertIn((None, (1, 0)), types)
+ variables = types.pop((None, (1, 0)))
+ self.assertFalse(types)
+ self.assertEqual({'a': set(['set']), 'c': set(['set']), 'd': set(['set']), 'e': set(['set'])}, variables)
+
+ def test_typing_function_set(self):
+ code = '''\
+ def func(x):
+ a = set()
+ # b = {i for i in range(10)} # jedi does not support set comprehension yet
+ c = a
+ d = a | b
+
+ print(func({1,2,3}))
+ '''
+ types = self._test(code)
+ self.assertIn(('func', (1, 0)), types)
+ variables = types.pop(('func', (1, 0)))
+ self.assertFalse(types)
+ self.assertEqual({'a': set(['set']), 'c': set(['set']), 'd': set(['set']), 'x': set(['set'])}, variables)
+
+
class TestTypeInjection(TestJediTyper):
"""
Subtype of TestJediTyper that additionally tests type injection and compilation.
diff --git a/contrib/tools/cython/Cython/Tests/TestStringIOTree.py b/contrib/tools/cython/Cython/Tests/TestStringIOTree.py
index a15f2cd88d..e1b3b63386 100644
--- a/contrib/tools/cython/Cython/Tests/TestStringIOTree.py
+++ b/contrib/tools/cython/Cython/Tests/TestStringIOTree.py
@@ -52,7 +52,7 @@ class TestStringIOTree(unittest.TestCase):
self.write_line(10, tree=line_10_insertion_point)
self.write_line(12, tree=line_9_to_12_insertion_point)
- self.assertEqual(self.tree.allmarkers(), list(range(1, 17)))
+ self.assertEqual(self.tree.allmarkers(), list(range(1, 17)))
self.assertEqual(code.strip(), self.tree.getvalue().strip())
diff --git a/contrib/tools/cython/Cython/Tests/xmlrunner.py b/contrib/tools/cython/Cython/Tests/xmlrunner.py
index d6838aa22e..0ade225fd2 100644
--- a/contrib/tools/cython/Cython/Tests/xmlrunner.py
+++ b/contrib/tools/cython/Cython/Tests/xmlrunner.py
@@ -38,17 +38,17 @@ if __name__ == '__main__':
unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
"""
-from __future__ import absolute_import
-
+from __future__ import absolute_import
+
import os
import sys
import time
from unittest import TestResult, TextTestResult, TextTestRunner
import xml.dom.minidom
-try:
- from StringIO import StringIO
-except ImportError:
- from io import StringIO # doesn't accept 'str' in Py2
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO # doesn't accept 'str' in Py2
class XMLDocument(xml.dom.minidom.Document):
@@ -186,27 +186,27 @@ class _XMLTestResult(TextTestResult):
for test_info in errors:
if isinstance(test_info, tuple):
test_info, exc_info = test_info
-
- try:
- t = test_info.get_elapsed_time()
- except AttributeError:
- t = 0
- try:
- descr = test_info.get_description()
- except AttributeError:
- try:
- descr = test_info.getDescription()
- except AttributeError:
- descr = str(test_info)
- try:
- err_info = test_info.get_error_info()
- except AttributeError:
- err_info = str(test_info)
-
+
+ try:
+ t = test_info.get_elapsed_time()
+ except AttributeError:
+ t = 0
+ try:
+ descr = test_info.get_description()
+ except AttributeError:
+ try:
+ descr = test_info.getDescription()
+ except AttributeError:
+ descr = str(test_info)
+ try:
+ err_info = test_info.get_error_info()
+ except AttributeError:
+ err_info = str(test_info)
+
self.stream.writeln(self.separator1)
- self.stream.writeln('%s [%.3fs]: %s' % (flavour, t, descr))
+ self.stream.writeln('%s [%.3fs]: %s' % (flavour, t, descr))
self.stream.writeln(self.separator2)
- self.stream.writeln('%s' % err_info)
+ self.stream.writeln('%s' % err_info)
def _get_info_by_testcase(self):
"""This method organizes test results by TestCase module. This
@@ -217,9 +217,9 @@ class _XMLTestResult(TextTestResult):
for tests in (self.successes, self.failures, self.errors):
for test_info in tests:
- if not isinstance(test_info, _TestInfo):
- print("Unexpected test result type: %r" % (test_info,))
- continue
+ if not isinstance(test_info, _TestInfo):
+ print("Unexpected test result type: %r" % (test_info,))
+ continue
testcase = type(test_info.test_method)
# Ignore module name if it is '__main__'
@@ -335,10 +335,10 @@ class _XMLTestResult(TextTestResult):
class XMLTestRunner(TextTestRunner):
"""A test runner class that outputs the results in JUnit like XML files.
"""
- def __init__(self, output='.', stream=None, descriptions=True, verbose=False, elapsed_times=True):
+ def __init__(self, output='.', stream=None, descriptions=True, verbose=False, elapsed_times=True):
"Create a new instance of XMLTestRunner."
- if stream is None:
- stream = sys.stderr
+ if stream is None:
+ stream = sys.stderr
verbosity = (1, 2)[verbose]
TextTestRunner.__init__(self, stream, descriptions, verbosity)
self.output = output
@@ -367,11 +367,11 @@ class XMLTestRunner(TextTestRunner):
stop_time = time.time()
time_taken = stop_time - start_time
- # Generate reports
- self.stream.writeln()
- self.stream.writeln('Generating XML reports...')
- result.generate_reports(self)
-
+ # Generate reports
+ self.stream.writeln()
+ self.stream.writeln('Generating XML reports...')
+ result.generate_reports(self)
+
# Print results
result.printErrors()
self.stream.writeln(result.separator2)
diff --git a/contrib/tools/cython/Cython/Utility/AsyncGen.c b/contrib/tools/cython/Cython/Utility/AsyncGen.c
index 9a11d6a129..a6ba7143c2 100644
--- a/contrib/tools/cython/Cython/Utility/AsyncGen.c
+++ b/contrib/tools/cython/Cython/Utility/AsyncGen.c
@@ -103,7 +103,7 @@ static int __Pyx_async_gen_init_hooks(__pyx_PyAsyncGenObject *o) {
//@requires: AsyncGeneratorInitFinalizer
//@requires: Coroutine.c::Coroutine
//@requires: Coroutine.c::ReturnWithStopIteration
-//@requires: ObjectHandling.c::PyObjectCall2Args
+//@requires: ObjectHandling.c::PyObjectCall2Args
//@requires: ObjectHandling.c::PyObject_GenericGetAttrNoDict
PyDoc_STRVAR(__Pyx_async_gen_send_doc,
@@ -223,20 +223,20 @@ __Pyx_async_gen_init_hooks(__pyx_PyAsyncGenObject *o)
firstiter = tstate->async_gen_firstiter;
if (firstiter) {
PyObject *res;
-#if CYTHON_UNPACK_METHODS
- PyObject *self;
-#endif
+#if CYTHON_UNPACK_METHODS
+ PyObject *self;
+#endif
Py_INCREF(firstiter);
// at least asyncio stores methods here => optimise the call
-#if CYTHON_UNPACK_METHODS
- if (likely(PyMethod_Check(firstiter)) && likely((self = PyMethod_GET_SELF(firstiter)) != NULL)) {
- PyObject *function = PyMethod_GET_FUNCTION(firstiter);
- res = __Pyx_PyObject_Call2Args(function, self, (PyObject*)o);
- } else
-#endif
- res = __Pyx_PyObject_CallOneArg(firstiter, (PyObject*)o);
-
+#if CYTHON_UNPACK_METHODS
+ if (likely(PyMethod_Check(firstiter)) && likely((self = PyMethod_GET_SELF(firstiter)) != NULL)) {
+ PyObject *function = PyMethod_GET_FUNCTION(firstiter);
+ res = __Pyx_PyObject_Call2Args(function, self, (PyObject*)o);
+ } else
+#endif
+ res = __Pyx_PyObject_CallOneArg(firstiter, (PyObject*)o);
+
Py_DECREF(firstiter);
if (unlikely(res == NULL)) {
return 1;
@@ -259,12 +259,12 @@ __Pyx_async_gen_anext(PyObject *g)
return __Pyx_async_gen_asend_new(o, NULL);
}
-static PyObject *
-__Pyx_async_gen_anext_method(PyObject *g, CYTHON_UNUSED PyObject *arg) {
- return __Pyx_async_gen_anext(g);
-}
-
+static PyObject *
+__Pyx_async_gen_anext_method(PyObject *g, CYTHON_UNUSED PyObject *arg) {
+ return __Pyx_async_gen_anext(g);
+}
+
static PyObject *
__Pyx_async_gen_asend(__pyx_PyAsyncGenObject *o, PyObject *arg)
{
@@ -284,7 +284,7 @@ __Pyx_async_gen_aclose(__pyx_PyAsyncGenObject *o, CYTHON_UNUSED PyObject *arg)
return __Pyx_async_gen_athrow_new(o, NULL);
}
-
+
static PyObject *
__Pyx_async_gen_athrow(__pyx_PyAsyncGenObject *o, PyObject *args)
{
@@ -295,12 +295,12 @@ __Pyx_async_gen_athrow(__pyx_PyAsyncGenObject *o, PyObject *args)
}
-static PyObject *
-__Pyx_async_gen_self_method(PyObject *g, CYTHON_UNUSED PyObject *arg) {
- return __Pyx_NewRef(g);
-}
-
-
+static PyObject *
+__Pyx_async_gen_self_method(PyObject *g, CYTHON_UNUSED PyObject *arg) {
+ return __Pyx_NewRef(g);
+}
+
+
static PyGetSetDef __Pyx_async_gen_getsetlist[] = {
{(char*) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
(char*) PyDoc_STR("name of the async generator"), 0},
@@ -340,8 +340,8 @@ static PyMethodDef __Pyx_async_gen_methods[] = {
{"asend", (PyCFunction)__Pyx_async_gen_asend, METH_O, __Pyx_async_asend_doc},
{"athrow",(PyCFunction)__Pyx_async_gen_athrow, METH_VARARGS, __Pyx_async_athrow_doc},
{"aclose", (PyCFunction)__Pyx_async_gen_aclose, METH_NOARGS, __Pyx_async_aclose_doc},
- {"__aiter__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_aiter_doc},
- {"__anext__", (PyCFunction)__Pyx_async_gen_anext_method, METH_NOARGS, __Pyx_async_anext_doc},
+ {"__aiter__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_aiter_doc},
+ {"__anext__", (PyCFunction)__Pyx_async_gen_anext_method, METH_NOARGS, __Pyx_async_anext_doc},
{0, 0, 0, 0} /* Sentinel */
};
@@ -425,11 +425,11 @@ static PyTypeObject __pyx_AsyncGenType_type = {
0, /* tp_finalize */
#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
@@ -587,7 +587,7 @@ static PyMethodDef __Pyx_async_gen_asend_methods[] = {
{"send", (PyCFunction)__Pyx_async_gen_asend_send, METH_O, __Pyx_async_gen_send_doc},
{"throw", (PyCFunction)__Pyx_async_gen_asend_throw, METH_VARARGS, __Pyx_async_gen_throw_doc},
{"close", (PyCFunction)__Pyx_async_gen_asend_close, METH_NOARGS, __Pyx_async_gen_close_doc},
- {"__await__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_gen_await_doc},
+ {"__await__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_gen_await_doc},
{0, 0, 0, 0} /* Sentinel */
};
@@ -666,11 +666,11 @@ static PyTypeObject __pyx__PyAsyncGenASendType_type = {
0, /* tp_finalize */
#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
@@ -784,11 +784,11 @@ static PyTypeObject __pyx__PyAsyncGenWrappedValueType_type = {
0, /* tp_finalize */
#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
@@ -997,7 +997,7 @@ static PyMethodDef __Pyx_async_gen_athrow_methods[] = {
{"send", (PyCFunction)__Pyx_async_gen_athrow_send, METH_O, __Pyx_async_gen_send_doc},
{"throw", (PyCFunction)__Pyx_async_gen_athrow_throw, METH_VARARGS, __Pyx_async_gen_throw_doc},
{"close", (PyCFunction)__Pyx_async_gen_athrow_close, METH_NOARGS, __Pyx_async_gen_close_doc},
- {"__await__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_gen_await_doc},
+ {"__await__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_gen_await_doc},
{0, 0, 0, 0} /* Sentinel */
};
@@ -1075,11 +1075,11 @@ static PyTypeObject __pyx__PyAsyncGenAThrowType_type = {
0, /* tp_finalize */
#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
diff --git a/contrib/tools/cython/Cython/Utility/Buffer.c b/contrib/tools/cython/Cython/Utility/Buffer.c
index 3c7105fa35..8c2c5de779 100644
--- a/contrib/tools/cython/Cython/Utility/Buffer.c
+++ b/contrib/tools/cython/Cython/Utility/Buffer.c
@@ -200,7 +200,7 @@ static int __Pyx__GetBufferAndValidate(
__Pyx_BufFmt_Init(&ctx, stack, dtype);
if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail;
}
- if (unlikely((size_t)buf->itemsize != dtype->size)) {
+ if (unlikely((size_t)buf->itemsize != dtype->size)) {
PyErr_Format(PyExc_ValueError,
"Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)",
buf->itemsize, (buf->itemsize > 1) ? "s" : "",
@@ -229,9 +229,9 @@ fail:;
//
// The alignment code is copied from _struct.c in Python.
-static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts);
-static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,
- __Pyx_BufFmt_StackElem* stack,
+static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts);
+static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,
+ __Pyx_BufFmt_StackElem* stack,
__Pyx_TypeInfo* type); /*proto*/
/////////////// BufferFormatCheck ///////////////
@@ -273,7 +273,7 @@ static int __Pyx_BufFmt_ParseNumber(const char** ts) {
return -1;
} else {
count = *t++ - '0';
- while (*t >= '0' && *t <= '9') {
+ while (*t >= '0' && *t <= '9') {
count *= 10;
count += *t++ - '0';
}
@@ -886,13 +886,13 @@ static struct __pyx_typeinfo_string __Pyx_TypeInfoToFormat(__Pyx_TypeInfo *type)
case 'I':
case 'U':
if (size == 1)
- *buf = (type->is_unsigned) ? 'B' : 'b';
+ *buf = (type->is_unsigned) ? 'B' : 'b';
else if (size == 2)
- *buf = (type->is_unsigned) ? 'H' : 'h';
+ *buf = (type->is_unsigned) ? 'H' : 'h';
else if (size == 4)
- *buf = (type->is_unsigned) ? 'I' : 'i';
+ *buf = (type->is_unsigned) ? 'I' : 'i';
else if (size == 8)
- *buf = (type->is_unsigned) ? 'Q' : 'q';
+ *buf = (type->is_unsigned) ? 'Q' : 'q';
break;
case 'P':
*buf = 'P';
diff --git a/contrib/tools/cython/Cython/Utility/Builtins.c b/contrib/tools/cython/Cython/Utility/Builtins.c
index 1ffb3bcebd..81cc1ce82f 100644
--- a/contrib/tools/cython/Cython/Utility/Builtins.c
+++ b/contrib/tools/cython/Cython/Utility/Builtins.c
@@ -29,7 +29,7 @@ static PyObject* __Pyx_Globals(void) {
goto bad;
for (i = PyList_GET_SIZE(names)-1; i >= 0; i--) {
#if CYTHON_COMPILING_IN_PYPY
- PyObject* name = PySequence_ITEM(names, i);
+ PyObject* name = PySequence_ITEM(names, i);
if (!name)
goto bad;
#else
@@ -115,12 +115,12 @@ static PyObject* __Pyx_PyExec3(PyObject* o, PyObject* globals, PyObject* locals)
}
if (PyCode_Check(o)) {
- if (__Pyx_PyCode_HasFreeVars((PyCodeObject *)o)) {
+ if (__Pyx_PyCode_HasFreeVars((PyCodeObject *)o)) {
PyErr_SetString(PyExc_TypeError,
"code object passed to exec() may not contain free variables");
goto bad;
}
- #if CYTHON_COMPILING_IN_PYPY || PY_VERSION_HEX < 0x030200B1
+ #if CYTHON_COMPILING_IN_PYPY || PY_VERSION_HEX < 0x030200B1
result = PyEval_EvalCode((PyCodeObject *)o, globals, locals);
#else
result = PyEval_EvalCode(o, globals, locals);
@@ -237,111 +237,111 @@ static PyObject* __Pyx_Intern(PyObject* s) {
//////////////////// abs_longlong.proto ////////////////////
static CYTHON_INLINE PY_LONG_LONG __Pyx_abs_longlong(PY_LONG_LONG x) {
-#if defined (__cplusplus) && __cplusplus >= 201103L
+#if defined (__cplusplus) && __cplusplus >= 201103L
return std::abs(x);
-#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
return llabs(x);
#elif defined (_MSC_VER)
- // abs() is defined for long, but 64-bits type on MSVC is long long.
+ // abs() is defined for long, but 64-bits type on MSVC is long long.
// Use MS-specific _abs64() instead, which returns the original (negative) value for abs(-MAX-1)
return _abs64(x);
-#elif defined (__GNUC__)
- // gcc or clang on 64 bit windows.
+#elif defined (__GNUC__)
+ // gcc or clang on 64 bit windows.
return __builtin_llabs(x);
#else
- if (sizeof(PY_LONG_LONG) <= sizeof(Py_ssize_t))
- return __Pyx_sst_abs(x);
+ if (sizeof(PY_LONG_LONG) <= sizeof(Py_ssize_t))
+ return __Pyx_sst_abs(x);
return (x<0) ? -x : x;
#endif
}
-
-//////////////////// py_abs.proto ////////////////////
-
-#if CYTHON_USE_PYLONG_INTERNALS
-static PyObject *__Pyx_PyLong_AbsNeg(PyObject *num);/*proto*/
-
-#define __Pyx_PyNumber_Absolute(x) \
- ((likely(PyLong_CheckExact(x))) ? \
- (likely(Py_SIZE(x) >= 0) ? (Py_INCREF(x), (x)) : __Pyx_PyLong_AbsNeg(x)) : \
- PyNumber_Absolute(x))
-
-#else
-#define __Pyx_PyNumber_Absolute(x) PyNumber_Absolute(x)
-#endif
-
-//////////////////// py_abs ////////////////////
-
-#if CYTHON_USE_PYLONG_INTERNALS
-static PyObject *__Pyx_PyLong_AbsNeg(PyObject *n) {
- if (likely(Py_SIZE(n) == -1)) {
- // digits are unsigned
- return PyLong_FromLong(((PyLongObject*)n)->ob_digit[0]);
- }
-#if CYTHON_COMPILING_IN_CPYTHON
- {
- PyObject *copy = _PyLong_Copy((PyLongObject*)n);
- if (likely(copy)) {
+
+//////////////////// py_abs.proto ////////////////////
+
+#if CYTHON_USE_PYLONG_INTERNALS
+static PyObject *__Pyx_PyLong_AbsNeg(PyObject *num);/*proto*/
+
+#define __Pyx_PyNumber_Absolute(x) \
+ ((likely(PyLong_CheckExact(x))) ? \
+ (likely(Py_SIZE(x) >= 0) ? (Py_INCREF(x), (x)) : __Pyx_PyLong_AbsNeg(x)) : \
+ PyNumber_Absolute(x))
+
+#else
+#define __Pyx_PyNumber_Absolute(x) PyNumber_Absolute(x)
+#endif
+
+//////////////////// py_abs ////////////////////
+
+#if CYTHON_USE_PYLONG_INTERNALS
+static PyObject *__Pyx_PyLong_AbsNeg(PyObject *n) {
+ if (likely(Py_SIZE(n) == -1)) {
+ // digits are unsigned
+ return PyLong_FromLong(((PyLongObject*)n)->ob_digit[0]);
+ }
+#if CYTHON_COMPILING_IN_CPYTHON
+ {
+ PyObject *copy = _PyLong_Copy((PyLongObject*)n);
+ if (likely(copy)) {
// negate the size to swap the sign
__Pyx_SET_SIZE(copy, -Py_SIZE(copy));
- }
- return copy;
- }
-#else
- return PyNumber_Negative(n);
-#endif
-}
-#endif
-
-
+ }
+ return copy;
+ }
+#else
+ return PyNumber_Negative(n);
+#endif
+}
+#endif
+
+
//////////////////// pow2.proto ////////////////////
#define __Pyx_PyNumber_Power2(a, b) PyNumber_Power(a, b, Py_None)
-
-//////////////////// object_ord.proto ////////////////////
-//@requires: TypeConversion.c::UnicodeAsUCS4
-
-#if PY_MAJOR_VERSION >= 3
-#define __Pyx_PyObject_Ord(c) \
- (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c))
-#else
-#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c)
-#endif
-static long __Pyx__PyObject_Ord(PyObject* c); /*proto*/
-
-//////////////////// object_ord ////////////////////
-
-static long __Pyx__PyObject_Ord(PyObject* c) {
- Py_ssize_t size;
- if (PyBytes_Check(c)) {
- size = PyBytes_GET_SIZE(c);
- if (likely(size == 1)) {
- return (unsigned char) PyBytes_AS_STRING(c)[0];
- }
-#if PY_MAJOR_VERSION < 3
- } else if (PyUnicode_Check(c)) {
- return (long)__Pyx_PyUnicode_AsPy_UCS4(c);
-#endif
-#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
- } else if (PyByteArray_Check(c)) {
- size = PyByteArray_GET_SIZE(c);
- if (likely(size == 1)) {
- return (unsigned char) PyByteArray_AS_STRING(c)[0];
- }
-#endif
- } else {
- // FIXME: support character buffers - but CPython doesn't support them either
- PyErr_Format(PyExc_TypeError,
+
+//////////////////// object_ord.proto ////////////////////
+//@requires: TypeConversion.c::UnicodeAsUCS4
+
+#if PY_MAJOR_VERSION >= 3
+#define __Pyx_PyObject_Ord(c) \
+ (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c))
+#else
+#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c)
+#endif
+static long __Pyx__PyObject_Ord(PyObject* c); /*proto*/
+
+//////////////////// object_ord ////////////////////
+
+static long __Pyx__PyObject_Ord(PyObject* c) {
+ Py_ssize_t size;
+ if (PyBytes_Check(c)) {
+ size = PyBytes_GET_SIZE(c);
+ if (likely(size == 1)) {
+ return (unsigned char) PyBytes_AS_STRING(c)[0];
+ }
+#if PY_MAJOR_VERSION < 3
+ } else if (PyUnicode_Check(c)) {
+ return (long)__Pyx_PyUnicode_AsPy_UCS4(c);
+#endif
+#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
+ } else if (PyByteArray_Check(c)) {
+ size = PyByteArray_GET_SIZE(c);
+ if (likely(size == 1)) {
+ return (unsigned char) PyByteArray_AS_STRING(c)[0];
+ }
+#endif
+ } else {
+ // FIXME: support character buffers - but CPython doesn't support them either
+ PyErr_Format(PyExc_TypeError,
"ord() expected string of length 1, but %.200s found", Py_TYPE(c)->tp_name);
- return (long)(Py_UCS4)-1;
- }
- PyErr_Format(PyExc_TypeError,
- "ord() expected a character, but string of length %zd found", size);
- return (long)(Py_UCS4)-1;
-}
-
-
+ return (long)(Py_UCS4)-1;
+ }
+ PyErr_Format(PyExc_TypeError,
+ "ord() expected a character, but string of length %zd found", size);
+ return (long)(Py_UCS4)-1;
+}
+
+
//////////////////// py_dict_keys.proto ////////////////////
static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d); /*proto*/
@@ -350,7 +350,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d); /*proto*/
static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d) {
if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "keys", d);
+ return CALL_UNBOUND_METHOD(PyDict_Type, "keys", d);
else
return PyDict_Keys(d);
}
@@ -363,7 +363,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d); /*proto*/
static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) {
if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "values", d);
+ return CALL_UNBOUND_METHOD(PyDict_Type, "values", d);
else
return PyDict_Values(d);
}
@@ -376,7 +376,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_Items(PyObject* d); /*proto*/
static CYTHON_INLINE PyObject* __Pyx_PyDict_Items(PyObject* d) {
if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "items", d);
+ return CALL_UNBOUND_METHOD(PyDict_Type, "items", d);
else
return PyDict_Items(d);
}
@@ -388,10 +388,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_IterKeys(PyObject* d); /*proto*/
//////////////////// py_dict_iterkeys ////////////////////
static CYTHON_INLINE PyObject* __Pyx_PyDict_IterKeys(PyObject* d) {
- if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "keys", d);
- else
- return CALL_UNBOUND_METHOD(PyDict_Type, "iterkeys", d);
+ if (PY_MAJOR_VERSION >= 3)
+ return CALL_UNBOUND_METHOD(PyDict_Type, "keys", d);
+ else
+ return CALL_UNBOUND_METHOD(PyDict_Type, "iterkeys", d);
}
//////////////////// py_dict_itervalues.proto ////////////////////
@@ -401,10 +401,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_IterValues(PyObject* d); /*proto*/
//////////////////// py_dict_itervalues ////////////////////
static CYTHON_INLINE PyObject* __Pyx_PyDict_IterValues(PyObject* d) {
- if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "values", d);
- else
- return CALL_UNBOUND_METHOD(PyDict_Type, "itervalues", d);
+ if (PY_MAJOR_VERSION >= 3)
+ return CALL_UNBOUND_METHOD(PyDict_Type, "values", d);
+ else
+ return CALL_UNBOUND_METHOD(PyDict_Type, "itervalues", d);
}
//////////////////// py_dict_iteritems.proto ////////////////////
@@ -414,10 +414,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_IterItems(PyObject* d); /*proto*/
//////////////////// py_dict_iteritems ////////////////////
static CYTHON_INLINE PyObject* __Pyx_PyDict_IterItems(PyObject* d) {
- if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "items", d);
- else
- return CALL_UNBOUND_METHOD(PyDict_Type, "iteritems", d);
+ if (PY_MAJOR_VERSION >= 3)
+ return CALL_UNBOUND_METHOD(PyDict_Type, "items", d);
+ else
+ return CALL_UNBOUND_METHOD(PyDict_Type, "iteritems", d);
}
//////////////////// py_dict_viewkeys.proto ////////////////////
@@ -430,10 +430,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_ViewKeys(PyObject* d); /*proto*/
//////////////////// py_dict_viewkeys ////////////////////
static CYTHON_INLINE PyObject* __Pyx_PyDict_ViewKeys(PyObject* d) {
- if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "keys", d);
- else
- return CALL_UNBOUND_METHOD(PyDict_Type, "viewkeys", d);
+ if (PY_MAJOR_VERSION >= 3)
+ return CALL_UNBOUND_METHOD(PyDict_Type, "keys", d);
+ else
+ return CALL_UNBOUND_METHOD(PyDict_Type, "viewkeys", d);
}
//////////////////// py_dict_viewvalues.proto ////////////////////
@@ -446,10 +446,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_ViewValues(PyObject* d); /*proto*/
//////////////////// py_dict_viewvalues ////////////////////
static CYTHON_INLINE PyObject* __Pyx_PyDict_ViewValues(PyObject* d) {
- if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "values", d);
- else
- return CALL_UNBOUND_METHOD(PyDict_Type, "viewvalues", d);
+ if (PY_MAJOR_VERSION >= 3)
+ return CALL_UNBOUND_METHOD(PyDict_Type, "values", d);
+ else
+ return CALL_UNBOUND_METHOD(PyDict_Type, "viewvalues", d);
}
//////////////////// py_dict_viewitems.proto ////////////////////
@@ -462,10 +462,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyDict_ViewItems(PyObject* d); /*proto*/
//////////////////// py_dict_viewitems ////////////////////
static CYTHON_INLINE PyObject* __Pyx_PyDict_ViewItems(PyObject* d) {
- if (PY_MAJOR_VERSION >= 3)
- return CALL_UNBOUND_METHOD(PyDict_Type, "items", d);
- else
- return CALL_UNBOUND_METHOD(PyDict_Type, "viewitems", d);
+ if (PY_MAJOR_VERSION >= 3)
+ return CALL_UNBOUND_METHOD(PyDict_Type, "items", d);
+ else
+ return CALL_UNBOUND_METHOD(PyDict_Type, "viewitems", d);
}
@@ -479,16 +479,16 @@ static CYTHON_INLINE PyObject* __Pyx_PyFrozenSet_New(PyObject* it);
static CYTHON_INLINE PyObject* __Pyx_PyFrozenSet_New(PyObject* it) {
if (it) {
PyObject* result;
-#if CYTHON_COMPILING_IN_PYPY
- // PyPy currently lacks PyFrozenSet_CheckExact() and PyFrozenSet_New()
- PyObject* args;
- args = PyTuple_Pack(1, it);
- if (unlikely(!args))
- return NULL;
- result = PyObject_Call((PyObject*)&PyFrozenSet_Type, args, NULL);
- Py_DECREF(args);
- return result;
-#else
+#if CYTHON_COMPILING_IN_PYPY
+ // PyPy currently lacks PyFrozenSet_CheckExact() and PyFrozenSet_New()
+ PyObject* args;
+ args = PyTuple_Pack(1, it);
+ if (unlikely(!args))
+ return NULL;
+ result = PyObject_Call((PyObject*)&PyFrozenSet_Type, args, NULL);
+ Py_DECREF(args);
+ return result;
+#else
if (PyFrozenSet_CheckExact(it)) {
Py_INCREF(it);
return it;
@@ -501,42 +501,42 @@ static CYTHON_INLINE PyObject* __Pyx_PyFrozenSet_New(PyObject* it) {
// empty frozenset is a singleton (on Python <3.10)
// seems wasteful, but CPython does the same
Py_DECREF(result);
-#endif
+#endif
}
-#if CYTHON_USE_TYPE_SLOTS
+#if CYTHON_USE_TYPE_SLOTS
return PyFrozenSet_Type.tp_new(&PyFrozenSet_Type, $empty_tuple, NULL);
-#else
+#else
return PyObject_Call((PyObject*)&PyFrozenSet_Type, $empty_tuple, NULL);
-#endif
-}
-
-
-//////////////////// PySet_Update.proto ////////////////////
-
-static CYTHON_INLINE int __Pyx_PySet_Update(PyObject* set, PyObject* it); /*proto*/
-
-//////////////////// PySet_Update ////////////////////
-
-static CYTHON_INLINE int __Pyx_PySet_Update(PyObject* set, PyObject* it) {
- PyObject *retval;
- #if CYTHON_USE_TYPE_SLOTS && !CYTHON_COMPILING_IN_PYPY
- if (PyAnySet_Check(it)) {
- if (PySet_GET_SIZE(it) == 0)
- return 0;
- // fast and safe case: CPython will update our result set and return it
- retval = PySet_Type.tp_as_number->nb_inplace_or(set, it);
- if (likely(retval == set)) {
- Py_DECREF(retval);
- return 0;
- }
- if (unlikely(!retval))
- return -1;
- // unusual result, fall through to set.update() call below
- Py_DECREF(retval);
- }
+#endif
+}
+
+
+//////////////////// PySet_Update.proto ////////////////////
+
+static CYTHON_INLINE int __Pyx_PySet_Update(PyObject* set, PyObject* it); /*proto*/
+
+//////////////////// PySet_Update ////////////////////
+
+static CYTHON_INLINE int __Pyx_PySet_Update(PyObject* set, PyObject* it) {
+ PyObject *retval;
+ #if CYTHON_USE_TYPE_SLOTS && !CYTHON_COMPILING_IN_PYPY
+ if (PyAnySet_Check(it)) {
+ if (PySet_GET_SIZE(it) == 0)
+ return 0;
+ // fast and safe case: CPython will update our result set and return it
+ retval = PySet_Type.tp_as_number->nb_inplace_or(set, it);
+ if (likely(retval == set)) {
+ Py_DECREF(retval);
+ return 0;
+ }
+ if (unlikely(!retval))
+ return -1;
+ // unusual result, fall through to set.update() call below
+ Py_DECREF(retval);
+ }
#endif
- retval = CALL_UNBOUND_METHOD(PySet_Type, "update", set, it);
- if (unlikely(!retval)) return -1;
- Py_DECREF(retval);
- return 0;
+ retval = CALL_UNBOUND_METHOD(PySet_Type, "update", set, it);
+ if (unlikely(!retval)) return -1;
+ Py_DECREF(retval);
+ return 0;
}
diff --git a/contrib/tools/cython/Cython/Utility/CConvert.pyx b/contrib/tools/cython/Cython/Utility/CConvert.pyx
index 5969f6a582..22ba939362 100644
--- a/contrib/tools/cython/Cython/Utility/CConvert.pyx
+++ b/contrib/tools/cython/Cython/Utility/CConvert.pyx
@@ -1,132 +1,132 @@
-#################### FromPyStructUtility ####################
-
-cdef extern from *:
- ctypedef struct PyTypeObject:
- char* tp_name
- PyTypeObject *Py_TYPE(obj)
- bint PyMapping_Check(obj)
- object PyErr_Format(exc, const char *format, ...)
-
-@cname("{{funcname}}")
+#################### FromPyStructUtility ####################
+
+cdef extern from *:
+ ctypedef struct PyTypeObject:
+ char* tp_name
+ PyTypeObject *Py_TYPE(obj)
+ bint PyMapping_Check(obj)
+ object PyErr_Format(exc, const char *format, ...)
+
+@cname("{{funcname}}")
cdef {{struct_type}} {{funcname}}(obj) except *:
cdef {{struct_type}} result
- if not PyMapping_Check(obj):
- PyErr_Format(TypeError, b"Expected %.16s, got %.200s", b"a mapping", Py_TYPE(obj).tp_name)
-
- {{for member in var_entries:}}
- try:
- value = obj['{{member.name}}']
- except KeyError:
- raise ValueError("No value specified for struct attribute '{{member.name}}'")
- result.{{member.cname}} = value
- {{endfor}}
- return result
-
-
-#################### FromPyUnionUtility ####################
-
-cdef extern from *:
- ctypedef struct PyTypeObject:
- char* tp_name
- PyTypeObject *Py_TYPE(obj)
- bint PyMapping_Check(obj)
- object PyErr_Format(exc, const char *format, ...)
-
-@cname("{{funcname}}")
+ if not PyMapping_Check(obj):
+ PyErr_Format(TypeError, b"Expected %.16s, got %.200s", b"a mapping", Py_TYPE(obj).tp_name)
+
+ {{for member in var_entries:}}
+ try:
+ value = obj['{{member.name}}']
+ except KeyError:
+ raise ValueError("No value specified for struct attribute '{{member.name}}'")
+ result.{{member.cname}} = value
+ {{endfor}}
+ return result
+
+
+#################### FromPyUnionUtility ####################
+
+cdef extern from *:
+ ctypedef struct PyTypeObject:
+ char* tp_name
+ PyTypeObject *Py_TYPE(obj)
+ bint PyMapping_Check(obj)
+ object PyErr_Format(exc, const char *format, ...)
+
+@cname("{{funcname}}")
cdef {{struct_type}} {{funcname}}(obj) except *:
cdef {{struct_type}} result
- cdef Py_ssize_t length
- if not PyMapping_Check(obj):
- PyErr_Format(TypeError, b"Expected %.16s, got %.200s", b"a mapping", Py_TYPE(obj).tp_name)
-
- last_found = None
- length = len(obj)
- if length:
- {{for member in var_entries:}}
- if '{{member.name}}' in obj:
- if last_found is not None:
- raise ValueError("More than one union attribute passed: '%s' and '%s'" % (last_found, '{{member.name}}'))
- last_found = '{{member.name}}'
- result.{{member.cname}} = obj['{{member.name}}']
- length -= 1
- if not length:
- return result
- {{endfor}}
- if last_found is None:
- raise ValueError("No value specified for any of the union attributes (%s)" %
- '{{", ".join(member.name for member in var_entries)}}')
- return result
-
-
-#################### cfunc.to_py ####################
-
-@cname("{{cname}}")
-cdef object {{cname}}({{return_type.ctype}} (*f)({{ ', '.join(arg.type_cname for arg in args) }}) {{except_clause}}):
- def wrap({{ ', '.join('{arg.ctype} {arg.name}'.format(arg=arg) for arg in args) }}):
- """wrap({{', '.join(('{arg.name}: {arg.type_displayname}'.format(arg=arg) if arg.type_displayname else arg.name) for arg in args)}}){{if return_type.type_displayname}} -> {{return_type.type_displayname}}{{endif}}"""
- {{'' if return_type.type.is_void else 'return '}}f({{ ', '.join(arg.name for arg in args) }})
- return wrap
-
-
-#################### carray.from_py ####################
-
-cdef extern from *:
- object PyErr_Format(exc, const char *format, ...)
-
-@cname("{{cname}}")
-cdef int {{cname}}(object o, {{base_type}} *v, Py_ssize_t length) except -1:
- cdef Py_ssize_t i = length
- try:
- i = len(o)
- except (TypeError, OverflowError):
- pass
- if i == length:
- for i, item in enumerate(o):
- if i >= length:
- break
- v[i] = item
- else:
- i += 1 # convert index to length
- if i == length:
- return 0
-
- PyErr_Format(
- IndexError,
- ("too many values found during array assignment, expected %zd"
- if i >= length else
- "not enough values found during array assignment, expected %zd, got %zd"),
- length, i)
-
-
-#################### carray.to_py ####################
-
-cdef extern from *:
- void Py_INCREF(object o)
- tuple PyTuple_New(Py_ssize_t size)
- list PyList_New(Py_ssize_t size)
- void PyTuple_SET_ITEM(object p, Py_ssize_t pos, object o)
- void PyList_SET_ITEM(object p, Py_ssize_t pos, object o)
-
-
-@cname("{{cname}}")
-cdef inline list {{cname}}({{base_type}} *v, Py_ssize_t length):
- cdef size_t i
- cdef object value
- l = PyList_New(length)
- for i in range(<size_t>length):
- value = v[i]
- Py_INCREF(value)
- PyList_SET_ITEM(l, i, value)
- return l
-
-
-@cname("{{to_tuple_cname}}")
-cdef inline tuple {{to_tuple_cname}}({{base_type}} *v, Py_ssize_t length):
- cdef size_t i
- cdef object value
- t = PyTuple_New(length)
- for i in range(<size_t>length):
- value = v[i]
- Py_INCREF(value)
- PyTuple_SET_ITEM(t, i, value)
- return t
+ cdef Py_ssize_t length
+ if not PyMapping_Check(obj):
+ PyErr_Format(TypeError, b"Expected %.16s, got %.200s", b"a mapping", Py_TYPE(obj).tp_name)
+
+ last_found = None
+ length = len(obj)
+ if length:
+ {{for member in var_entries:}}
+ if '{{member.name}}' in obj:
+ if last_found is not None:
+ raise ValueError("More than one union attribute passed: '%s' and '%s'" % (last_found, '{{member.name}}'))
+ last_found = '{{member.name}}'
+ result.{{member.cname}} = obj['{{member.name}}']
+ length -= 1
+ if not length:
+ return result
+ {{endfor}}
+ if last_found is None:
+ raise ValueError("No value specified for any of the union attributes (%s)" %
+ '{{", ".join(member.name for member in var_entries)}}')
+ return result
+
+
+#################### cfunc.to_py ####################
+
+@cname("{{cname}}")
+cdef object {{cname}}({{return_type.ctype}} (*f)({{ ', '.join(arg.type_cname for arg in args) }}) {{except_clause}}):
+ def wrap({{ ', '.join('{arg.ctype} {arg.name}'.format(arg=arg) for arg in args) }}):
+ """wrap({{', '.join(('{arg.name}: {arg.type_displayname}'.format(arg=arg) if arg.type_displayname else arg.name) for arg in args)}}){{if return_type.type_displayname}} -> {{return_type.type_displayname}}{{endif}}"""
+ {{'' if return_type.type.is_void else 'return '}}f({{ ', '.join(arg.name for arg in args) }})
+ return wrap
+
+
+#################### carray.from_py ####################
+
+cdef extern from *:
+ object PyErr_Format(exc, const char *format, ...)
+
+@cname("{{cname}}")
+cdef int {{cname}}(object o, {{base_type}} *v, Py_ssize_t length) except -1:
+ cdef Py_ssize_t i = length
+ try:
+ i = len(o)
+ except (TypeError, OverflowError):
+ pass
+ if i == length:
+ for i, item in enumerate(o):
+ if i >= length:
+ break
+ v[i] = item
+ else:
+ i += 1 # convert index to length
+ if i == length:
+ return 0
+
+ PyErr_Format(
+ IndexError,
+ ("too many values found during array assignment, expected %zd"
+ if i >= length else
+ "not enough values found during array assignment, expected %zd, got %zd"),
+ length, i)
+
+
+#################### carray.to_py ####################
+
+cdef extern from *:
+ void Py_INCREF(object o)
+ tuple PyTuple_New(Py_ssize_t size)
+ list PyList_New(Py_ssize_t size)
+ void PyTuple_SET_ITEM(object p, Py_ssize_t pos, object o)
+ void PyList_SET_ITEM(object p, Py_ssize_t pos, object o)
+
+
+@cname("{{cname}}")
+cdef inline list {{cname}}({{base_type}} *v, Py_ssize_t length):
+ cdef size_t i
+ cdef object value
+ l = PyList_New(length)
+ for i in range(<size_t>length):
+ value = v[i]
+ Py_INCREF(value)
+ PyList_SET_ITEM(l, i, value)
+ return l
+
+
+@cname("{{to_tuple_cname}}")
+cdef inline tuple {{to_tuple_cname}}({{base_type}} *v, Py_ssize_t length):
+ cdef size_t i
+ cdef object value
+ t = PyTuple_New(length)
+ for i in range(<size_t>length):
+ value = v[i]
+ Py_INCREF(value)
+ PyTuple_SET_ITEM(t, i, value)
+ return t
diff --git a/contrib/tools/cython/Cython/Utility/CMath.c b/contrib/tools/cython/Cython/Utility/CMath.c
index 2cd2223138..a8f53b2f51 100644
--- a/contrib/tools/cython/Cython/Utility/CMath.c
+++ b/contrib/tools/cython/Cython/Utility/CMath.c
@@ -1,95 +1,95 @@
-
-/////////////// CDivisionWarning.proto ///////////////
-
-static int __Pyx_cdivision_warning(const char *, int); /* proto */
-
-/////////////// CDivisionWarning ///////////////
-
-static int __Pyx_cdivision_warning(const char *filename, int lineno) {
-#if CYTHON_COMPILING_IN_PYPY
- // avoid compiler warnings
- filename++; lineno++;
- return PyErr_Warn(PyExc_RuntimeWarning,
- "division with oppositely signed operands, C and Python semantics differ");
-#else
- return PyErr_WarnExplicit(PyExc_RuntimeWarning,
- "division with oppositely signed operands, C and Python semantics differ",
- filename,
- lineno,
- __Pyx_MODULE_NAME,
- NULL);
-#endif
-}
-
-
-/////////////// DivInt.proto ///////////////
-
-static CYTHON_INLINE %(type)s __Pyx_div_%(type_name)s(%(type)s, %(type)s); /* proto */
-
-/////////////// DivInt ///////////////
-
-static CYTHON_INLINE %(type)s __Pyx_div_%(type_name)s(%(type)s a, %(type)s b) {
- %(type)s q = a / b;
- %(type)s r = a - q*b;
- q -= ((r != 0) & ((r ^ b) < 0));
- return q;
-}
-
-
-/////////////// ModInt.proto ///////////////
-
-static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s, %(type)s); /* proto */
-
-/////////////// ModInt ///////////////
-
-static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s a, %(type)s b) {
- %(type)s r = a %% b;
- r += ((r != 0) & ((r ^ b) < 0)) * b;
- return r;
-}
-
-
-/////////////// ModFloat.proto ///////////////
-
-static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s, %(type)s); /* proto */
-
-/////////////// ModFloat ///////////////
-
-static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s a, %(type)s b) {
- %(type)s r = fmod%(math_h_modifier)s(a, b);
- r += ((r != 0) & ((r < 0) ^ (b < 0))) * b;
- return r;
-}
-
-
-/////////////// IntPow.proto ///////////////
-
-static CYTHON_INLINE %(type)s %(func_name)s(%(type)s, %(type)s); /* proto */
-
-/////////////// IntPow ///////////////
-
-static CYTHON_INLINE %(type)s %(func_name)s(%(type)s b, %(type)s e) {
- %(type)s t = b;
- switch (e) {
- case 3:
- t *= b;
+
+/////////////// CDivisionWarning.proto ///////////////
+
+static int __Pyx_cdivision_warning(const char *, int); /* proto */
+
+/////////////// CDivisionWarning ///////////////
+
+static int __Pyx_cdivision_warning(const char *filename, int lineno) {
+#if CYTHON_COMPILING_IN_PYPY
+ // avoid compiler warnings
+ filename++; lineno++;
+ return PyErr_Warn(PyExc_RuntimeWarning,
+ "division with oppositely signed operands, C and Python semantics differ");
+#else
+ return PyErr_WarnExplicit(PyExc_RuntimeWarning,
+ "division with oppositely signed operands, C and Python semantics differ",
+ filename,
+ lineno,
+ __Pyx_MODULE_NAME,
+ NULL);
+#endif
+}
+
+
+/////////////// DivInt.proto ///////////////
+
+static CYTHON_INLINE %(type)s __Pyx_div_%(type_name)s(%(type)s, %(type)s); /* proto */
+
+/////////////// DivInt ///////////////
+
+static CYTHON_INLINE %(type)s __Pyx_div_%(type_name)s(%(type)s a, %(type)s b) {
+ %(type)s q = a / b;
+ %(type)s r = a - q*b;
+ q -= ((r != 0) & ((r ^ b) < 0));
+ return q;
+}
+
+
+/////////////// ModInt.proto ///////////////
+
+static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s, %(type)s); /* proto */
+
+/////////////// ModInt ///////////////
+
+static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s a, %(type)s b) {
+ %(type)s r = a %% b;
+ r += ((r != 0) & ((r ^ b) < 0)) * b;
+ return r;
+}
+
+
+/////////////// ModFloat.proto ///////////////
+
+static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s, %(type)s); /* proto */
+
+/////////////// ModFloat ///////////////
+
+static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s a, %(type)s b) {
+ %(type)s r = fmod%(math_h_modifier)s(a, b);
+ r += ((r != 0) & ((r < 0) ^ (b < 0))) * b;
+ return r;
+}
+
+
+/////////////// IntPow.proto ///////////////
+
+static CYTHON_INLINE %(type)s %(func_name)s(%(type)s, %(type)s); /* proto */
+
+/////////////// IntPow ///////////////
+
+static CYTHON_INLINE %(type)s %(func_name)s(%(type)s b, %(type)s e) {
+ %(type)s t = b;
+ switch (e) {
+ case 3:
+ t *= b;
CYTHON_FALLTHROUGH;
- case 2:
- t *= b;
+ case 2:
+ t *= b;
CYTHON_FALLTHROUGH;
- case 1:
- return t;
- case 0:
- return 1;
- }
- #if %(signed)s
- if (unlikely(e<0)) return 0;
- #endif
- t = 1;
- while (likely(e)) {
- t *= (b * (e&1)) | ((~e)&1); /* 1 or b */
- b *= b;
- e >>= 1;
- }
- return t;
-}
+ case 1:
+ return t;
+ case 0:
+ return 1;
+ }
+ #if %(signed)s
+ if (unlikely(e<0)) return 0;
+ #endif
+ t = 1;
+ while (likely(e)) {
+ t *= (b * (e&1)) | ((~e)&1); /* 1 or b */
+ b *= b;
+ e >>= 1;
+ }
+ return t;
+}
diff --git a/contrib/tools/cython/Cython/Utility/Complex.c b/contrib/tools/cython/Cython/Utility/Complex.c
index 28062a0611..1dd56387dd 100644
--- a/contrib/tools/cython/Cython/Utility/Complex.c
+++ b/contrib/tools/cython/Cython/Utility/Complex.c
@@ -1,291 +1,291 @@
/////////////// Header.proto ///////////////
//@proto_block: h_code
-
-#if !defined(CYTHON_CCOMPLEX)
- #if defined(__cplusplus)
- #define CYTHON_CCOMPLEX 1
- #elif defined(_Complex_I)
- #define CYTHON_CCOMPLEX 1
- #else
- #define CYTHON_CCOMPLEX 0
- #endif
-#endif
-
-#if CYTHON_CCOMPLEX
- #ifdef __cplusplus
- #include <complex>
- #else
- #include <complex.h>
- #endif
-#endif
-
-#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)
- #undef _Complex_I
- #define _Complex_I 1.0fj
-#endif
-
-
-/////////////// RealImag.proto ///////////////
-
-#if CYTHON_CCOMPLEX
- #ifdef __cplusplus
- #define __Pyx_CREAL(z) ((z).real())
- #define __Pyx_CIMAG(z) ((z).imag())
- #else
- #define __Pyx_CREAL(z) (__real__(z))
- #define __Pyx_CIMAG(z) (__imag__(z))
- #endif
-#else
- #define __Pyx_CREAL(z) ((z).real)
- #define __Pyx_CIMAG(z) ((z).imag)
-#endif
-
-#if defined(__cplusplus) && CYTHON_CCOMPLEX \
- && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103)
- #define __Pyx_SET_CREAL(z,x) ((z).real(x))
- #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))
-#else
- #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)
- #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)
-#endif
-
-
+
+#if !defined(CYTHON_CCOMPLEX)
+ #if defined(__cplusplus)
+ #define CYTHON_CCOMPLEX 1
+ #elif defined(_Complex_I)
+ #define CYTHON_CCOMPLEX 1
+ #else
+ #define CYTHON_CCOMPLEX 0
+ #endif
+#endif
+
+#if CYTHON_CCOMPLEX
+ #ifdef __cplusplus
+ #include <complex>
+ #else
+ #include <complex.h>
+ #endif
+#endif
+
+#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)
+ #undef _Complex_I
+ #define _Complex_I 1.0fj
+#endif
+
+
+/////////////// RealImag.proto ///////////////
+
+#if CYTHON_CCOMPLEX
+ #ifdef __cplusplus
+ #define __Pyx_CREAL(z) ((z).real())
+ #define __Pyx_CIMAG(z) ((z).imag())
+ #else
+ #define __Pyx_CREAL(z) (__real__(z))
+ #define __Pyx_CIMAG(z) (__imag__(z))
+ #endif
+#else
+ #define __Pyx_CREAL(z) ((z).real)
+ #define __Pyx_CIMAG(z) ((z).imag)
+#endif
+
+#if defined(__cplusplus) && CYTHON_CCOMPLEX \
+ && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103)
+ #define __Pyx_SET_CREAL(z,x) ((z).real(x))
+ #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))
+#else
+ #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)
+ #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)
+#endif
+
+
/////////////// Declarations.proto ///////////////
//@proto_block: complex_type_declarations
-
-#if CYTHON_CCOMPLEX
- #ifdef __cplusplus
- typedef ::std::complex< {{real_type}} > {{type_name}};
- #else
- typedef {{real_type}} _Complex {{type_name}};
- #endif
-#else
- typedef struct { {{real_type}} real, imag; } {{type_name}};
-#endif
-
-static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}}, {{real_type}});
-
-/////////////// Declarations ///////////////
-
-#if CYTHON_CCOMPLEX
- #ifdef __cplusplus
- static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
- return ::std::complex< {{real_type}} >(x, y);
- }
- #else
- static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
- return x + y*({{type}})_Complex_I;
- }
- #endif
-#else
- static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
- {{type}} z;
- z.real = x;
- z.imag = y;
- return z;
- }
-#endif
-
-
-/////////////// ToPy.proto ///////////////
-
-#define __pyx_PyComplex_FromComplex(z) \
- PyComplex_FromDoubles((double)__Pyx_CREAL(z), \
- (double)__Pyx_CIMAG(z))
-
-
-/////////////// FromPy.proto ///////////////
-
-static {{type}} __Pyx_PyComplex_As_{{type_name}}(PyObject*);
-
-/////////////// FromPy ///////////////
-
-static {{type}} __Pyx_PyComplex_As_{{type_name}}(PyObject* o) {
- Py_complex cval;
-#if !CYTHON_COMPILING_IN_PYPY
- if (PyComplex_CheckExact(o))
- cval = ((PyComplexObject *)o)->cval;
- else
-#endif
- cval = PyComplex_AsCComplex(o);
- return {{type_name}}_from_parts(
- ({{real_type}})cval.real,
- ({{real_type}})cval.imag);
-}
-
-
-/////////////// Arithmetic.proto ///////////////
-
-#if CYTHON_CCOMPLEX
- #define __Pyx_c_eq{{func_suffix}}(a, b) ((a)==(b))
- #define __Pyx_c_sum{{func_suffix}}(a, b) ((a)+(b))
- #define __Pyx_c_diff{{func_suffix}}(a, b) ((a)-(b))
- #define __Pyx_c_prod{{func_suffix}}(a, b) ((a)*(b))
- #define __Pyx_c_quot{{func_suffix}}(a, b) ((a)/(b))
- #define __Pyx_c_neg{{func_suffix}}(a) (-(a))
- #ifdef __cplusplus
- #define __Pyx_c_is_zero{{func_suffix}}(z) ((z)==({{real_type}})0)
- #define __Pyx_c_conj{{func_suffix}}(z) (::std::conj(z))
- #if {{is_float}}
- #define __Pyx_c_abs{{func_suffix}}(z) (::std::abs(z))
- #define __Pyx_c_pow{{func_suffix}}(a, b) (::std::pow(a, b))
- #endif
- #else
- #define __Pyx_c_is_zero{{func_suffix}}(z) ((z)==0)
- #define __Pyx_c_conj{{func_suffix}}(z) (conj{{m}}(z))
- #if {{is_float}}
- #define __Pyx_c_abs{{func_suffix}}(z) (cabs{{m}}(z))
- #define __Pyx_c_pow{{func_suffix}}(a, b) (cpow{{m}}(a, b))
- #endif
- #endif
-#else
- static CYTHON_INLINE int __Pyx_c_eq{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_sum{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_diff{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_prod{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}}, {{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_neg{{func_suffix}}({{type}});
- static CYTHON_INLINE int __Pyx_c_is_zero{{func_suffix}}({{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_conj{{func_suffix}}({{type}});
- #if {{is_float}}
- static CYTHON_INLINE {{real_type}} __Pyx_c_abs{{func_suffix}}({{type}});
- static CYTHON_INLINE {{type}} __Pyx_c_pow{{func_suffix}}({{type}}, {{type}});
- #endif
-#endif
-
-/////////////// Arithmetic ///////////////
-
-#if CYTHON_CCOMPLEX
-#else
- static CYTHON_INLINE int __Pyx_c_eq{{func_suffix}}({{type}} a, {{type}} b) {
- return (a.real == b.real) && (a.imag == b.imag);
- }
- static CYTHON_INLINE {{type}} __Pyx_c_sum{{func_suffix}}({{type}} a, {{type}} b) {
- {{type}} z;
- z.real = a.real + b.real;
- z.imag = a.imag + b.imag;
- return z;
- }
- static CYTHON_INLINE {{type}} __Pyx_c_diff{{func_suffix}}({{type}} a, {{type}} b) {
- {{type}} z;
- z.real = a.real - b.real;
- z.imag = a.imag - b.imag;
- return z;
- }
- static CYTHON_INLINE {{type}} __Pyx_c_prod{{func_suffix}}({{type}} a, {{type}} b) {
- {{type}} z;
- z.real = a.real * b.real - a.imag * b.imag;
- z.imag = a.real * b.imag + a.imag * b.real;
- return z;
- }
-
- #if {{is_float}}
- static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}} a, {{type}} b) {
- if (b.imag == 0) {
- return {{type_name}}_from_parts(a.real / b.real, a.imag / b.real);
- } else if (fabs{{m}}(b.real) >= fabs{{m}}(b.imag)) {
- if (b.real == 0 && b.imag == 0) {
- return {{type_name}}_from_parts(a.real / b.real, a.imag / b.imag);
- } else {
- {{real_type}} r = b.imag / b.real;
- {{real_type}} s = ({{real_type}})(1.0) / (b.real + b.imag * r);
- return {{type_name}}_from_parts(
- (a.real + a.imag * r) * s, (a.imag - a.real * r) * s);
- }
- } else {
- {{real_type}} r = b.real / b.imag;
- {{real_type}} s = ({{real_type}})(1.0) / (b.imag + b.real * r);
- return {{type_name}}_from_parts(
- (a.real * r + a.imag) * s, (a.imag * r - a.real) * s);
- }
- }
- #else
- static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}} a, {{type}} b) {
- if (b.imag == 0) {
- return {{type_name}}_from_parts(a.real / b.real, a.imag / b.real);
- } else {
- {{real_type}} denom = b.real * b.real + b.imag * b.imag;
- return {{type_name}}_from_parts(
- (a.real * b.real + a.imag * b.imag) / denom,
- (a.imag * b.real - a.real * b.imag) / denom);
- }
- }
- #endif
-
- static CYTHON_INLINE {{type}} __Pyx_c_neg{{func_suffix}}({{type}} a) {
- {{type}} z;
- z.real = -a.real;
- z.imag = -a.imag;
- return z;
- }
- static CYTHON_INLINE int __Pyx_c_is_zero{{func_suffix}}({{type}} a) {
- return (a.real == 0) && (a.imag == 0);
- }
- static CYTHON_INLINE {{type}} __Pyx_c_conj{{func_suffix}}({{type}} a) {
- {{type}} z;
- z.real = a.real;
- z.imag = -a.imag;
- return z;
- }
- #if {{is_float}}
- static CYTHON_INLINE {{real_type}} __Pyx_c_abs{{func_suffix}}({{type}} z) {
- #if !defined(HAVE_HYPOT) || defined(_MSC_VER)
- return sqrt{{m}}(z.real*z.real + z.imag*z.imag);
- #else
- return hypot{{m}}(z.real, z.imag);
- #endif
- }
- static CYTHON_INLINE {{type}} __Pyx_c_pow{{func_suffix}}({{type}} a, {{type}} b) {
- {{type}} z;
- {{real_type}} r, lnr, theta, z_r, z_theta;
- if (b.imag == 0 && b.real == (int)b.real) {
- if (b.real < 0) {
- {{real_type}} denom = a.real * a.real + a.imag * a.imag;
- a.real = a.real / denom;
- a.imag = -a.imag / denom;
- b.real = -b.real;
- }
- switch ((int)b.real) {
- case 0:
- z.real = 1;
- z.imag = 0;
- return z;
- case 1:
- return a;
- case 2:
- return __Pyx_c_prod{{func_suffix}}(a, a);
- case 3:
- z = __Pyx_c_prod{{func_suffix}}(a, a);
- return __Pyx_c_prod{{func_suffix}}(z, a);
- case 4:
- z = __Pyx_c_prod{{func_suffix}}(a, a);
- return __Pyx_c_prod{{func_suffix}}(z, z);
- }
- }
- if (a.imag == 0) {
- if (a.real == 0) {
- return a;
- } else if (b.imag == 0) {
- z.real = pow{{m}}(a.real, b.real);
- z.imag = 0;
- return z;
- } else if (a.real > 0) {
- r = a.real;
- theta = 0;
- } else {
- r = -a.real;
- theta = atan2{{m}}(0.0, -1.0);
- }
- } else {
- r = __Pyx_c_abs{{func_suffix}}(a);
- theta = atan2{{m}}(a.imag, a.real);
- }
- lnr = log{{m}}(r);
- z_r = exp{{m}}(lnr * b.real - theta * b.imag);
- z_theta = theta * b.real + lnr * b.imag;
- z.real = z_r * cos{{m}}(z_theta);
- z.imag = z_r * sin{{m}}(z_theta);
- return z;
- }
- #endif
-#endif
+
+#if CYTHON_CCOMPLEX
+ #ifdef __cplusplus
+ typedef ::std::complex< {{real_type}} > {{type_name}};
+ #else
+ typedef {{real_type}} _Complex {{type_name}};
+ #endif
+#else
+ typedef struct { {{real_type}} real, imag; } {{type_name}};
+#endif
+
+static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}}, {{real_type}});
+
+/////////////// Declarations ///////////////
+
+#if CYTHON_CCOMPLEX
+ #ifdef __cplusplus
+ static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
+ return ::std::complex< {{real_type}} >(x, y);
+ }
+ #else
+ static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
+ return x + y*({{type}})_Complex_I;
+ }
+ #endif
+#else
+ static CYTHON_INLINE {{type}} {{type_name}}_from_parts({{real_type}} x, {{real_type}} y) {
+ {{type}} z;
+ z.real = x;
+ z.imag = y;
+ return z;
+ }
+#endif
+
+
+/////////////// ToPy.proto ///////////////
+
+#define __pyx_PyComplex_FromComplex(z) \
+ PyComplex_FromDoubles((double)__Pyx_CREAL(z), \
+ (double)__Pyx_CIMAG(z))
+
+
+/////////////// FromPy.proto ///////////////
+
+static {{type}} __Pyx_PyComplex_As_{{type_name}}(PyObject*);
+
+/////////////// FromPy ///////////////
+
+static {{type}} __Pyx_PyComplex_As_{{type_name}}(PyObject* o) {
+ Py_complex cval;
+#if !CYTHON_COMPILING_IN_PYPY
+ if (PyComplex_CheckExact(o))
+ cval = ((PyComplexObject *)o)->cval;
+ else
+#endif
+ cval = PyComplex_AsCComplex(o);
+ return {{type_name}}_from_parts(
+ ({{real_type}})cval.real,
+ ({{real_type}})cval.imag);
+}
+
+
+/////////////// Arithmetic.proto ///////////////
+
+#if CYTHON_CCOMPLEX
+ #define __Pyx_c_eq{{func_suffix}}(a, b) ((a)==(b))
+ #define __Pyx_c_sum{{func_suffix}}(a, b) ((a)+(b))
+ #define __Pyx_c_diff{{func_suffix}}(a, b) ((a)-(b))
+ #define __Pyx_c_prod{{func_suffix}}(a, b) ((a)*(b))
+ #define __Pyx_c_quot{{func_suffix}}(a, b) ((a)/(b))
+ #define __Pyx_c_neg{{func_suffix}}(a) (-(a))
+ #ifdef __cplusplus
+ #define __Pyx_c_is_zero{{func_suffix}}(z) ((z)==({{real_type}})0)
+ #define __Pyx_c_conj{{func_suffix}}(z) (::std::conj(z))
+ #if {{is_float}}
+ #define __Pyx_c_abs{{func_suffix}}(z) (::std::abs(z))
+ #define __Pyx_c_pow{{func_suffix}}(a, b) (::std::pow(a, b))
+ #endif
+ #else
+ #define __Pyx_c_is_zero{{func_suffix}}(z) ((z)==0)
+ #define __Pyx_c_conj{{func_suffix}}(z) (conj{{m}}(z))
+ #if {{is_float}}
+ #define __Pyx_c_abs{{func_suffix}}(z) (cabs{{m}}(z))
+ #define __Pyx_c_pow{{func_suffix}}(a, b) (cpow{{m}}(a, b))
+ #endif
+ #endif
+#else
+ static CYTHON_INLINE int __Pyx_c_eq{{func_suffix}}({{type}}, {{type}});
+ static CYTHON_INLINE {{type}} __Pyx_c_sum{{func_suffix}}({{type}}, {{type}});
+ static CYTHON_INLINE {{type}} __Pyx_c_diff{{func_suffix}}({{type}}, {{type}});
+ static CYTHON_INLINE {{type}} __Pyx_c_prod{{func_suffix}}({{type}}, {{type}});
+ static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}}, {{type}});
+ static CYTHON_INLINE {{type}} __Pyx_c_neg{{func_suffix}}({{type}});
+ static CYTHON_INLINE int __Pyx_c_is_zero{{func_suffix}}({{type}});
+ static CYTHON_INLINE {{type}} __Pyx_c_conj{{func_suffix}}({{type}});
+ #if {{is_float}}
+ static CYTHON_INLINE {{real_type}} __Pyx_c_abs{{func_suffix}}({{type}});
+ static CYTHON_INLINE {{type}} __Pyx_c_pow{{func_suffix}}({{type}}, {{type}});
+ #endif
+#endif
+
+/////////////// Arithmetic ///////////////
+
+#if CYTHON_CCOMPLEX
+#else
+ static CYTHON_INLINE int __Pyx_c_eq{{func_suffix}}({{type}} a, {{type}} b) {
+ return (a.real == b.real) && (a.imag == b.imag);
+ }
+ static CYTHON_INLINE {{type}} __Pyx_c_sum{{func_suffix}}({{type}} a, {{type}} b) {
+ {{type}} z;
+ z.real = a.real + b.real;
+ z.imag = a.imag + b.imag;
+ return z;
+ }
+ static CYTHON_INLINE {{type}} __Pyx_c_diff{{func_suffix}}({{type}} a, {{type}} b) {
+ {{type}} z;
+ z.real = a.real - b.real;
+ z.imag = a.imag - b.imag;
+ return z;
+ }
+ static CYTHON_INLINE {{type}} __Pyx_c_prod{{func_suffix}}({{type}} a, {{type}} b) {
+ {{type}} z;
+ z.real = a.real * b.real - a.imag * b.imag;
+ z.imag = a.real * b.imag + a.imag * b.real;
+ return z;
+ }
+
+ #if {{is_float}}
+ static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}} a, {{type}} b) {
+ if (b.imag == 0) {
+ return {{type_name}}_from_parts(a.real / b.real, a.imag / b.real);
+ } else if (fabs{{m}}(b.real) >= fabs{{m}}(b.imag)) {
+ if (b.real == 0 && b.imag == 0) {
+ return {{type_name}}_from_parts(a.real / b.real, a.imag / b.imag);
+ } else {
+ {{real_type}} r = b.imag / b.real;
+ {{real_type}} s = ({{real_type}})(1.0) / (b.real + b.imag * r);
+ return {{type_name}}_from_parts(
+ (a.real + a.imag * r) * s, (a.imag - a.real * r) * s);
+ }
+ } else {
+ {{real_type}} r = b.real / b.imag;
+ {{real_type}} s = ({{real_type}})(1.0) / (b.imag + b.real * r);
+ return {{type_name}}_from_parts(
+ (a.real * r + a.imag) * s, (a.imag * r - a.real) * s);
+ }
+ }
+ #else
+ static CYTHON_INLINE {{type}} __Pyx_c_quot{{func_suffix}}({{type}} a, {{type}} b) {
+ if (b.imag == 0) {
+ return {{type_name}}_from_parts(a.real / b.real, a.imag / b.real);
+ } else {
+ {{real_type}} denom = b.real * b.real + b.imag * b.imag;
+ return {{type_name}}_from_parts(
+ (a.real * b.real + a.imag * b.imag) / denom,
+ (a.imag * b.real - a.real * b.imag) / denom);
+ }
+ }
+ #endif
+
+ static CYTHON_INLINE {{type}} __Pyx_c_neg{{func_suffix}}({{type}} a) {
+ {{type}} z;
+ z.real = -a.real;
+ z.imag = -a.imag;
+ return z;
+ }
+ static CYTHON_INLINE int __Pyx_c_is_zero{{func_suffix}}({{type}} a) {
+ return (a.real == 0) && (a.imag == 0);
+ }
+ static CYTHON_INLINE {{type}} __Pyx_c_conj{{func_suffix}}({{type}} a) {
+ {{type}} z;
+ z.real = a.real;
+ z.imag = -a.imag;
+ return z;
+ }
+ #if {{is_float}}
+ static CYTHON_INLINE {{real_type}} __Pyx_c_abs{{func_suffix}}({{type}} z) {
+ #if !defined(HAVE_HYPOT) || defined(_MSC_VER)
+ return sqrt{{m}}(z.real*z.real + z.imag*z.imag);
+ #else
+ return hypot{{m}}(z.real, z.imag);
+ #endif
+ }
+ static CYTHON_INLINE {{type}} __Pyx_c_pow{{func_suffix}}({{type}} a, {{type}} b) {
+ {{type}} z;
+ {{real_type}} r, lnr, theta, z_r, z_theta;
+ if (b.imag == 0 && b.real == (int)b.real) {
+ if (b.real < 0) {
+ {{real_type}} denom = a.real * a.real + a.imag * a.imag;
+ a.real = a.real / denom;
+ a.imag = -a.imag / denom;
+ b.real = -b.real;
+ }
+ switch ((int)b.real) {
+ case 0:
+ z.real = 1;
+ z.imag = 0;
+ return z;
+ case 1:
+ return a;
+ case 2:
+ return __Pyx_c_prod{{func_suffix}}(a, a);
+ case 3:
+ z = __Pyx_c_prod{{func_suffix}}(a, a);
+ return __Pyx_c_prod{{func_suffix}}(z, a);
+ case 4:
+ z = __Pyx_c_prod{{func_suffix}}(a, a);
+ return __Pyx_c_prod{{func_suffix}}(z, z);
+ }
+ }
+ if (a.imag == 0) {
+ if (a.real == 0) {
+ return a;
+ } else if (b.imag == 0) {
+ z.real = pow{{m}}(a.real, b.real);
+ z.imag = 0;
+ return z;
+ } else if (a.real > 0) {
+ r = a.real;
+ theta = 0;
+ } else {
+ r = -a.real;
+ theta = atan2{{m}}(0.0, -1.0);
+ }
+ } else {
+ r = __Pyx_c_abs{{func_suffix}}(a);
+ theta = atan2{{m}}(a.imag, a.real);
+ }
+ lnr = log{{m}}(r);
+ z_r = exp{{m}}(lnr * b.real - theta * b.imag);
+ z_theta = theta * b.real + lnr * b.imag;
+ z.real = z_r * cos{{m}}(z_theta);
+ z.imag = z_r * sin{{m}}(z_theta);
+ return z;
+ }
+ #endif
+#endif
diff --git a/contrib/tools/cython/Cython/Utility/Coroutine.c b/contrib/tools/cython/Cython/Utility/Coroutine.c
index d26314083b..ee6e254e2d 100644
--- a/contrib/tools/cython/Cython/Utility/Coroutine.c
+++ b/contrib/tools/cython/Cython/Utility/Coroutine.c
@@ -1,10 +1,10 @@
-//////////////////// GeneratorYieldFrom.proto ////////////////////
-
-static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_CoroutineObject *gen, PyObject *source);
-
-//////////////////// GeneratorYieldFrom ////////////////////
-//@requires: Generator
-
+//////////////////// GeneratorYieldFrom.proto ////////////////////
+
+static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_CoroutineObject *gen, PyObject *source);
+
+//////////////////// GeneratorYieldFrom ////////////////////
+//@requires: Generator
+
static void __PyxPyIter_CheckErrorAndDecref(PyObject *source) {
PyErr_Format(PyExc_TypeError,
"iter() returned non-iterator of type '%.100s'",
@@ -12,58 +12,58 @@ static void __PyxPyIter_CheckErrorAndDecref(PyObject *source) {
Py_DECREF(source);
}
-static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_CoroutineObject *gen, PyObject *source) {
- PyObject *source_gen, *retval;
-#ifdef __Pyx_Coroutine_USED
+static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_CoroutineObject *gen, PyObject *source) {
+ PyObject *source_gen, *retval;
+#ifdef __Pyx_Coroutine_USED
if (__Pyx_Coroutine_Check(source)) {
- // TODO: this should only happen for types.coroutine()ed generators, but we can't determine that here
- Py_INCREF(source);
- source_gen = source;
- retval = __Pyx_Generator_Next(source);
- } else
-#endif
- {
-#if CYTHON_USE_TYPE_SLOTS
- if (likely(Py_TYPE(source)->tp_iter)) {
- source_gen = Py_TYPE(source)->tp_iter(source);
- if (unlikely(!source_gen))
- return NULL;
- if (unlikely(!PyIter_Check(source_gen))) {
+ // TODO: this should only happen for types.coroutine()ed generators, but we can't determine that here
+ Py_INCREF(source);
+ source_gen = source;
+ retval = __Pyx_Generator_Next(source);
+ } else
+#endif
+ {
+#if CYTHON_USE_TYPE_SLOTS
+ if (likely(Py_TYPE(source)->tp_iter)) {
+ source_gen = Py_TYPE(source)->tp_iter(source);
+ if (unlikely(!source_gen))
+ return NULL;
+ if (unlikely(!PyIter_Check(source_gen))) {
__PyxPyIter_CheckErrorAndDecref(source_gen);
- return NULL;
- }
- } else
+ return NULL;
+ }
+ } else
// CPython also allows non-iterable sequences to be iterated over
-#endif
+#endif
{
- source_gen = PyObject_GetIter(source);
+ source_gen = PyObject_GetIter(source);
if (unlikely(!source_gen))
return NULL;
}
- // source_gen is now the iterator, make the first next() call
+ // source_gen is now the iterator, make the first next() call
#if CYTHON_USE_TYPE_SLOTS
- retval = Py_TYPE(source_gen)->tp_iternext(source_gen);
+ retval = Py_TYPE(source_gen)->tp_iternext(source_gen);
#else
retval = PyIter_Next(source_gen);
#endif
- }
- if (likely(retval)) {
- gen->yieldfrom = source_gen;
- return retval;
- }
- Py_DECREF(source_gen);
- return NULL;
-}
-
-
-//////////////////// CoroutineYieldFrom.proto ////////////////////
-
+ }
+ if (likely(retval)) {
+ gen->yieldfrom = source_gen;
+ return retval;
+ }
+ Py_DECREF(source_gen);
+ return NULL;
+}
+
+
+//////////////////// CoroutineYieldFrom.proto ////////////////////
+
static CYTHON_INLINE PyObject* __Pyx_Coroutine_Yield_From(__pyx_CoroutineObject *gen, PyObject *source);
-
-//////////////////// CoroutineYieldFrom ////////////////////
-//@requires: Coroutine
-//@requires: GetAwaitIter
-
+
+//////////////////// CoroutineYieldFrom ////////////////////
+//@requires: Coroutine
+//@requires: GetAwaitIter
+
static PyObject* __Pyx__Coroutine_Yield_From_Generic(__pyx_CoroutineObject *gen, PyObject *source) {
PyObject *retval;
PyObject *source_gen = __Pyx__Coroutine_GetAwaitableIter(source);
@@ -76,9 +76,9 @@ static PyObject* __Pyx__Coroutine_Yield_From_Generic(__pyx_CoroutineObject *gen,
} else {
#if CYTHON_USE_TYPE_SLOTS
retval = Py_TYPE(source_gen)->tp_iternext(source_gen);
-#else
+#else
retval = PyIter_Next(source_gen);
-#endif
+#endif
}
if (retval) {
gen->yieldfrom = source_gen;
@@ -86,53 +86,53 @@ static PyObject* __Pyx__Coroutine_Yield_From_Generic(__pyx_CoroutineObject *gen,
}
Py_DECREF(source_gen);
return NULL;
-}
-
+}
+
static CYTHON_INLINE PyObject* __Pyx_Coroutine_Yield_From(__pyx_CoroutineObject *gen, PyObject *source) {
- PyObject *retval;
+ PyObject *retval;
if (__Pyx_Coroutine_Check(source)) {
if (unlikely(((__pyx_CoroutineObject*)source)->yieldfrom)) {
PyErr_SetString(
PyExc_RuntimeError,
"coroutine is being awaited already");
- return NULL;
- }
- retval = __Pyx_Generator_Next(source);
+ return NULL;
+ }
+ retval = __Pyx_Generator_Next(source);
#ifdef __Pyx_AsyncGen_USED
// inlined "__pyx_PyAsyncGenASend" handling to avoid the series of generic calls
} else if (__pyx_PyAsyncGenASend_CheckExact(source)) {
retval = __Pyx_async_gen_asend_iternext(source);
#endif
- } else {
+ } else {
return __Pyx__Coroutine_Yield_From_Generic(gen, source);
- }
+ }
if (retval) {
Py_INCREF(source);
gen->yieldfrom = source;
- }
+ }
return retval;
-}
-
-
-//////////////////// GetAwaitIter.proto ////////////////////
-
-static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAwaitableIter(PyObject *o); /*proto*/
-static PyObject *__Pyx__Coroutine_GetAwaitableIter(PyObject *o); /*proto*/
-
-//////////////////// GetAwaitIter ////////////////////
-//@requires: ObjectHandling.c::PyObjectGetMethod
-//@requires: ObjectHandling.c::PyObjectCallNoArg
-//@requires: ObjectHandling.c::PyObjectCallOneArg
-
-static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAwaitableIter(PyObject *o) {
-#ifdef __Pyx_Coroutine_USED
+}
+
+
+//////////////////// GetAwaitIter.proto ////////////////////
+
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAwaitableIter(PyObject *o); /*proto*/
+static PyObject *__Pyx__Coroutine_GetAwaitableIter(PyObject *o); /*proto*/
+
+//////////////////// GetAwaitIter ////////////////////
+//@requires: ObjectHandling.c::PyObjectGetMethod
+//@requires: ObjectHandling.c::PyObjectCallNoArg
+//@requires: ObjectHandling.c::PyObjectCallOneArg
+
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAwaitableIter(PyObject *o) {
+#ifdef __Pyx_Coroutine_USED
if (__Pyx_Coroutine_Check(o)) {
return __Pyx_NewRef(o);
- }
-#endif
- return __Pyx__Coroutine_GetAwaitableIter(o);
-}
-
+ }
+#endif
+ return __Pyx__Coroutine_GetAwaitableIter(o);
+}
+
static void __Pyx_Coroutine_AwaitableIterError(PyObject *source) {
#if PY_VERSION_HEX >= 0x030600B3 || defined(_PyErr_FormatFromCause)
@@ -170,102 +170,102 @@ static void __Pyx_Coroutine_AwaitableIterError(PyObject *source) {
#endif
}
-// adapted from genobject.c in Py3.5
-static PyObject *__Pyx__Coroutine_GetAwaitableIter(PyObject *obj) {
- PyObject *res;
-#if CYTHON_USE_ASYNC_SLOTS
- __Pyx_PyAsyncMethodsStruct* am = __Pyx_PyType_AsAsync(obj);
- if (likely(am && am->am_await)) {
- res = (*am->am_await)(obj);
- } else
-#endif
-#if PY_VERSION_HEX >= 0x030500B2 || defined(PyCoro_CheckExact)
- if (PyCoro_CheckExact(obj)) {
+// adapted from genobject.c in Py3.5
+static PyObject *__Pyx__Coroutine_GetAwaitableIter(PyObject *obj) {
+ PyObject *res;
+#if CYTHON_USE_ASYNC_SLOTS
+ __Pyx_PyAsyncMethodsStruct* am = __Pyx_PyType_AsAsync(obj);
+ if (likely(am && am->am_await)) {
+ res = (*am->am_await)(obj);
+ } else
+#endif
+#if PY_VERSION_HEX >= 0x030500B2 || defined(PyCoro_CheckExact)
+ if (PyCoro_CheckExact(obj)) {
return __Pyx_NewRef(obj);
- } else
-#endif
-#if CYTHON_COMPILING_IN_CPYTHON && defined(CO_ITERABLE_COROUTINE)
- if (PyGen_CheckExact(obj) && ((PyGenObject*)obj)->gi_code && ((PyCodeObject *)((PyGenObject*)obj)->gi_code)->co_flags & CO_ITERABLE_COROUTINE) {
- // Python generator marked with "@types.coroutine" decorator
+ } else
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && defined(CO_ITERABLE_COROUTINE)
+ if (PyGen_CheckExact(obj) && ((PyGenObject*)obj)->gi_code && ((PyCodeObject *)((PyGenObject*)obj)->gi_code)->co_flags & CO_ITERABLE_COROUTINE) {
+ // Python generator marked with "@types.coroutine" decorator
return __Pyx_NewRef(obj);
- } else
-#endif
- {
- PyObject *method = NULL;
- int is_method = __Pyx_PyObject_GetMethod(obj, PYIDENT("__await__"), &method);
- if (likely(is_method)) {
- res = __Pyx_PyObject_CallOneArg(method, obj);
- } else if (likely(method)) {
- res = __Pyx_PyObject_CallNoArg(method);
- } else
- goto slot_error;
- Py_DECREF(method);
- }
+ } else
+#endif
+ {
+ PyObject *method = NULL;
+ int is_method = __Pyx_PyObject_GetMethod(obj, PYIDENT("__await__"), &method);
+ if (likely(is_method)) {
+ res = __Pyx_PyObject_CallOneArg(method, obj);
+ } else if (likely(method)) {
+ res = __Pyx_PyObject_CallNoArg(method);
+ } else
+ goto slot_error;
+ Py_DECREF(method);
+ }
if (unlikely(!res)) {
// surprisingly, CPython replaces the exception here...
__Pyx_Coroutine_AwaitableIterError(obj);
goto bad;
}
if (unlikely(!PyIter_Check(res))) {
- PyErr_Format(PyExc_TypeError,
- "__await__() returned non-iterator of type '%.100s'",
- Py_TYPE(res)->tp_name);
- Py_CLEAR(res);
- } else {
- int is_coroutine = 0;
- #ifdef __Pyx_Coroutine_USED
+ PyErr_Format(PyExc_TypeError,
+ "__await__() returned non-iterator of type '%.100s'",
+ Py_TYPE(res)->tp_name);
+ Py_CLEAR(res);
+ } else {
+ int is_coroutine = 0;
+ #ifdef __Pyx_Coroutine_USED
is_coroutine |= __Pyx_Coroutine_Check(res);
- #endif
- #if PY_VERSION_HEX >= 0x030500B2 || defined(PyCoro_CheckExact)
- is_coroutine |= PyCoro_CheckExact(res);
- #endif
- if (unlikely(is_coroutine)) {
- /* __await__ must return an *iterator*, not
- a coroutine or another awaitable (see PEP 492) */
- PyErr_SetString(PyExc_TypeError,
- "__await__() returned a coroutine");
- Py_CLEAR(res);
- }
- }
- return res;
-slot_error:
- PyErr_Format(PyExc_TypeError,
- "object %.100s can't be used in 'await' expression",
- Py_TYPE(obj)->tp_name);
-bad:
- return NULL;
-}
-
-
-//////////////////// AsyncIter.proto ////////////////////
-
-static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAsyncIter(PyObject *o); /*proto*/
-static CYTHON_INLINE PyObject *__Pyx_Coroutine_AsyncIterNext(PyObject *o); /*proto*/
-
-//////////////////// AsyncIter ////////////////////
-//@requires: GetAwaitIter
-//@requires: ObjectHandling.c::PyObjectCallMethod0
-
+ #endif
+ #if PY_VERSION_HEX >= 0x030500B2 || defined(PyCoro_CheckExact)
+ is_coroutine |= PyCoro_CheckExact(res);
+ #endif
+ if (unlikely(is_coroutine)) {
+ /* __await__ must return an *iterator*, not
+ a coroutine or another awaitable (see PEP 492) */
+ PyErr_SetString(PyExc_TypeError,
+ "__await__() returned a coroutine");
+ Py_CLEAR(res);
+ }
+ }
+ return res;
+slot_error:
+ PyErr_Format(PyExc_TypeError,
+ "object %.100s can't be used in 'await' expression",
+ Py_TYPE(obj)->tp_name);
+bad:
+ return NULL;
+}
+
+
+//////////////////// AsyncIter.proto ////////////////////
+
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAsyncIter(PyObject *o); /*proto*/
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_AsyncIterNext(PyObject *o); /*proto*/
+
+//////////////////// AsyncIter ////////////////////
+//@requires: GetAwaitIter
+//@requires: ObjectHandling.c::PyObjectCallMethod0
+
static PyObject *__Pyx_Coroutine_GetAsyncIter_Generic(PyObject *obj) {
-#if PY_VERSION_HEX < 0x030500B1
- {
- PyObject *iter = __Pyx_PyObject_CallMethod0(obj, PYIDENT("__aiter__"));
- if (likely(iter))
- return iter;
- // FIXME: for the sake of a nicely conforming exception message, assume any AttributeError meant '__aiter__'
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- return NULL;
- }
-#else
- // avoid C warning about 'unused function'
+#if PY_VERSION_HEX < 0x030500B1
+ {
+ PyObject *iter = __Pyx_PyObject_CallMethod0(obj, PYIDENT("__aiter__"));
+ if (likely(iter))
+ return iter;
+ // FIXME: for the sake of a nicely conforming exception message, assume any AttributeError meant '__aiter__'
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError))
+ return NULL;
+ }
+#else
+ // avoid C warning about 'unused function'
if ((0)) (void) __Pyx_PyObject_CallMethod0(obj, PYIDENT("__aiter__"));
-#endif
-
- PyErr_Format(PyExc_TypeError, "'async for' requires an object with __aiter__ method, got %.100s",
- Py_TYPE(obj)->tp_name);
- return NULL;
-}
-
+#endif
+
+ PyErr_Format(PyExc_TypeError, "'async for' requires an object with __aiter__ method, got %.100s",
+ Py_TYPE(obj)->tp_name);
+ return NULL;
+}
+
static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAsyncIter(PyObject *obj) {
#ifdef __Pyx_AsyncGen_USED
@@ -273,34 +273,34 @@ static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAsyncIter(PyObject *obj) {
return __Pyx_NewRef(obj);
}
#endif
-#if CYTHON_USE_ASYNC_SLOTS
+#if CYTHON_USE_ASYNC_SLOTS
{
__Pyx_PyAsyncMethodsStruct* am = __Pyx_PyType_AsAsync(obj);
if (likely(am && am->am_aiter)) {
return (*am->am_aiter)(obj);
}
- }
-#endif
+ }
+#endif
return __Pyx_Coroutine_GetAsyncIter_Generic(obj);
}
static PyObject *__Pyx__Coroutine_AsyncIterNext(PyObject *obj) {
-#if PY_VERSION_HEX < 0x030500B1
- {
- PyObject *value = __Pyx_PyObject_CallMethod0(obj, PYIDENT("__anext__"));
- if (likely(value))
- return value;
- }
- // FIXME: for the sake of a nicely conforming exception message, assume any AttributeError meant '__anext__'
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
-#endif
- PyErr_Format(PyExc_TypeError, "'async for' requires an object with __anext__ method, got %.100s",
- Py_TYPE(obj)->tp_name);
- return NULL;
-}
-
-
+#if PY_VERSION_HEX < 0x030500B1
+ {
+ PyObject *value = __Pyx_PyObject_CallMethod0(obj, PYIDENT("__anext__"));
+ if (likely(value))
+ return value;
+ }
+ // FIXME: for the sake of a nicely conforming exception message, assume any AttributeError meant '__anext__'
+ if (PyErr_ExceptionMatches(PyExc_AttributeError))
+#endif
+ PyErr_Format(PyExc_TypeError, "'async for' requires an object with __anext__ method, got %.100s",
+ Py_TYPE(obj)->tp_name);
+ return NULL;
+}
+
+
static CYTHON_INLINE PyObject *__Pyx_Coroutine_AsyncIterNext(PyObject *obj) {
#ifdef __Pyx_AsyncGen_USED
if (__Pyx_AsyncGen_CheckExact(obj)) {
@@ -319,16 +319,16 @@ static CYTHON_INLINE PyObject *__Pyx_Coroutine_AsyncIterNext(PyObject *obj) {
}
-//////////////////// pep479.proto ////////////////////
-
+//////////////////// pep479.proto ////////////////////
+
static void __Pyx_Generator_Replace_StopIteration(int in_async_gen); /*proto*/
-
-//////////////////// pep479 ////////////////////
-//@requires: Exceptions.c::GetException
-
+
+//////////////////// pep479 ////////////////////
+//@requires: Exceptions.c::GetException
+
static void __Pyx_Generator_Replace_StopIteration(CYTHON_UNUSED int in_async_gen) {
PyObject *exc, *val, *tb, *cur_exc;
- __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_declare
#ifdef __Pyx_StopAsyncIteration_USED
int is_async_stopiteration = 0;
#endif
@@ -343,272 +343,272 @@ static void __Pyx_Generator_Replace_StopIteration(CYTHON_UNUSED int in_async_gen
return;
}
- __Pyx_PyThreadState_assign
+ __Pyx_PyThreadState_assign
// Chain exceptions by moving Stop(Async)Iteration to exc_info before creating the RuntimeError.
// In Py2.x, no chaining happens, but the exception still stays visible in exc_info.
- __Pyx_GetException(&exc, &val, &tb);
- Py_XDECREF(exc);
- Py_XDECREF(val);
- Py_XDECREF(tb);
+ __Pyx_GetException(&exc, &val, &tb);
+ Py_XDECREF(exc);
+ Py_XDECREF(val);
+ Py_XDECREF(tb);
PyErr_SetString(PyExc_RuntimeError,
#ifdef __Pyx_StopAsyncIteration_USED
is_async_stopiteration ? "async generator raised StopAsyncIteration" :
in_async_gen ? "async generator raised StopIteration" :
#endif
"generator raised StopIteration");
-}
-
-
-//////////////////// CoroutineBase.proto ////////////////////
+}
+
+
+//////////////////// CoroutineBase.proto ////////////////////
//@substitute: naming
-
+
typedef PyObject *(*__pyx_coroutine_body_t)(PyObject *, PyThreadState *, PyObject *);
-
-#if CYTHON_USE_EXC_INFO_STACK
-// See https://bugs.python.org/issue25612
-#define __Pyx_ExcInfoStruct _PyErr_StackItem
-#else
-// Minimal replacement struct for Py<3.7, without the Py3.7 exception state stack.
-typedef struct {
- PyObject *exc_type;
- PyObject *exc_value;
- PyObject *exc_traceback;
-} __Pyx_ExcInfoStruct;
-#endif
-
-typedef struct {
- PyObject_HEAD
- __pyx_coroutine_body_t body;
- PyObject *closure;
- __Pyx_ExcInfoStruct gi_exc_state;
- PyObject *gi_weakreflist;
- PyObject *classobj;
- PyObject *yieldfrom;
- PyObject *gi_name;
- PyObject *gi_qualname;
- PyObject *gi_modulename;
+
+#if CYTHON_USE_EXC_INFO_STACK
+// See https://bugs.python.org/issue25612
+#define __Pyx_ExcInfoStruct _PyErr_StackItem
+#else
+// Minimal replacement struct for Py<3.7, without the Py3.7 exception state stack.
+typedef struct {
+ PyObject *exc_type;
+ PyObject *exc_value;
+ PyObject *exc_traceback;
+} __Pyx_ExcInfoStruct;
+#endif
+
+typedef struct {
+ PyObject_HEAD
+ __pyx_coroutine_body_t body;
+ PyObject *closure;
+ __Pyx_ExcInfoStruct gi_exc_state;
+ PyObject *gi_weakreflist;
+ PyObject *classobj;
+ PyObject *yieldfrom;
+ PyObject *gi_name;
+ PyObject *gi_qualname;
+ PyObject *gi_modulename;
PyObject *gi_code;
PyObject *gi_frame;
- int resume_label;
- // using T_BOOL for property below requires char value
- char is_running;
-} __pyx_CoroutineObject;
-
-static __pyx_CoroutineObject *__Pyx__Coroutine_New(
+ int resume_label;
+ // using T_BOOL for property below requires char value
+ char is_running;
+} __pyx_CoroutineObject;
+
+static __pyx_CoroutineObject *__Pyx__Coroutine_New(
PyTypeObject *type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
- PyObject *name, PyObject *qualname, PyObject *module_name); /*proto*/
+ PyObject *name, PyObject *qualname, PyObject *module_name); /*proto*/
static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit(
__pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
PyObject *name, PyObject *qualname, PyObject *module_name); /*proto*/
-static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *self);
-static int __Pyx_Coroutine_clear(PyObject *self); /*proto*/
+static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *self);
+static int __Pyx_Coroutine_clear(PyObject *self); /*proto*/
static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value); /*proto*/
static PyObject *__Pyx_Coroutine_Close(PyObject *self); /*proto*/
static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args); /*proto*/
-
+
// macros for exception state swapping instead of inline functions to make use of the local thread state context
-#if CYTHON_USE_EXC_INFO_STACK
-#define __Pyx_Coroutine_SwapException(self)
-#define __Pyx_Coroutine_ResetAndClearException(self) __Pyx_Coroutine_ExceptionClear(&(self)->gi_exc_state)
-#else
+#if CYTHON_USE_EXC_INFO_STACK
+#define __Pyx_Coroutine_SwapException(self)
+#define __Pyx_Coroutine_ResetAndClearException(self) __Pyx_Coroutine_ExceptionClear(&(self)->gi_exc_state)
+#else
#define __Pyx_Coroutine_SwapException(self) { \
- __Pyx_ExceptionSwap(&(self)->gi_exc_state.exc_type, &(self)->gi_exc_state.exc_value, &(self)->gi_exc_state.exc_traceback); \
- __Pyx_Coroutine_ResetFrameBackpointer(&(self)->gi_exc_state); \
+ __Pyx_ExceptionSwap(&(self)->gi_exc_state.exc_type, &(self)->gi_exc_state.exc_value, &(self)->gi_exc_state.exc_traceback); \
+ __Pyx_Coroutine_ResetFrameBackpointer(&(self)->gi_exc_state); \
}
#define __Pyx_Coroutine_ResetAndClearException(self) { \
- __Pyx_ExceptionReset((self)->gi_exc_state.exc_type, (self)->gi_exc_state.exc_value, (self)->gi_exc_state.exc_traceback); \
- (self)->gi_exc_state.exc_type = (self)->gi_exc_state.exc_value = (self)->gi_exc_state.exc_traceback = NULL; \
+ __Pyx_ExceptionReset((self)->gi_exc_state.exc_type, (self)->gi_exc_state.exc_value, (self)->gi_exc_state.exc_traceback); \
+ (self)->gi_exc_state.exc_type = (self)->gi_exc_state.exc_value = (self)->gi_exc_state.exc_traceback = NULL; \
}
-#endif
+#endif
#if CYTHON_FAST_THREAD_STATE
#define __Pyx_PyGen_FetchStopIterationValue(pvalue) \
__Pyx_PyGen__FetchStopIterationValue($local_tstate_cname, pvalue)
-#else
+#else
#define __Pyx_PyGen_FetchStopIterationValue(pvalue) \
__Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, pvalue)
-#endif
+#endif
static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *tstate, PyObject **pvalue); /*proto*/
-static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state); /*proto*/
-
-
-//////////////////// Coroutine.proto ////////////////////
-
-#define __Pyx_Coroutine_USED
-static PyTypeObject *__pyx_CoroutineType = 0;
-static PyTypeObject *__pyx_CoroutineAwaitType = 0;
-#define __Pyx_Coroutine_CheckExact(obj) (Py_TYPE(obj) == __pyx_CoroutineType)
+static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state); /*proto*/
+
+
+//////////////////// Coroutine.proto ////////////////////
+
+#define __Pyx_Coroutine_USED
+static PyTypeObject *__pyx_CoroutineType = 0;
+static PyTypeObject *__pyx_CoroutineAwaitType = 0;
+#define __Pyx_Coroutine_CheckExact(obj) (Py_TYPE(obj) == __pyx_CoroutineType)
// __Pyx_Coroutine_Check(obj): see override for IterableCoroutine below
#define __Pyx_Coroutine_Check(obj) __Pyx_Coroutine_CheckExact(obj)
#define __Pyx_CoroutineAwait_CheckExact(obj) (Py_TYPE(obj) == __pyx_CoroutineAwaitType)
-
+
#define __Pyx_Coroutine_New(body, code, closure, name, qualname, module_name) \
__Pyx__Coroutine_New(__pyx_CoroutineType, body, code, closure, name, qualname, module_name)
-
-static int __pyx_Coroutine_init(void); /*proto*/
-static PyObject *__Pyx__Coroutine_await(PyObject *coroutine); /*proto*/
-
+
+static int __pyx_Coroutine_init(void); /*proto*/
+static PyObject *__Pyx__Coroutine_await(PyObject *coroutine); /*proto*/
+
typedef struct {
PyObject_HEAD
PyObject *coroutine;
} __pyx_CoroutineAwaitObject;
-
-static PyObject *__Pyx_CoroutineAwait_Close(__pyx_CoroutineAwaitObject *self, PyObject *arg); /*proto*/
+
+static PyObject *__Pyx_CoroutineAwait_Close(__pyx_CoroutineAwaitObject *self, PyObject *arg); /*proto*/
static PyObject *__Pyx_CoroutineAwait_Throw(__pyx_CoroutineAwaitObject *self, PyObject *args); /*proto*/
-//////////////////// Generator.proto ////////////////////
-
-#define __Pyx_Generator_USED
-static PyTypeObject *__pyx_GeneratorType = 0;
-#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
-
+//////////////////// Generator.proto ////////////////////
+
+#define __Pyx_Generator_USED
+static PyTypeObject *__pyx_GeneratorType = 0;
+#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
+
#define __Pyx_Generator_New(body, code, closure, name, qualname, module_name) \
__Pyx__Coroutine_New(__pyx_GeneratorType, body, code, closure, name, qualname, module_name)
-
-static PyObject *__Pyx_Generator_Next(PyObject *self);
-static int __pyx_Generator_init(void); /*proto*/
-
-
+
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static int __pyx_Generator_init(void); /*proto*/
+
+
//////////////////// AsyncGen ////////////////////
//@requires: AsyncGen.c::AsyncGenerator
// -> empty, only delegates to separate file
-//////////////////// CoroutineBase ////////////////////
-//@substitute: naming
-//@requires: Exceptions.c::PyErrFetchRestore
-//@requires: Exceptions.c::PyThreadStateGet
-//@requires: Exceptions.c::SwapException
-//@requires: Exceptions.c::RaiseException
+//////////////////// CoroutineBase ////////////////////
+//@substitute: naming
+//@requires: Exceptions.c::PyErrFetchRestore
+//@requires: Exceptions.c::PyThreadStateGet
+//@requires: Exceptions.c::SwapException
+//@requires: Exceptions.c::RaiseException
//@requires: Exceptions.c::SaveResetException
-//@requires: ObjectHandling.c::PyObjectCallMethod1
-//@requires: ObjectHandling.c::PyObjectGetAttrStr
+//@requires: ObjectHandling.c::PyObjectCallMethod1
+//@requires: ObjectHandling.c::PyObjectGetAttrStr
//@requires: CommonStructures.c::FetchCommonType
-
-#include <structmember.h>
-#include <frameobject.h>
-
-#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
-
-// If StopIteration exception is set, fetches its 'value'
-// attribute if any, otherwise sets pvalue to None.
-//
-// Returns 0 if no exception or StopIteration is set.
-// If any other exception is set, returns -1 and leaves
-// pvalue unchanged.
+
+#include <structmember.h>
+#include <frameobject.h>
+
+#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
+
+// If StopIteration exception is set, fetches its 'value'
+// attribute if any, otherwise sets pvalue to None.
+//
+// Returns 0 if no exception or StopIteration is set.
+// If any other exception is set, returns -1 and leaves
+// pvalue unchanged.
static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *$local_tstate_cname, PyObject **pvalue) {
- PyObject *et, *ev, *tb;
- PyObject *value = NULL;
-
- __Pyx_ErrFetch(&et, &ev, &tb);
-
- if (!et) {
- Py_XDECREF(tb);
- Py_XDECREF(ev);
- Py_INCREF(Py_None);
- *pvalue = Py_None;
- return 0;
- }
-
- // most common case: plain StopIteration without or with separate argument
- if (likely(et == PyExc_StopIteration)) {
- if (!ev) {
- Py_INCREF(Py_None);
- value = Py_None;
- }
-#if PY_VERSION_HEX >= 0x030300A0
- else if (Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) {
- value = ((PyStopIterationObject *)ev)->value;
- Py_INCREF(value);
- Py_DECREF(ev);
- }
-#endif
- // PyErr_SetObject() and friends put the value directly into ev
- else if (unlikely(PyTuple_Check(ev))) {
- // if it's a tuple, it is interpreted as separate constructor arguments (surprise!)
- if (PyTuple_GET_SIZE(ev) >= 1) {
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
- value = PyTuple_GET_ITEM(ev, 0);
- Py_INCREF(value);
-#else
- value = PySequence_ITEM(ev, 0);
-#endif
- } else {
- Py_INCREF(Py_None);
- value = Py_None;
- }
- Py_DECREF(ev);
- }
+ PyObject *et, *ev, *tb;
+ PyObject *value = NULL;
+
+ __Pyx_ErrFetch(&et, &ev, &tb);
+
+ if (!et) {
+ Py_XDECREF(tb);
+ Py_XDECREF(ev);
+ Py_INCREF(Py_None);
+ *pvalue = Py_None;
+ return 0;
+ }
+
+ // most common case: plain StopIteration without or with separate argument
+ if (likely(et == PyExc_StopIteration)) {
+ if (!ev) {
+ Py_INCREF(Py_None);
+ value = Py_None;
+ }
+#if PY_VERSION_HEX >= 0x030300A0
+ else if (Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) {
+ value = ((PyStopIterationObject *)ev)->value;
+ Py_INCREF(value);
+ Py_DECREF(ev);
+ }
+#endif
+ // PyErr_SetObject() and friends put the value directly into ev
+ else if (unlikely(PyTuple_Check(ev))) {
+ // if it's a tuple, it is interpreted as separate constructor arguments (surprise!)
+ if (PyTuple_GET_SIZE(ev) >= 1) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ value = PyTuple_GET_ITEM(ev, 0);
+ Py_INCREF(value);
+#else
+ value = PySequence_ITEM(ev, 0);
+#endif
+ } else {
+ Py_INCREF(Py_None);
+ value = Py_None;
+ }
+ Py_DECREF(ev);
+ }
else if (!__Pyx_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) {
- // 'steal' reference to ev
- value = ev;
- }
- if (likely(value)) {
- Py_XDECREF(tb);
- Py_DECREF(et);
- *pvalue = value;
- return 0;
- }
+ // 'steal' reference to ev
+ value = ev;
+ }
+ if (likely(value)) {
+ Py_XDECREF(tb);
+ Py_DECREF(et);
+ *pvalue = value;
+ return 0;
+ }
} else if (!__Pyx_PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) {
- __Pyx_ErrRestore(et, ev, tb);
- return -1;
- }
-
- // otherwise: normalise and check what that gives us
- PyErr_NormalizeException(&et, &ev, &tb);
- if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) {
- // looks like normalisation failed - raise the new exception
- __Pyx_ErrRestore(et, ev, tb);
- return -1;
- }
- Py_XDECREF(tb);
- Py_DECREF(et);
-#if PY_VERSION_HEX >= 0x030300A0
- value = ((PyStopIterationObject *)ev)->value;
- Py_INCREF(value);
- Py_DECREF(ev);
-#else
- {
- PyObject* args = __Pyx_PyObject_GetAttrStr(ev, PYIDENT("args"));
- Py_DECREF(ev);
- if (likely(args)) {
- value = PySequence_GetItem(args, 0);
- Py_DECREF(args);
- }
- if (unlikely(!value)) {
- __Pyx_ErrRestore(NULL, NULL, NULL);
- Py_INCREF(Py_None);
- value = Py_None;
- }
- }
-#endif
- *pvalue = value;
- return 0;
-}
-
-static CYTHON_INLINE
-void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *exc_state) {
- PyObject *t, *v, *tb;
- t = exc_state->exc_type;
- v = exc_state->exc_value;
- tb = exc_state->exc_traceback;
-
- exc_state->exc_type = NULL;
- exc_state->exc_value = NULL;
- exc_state->exc_traceback = NULL;
-
- Py_XDECREF(t);
- Py_XDECREF(v);
- Py_XDECREF(tb);
-}
-
+ __Pyx_ErrRestore(et, ev, tb);
+ return -1;
+ }
+
+ // otherwise: normalise and check what that gives us
+ PyErr_NormalizeException(&et, &ev, &tb);
+ if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) {
+ // looks like normalisation failed - raise the new exception
+ __Pyx_ErrRestore(et, ev, tb);
+ return -1;
+ }
+ Py_XDECREF(tb);
+ Py_DECREF(et);
+#if PY_VERSION_HEX >= 0x030300A0
+ value = ((PyStopIterationObject *)ev)->value;
+ Py_INCREF(value);
+ Py_DECREF(ev);
+#else
+ {
+ PyObject* args = __Pyx_PyObject_GetAttrStr(ev, PYIDENT("args"));
+ Py_DECREF(ev);
+ if (likely(args)) {
+ value = PySequence_GetItem(args, 0);
+ Py_DECREF(args);
+ }
+ if (unlikely(!value)) {
+ __Pyx_ErrRestore(NULL, NULL, NULL);
+ Py_INCREF(Py_None);
+ value = Py_None;
+ }
+ }
+#endif
+ *pvalue = value;
+ return 0;
+}
+
+static CYTHON_INLINE
+void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *exc_state) {
+ PyObject *t, *v, *tb;
+ t = exc_state->exc_type;
+ v = exc_state->exc_value;
+ tb = exc_state->exc_traceback;
+
+ exc_state->exc_type = NULL;
+ exc_state->exc_value = NULL;
+ exc_state->exc_traceback = NULL;
+
+ Py_XDECREF(t);
+ Py_XDECREF(v);
+ Py_XDECREF(tb);
+}
+
#define __Pyx_Coroutine_AlreadyRunningError(gen) (__Pyx__Coroutine_AlreadyRunningError(gen), (PyObject*)NULL)
static void __Pyx__Coroutine_AlreadyRunningError(CYTHON_UNUSED __pyx_CoroutineObject *gen) {
const char *msg;
- if ((0)) {
+ if ((0)) {
#ifdef __Pyx_Coroutine_USED
} else if (__Pyx_Coroutine_Check((PyObject*)gen)) {
msg = "coroutine already executing";
@@ -619,14 +619,14 @@ static void __Pyx__Coroutine_AlreadyRunningError(CYTHON_UNUSED __pyx_CoroutineOb
#endif
} else {
msg = "generator already executing";
- }
+ }
PyErr_SetString(PyExc_ValueError, msg);
-}
-
+}
+
#define __Pyx_Coroutine_NotStartedError(gen) (__Pyx__Coroutine_NotStartedError(gen), (PyObject*)NULL)
static void __Pyx__Coroutine_NotStartedError(CYTHON_UNUSED PyObject *gen) {
const char *msg;
- if ((0)) {
+ if ((0)) {
#ifdef __Pyx_Coroutine_USED
} else if (__Pyx_Coroutine_Check(gen)) {
msg = "can't send non-None value to a just-started coroutine";
@@ -667,53 +667,53 @@ static
PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, int closing) {
__Pyx_PyThreadState_declare
PyThreadState *tstate;
- __Pyx_ExcInfoStruct *exc_state;
- PyObject *retval;
-
- assert(!self->is_running);
-
- if (unlikely(self->resume_label == 0)) {
- if (unlikely(value && value != Py_None)) {
+ __Pyx_ExcInfoStruct *exc_state;
+ PyObject *retval;
+
+ assert(!self->is_running);
+
+ if (unlikely(self->resume_label == 0)) {
+ if (unlikely(value && value != Py_None)) {
return __Pyx_Coroutine_NotStartedError((PyObject*)self);
- }
- }
-
- if (unlikely(self->resume_label == -1)) {
+ }
+ }
+
+ if (unlikely(self->resume_label == -1)) {
return __Pyx_Coroutine_AlreadyTerminatedError((PyObject*)self, value, closing);
- }
-
+ }
+
#if CYTHON_FAST_THREAD_STATE
- __Pyx_PyThreadState_assign
+ __Pyx_PyThreadState_assign
tstate = $local_tstate_cname;
#else
tstate = __Pyx_PyThreadState_Current;
#endif
- // Traceback/Frame rules pre-Py3.7:
- // - on entry, save external exception state in self->gi_exc_state, restore it on exit
- // - on exit, keep internally generated exceptions in self->gi_exc_state, clear everything else
+ // Traceback/Frame rules pre-Py3.7:
+ // - on entry, save external exception state in self->gi_exc_state, restore it on exit
+ // - on exit, keep internally generated exceptions in self->gi_exc_state, clear everything else
// - on entry, set "f_back" pointer of internal exception traceback to (current) outer call frame
// - on exit, clear "f_back" of internal exception traceback
// - do not touch external frames and tracebacks
- // Traceback/Frame rules for Py3.7+ (CYTHON_USE_EXC_INFO_STACK):
- // - on entry, push internal exception state in self->gi_exc_state on the exception stack
- // - on exit, keep internally generated exceptions in self->gi_exc_state, clear everything else
- // - on entry, set "f_back" pointer of internal exception traceback to (current) outer call frame
- // - on exit, clear "f_back" of internal exception traceback
- // - do not touch external frames and tracebacks
-
- exc_state = &self->gi_exc_state;
- if (exc_state->exc_type) {
- #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON
- // FIXME: what to do in PyPy?
- #else
- // Generators always return to their most recent caller, not
- // necessarily their creator.
- if (exc_state->exc_traceback) {
- PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback;
- PyFrameObject *f = tb->tb_frame;
-
+ // Traceback/Frame rules for Py3.7+ (CYTHON_USE_EXC_INFO_STACK):
+ // - on entry, push internal exception state in self->gi_exc_state on the exception stack
+ // - on exit, keep internally generated exceptions in self->gi_exc_state, clear everything else
+ // - on entry, set "f_back" pointer of internal exception traceback to (current) outer call frame
+ // - on exit, clear "f_back" of internal exception traceback
+ // - do not touch external frames and tracebacks
+
+ exc_state = &self->gi_exc_state;
+ if (exc_state->exc_type) {
+ #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON
+ // FIXME: what to do in PyPy?
+ #else
+ // Generators always return to their most recent caller, not
+ // necessarily their creator.
+ if (exc_state->exc_traceback) {
+ PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback;
+ PyFrameObject *f = tb->tb_frame;
+
assert(f->f_back == NULL);
#if PY_VERSION_HEX >= 0x030B00A1
// PyThreadState_GetFrame returns NULL if there isn't a current frame
@@ -723,62 +723,62 @@ PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, i
Py_XINCREF(tstate->frame);
f->f_back = tstate->frame;
#endif
- }
- #endif
- }
-
-#if CYTHON_USE_EXC_INFO_STACK
- // See https://bugs.python.org/issue25612
- exc_state->previous_item = tstate->exc_info;
- tstate->exc_info = exc_state;
-#else
- if (exc_state->exc_type) {
+ }
+ #endif
+ }
+
+#if CYTHON_USE_EXC_INFO_STACK
+ // See https://bugs.python.org/issue25612
+ exc_state->previous_item = tstate->exc_info;
+ tstate->exc_info = exc_state;
+#else
+ if (exc_state->exc_type) {
// We were in an except handler when we left,
// restore the exception state which was put aside.
- __Pyx_ExceptionSwap(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback);
+ __Pyx_ExceptionSwap(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback);
// self->exc_* now holds the exception state of the caller
- } else {
+ } else {
// save away the exception state of the caller
- __Pyx_Coroutine_ExceptionClear(exc_state);
- __Pyx_ExceptionSave(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback);
- }
-#endif
-
- self->is_running = 1;
+ __Pyx_Coroutine_ExceptionClear(exc_state);
+ __Pyx_ExceptionSave(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback);
+ }
+#endif
+
+ self->is_running = 1;
PyObject* s = (PyObject *)(self);
retval = self->body(s, tstate, value);
- self->is_running = 0;
-
-#if CYTHON_USE_EXC_INFO_STACK
- // See https://bugs.python.org/issue25612
- exc_state = &self->gi_exc_state;
- tstate->exc_info = exc_state->previous_item;
- exc_state->previous_item = NULL;
- // Cut off the exception frame chain so that we can reconnect it on re-entry above.
- __Pyx_Coroutine_ResetFrameBackpointer(exc_state);
-#endif
-
+ self->is_running = 0;
+
+#if CYTHON_USE_EXC_INFO_STACK
+ // See https://bugs.python.org/issue25612
+ exc_state = &self->gi_exc_state;
+ tstate->exc_info = exc_state->previous_item;
+ exc_state->previous_item = NULL;
+ // Cut off the exception frame chain so that we can reconnect it on re-entry above.
+ __Pyx_Coroutine_ResetFrameBackpointer(exc_state);
+#endif
+
return retval;
}
-static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state) {
+static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state) {
// Don't keep the reference to f_back any longer than necessary. It
// may keep a chain of frames alive or it could create a reference
// cycle.
- PyObject *exc_tb = exc_state->exc_traceback;
-
- if (likely(exc_tb)) {
-#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON
+ PyObject *exc_tb = exc_state->exc_traceback;
+
+ if (likely(exc_tb)) {
+#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON
// FIXME: what to do in PyPy?
-#else
- PyTracebackObject *tb = (PyTracebackObject *) exc_tb;
+#else
+ PyTracebackObject *tb = (PyTracebackObject *) exc_tb;
PyFrameObject *f = tb->tb_frame;
Py_CLEAR(f->f_back);
-#endif
- }
-}
-
-static CYTHON_INLINE
+#endif
+ }
+}
+
+static CYTHON_INLINE
PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *retval) {
if (unlikely(!retval)) {
__Pyx_PyThreadState_declare
@@ -792,12 +792,12 @@ PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *re
#endif
__Pyx_PyErr_SetNone(exc);
}
- }
- return retval;
-}
-
+ }
+ return retval;
+}
+
#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3)
-static CYTHON_INLINE
+static CYTHON_INLINE
PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) {
#if PY_VERSION_HEX <= 0x030A00A1
return _PyGen_Send(gen, arg);
@@ -823,38 +823,38 @@ PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) {
#endif
static CYTHON_INLINE
-PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) {
- PyObject *ret;
- PyObject *val = NULL;
- __Pyx_Coroutine_Undelegate(gen);
+PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) {
+ PyObject *ret;
+ PyObject *val = NULL;
+ __Pyx_Coroutine_Undelegate(gen);
__Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, &val);
- // val == NULL on failure => pass on exception
+ // val == NULL on failure => pass on exception
ret = __Pyx_Coroutine_SendEx(gen, val, 0);
- Py_XDECREF(val);
- return ret;
-}
-
-static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) {
- PyObject *retval;
- __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
- PyObject *yf = gen->yieldfrom;
+ Py_XDECREF(val);
+ return ret;
+}
+
+static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) {
+ PyObject *retval;
+ __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
+ PyObject *yf = gen->yieldfrom;
if (unlikely(gen->is_running))
return __Pyx_Coroutine_AlreadyRunningError(gen);
- if (yf) {
- PyObject *ret;
- // FIXME: does this really need an INCREF() ?
- //Py_INCREF(yf);
- gen->is_running = 1;
- #ifdef __Pyx_Generator_USED
- if (__Pyx_Generator_CheckExact(yf)) {
- ret = __Pyx_Coroutine_Send(yf, value);
- } else
- #endif
- #ifdef __Pyx_Coroutine_USED
+ if (yf) {
+ PyObject *ret;
+ // FIXME: does this really need an INCREF() ?
+ //Py_INCREF(yf);
+ gen->is_running = 1;
+ #ifdef __Pyx_Generator_USED
+ if (__Pyx_Generator_CheckExact(yf)) {
+ ret = __Pyx_Coroutine_Send(yf, value);
+ } else
+ #endif
+ #ifdef __Pyx_Coroutine_USED
if (__Pyx_Coroutine_Check(yf)) {
- ret = __Pyx_Coroutine_Send(yf, value);
- } else
- #endif
+ ret = __Pyx_Coroutine_Send(yf, value);
+ } else
+ #endif
#ifdef __Pyx_AsyncGen_USED
if (__pyx_PyAsyncGenASend_CheckExact(yf)) {
ret = __Pyx_async_gen_asend_send(yf, value);
@@ -872,49 +872,49 @@ static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) {
ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value);
} else
#endif
- {
- if (value == Py_None)
- ret = Py_TYPE(yf)->tp_iternext(yf);
- else
- ret = __Pyx_PyObject_CallMethod1(yf, PYIDENT("send"), value);
- }
- gen->is_running = 0;
- //Py_DECREF(yf);
- if (likely(ret)) {
- return ret;
- }
- retval = __Pyx_Coroutine_FinishDelegation(gen);
- } else {
+ {
+ if (value == Py_None)
+ ret = Py_TYPE(yf)->tp_iternext(yf);
+ else
+ ret = __Pyx_PyObject_CallMethod1(yf, PYIDENT("send"), value);
+ }
+ gen->is_running = 0;
+ //Py_DECREF(yf);
+ if (likely(ret)) {
+ return ret;
+ }
+ retval = __Pyx_Coroutine_FinishDelegation(gen);
+ } else {
retval = __Pyx_Coroutine_SendEx(gen, value, 0);
- }
+ }
return __Pyx_Coroutine_MethodReturn(self, retval);
-}
-
-// This helper function is used by gen_close and gen_throw to
-// close a subiterator being delegated to by yield-from.
-static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) {
- PyObject *retval = NULL;
- int err = 0;
-
- #ifdef __Pyx_Generator_USED
- if (__Pyx_Generator_CheckExact(yf)) {
- retval = __Pyx_Coroutine_Close(yf);
- if (!retval)
- return -1;
- } else
- #endif
- #ifdef __Pyx_Coroutine_USED
+}
+
+// This helper function is used by gen_close and gen_throw to
+// close a subiterator being delegated to by yield-from.
+static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) {
+ PyObject *retval = NULL;
+ int err = 0;
+
+ #ifdef __Pyx_Generator_USED
+ if (__Pyx_Generator_CheckExact(yf)) {
+ retval = __Pyx_Coroutine_Close(yf);
+ if (!retval)
+ return -1;
+ } else
+ #endif
+ #ifdef __Pyx_Coroutine_USED
if (__Pyx_Coroutine_Check(yf)) {
- retval = __Pyx_Coroutine_Close(yf);
- if (!retval)
- return -1;
- } else
+ retval = __Pyx_Coroutine_Close(yf);
+ if (!retval)
+ return -1;
+ } else
if (__Pyx_CoroutineAwait_CheckExact(yf)) {
- retval = __Pyx_CoroutineAwait_Close((__pyx_CoroutineAwaitObject*)yf, NULL);
+ retval = __Pyx_CoroutineAwait_Close((__pyx_CoroutineAwaitObject*)yf, NULL);
if (!retval)
return -1;
} else
- #endif
+ #endif
#ifdef __Pyx_AsyncGen_USED
if (__pyx_PyAsyncGenASend_CheckExact(yf)) {
retval = __Pyx_async_gen_asend_close(yf, NULL);
@@ -925,43 +925,43 @@ static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) {
// cannot fail
} else
#endif
- {
- PyObject *meth;
- gen->is_running = 1;
- meth = __Pyx_PyObject_GetAttrStr(yf, PYIDENT("close"));
- if (unlikely(!meth)) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_WriteUnraisable(yf);
- }
- PyErr_Clear();
- } else {
- retval = PyObject_CallFunction(meth, NULL);
- Py_DECREF(meth);
- if (!retval)
- err = -1;
- }
- gen->is_running = 0;
- }
- Py_XDECREF(retval);
- return err;
-}
-
-static PyObject *__Pyx_Generator_Next(PyObject *self) {
- __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
- PyObject *yf = gen->yieldfrom;
+ {
+ PyObject *meth;
+ gen->is_running = 1;
+ meth = __Pyx_PyObject_GetAttrStr(yf, PYIDENT("close"));
+ if (unlikely(!meth)) {
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ PyErr_WriteUnraisable(yf);
+ }
+ PyErr_Clear();
+ } else {
+ retval = PyObject_CallFunction(meth, NULL);
+ Py_DECREF(meth);
+ if (!retval)
+ err = -1;
+ }
+ gen->is_running = 0;
+ }
+ Py_XDECREF(retval);
+ return err;
+}
+
+static PyObject *__Pyx_Generator_Next(PyObject *self) {
+ __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
+ PyObject *yf = gen->yieldfrom;
if (unlikely(gen->is_running))
return __Pyx_Coroutine_AlreadyRunningError(gen);
- if (yf) {
- PyObject *ret;
- // FIXME: does this really need an INCREF() ?
- //Py_INCREF(yf);
- // YieldFrom code ensures that yf is an iterator
- gen->is_running = 1;
- #ifdef __Pyx_Generator_USED
- if (__Pyx_Generator_CheckExact(yf)) {
- ret = __Pyx_Generator_Next(yf);
- } else
- #endif
+ if (yf) {
+ PyObject *ret;
+ // FIXME: does this really need an INCREF() ?
+ //Py_INCREF(yf);
+ // YieldFrom code ensures that yf is an iterator
+ gen->is_running = 1;
+ #ifdef __Pyx_Generator_USED
+ if (__Pyx_Generator_CheckExact(yf)) {
+ ret = __Pyx_Generator_Next(yf);
+ } else
+ #endif
#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3)
// _PyGen_Send() is not exported before Py3.6
if (PyGen_CheckExact(yf)) {
@@ -973,42 +973,42 @@ static PyObject *__Pyx_Generator_Next(PyObject *self) {
ret = __Pyx_Coroutine_Send(yf, Py_None);
} else
#endif
- ret = Py_TYPE(yf)->tp_iternext(yf);
- gen->is_running = 0;
- //Py_DECREF(yf);
- if (likely(ret)) {
- return ret;
- }
- return __Pyx_Coroutine_FinishDelegation(gen);
- }
+ ret = Py_TYPE(yf)->tp_iternext(yf);
+ gen->is_running = 0;
+ //Py_DECREF(yf);
+ if (likely(ret)) {
+ return ret;
+ }
+ return __Pyx_Coroutine_FinishDelegation(gen);
+ }
return __Pyx_Coroutine_SendEx(gen, Py_None, 0);
-}
-
-static PyObject *__Pyx_Coroutine_Close_Method(PyObject *self, CYTHON_UNUSED PyObject *arg) {
- return __Pyx_Coroutine_Close(self);
-}
-
-static PyObject *__Pyx_Coroutine_Close(PyObject *self) {
- __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
- PyObject *retval, *raised_exception;
- PyObject *yf = gen->yieldfrom;
- int err = 0;
-
+}
+
+static PyObject *__Pyx_Coroutine_Close_Method(PyObject *self, CYTHON_UNUSED PyObject *arg) {
+ return __Pyx_Coroutine_Close(self);
+}
+
+static PyObject *__Pyx_Coroutine_Close(PyObject *self) {
+ __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+ PyObject *retval, *raised_exception;
+ PyObject *yf = gen->yieldfrom;
+ int err = 0;
+
if (unlikely(gen->is_running))
return __Pyx_Coroutine_AlreadyRunningError(gen);
-
- if (yf) {
- Py_INCREF(yf);
- err = __Pyx_Coroutine_CloseIter(gen, yf);
- __Pyx_Coroutine_Undelegate(gen);
- Py_DECREF(yf);
- }
- if (err == 0)
- PyErr_SetNone(PyExc_GeneratorExit);
+
+ if (yf) {
+ Py_INCREF(yf);
+ err = __Pyx_Coroutine_CloseIter(gen, yf);
+ __Pyx_Coroutine_Undelegate(gen);
+ Py_DECREF(yf);
+ }
+ if (err == 0)
+ PyErr_SetNone(PyExc_GeneratorExit);
retval = __Pyx_Coroutine_SendEx(gen, NULL, 1);
if (unlikely(retval)) {
const char *msg;
- Py_DECREF(retval);
+ Py_DECREF(retval);
if ((0)) {
#ifdef __Pyx_Coroutine_USED
} else if (__Pyx_Coroutine_Check(self)) {
@@ -1026,48 +1026,48 @@ static PyObject *__Pyx_Coroutine_Close(PyObject *self) {
msg = "generator ignored GeneratorExit";
}
PyErr_SetString(PyExc_RuntimeError, msg);
- return NULL;
- }
- raised_exception = PyErr_Occurred();
+ return NULL;
+ }
+ raised_exception = PyErr_Occurred();
if (likely(!raised_exception || __Pyx_PyErr_GivenExceptionMatches2(raised_exception, PyExc_GeneratorExit, PyExc_StopIteration))) {
- // ignore these errors
- if (raised_exception) PyErr_Clear();
- Py_INCREF(Py_None);
- return Py_None;
- }
- return NULL;
-}
-
+ // ignore these errors
+ if (raised_exception) PyErr_Clear();
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ return NULL;
+}
+
static PyObject *__Pyx__Coroutine_Throw(PyObject *self, PyObject *typ, PyObject *val, PyObject *tb,
PyObject *args, int close_on_genexit) {
- __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
- PyObject *yf = gen->yieldfrom;
-
+ __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+ PyObject *yf = gen->yieldfrom;
+
if (unlikely(gen->is_running))
return __Pyx_Coroutine_AlreadyRunningError(gen);
-
- if (yf) {
- PyObject *ret;
- Py_INCREF(yf);
+
+ if (yf) {
+ PyObject *ret;
+ Py_INCREF(yf);
if (__Pyx_PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && close_on_genexit) {
// Asynchronous generators *should not* be closed right away.
// We have to allow some awaits to work it through, hence the
// `close_on_genexit` parameter here.
- int err = __Pyx_Coroutine_CloseIter(gen, yf);
- Py_DECREF(yf);
- __Pyx_Coroutine_Undelegate(gen);
- if (err < 0)
+ int err = __Pyx_Coroutine_CloseIter(gen, yf);
+ Py_DECREF(yf);
+ __Pyx_Coroutine_Undelegate(gen);
+ if (err < 0)
return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0));
- goto throw_here;
- }
- gen->is_running = 1;
+ goto throw_here;
+ }
+ gen->is_running = 1;
if (0
- #ifdef __Pyx_Generator_USED
+ #ifdef __Pyx_Generator_USED
|| __Pyx_Generator_CheckExact(yf)
- #endif
- #ifdef __Pyx_Coroutine_USED
+ #endif
+ #ifdef __Pyx_Coroutine_USED
|| __Pyx_Coroutine_Check(yf)
- #endif
+ #endif
) {
ret = __Pyx__Coroutine_Throw(yf, typ, val, tb, args, close_on_genexit);
#ifdef __Pyx_Coroutine_USED
@@ -1075,70 +1075,70 @@ static PyObject *__Pyx__Coroutine_Throw(PyObject *self, PyObject *typ, PyObject
ret = __Pyx__Coroutine_Throw(((__pyx_CoroutineAwaitObject*)yf)->coroutine, typ, val, tb, args, close_on_genexit);
#endif
} else {
- PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, PYIDENT("throw"));
- if (unlikely(!meth)) {
- Py_DECREF(yf);
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
- gen->is_running = 0;
- return NULL;
- }
- PyErr_Clear();
- __Pyx_Coroutine_Undelegate(gen);
- gen->is_running = 0;
- goto throw_here;
- }
+ PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, PYIDENT("throw"));
+ if (unlikely(!meth)) {
+ Py_DECREF(yf);
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ gen->is_running = 0;
+ return NULL;
+ }
+ PyErr_Clear();
+ __Pyx_Coroutine_Undelegate(gen);
+ gen->is_running = 0;
+ goto throw_here;
+ }
if (likely(args)) {
ret = PyObject_CallObject(meth, args);
} else {
// "tb" or even "val" might be NULL, but that also correctly terminates the argument list
ret = PyObject_CallFunctionObjArgs(meth, typ, val, tb, NULL);
}
- Py_DECREF(meth);
- }
- gen->is_running = 0;
- Py_DECREF(yf);
- if (!ret) {
- ret = __Pyx_Coroutine_FinishDelegation(gen);
- }
+ Py_DECREF(meth);
+ }
+ gen->is_running = 0;
+ Py_DECREF(yf);
+ if (!ret) {
+ ret = __Pyx_Coroutine_FinishDelegation(gen);
+ }
return __Pyx_Coroutine_MethodReturn(self, ret);
- }
-throw_here:
- __Pyx_Raise(typ, val, tb, NULL);
+ }
+throw_here:
+ __Pyx_Raise(typ, val, tb, NULL);
return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0));
-}
-
+}
+
static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) {
PyObject *typ;
PyObject *val = NULL;
PyObject *tb = NULL;
-
+
if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
return NULL;
return __Pyx__Coroutine_Throw(self, typ, val, tb, args, 1);
}
-static CYTHON_INLINE int __Pyx_Coroutine_traverse_excstate(__Pyx_ExcInfoStruct *exc_state, visitproc visit, void *arg) {
- Py_VISIT(exc_state->exc_type);
- Py_VISIT(exc_state->exc_value);
- Py_VISIT(exc_state->exc_traceback);
- return 0;
-}
-
+static CYTHON_INLINE int __Pyx_Coroutine_traverse_excstate(__Pyx_ExcInfoStruct *exc_state, visitproc visit, void *arg) {
+ Py_VISIT(exc_state->exc_type);
+ Py_VISIT(exc_state->exc_value);
+ Py_VISIT(exc_state->exc_traceback);
+ return 0;
+}
+
static int __Pyx_Coroutine_traverse(__pyx_CoroutineObject *gen, visitproc visit, void *arg) {
- Py_VISIT(gen->closure);
- Py_VISIT(gen->classobj);
- Py_VISIT(gen->yieldfrom);
- return __Pyx_Coroutine_traverse_excstate(&gen->gi_exc_state, visit, arg);
-}
-
-static int __Pyx_Coroutine_clear(PyObject *self) {
- __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
-
- Py_CLEAR(gen->closure);
- Py_CLEAR(gen->classobj);
- Py_CLEAR(gen->yieldfrom);
- __Pyx_Coroutine_ExceptionClear(&gen->gi_exc_state);
+ Py_VISIT(gen->closure);
+ Py_VISIT(gen->classobj);
+ Py_VISIT(gen->yieldfrom);
+ return __Pyx_Coroutine_traverse_excstate(&gen->gi_exc_state, visit, arg);
+}
+
+static int __Pyx_Coroutine_clear(PyObject *self) {
+ __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+
+ Py_CLEAR(gen->closure);
+ Py_CLEAR(gen->classobj);
+ Py_CLEAR(gen->yieldfrom);
+ __Pyx_Coroutine_ExceptionClear(&gen->gi_exc_state);
#ifdef __Pyx_AsyncGen_USED
if (__Pyx_AsyncGen_CheckExact(self)) {
Py_CLEAR(((__pyx_PyAsyncGenObject*)gen)->ag_finalizer);
@@ -1146,35 +1146,35 @@ static int __Pyx_Coroutine_clear(PyObject *self) {
#endif
Py_CLEAR(gen->gi_code);
Py_CLEAR(gen->gi_frame);
- Py_CLEAR(gen->gi_name);
- Py_CLEAR(gen->gi_qualname);
+ Py_CLEAR(gen->gi_name);
+ Py_CLEAR(gen->gi_qualname);
Py_CLEAR(gen->gi_modulename);
- return 0;
-}
-
-static void __Pyx_Coroutine_dealloc(PyObject *self) {
- __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
-
- PyObject_GC_UnTrack(gen);
- if (gen->gi_weakreflist != NULL)
- PyObject_ClearWeakRefs(self);
-
+ return 0;
+}
+
+static void __Pyx_Coroutine_dealloc(PyObject *self) {
+ __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+
+ PyObject_GC_UnTrack(gen);
+ if (gen->gi_weakreflist != NULL)
+ PyObject_ClearWeakRefs(self);
+
if (gen->resume_label >= 0) {
// Generator is paused or unstarted, so we need to close
- PyObject_GC_Track(self);
+ PyObject_GC_Track(self);
#if PY_VERSION_HEX >= 0x030400a1 && CYTHON_USE_TP_FINALIZE
- if (PyObject_CallFinalizerFromDealloc(self))
-#else
- Py_TYPE(gen)->tp_del(self);
+ if (PyObject_CallFinalizerFromDealloc(self))
+#else
+ Py_TYPE(gen)->tp_del(self);
if (Py_REFCNT(self) > 0)
-#endif
- {
- // resurrected. :(
- return;
- }
- PyObject_GC_UnTrack(self);
- }
-
+#endif
+ {
+ // resurrected. :(
+ return;
+ }
+ PyObject_GC_UnTrack(self);
+ }
+
#ifdef __Pyx_AsyncGen_USED
if (__Pyx_AsyncGen_CheckExact(self)) {
/* We have to handle this case for asynchronous generators
@@ -1183,31 +1183,31 @@ static void __Pyx_Coroutine_dealloc(PyObject *self) {
Py_CLEAR(((__pyx_PyAsyncGenObject*)self)->ag_finalizer);
}
#endif
- __Pyx_Coroutine_clear(self);
- PyObject_GC_Del(gen);
-}
-
-static void __Pyx_Coroutine_del(PyObject *self) {
- PyObject *error_type, *error_value, *error_traceback;
- __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
- __Pyx_PyThreadState_declare
-
+ __Pyx_Coroutine_clear(self);
+ PyObject_GC_Del(gen);
+}
+
+static void __Pyx_Coroutine_del(PyObject *self) {
+ PyObject *error_type, *error_value, *error_traceback;
+ __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+ __Pyx_PyThreadState_declare
+
if (gen->resume_label < 0) {
// already terminated => nothing to clean up
return;
}
-
+
#if !CYTHON_USE_TP_FINALIZE
- // Temporarily resurrect the object.
- assert(self->ob_refcnt == 0);
+ // Temporarily resurrect the object.
+ assert(self->ob_refcnt == 0);
__Pyx_SET_REFCNT(self, 1);
-#endif
-
+#endif
+
__Pyx_PyThreadState_assign
- // Save the current exception, if any.
- __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
-
+ // Save the current exception, if any.
+ __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
+
#ifdef __Pyx_AsyncGen_USED
if (__Pyx_AsyncGen_CheckExact(self)) {
__pyx_PyAsyncGenObject *agen = (__pyx_PyAsyncGenObject*)self;
@@ -1225,7 +1225,7 @@ static void __Pyx_Coroutine_del(PyObject *self) {
}
}
#endif
-
+
if (unlikely(gen->resume_label == 0 && !error_value)) {
#ifdef __Pyx_Coroutine_USED
#ifdef __Pyx_Generator_USED
@@ -1250,7 +1250,7 @@ static void __Pyx_Coroutine_del(PyObject *self) {
qualname = gen->gi_qualname;
cname = PyString_AS_STRING(qualname);
msg = PyString_FromFormat("coroutine '%.50s' was never awaited", cname);
-
+
if (unlikely(!msg)) {
PyErr_Clear();
cmsg = (char*) "coroutine was never awaited";
@@ -1275,109 +1275,109 @@ static void __Pyx_Coroutine_del(PyObject *self) {
}
}
- // Restore the saved exception.
- __Pyx_ErrRestore(error_type, error_value, error_traceback);
-
+ // Restore the saved exception.
+ __Pyx_ErrRestore(error_type, error_value, error_traceback);
+
#if !CYTHON_USE_TP_FINALIZE
- // Undo the temporary resurrection; can't use DECREF here, it would
- // cause a recursive call.
+ // Undo the temporary resurrection; can't use DECREF here, it would
+ // cause a recursive call.
assert(Py_REFCNT(self) > 0);
- if (--self->ob_refcnt == 0) {
- // this is the normal path out
- return;
- }
-
- // close() resurrected it! Make it look like the original Py_DECREF
- // never happened.
- {
+ if (--self->ob_refcnt == 0) {
+ // this is the normal path out
+ return;
+ }
+
+ // close() resurrected it! Make it look like the original Py_DECREF
+ // never happened.
+ {
Py_ssize_t refcnt = Py_REFCNT(self);
- _Py_NewReference(self);
+ _Py_NewReference(self);
__Pyx_SET_REFCNT(self, refcnt);
- }
-#if CYTHON_COMPILING_IN_CPYTHON
+ }
+#if CYTHON_COMPILING_IN_CPYTHON
assert(PyType_IS_GC(Py_TYPE(self)) &&
- _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
-
- // If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
- // we need to undo that.
- _Py_DEC_REFTOTAL;
-#endif
- // If Py_TRACE_REFS, _Py_NewReference re-added self to the object
- // chain, so no more to do there.
- // If COUNT_ALLOCS, the original decref bumped tp_frees, and
- // _Py_NewReference bumped tp_allocs: both of those need to be
- // undone.
-#ifdef COUNT_ALLOCS
- --Py_TYPE(self)->tp_frees;
- --Py_TYPE(self)->tp_allocs;
-#endif
-#endif
-}
-
-static PyObject *
-__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context)
-{
- PyObject *name = self->gi_name;
- // avoid NULL pointer dereference during garbage collection
- if (unlikely(!name)) name = Py_None;
- Py_INCREF(name);
- return name;
-}
-
-static int
-__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context)
-{
- PyObject *tmp;
-
-#if PY_MAJOR_VERSION >= 3
- if (unlikely(value == NULL || !PyUnicode_Check(value)))
-#else
- if (unlikely(value == NULL || !PyString_Check(value)))
-#endif
- {
- PyErr_SetString(PyExc_TypeError,
- "__name__ must be set to a string object");
- return -1;
- }
- tmp = self->gi_name;
- Py_INCREF(value);
- self->gi_name = value;
- Py_XDECREF(tmp);
- return 0;
-}
-
-static PyObject *
-__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context)
-{
- PyObject *name = self->gi_qualname;
- // avoid NULL pointer dereference during garbage collection
- if (unlikely(!name)) name = Py_None;
- Py_INCREF(name);
- return name;
-}
-
-static int
-__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context)
-{
- PyObject *tmp;
-
-#if PY_MAJOR_VERSION >= 3
- if (unlikely(value == NULL || !PyUnicode_Check(value)))
-#else
- if (unlikely(value == NULL || !PyString_Check(value)))
-#endif
- {
- PyErr_SetString(PyExc_TypeError,
- "__qualname__ must be set to a string object");
- return -1;
- }
- tmp = self->gi_qualname;
- Py_INCREF(value);
- self->gi_qualname = value;
- Py_XDECREF(tmp);
- return 0;
-}
-
+ _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
+
+ // If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
+ // we need to undo that.
+ _Py_DEC_REFTOTAL;
+#endif
+ // If Py_TRACE_REFS, _Py_NewReference re-added self to the object
+ // chain, so no more to do there.
+ // If COUNT_ALLOCS, the original decref bumped tp_frees, and
+ // _Py_NewReference bumped tp_allocs: both of those need to be
+ // undone.
+#ifdef COUNT_ALLOCS
+ --Py_TYPE(self)->tp_frees;
+ --Py_TYPE(self)->tp_allocs;
+#endif
+#endif
+}
+
+static PyObject *
+__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context)
+{
+ PyObject *name = self->gi_name;
+ // avoid NULL pointer dereference during garbage collection
+ if (unlikely(!name)) name = Py_None;
+ Py_INCREF(name);
+ return name;
+}
+
+static int
+__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context)
+{
+ PyObject *tmp;
+
+#if PY_MAJOR_VERSION >= 3
+ if (unlikely(value == NULL || !PyUnicode_Check(value)))
+#else
+ if (unlikely(value == NULL || !PyString_Check(value)))
+#endif
+ {
+ PyErr_SetString(PyExc_TypeError,
+ "__name__ must be set to a string object");
+ return -1;
+ }
+ tmp = self->gi_name;
+ Py_INCREF(value);
+ self->gi_name = value;
+ Py_XDECREF(tmp);
+ return 0;
+}
+
+static PyObject *
+__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context)
+{
+ PyObject *name = self->gi_qualname;
+ // avoid NULL pointer dereference during garbage collection
+ if (unlikely(!name)) name = Py_None;
+ Py_INCREF(name);
+ return name;
+}
+
+static int
+__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context)
+{
+ PyObject *tmp;
+
+#if PY_MAJOR_VERSION >= 3
+ if (unlikely(value == NULL || !PyUnicode_Check(value)))
+#else
+ if (unlikely(value == NULL || !PyString_Check(value)))
+#endif
+ {
+ PyErr_SetString(PyExc_TypeError,
+ "__qualname__ must be set to a string object");
+ return -1;
+ }
+ tmp = self->gi_qualname;
+ Py_INCREF(value);
+ self->gi_qualname = value;
+ Py_XDECREF(tmp);
+ return 0;
+}
+
static PyObject *
__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context)
@@ -1403,353 +1403,353 @@ __Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *conte
return frame;
}
-static __pyx_CoroutineObject *__Pyx__Coroutine_New(
+static __pyx_CoroutineObject *__Pyx__Coroutine_New(
PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
- PyObject *name, PyObject *qualname, PyObject *module_name) {
- __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type);
+ PyObject *name, PyObject *qualname, PyObject *module_name) {
+ __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type);
if (unlikely(!gen))
- return NULL;
+ return NULL;
return __Pyx__Coroutine_NewInit(gen, body, code, closure, name, qualname, module_name);
}
-
+
static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit(
__pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
PyObject *name, PyObject *qualname, PyObject *module_name) {
- gen->body = body;
- gen->closure = closure;
- Py_XINCREF(closure);
- gen->is_running = 0;
- gen->resume_label = 0;
- gen->classobj = NULL;
- gen->yieldfrom = NULL;
- gen->gi_exc_state.exc_type = NULL;
- gen->gi_exc_state.exc_value = NULL;
- gen->gi_exc_state.exc_traceback = NULL;
-#if CYTHON_USE_EXC_INFO_STACK
- gen->gi_exc_state.previous_item = NULL;
-#endif
- gen->gi_weakreflist = NULL;
- Py_XINCREF(qualname);
- gen->gi_qualname = qualname;
- Py_XINCREF(name);
- gen->gi_name = name;
- Py_XINCREF(module_name);
- gen->gi_modulename = module_name;
+ gen->body = body;
+ gen->closure = closure;
+ Py_XINCREF(closure);
+ gen->is_running = 0;
+ gen->resume_label = 0;
+ gen->classobj = NULL;
+ gen->yieldfrom = NULL;
+ gen->gi_exc_state.exc_type = NULL;
+ gen->gi_exc_state.exc_value = NULL;
+ gen->gi_exc_state.exc_traceback = NULL;
+#if CYTHON_USE_EXC_INFO_STACK
+ gen->gi_exc_state.previous_item = NULL;
+#endif
+ gen->gi_weakreflist = NULL;
+ Py_XINCREF(qualname);
+ gen->gi_qualname = qualname;
+ Py_XINCREF(name);
+ gen->gi_name = name;
+ Py_XINCREF(module_name);
+ gen->gi_modulename = module_name;
Py_XINCREF(code);
gen->gi_code = code;
gen->gi_frame = NULL;
-
- PyObject_GC_Track(gen);
- return gen;
-}
-
-
-//////////////////// Coroutine ////////////////////
-//@requires: CoroutineBase
-//@requires: PatchGeneratorABC
+
+ PyObject_GC_Track(gen);
+ return gen;
+}
+
+
+//////////////////// Coroutine ////////////////////
+//@requires: CoroutineBase
+//@requires: PatchGeneratorABC
//@requires: ObjectHandling.c::PyObject_GenericGetAttrNoDict
-
-static void __Pyx_CoroutineAwait_dealloc(PyObject *self) {
- PyObject_GC_UnTrack(self);
- Py_CLEAR(((__pyx_CoroutineAwaitObject*)self)->coroutine);
- PyObject_GC_Del(self);
-}
-
-static int __Pyx_CoroutineAwait_traverse(__pyx_CoroutineAwaitObject *self, visitproc visit, void *arg) {
- Py_VISIT(self->coroutine);
- return 0;
-}
-
-static int __Pyx_CoroutineAwait_clear(__pyx_CoroutineAwaitObject *self) {
- Py_CLEAR(self->coroutine);
- return 0;
-}
-
-static PyObject *__Pyx_CoroutineAwait_Next(__pyx_CoroutineAwaitObject *self) {
- return __Pyx_Generator_Next(self->coroutine);
-}
-
-static PyObject *__Pyx_CoroutineAwait_Send(__pyx_CoroutineAwaitObject *self, PyObject *value) {
- return __Pyx_Coroutine_Send(self->coroutine, value);
-}
-
-static PyObject *__Pyx_CoroutineAwait_Throw(__pyx_CoroutineAwaitObject *self, PyObject *args) {
- return __Pyx_Coroutine_Throw(self->coroutine, args);
-}
-
-static PyObject *__Pyx_CoroutineAwait_Close(__pyx_CoroutineAwaitObject *self, CYTHON_UNUSED PyObject *arg) {
- return __Pyx_Coroutine_Close(self->coroutine);
-}
-
-static PyObject *__Pyx_CoroutineAwait_self(PyObject *self) {
- Py_INCREF(self);
- return self;
-}
-
-#if !CYTHON_COMPILING_IN_PYPY
-static PyObject *__Pyx_CoroutineAwait_no_new(CYTHON_UNUSED PyTypeObject *type, CYTHON_UNUSED PyObject *args, CYTHON_UNUSED PyObject *kwargs) {
- PyErr_SetString(PyExc_TypeError, "cannot instantiate type, use 'await coroutine' instead");
- return NULL;
-}
-#endif
-
-static PyMethodDef __pyx_CoroutineAwait_methods[] = {
- {"send", (PyCFunction) __Pyx_CoroutineAwait_Send, METH_O,
- (char*) PyDoc_STR("send(arg) -> send 'arg' into coroutine,\nreturn next yielded value or raise StopIteration.")},
- {"throw", (PyCFunction) __Pyx_CoroutineAwait_Throw, METH_VARARGS,
- (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in coroutine,\nreturn next yielded value or raise StopIteration.")},
- {"close", (PyCFunction) __Pyx_CoroutineAwait_Close, METH_NOARGS,
- (char*) PyDoc_STR("close() -> raise GeneratorExit inside coroutine.")},
- {0, 0, 0, 0}
-};
-
-static PyTypeObject __pyx_CoroutineAwaitType_type = {
- PyVarObject_HEAD_INIT(0, 0)
- "coroutine_wrapper", /*tp_name*/
- sizeof(__pyx_CoroutineAwaitObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor) __Pyx_CoroutineAwait_dealloc,/*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_as_async resp. tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
- PyDoc_STR("A wrapper object implementing __await__ for coroutines."), /*tp_doc*/
- (traverseproc) __Pyx_CoroutineAwait_traverse, /*tp_traverse*/
- (inquiry) __Pyx_CoroutineAwait_clear, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- __Pyx_CoroutineAwait_self, /*tp_iter*/
- (iternextfunc) __Pyx_CoroutineAwait_Next, /*tp_iternext*/
- __pyx_CoroutineAwait_methods, /*tp_methods*/
- 0 , /*tp_members*/
- 0 , /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- 0, /*tp_init*/
- 0, /*tp_alloc*/
-#if !CYTHON_COMPILING_IN_PYPY
- __Pyx_CoroutineAwait_no_new, /*tp_new*/
-#else
- 0, /*tp_new*/
-#endif
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
- 0, /*tp_bases*/
- 0, /*tp_mro*/
- 0, /*tp_cache*/
- 0, /*tp_subclasses*/
- 0, /*tp_weaklist*/
- 0, /*tp_del*/
- 0, /*tp_version_tag*/
-#if PY_VERSION_HEX >= 0x030400a1
- 0, /*tp_finalize*/
-#endif
+
+static void __Pyx_CoroutineAwait_dealloc(PyObject *self) {
+ PyObject_GC_UnTrack(self);
+ Py_CLEAR(((__pyx_CoroutineAwaitObject*)self)->coroutine);
+ PyObject_GC_Del(self);
+}
+
+static int __Pyx_CoroutineAwait_traverse(__pyx_CoroutineAwaitObject *self, visitproc visit, void *arg) {
+ Py_VISIT(self->coroutine);
+ return 0;
+}
+
+static int __Pyx_CoroutineAwait_clear(__pyx_CoroutineAwaitObject *self) {
+ Py_CLEAR(self->coroutine);
+ return 0;
+}
+
+static PyObject *__Pyx_CoroutineAwait_Next(__pyx_CoroutineAwaitObject *self) {
+ return __Pyx_Generator_Next(self->coroutine);
+}
+
+static PyObject *__Pyx_CoroutineAwait_Send(__pyx_CoroutineAwaitObject *self, PyObject *value) {
+ return __Pyx_Coroutine_Send(self->coroutine, value);
+}
+
+static PyObject *__Pyx_CoroutineAwait_Throw(__pyx_CoroutineAwaitObject *self, PyObject *args) {
+ return __Pyx_Coroutine_Throw(self->coroutine, args);
+}
+
+static PyObject *__Pyx_CoroutineAwait_Close(__pyx_CoroutineAwaitObject *self, CYTHON_UNUSED PyObject *arg) {
+ return __Pyx_Coroutine_Close(self->coroutine);
+}
+
+static PyObject *__Pyx_CoroutineAwait_self(PyObject *self) {
+ Py_INCREF(self);
+ return self;
+}
+
+#if !CYTHON_COMPILING_IN_PYPY
+static PyObject *__Pyx_CoroutineAwait_no_new(CYTHON_UNUSED PyTypeObject *type, CYTHON_UNUSED PyObject *args, CYTHON_UNUSED PyObject *kwargs) {
+ PyErr_SetString(PyExc_TypeError, "cannot instantiate type, use 'await coroutine' instead");
+ return NULL;
+}
+#endif
+
+static PyMethodDef __pyx_CoroutineAwait_methods[] = {
+ {"send", (PyCFunction) __Pyx_CoroutineAwait_Send, METH_O,
+ (char*) PyDoc_STR("send(arg) -> send 'arg' into coroutine,\nreturn next yielded value or raise StopIteration.")},
+ {"throw", (PyCFunction) __Pyx_CoroutineAwait_Throw, METH_VARARGS,
+ (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in coroutine,\nreturn next yielded value or raise StopIteration.")},
+ {"close", (PyCFunction) __Pyx_CoroutineAwait_Close, METH_NOARGS,
+ (char*) PyDoc_STR("close() -> raise GeneratorExit inside coroutine.")},
+ {0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_CoroutineAwaitType_type = {
+ PyVarObject_HEAD_INIT(0, 0)
+ "coroutine_wrapper", /*tp_name*/
+ sizeof(__pyx_CoroutineAwaitObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor) __Pyx_CoroutineAwait_dealloc,/*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_as_async resp. tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ PyDoc_STR("A wrapper object implementing __await__ for coroutines."), /*tp_doc*/
+ (traverseproc) __Pyx_CoroutineAwait_traverse, /*tp_traverse*/
+ (inquiry) __Pyx_CoroutineAwait_clear, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ __Pyx_CoroutineAwait_self, /*tp_iter*/
+ (iternextfunc) __Pyx_CoroutineAwait_Next, /*tp_iternext*/
+ __pyx_CoroutineAwait_methods, /*tp_methods*/
+ 0 , /*tp_members*/
+ 0 , /*tp_getset*/
+ 0, /*tp_base*/
+ 0, /*tp_dict*/
+ 0, /*tp_descr_get*/
+ 0, /*tp_descr_set*/
+ 0, /*tp_dictoffset*/
+ 0, /*tp_init*/
+ 0, /*tp_alloc*/
+#if !CYTHON_COMPILING_IN_PYPY
+ __Pyx_CoroutineAwait_no_new, /*tp_new*/
+#else
+ 0, /*tp_new*/
+#endif
+ 0, /*tp_free*/
+ 0, /*tp_is_gc*/
+ 0, /*tp_bases*/
+ 0, /*tp_mro*/
+ 0, /*tp_cache*/
+ 0, /*tp_subclasses*/
+ 0, /*tp_weaklist*/
+ 0, /*tp_del*/
+ 0, /*tp_version_tag*/
+#if PY_VERSION_HEX >= 0x030400a1
+ 0, /*tp_finalize*/
+#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
-};
-
-#if PY_VERSION_HEX < 0x030500B1 || defined(__Pyx_IterableCoroutine_USED) || CYTHON_USE_ASYNC_SLOTS
-static CYTHON_INLINE PyObject *__Pyx__Coroutine_await(PyObject *coroutine) {
- __pyx_CoroutineAwaitObject *await = PyObject_GC_New(__pyx_CoroutineAwaitObject, __pyx_CoroutineAwaitType);
- if (unlikely(!await)) return NULL;
- Py_INCREF(coroutine);
- await->coroutine = coroutine;
- PyObject_GC_Track(await);
- return (PyObject*)await;
-}
-#endif
-
-#if PY_VERSION_HEX < 0x030500B1
-static PyObject *__Pyx_Coroutine_await_method(PyObject *coroutine, CYTHON_UNUSED PyObject *arg) {
- return __Pyx__Coroutine_await(coroutine);
-}
-#endif
-
-#if defined(__Pyx_IterableCoroutine_USED) || CYTHON_USE_ASYNC_SLOTS
-static PyObject *__Pyx_Coroutine_await(PyObject *coroutine) {
+};
+
+#if PY_VERSION_HEX < 0x030500B1 || defined(__Pyx_IterableCoroutine_USED) || CYTHON_USE_ASYNC_SLOTS
+static CYTHON_INLINE PyObject *__Pyx__Coroutine_await(PyObject *coroutine) {
+ __pyx_CoroutineAwaitObject *await = PyObject_GC_New(__pyx_CoroutineAwaitObject, __pyx_CoroutineAwaitType);
+ if (unlikely(!await)) return NULL;
+ Py_INCREF(coroutine);
+ await->coroutine = coroutine;
+ PyObject_GC_Track(await);
+ return (PyObject*)await;
+}
+#endif
+
+#if PY_VERSION_HEX < 0x030500B1
+static PyObject *__Pyx_Coroutine_await_method(PyObject *coroutine, CYTHON_UNUSED PyObject *arg) {
+ return __Pyx__Coroutine_await(coroutine);
+}
+#endif
+
+#if defined(__Pyx_IterableCoroutine_USED) || CYTHON_USE_ASYNC_SLOTS
+static PyObject *__Pyx_Coroutine_await(PyObject *coroutine) {
if (unlikely(!coroutine || !__Pyx_Coroutine_Check(coroutine))) {
- PyErr_SetString(PyExc_TypeError, "invalid input, expected coroutine");
- return NULL;
- }
- return __Pyx__Coroutine_await(coroutine);
-}
-#endif
-
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x030500B1
-static PyObject *__Pyx_Coroutine_compare(PyObject *obj, PyObject *other, int op) {
- PyObject* result;
- switch (op) {
- case Py_EQ: result = (other == obj) ? Py_True : Py_False; break;
- case Py_NE: result = (other != obj) ? Py_True : Py_False; break;
- default:
- result = Py_NotImplemented;
- }
- Py_INCREF(result);
- return result;
-}
-#endif
-
-static PyMethodDef __pyx_Coroutine_methods[] = {
- {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
- (char*) PyDoc_STR("send(arg) -> send 'arg' into coroutine,\nreturn next iterated value or raise StopIteration.")},
- {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
- (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in coroutine,\nreturn next iterated value or raise StopIteration.")},
- {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS,
- (char*) PyDoc_STR("close() -> raise GeneratorExit inside coroutine.")},
-#if PY_VERSION_HEX < 0x030500B1
- {"__await__", (PyCFunction) __Pyx_Coroutine_await_method, METH_NOARGS,
- (char*) PyDoc_STR("__await__() -> return an iterator to be used in await expression.")},
-#endif
- {0, 0, 0, 0}
-};
-
-static PyMemberDef __pyx_Coroutine_memberlist[] = {
- {(char *) "cr_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
- {(char*) "cr_await", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
- (char*) PyDoc_STR("object being awaited, or None")},
+ PyErr_SetString(PyExc_TypeError, "invalid input, expected coroutine");
+ return NULL;
+ }
+ return __Pyx__Coroutine_await(coroutine);
+}
+#endif
+
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x030500B1
+static PyObject *__Pyx_Coroutine_compare(PyObject *obj, PyObject *other, int op) {
+ PyObject* result;
+ switch (op) {
+ case Py_EQ: result = (other == obj) ? Py_True : Py_False; break;
+ case Py_NE: result = (other != obj) ? Py_True : Py_False; break;
+ default:
+ result = Py_NotImplemented;
+ }
+ Py_INCREF(result);
+ return result;
+}
+#endif
+
+static PyMethodDef __pyx_Coroutine_methods[] = {
+ {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
+ (char*) PyDoc_STR("send(arg) -> send 'arg' into coroutine,\nreturn next iterated value or raise StopIteration.")},
+ {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
+ (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in coroutine,\nreturn next iterated value or raise StopIteration.")},
+ {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS,
+ (char*) PyDoc_STR("close() -> raise GeneratorExit inside coroutine.")},
+#if PY_VERSION_HEX < 0x030500B1
+ {"__await__", (PyCFunction) __Pyx_Coroutine_await_method, METH_NOARGS,
+ (char*) PyDoc_STR("__await__() -> return an iterator to be used in await expression.")},
+#endif
+ {0, 0, 0, 0}
+};
+
+static PyMemberDef __pyx_Coroutine_memberlist[] = {
+ {(char *) "cr_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
+ {(char*) "cr_await", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
+ (char*) PyDoc_STR("object being awaited, or None")},
{(char*) "cr_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL},
- {(char *) "__module__", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_modulename), PY_WRITE_RESTRICTED, 0},
- {0, 0, 0, 0, 0}
-};
-
-static PyGetSetDef __pyx_Coroutine_getsets[] = {
- {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
- (char*) PyDoc_STR("name of the coroutine"), 0},
- {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
- (char*) PyDoc_STR("qualified name of the coroutine"), 0},
+ {(char *) "__module__", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_modulename), PY_WRITE_RESTRICTED, 0},
+ {0, 0, 0, 0, 0}
+};
+
+static PyGetSetDef __pyx_Coroutine_getsets[] = {
+ {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
+ (char*) PyDoc_STR("name of the coroutine"), 0},
+ {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
+ (char*) PyDoc_STR("qualified name of the coroutine"), 0},
{(char *) "cr_frame", (getter)__Pyx_Coroutine_get_frame, NULL,
(char*) PyDoc_STR("Frame of the coroutine"), 0},
- {0, 0, 0, 0, 0}
-};
-
-#if CYTHON_USE_ASYNC_SLOTS
-static __Pyx_PyAsyncMethodsStruct __pyx_Coroutine_as_async = {
- __Pyx_Coroutine_await, /*am_await*/
- 0, /*am_aiter*/
- 0, /*am_anext*/
+ {0, 0, 0, 0, 0}
+};
+
+#if CYTHON_USE_ASYNC_SLOTS
+static __Pyx_PyAsyncMethodsStruct __pyx_Coroutine_as_async = {
+ __Pyx_Coroutine_await, /*am_await*/
+ 0, /*am_aiter*/
+ 0, /*am_anext*/
#if PY_VERSION_HEX >= 0x030A00A3
0, /*am_send*/
#endif
-};
-#endif
-
-static PyTypeObject __pyx_CoroutineType_type = {
- PyVarObject_HEAD_INIT(0, 0)
- "coroutine", /*tp_name*/
- sizeof(__pyx_CoroutineObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
+};
+#endif
+
+static PyTypeObject __pyx_CoroutineType_type = {
+ PyVarObject_HEAD_INIT(0, 0)
+ "coroutine", /*tp_name*/
+ sizeof(__pyx_CoroutineObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
(destructor) __Pyx_Coroutine_dealloc,/*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
-#if CYTHON_USE_ASYNC_SLOTS
- &__pyx_Coroutine_as_async, /*tp_as_async (tp_reserved) - Py3 only! */
-#else
- 0, /*tp_reserved*/
-#endif
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
- 0, /*tp_doc*/
- (traverseproc) __Pyx_Coroutine_traverse, /*tp_traverse*/
- 0, /*tp_clear*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+#if CYTHON_USE_ASYNC_SLOTS
+ &__pyx_Coroutine_as_async, /*tp_as_async (tp_reserved) - Py3 only! */
+#else
+ 0, /*tp_reserved*/
+#endif
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+ 0, /*tp_doc*/
+ (traverseproc) __Pyx_Coroutine_traverse, /*tp_traverse*/
+ 0, /*tp_clear*/
#if CYTHON_USE_ASYNC_SLOTS && CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x030500B1
- // in order to (mis-)use tp_reserved above, we must also implement tp_richcompare
- __Pyx_Coroutine_compare, /*tp_richcompare*/
-#else
- 0, /*tp_richcompare*/
-#endif
- offsetof(__pyx_CoroutineObject, gi_weakreflist), /*tp_weaklistoffset*/
+ // in order to (mis-)use tp_reserved above, we must also implement tp_richcompare
+ __Pyx_Coroutine_compare, /*tp_richcompare*/
+#else
+ 0, /*tp_richcompare*/
+#endif
+ offsetof(__pyx_CoroutineObject, gi_weakreflist), /*tp_weaklistoffset*/
// no tp_iter() as iterator is only available through __await__()
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- __pyx_Coroutine_methods, /*tp_methods*/
- __pyx_Coroutine_memberlist, /*tp_members*/
- __pyx_Coroutine_getsets, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- 0, /*tp_init*/
- 0, /*tp_alloc*/
- 0, /*tp_new*/
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
- 0, /*tp_bases*/
- 0, /*tp_mro*/
- 0, /*tp_cache*/
- 0, /*tp_subclasses*/
- 0, /*tp_weaklist*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ __pyx_Coroutine_methods, /*tp_methods*/
+ __pyx_Coroutine_memberlist, /*tp_members*/
+ __pyx_Coroutine_getsets, /*tp_getset*/
+ 0, /*tp_base*/
+ 0, /*tp_dict*/
+ 0, /*tp_descr_get*/
+ 0, /*tp_descr_set*/
+ 0, /*tp_dictoffset*/
+ 0, /*tp_init*/
+ 0, /*tp_alloc*/
+ 0, /*tp_new*/
+ 0, /*tp_free*/
+ 0, /*tp_is_gc*/
+ 0, /*tp_bases*/
+ 0, /*tp_mro*/
+ 0, /*tp_cache*/
+ 0, /*tp_subclasses*/
+ 0, /*tp_weaklist*/
#if CYTHON_USE_TP_FINALIZE
- 0, /*tp_del*/
-#else
- __Pyx_Coroutine_del, /*tp_del*/
-#endif
- 0, /*tp_version_tag*/
+ 0, /*tp_del*/
+#else
+ __Pyx_Coroutine_del, /*tp_del*/
+#endif
+ 0, /*tp_version_tag*/
#if CYTHON_USE_TP_FINALIZE
- __Pyx_Coroutine_del, /*tp_finalize*/
+ __Pyx_Coroutine_del, /*tp_finalize*/
#elif PY_VERSION_HEX >= 0x030400a1
0, /*tp_finalize*/
-#endif
+#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
-};
-
-static int __pyx_Coroutine_init(void) {
- // on Windows, C-API functions can't be used in slots statically
+};
+
+static int __pyx_Coroutine_init(void) {
+ // on Windows, C-API functions can't be used in slots statically
__pyx_CoroutineType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
- __pyx_CoroutineType = __Pyx_FetchCommonType(&__pyx_CoroutineType_type);
- if (unlikely(!__pyx_CoroutineType))
- return -1;
-
+ __pyx_CoroutineType = __Pyx_FetchCommonType(&__pyx_CoroutineType_type);
+ if (unlikely(!__pyx_CoroutineType))
+ return -1;
+
#ifdef __Pyx_IterableCoroutine_USED
if (unlikely(__pyx_IterableCoroutine_init() == -1))
return -1;
#endif
- __pyx_CoroutineAwaitType = __Pyx_FetchCommonType(&__pyx_CoroutineAwaitType_type);
- if (unlikely(!__pyx_CoroutineAwaitType))
- return -1;
- return 0;
-}
-
+ __pyx_CoroutineAwaitType = __Pyx_FetchCommonType(&__pyx_CoroutineAwaitType_type);
+ if (unlikely(!__pyx_CoroutineAwaitType))
+ return -1;
+ return 0;
+}
+
//////////////////// IterableCoroutine.proto ////////////////////
@@ -1836,11 +1836,11 @@ static PyTypeObject __pyx_IterableCoroutineType_type = {
__Pyx_Coroutine_del, /*tp_finalize*/
#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
@@ -1856,531 +1856,531 @@ static int __pyx_IterableCoroutine_init(void) {
}
-//////////////////// Generator ////////////////////
-//@requires: CoroutineBase
-//@requires: PatchGeneratorABC
+//////////////////// Generator ////////////////////
+//@requires: CoroutineBase
+//@requires: PatchGeneratorABC
//@requires: ObjectHandling.c::PyObject_GenericGetAttrNoDict
-
-static PyMethodDef __pyx_Generator_methods[] = {
- {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
- (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")},
- {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
- (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")},
- {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS,
- (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")},
- {0, 0, 0, 0}
-};
-
-static PyMemberDef __pyx_Generator_memberlist[] = {
- {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
- {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
- (char*) PyDoc_STR("object being iterated by 'yield from', or None")},
+
+static PyMethodDef __pyx_Generator_methods[] = {
+ {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
+ (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")},
+ {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
+ (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")},
+ {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS,
+ (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")},
+ {0, 0, 0, 0}
+};
+
+static PyMemberDef __pyx_Generator_memberlist[] = {
+ {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
+ {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
+ (char*) PyDoc_STR("object being iterated by 'yield from', or None")},
{(char*) "gi_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL},
- {0, 0, 0, 0, 0}
-};
-
-static PyGetSetDef __pyx_Generator_getsets[] = {
- {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
- (char*) PyDoc_STR("name of the generator"), 0},
- {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
- (char*) PyDoc_STR("qualified name of the generator"), 0},
+ {0, 0, 0, 0, 0}
+};
+
+static PyGetSetDef __pyx_Generator_getsets[] = {
+ {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
+ (char*) PyDoc_STR("name of the generator"), 0},
+ {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
+ (char*) PyDoc_STR("qualified name of the generator"), 0},
{(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL,
(char*) PyDoc_STR("Frame of the generator"), 0},
- {0, 0, 0, 0, 0}
-};
-
-static PyTypeObject __pyx_GeneratorType_type = {
- PyVarObject_HEAD_INIT(0, 0)
- "generator", /*tp_name*/
- sizeof(__pyx_CoroutineObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor) __Pyx_Coroutine_dealloc,/*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare / tp_as_async*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
- 0, /*tp_doc*/
- (traverseproc) __Pyx_Coroutine_traverse, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- offsetof(__pyx_CoroutineObject, gi_weakreflist), /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
- __pyx_Generator_methods, /*tp_methods*/
- __pyx_Generator_memberlist, /*tp_members*/
- __pyx_Generator_getsets, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- 0, /*tp_init*/
- 0, /*tp_alloc*/
- 0, /*tp_new*/
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
- 0, /*tp_bases*/
- 0, /*tp_mro*/
- 0, /*tp_cache*/
- 0, /*tp_subclasses*/
- 0, /*tp_weaklist*/
+ {0, 0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_GeneratorType_type = {
+ PyVarObject_HEAD_INIT(0, 0)
+ "generator", /*tp_name*/
+ sizeof(__pyx_CoroutineObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor) __Pyx_Coroutine_dealloc,/*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare / tp_as_async*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+ 0, /*tp_doc*/
+ (traverseproc) __Pyx_Coroutine_traverse, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ offsetof(__pyx_CoroutineObject, gi_weakreflist), /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
+ __pyx_Generator_methods, /*tp_methods*/
+ __pyx_Generator_memberlist, /*tp_members*/
+ __pyx_Generator_getsets, /*tp_getset*/
+ 0, /*tp_base*/
+ 0, /*tp_dict*/
+ 0, /*tp_descr_get*/
+ 0, /*tp_descr_set*/
+ 0, /*tp_dictoffset*/
+ 0, /*tp_init*/
+ 0, /*tp_alloc*/
+ 0, /*tp_new*/
+ 0, /*tp_free*/
+ 0, /*tp_is_gc*/
+ 0, /*tp_bases*/
+ 0, /*tp_mro*/
+ 0, /*tp_cache*/
+ 0, /*tp_subclasses*/
+ 0, /*tp_weaklist*/
#if CYTHON_USE_TP_FINALIZE
- 0, /*tp_del*/
-#else
- __Pyx_Coroutine_del, /*tp_del*/
-#endif
- 0, /*tp_version_tag*/
+ 0, /*tp_del*/
+#else
+ __Pyx_Coroutine_del, /*tp_del*/
+#endif
+ 0, /*tp_version_tag*/
#if CYTHON_USE_TP_FINALIZE
- __Pyx_Coroutine_del, /*tp_finalize*/
+ __Pyx_Coroutine_del, /*tp_finalize*/
#elif PY_VERSION_HEX >= 0x030400a1
0, /*tp_finalize*/
-#endif
+#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
-};
-
-static int __pyx_Generator_init(void) {
- // on Windows, C-API functions can't be used in slots statically
+};
+
+static int __pyx_Generator_init(void) {
+ // on Windows, C-API functions can't be used in slots statically
__pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
- __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
-
- __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
- if (unlikely(!__pyx_GeneratorType)) {
- return -1;
- }
- return 0;
-}
-
-
-/////////////// ReturnWithStopIteration.proto ///////////////
-
-#define __Pyx_ReturnWithStopIteration(value) \
- if (value == Py_None) PyErr_SetNone(PyExc_StopIteration); else __Pyx__ReturnWithStopIteration(value)
-static void __Pyx__ReturnWithStopIteration(PyObject* value); /*proto*/
-
-/////////////// ReturnWithStopIteration ///////////////
-//@requires: Exceptions.c::PyErrFetchRestore
-//@requires: Exceptions.c::PyThreadStateGet
-//@substitute: naming
-
-// 1) Instantiating an exception just to pass back a value is costly.
-// 2) CPython 3.3 <= x < 3.5b1 crash in yield-from when the StopIteration is not instantiated.
-// 3) Passing a tuple as value into PyErr_SetObject() passes its items on as arguments.
+ __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
+
+ __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
+ if (unlikely(!__pyx_GeneratorType)) {
+ return -1;
+ }
+ return 0;
+}
+
+
+/////////////// ReturnWithStopIteration.proto ///////////////
+
+#define __Pyx_ReturnWithStopIteration(value) \
+ if (value == Py_None) PyErr_SetNone(PyExc_StopIteration); else __Pyx__ReturnWithStopIteration(value)
+static void __Pyx__ReturnWithStopIteration(PyObject* value); /*proto*/
+
+/////////////// ReturnWithStopIteration ///////////////
+//@requires: Exceptions.c::PyErrFetchRestore
+//@requires: Exceptions.c::PyThreadStateGet
+//@substitute: naming
+
+// 1) Instantiating an exception just to pass back a value is costly.
+// 2) CPython 3.3 <= x < 3.5b1 crash in yield-from when the StopIteration is not instantiated.
+// 3) Passing a tuple as value into PyErr_SetObject() passes its items on as arguments.
// 4) Passing an exception as value will interpret it as an exception on unpacking and raise it (or unpack its value).
// 5) If there is currently an exception being handled, we need to chain it.
-
-static void __Pyx__ReturnWithStopIteration(PyObject* value) {
- PyObject *exc, *args;
-#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_PYSTON
- __Pyx_PyThreadState_declare
+
+static void __Pyx__ReturnWithStopIteration(PyObject* value) {
+ PyObject *exc, *args;
+#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_PYSTON
+ __Pyx_PyThreadState_declare
if ((PY_VERSION_HEX >= 0x03030000 && PY_VERSION_HEX < 0x030500B1)
|| unlikely(PyTuple_Check(value) || PyExceptionInstance_Check(value))) {
- args = PyTuple_New(1);
- if (unlikely(!args)) return;
- Py_INCREF(value);
- PyTuple_SET_ITEM(args, 0, value);
- exc = PyType_Type.tp_call(PyExc_StopIteration, args, NULL);
- Py_DECREF(args);
- if (!exc) return;
- } else {
- // it's safe to avoid instantiating the exception
- Py_INCREF(value);
- exc = value;
- }
+ args = PyTuple_New(1);
+ if (unlikely(!args)) return;
+ Py_INCREF(value);
+ PyTuple_SET_ITEM(args, 0, value);
+ exc = PyType_Type.tp_call(PyExc_StopIteration, args, NULL);
+ Py_DECREF(args);
+ if (!exc) return;
+ } else {
+ // it's safe to avoid instantiating the exception
+ Py_INCREF(value);
+ exc = value;
+ }
#if CYTHON_FAST_THREAD_STATE
- __Pyx_PyThreadState_assign
- #if CYTHON_USE_EXC_INFO_STACK
- if (!$local_tstate_cname->exc_info->exc_type)
+ __Pyx_PyThreadState_assign
+ #if CYTHON_USE_EXC_INFO_STACK
+ if (!$local_tstate_cname->exc_info->exc_type)
#else
if (!$local_tstate_cname->exc_type)
#endif
{
- // no chaining needed => avoid the overhead in PyErr_SetObject()
- Py_INCREF(PyExc_StopIteration);
- __Pyx_ErrRestore(PyExc_StopIteration, exc, NULL);
- return;
- }
- #endif
-#else
- args = PyTuple_Pack(1, value);
- if (unlikely(!args)) return;
- exc = PyObject_Call(PyExc_StopIteration, args, NULL);
- Py_DECREF(args);
- if (unlikely(!exc)) return;
-#endif
- PyErr_SetObject(PyExc_StopIteration, exc);
- Py_DECREF(exc);
-}
-
-
-//////////////////// PatchModuleWithCoroutine.proto ////////////////////
-
-static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code); /*proto*/
-
-//////////////////// PatchModuleWithCoroutine ////////////////////
-//@substitute: naming
-
-static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) {
-#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
- int result;
- PyObject *globals, *result_obj;
- globals = PyDict_New(); if (unlikely(!globals)) goto ignore;
- result = PyDict_SetItemString(globals, "_cython_coroutine_type",
- #ifdef __Pyx_Coroutine_USED
- (PyObject*)__pyx_CoroutineType);
- #else
- Py_None);
- #endif
- if (unlikely(result < 0)) goto ignore;
- result = PyDict_SetItemString(globals, "_cython_generator_type",
- #ifdef __Pyx_Generator_USED
- (PyObject*)__pyx_GeneratorType);
- #else
- Py_None);
+ // no chaining needed => avoid the overhead in PyErr_SetObject()
+ Py_INCREF(PyExc_StopIteration);
+ __Pyx_ErrRestore(PyExc_StopIteration, exc, NULL);
+ return;
+ }
#endif
- if (unlikely(result < 0)) goto ignore;
- if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore;
- if (unlikely(PyDict_SetItemString(globals, "__builtins__", $builtins_cname) < 0)) goto ignore;
- result_obj = PyRun_String(py_code, Py_file_input, globals, globals);
- if (unlikely(!result_obj)) goto ignore;
- Py_DECREF(result_obj);
- Py_DECREF(globals);
- return module;
-
-ignore:
- Py_XDECREF(globals);
- PyErr_WriteUnraisable(module);
- if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) {
- Py_DECREF(module);
- module = NULL;
- }
-#else
- // avoid "unused" warning
- py_code++;
-#endif
- return module;
-}
-
-
-//////////////////// PatchGeneratorABC.proto ////////////////////
-
-// register with Generator/Coroutine ABCs in 'collections.abc'
-// see https://bugs.python.org/issue24018
-static int __Pyx_patch_abc(void); /*proto*/
-
-//////////////////// PatchGeneratorABC ////////////////////
-//@requires: PatchModuleWithCoroutine
-
+#else
+ args = PyTuple_Pack(1, value);
+ if (unlikely(!args)) return;
+ exc = PyObject_Call(PyExc_StopIteration, args, NULL);
+ Py_DECREF(args);
+ if (unlikely(!exc)) return;
+#endif
+ PyErr_SetObject(PyExc_StopIteration, exc);
+ Py_DECREF(exc);
+}
+
+
+//////////////////// PatchModuleWithCoroutine.proto ////////////////////
+
+static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code); /*proto*/
+
+//////////////////// PatchModuleWithCoroutine ////////////////////
+//@substitute: naming
+
+static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) {
+#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+ int result;
+ PyObject *globals, *result_obj;
+ globals = PyDict_New(); if (unlikely(!globals)) goto ignore;
+ result = PyDict_SetItemString(globals, "_cython_coroutine_type",
+ #ifdef __Pyx_Coroutine_USED
+ (PyObject*)__pyx_CoroutineType);
+ #else
+ Py_None);
+ #endif
+ if (unlikely(result < 0)) goto ignore;
+ result = PyDict_SetItemString(globals, "_cython_generator_type",
+ #ifdef __Pyx_Generator_USED
+ (PyObject*)__pyx_GeneratorType);
+ #else
+ Py_None);
+ #endif
+ if (unlikely(result < 0)) goto ignore;
+ if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore;
+ if (unlikely(PyDict_SetItemString(globals, "__builtins__", $builtins_cname) < 0)) goto ignore;
+ result_obj = PyRun_String(py_code, Py_file_input, globals, globals);
+ if (unlikely(!result_obj)) goto ignore;
+ Py_DECREF(result_obj);
+ Py_DECREF(globals);
+ return module;
+
+ignore:
+ Py_XDECREF(globals);
+ PyErr_WriteUnraisable(module);
+ if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) {
+ Py_DECREF(module);
+ module = NULL;
+ }
+#else
+ // avoid "unused" warning
+ py_code++;
+#endif
+ return module;
+}
+
+
+//////////////////// PatchGeneratorABC.proto ////////////////////
+
+// register with Generator/Coroutine ABCs in 'collections.abc'
+// see https://bugs.python.org/issue24018
+static int __Pyx_patch_abc(void); /*proto*/
+
+//////////////////// PatchGeneratorABC ////////////////////
+//@requires: PatchModuleWithCoroutine
+
#ifndef CYTHON_REGISTER_ABCS
#define CYTHON_REGISTER_ABCS 1
#endif
-#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
-static PyObject* __Pyx_patch_abc_module(PyObject *module); /*proto*/
-static PyObject* __Pyx_patch_abc_module(PyObject *module) {
- module = __Pyx_Coroutine_patch_module(
- module, CSTRING("""\
-if _cython_generator_type is not None:
- try: Generator = _module.Generator
- except AttributeError: pass
- else: Generator.register(_cython_generator_type)
-if _cython_coroutine_type is not None:
- try: Coroutine = _module.Coroutine
- except AttributeError: pass
- else: Coroutine.register(_cython_coroutine_type)
-""")
- );
- return module;
-}
-#endif
-
-static int __Pyx_patch_abc(void) {
-#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
- static int abc_patched = 0;
+#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+static PyObject* __Pyx_patch_abc_module(PyObject *module); /*proto*/
+static PyObject* __Pyx_patch_abc_module(PyObject *module) {
+ module = __Pyx_Coroutine_patch_module(
+ module, CSTRING("""\
+if _cython_generator_type is not None:
+ try: Generator = _module.Generator
+ except AttributeError: pass
+ else: Generator.register(_cython_generator_type)
+if _cython_coroutine_type is not None:
+ try: Coroutine = _module.Coroutine
+ except AttributeError: pass
+ else: Coroutine.register(_cython_coroutine_type)
+""")
+ );
+ return module;
+}
+#endif
+
+static int __Pyx_patch_abc(void) {
+#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+ static int abc_patched = 0;
if (CYTHON_REGISTER_ABCS && !abc_patched) {
- PyObject *module;
+ PyObject *module;
module = PyImport_ImportModule((PY_MAJOR_VERSION >= 3) ? "collections.abc" : "collections");
- if (!module) {
- PyErr_WriteUnraisable(NULL);
- if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning,
+ if (!module) {
+ PyErr_WriteUnraisable(NULL);
+ if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning,
((PY_MAJOR_VERSION >= 3) ?
- "Cython module failed to register with collections.abc module" :
- "Cython module failed to register with collections module"), 1) < 0)) {
- return -1;
- }
- } else {
- module = __Pyx_patch_abc_module(module);
- abc_patched = 1;
- if (unlikely(!module))
- return -1;
- Py_DECREF(module);
- }
- // also register with "backports_abc" module if available, just in case
- module = PyImport_ImportModule("backports_abc");
- if (module) {
- module = __Pyx_patch_abc_module(module);
- Py_XDECREF(module);
- }
- if (!module) {
- PyErr_Clear();
- }
- }
-#else
- // avoid "unused" warning for __Pyx_Coroutine_patch_module()
+ "Cython module failed to register with collections.abc module" :
+ "Cython module failed to register with collections module"), 1) < 0)) {
+ return -1;
+ }
+ } else {
+ module = __Pyx_patch_abc_module(module);
+ abc_patched = 1;
+ if (unlikely(!module))
+ return -1;
+ Py_DECREF(module);
+ }
+ // also register with "backports_abc" module if available, just in case
+ module = PyImport_ImportModule("backports_abc");
+ if (module) {
+ module = __Pyx_patch_abc_module(module);
+ Py_XDECREF(module);
+ }
+ if (!module) {
+ PyErr_Clear();
+ }
+ }
+#else
+ // avoid "unused" warning for __Pyx_Coroutine_patch_module()
if ((0)) __Pyx_Coroutine_patch_module(NULL, NULL);
-#endif
- return 0;
-}
-
-
-//////////////////// PatchAsyncIO.proto ////////////////////
-
-// run after importing "asyncio" to patch Cython generator support into it
-static PyObject* __Pyx_patch_asyncio(PyObject* module); /*proto*/
-
-//////////////////// PatchAsyncIO ////////////////////
-//@requires: ImportExport.c::Import
-//@requires: PatchModuleWithCoroutine
-//@requires: PatchInspect
-
-static PyObject* __Pyx_patch_asyncio(PyObject* module) {
-#if PY_VERSION_HEX < 0x030500B2 && \
- (defined(__Pyx_Coroutine_USED) || defined(__Pyx_Generator_USED)) && \
- (!defined(CYTHON_PATCH_ASYNCIO) || CYTHON_PATCH_ASYNCIO)
- PyObject *patch_module = NULL;
- static int asyncio_patched = 0;
- if (unlikely((!asyncio_patched) && module)) {
- PyObject *package;
- package = __Pyx_Import(PYIDENT("asyncio.coroutines"), NULL, 0);
- if (package) {
- patch_module = __Pyx_Coroutine_patch_module(
- PyObject_GetAttrString(package, "coroutines"), CSTRING("""\
-try:
- coro_types = _module._COROUTINE_TYPES
-except AttributeError: pass
-else:
- if _cython_coroutine_type is not None and _cython_coroutine_type not in coro_types:
- coro_types = tuple(coro_types) + (_cython_coroutine_type,)
- if _cython_generator_type is not None and _cython_generator_type not in coro_types:
- coro_types = tuple(coro_types) + (_cython_generator_type,)
-_module._COROUTINE_TYPES = coro_types
-""")
- );
- } else {
- PyErr_Clear();
+#endif
+ return 0;
+}
+
+
+//////////////////// PatchAsyncIO.proto ////////////////////
+
+// run after importing "asyncio" to patch Cython generator support into it
+static PyObject* __Pyx_patch_asyncio(PyObject* module); /*proto*/
+
+//////////////////// PatchAsyncIO ////////////////////
+//@requires: ImportExport.c::Import
+//@requires: PatchModuleWithCoroutine
+//@requires: PatchInspect
+
+static PyObject* __Pyx_patch_asyncio(PyObject* module) {
+#if PY_VERSION_HEX < 0x030500B2 && \
+ (defined(__Pyx_Coroutine_USED) || defined(__Pyx_Generator_USED)) && \
+ (!defined(CYTHON_PATCH_ASYNCIO) || CYTHON_PATCH_ASYNCIO)
+ PyObject *patch_module = NULL;
+ static int asyncio_patched = 0;
+ if (unlikely((!asyncio_patched) && module)) {
+ PyObject *package;
+ package = __Pyx_Import(PYIDENT("asyncio.coroutines"), NULL, 0);
+ if (package) {
+ patch_module = __Pyx_Coroutine_patch_module(
+ PyObject_GetAttrString(package, "coroutines"), CSTRING("""\
+try:
+ coro_types = _module._COROUTINE_TYPES
+except AttributeError: pass
+else:
+ if _cython_coroutine_type is not None and _cython_coroutine_type not in coro_types:
+ coro_types = tuple(coro_types) + (_cython_coroutine_type,)
+ if _cython_generator_type is not None and _cython_generator_type not in coro_types:
+ coro_types = tuple(coro_types) + (_cython_generator_type,)
+_module._COROUTINE_TYPES = coro_types
+""")
+ );
+ } else {
+ PyErr_Clear();
// Always enable fallback: even if we compile against 3.4.2, we might be running on 3.4.1 at some point.
//#if PY_VERSION_HEX < 0x03040200
- // Py3.4.1 used to have asyncio.tasks instead of asyncio.coroutines
- package = __Pyx_Import(PYIDENT("asyncio.tasks"), NULL, 0);
- if (unlikely(!package)) goto asyncio_done;
- patch_module = __Pyx_Coroutine_patch_module(
- PyObject_GetAttrString(package, "tasks"), CSTRING("""\
-if hasattr(_module, 'iscoroutine'):
- old_types = getattr(_module.iscoroutine, '_cython_coroutine_types', None)
- if old_types is None or not isinstance(old_types, set):
- old_types = set()
- def cy_wrap(orig_func, type=type, cython_coroutine_types=old_types):
- def cy_iscoroutine(obj): return type(obj) in cython_coroutine_types or orig_func(obj)
- cy_iscoroutine._cython_coroutine_types = cython_coroutine_types
- return cy_iscoroutine
- _module.iscoroutine = cy_wrap(_module.iscoroutine)
- if _cython_coroutine_type is not None:
- old_types.add(_cython_coroutine_type)
- if _cython_generator_type is not None:
- old_types.add(_cython_generator_type)
-""")
- );
+ // Py3.4.1 used to have asyncio.tasks instead of asyncio.coroutines
+ package = __Pyx_Import(PYIDENT("asyncio.tasks"), NULL, 0);
+ if (unlikely(!package)) goto asyncio_done;
+ patch_module = __Pyx_Coroutine_patch_module(
+ PyObject_GetAttrString(package, "tasks"), CSTRING("""\
+if hasattr(_module, 'iscoroutine'):
+ old_types = getattr(_module.iscoroutine, '_cython_coroutine_types', None)
+ if old_types is None or not isinstance(old_types, set):
+ old_types = set()
+ def cy_wrap(orig_func, type=type, cython_coroutine_types=old_types):
+ def cy_iscoroutine(obj): return type(obj) in cython_coroutine_types or orig_func(obj)
+ cy_iscoroutine._cython_coroutine_types = cython_coroutine_types
+ return cy_iscoroutine
+ _module.iscoroutine = cy_wrap(_module.iscoroutine)
+ if _cython_coroutine_type is not None:
+ old_types.add(_cython_coroutine_type)
+ if _cython_generator_type is not None:
+ old_types.add(_cython_generator_type)
+""")
+ );
//#endif
-// Py < 0x03040200
- }
- Py_DECREF(package);
- if (unlikely(!patch_module)) goto ignore;
+// Py < 0x03040200
+ }
+ Py_DECREF(package);
+ if (unlikely(!patch_module)) goto ignore;
//#if PY_VERSION_HEX < 0x03040200
-asyncio_done:
- PyErr_Clear();
+asyncio_done:
+ PyErr_Clear();
//#endif
- asyncio_patched = 1;
-#ifdef __Pyx_Generator_USED
- // now patch inspect.isgenerator() by looking up the imported module in the patched asyncio module
- {
- PyObject *inspect_module;
- if (patch_module) {
- inspect_module = PyObject_GetAttr(patch_module, PYIDENT("inspect"));
- Py_DECREF(patch_module);
- } else {
- inspect_module = __Pyx_Import(PYIDENT("inspect"), NULL, 0);
- }
- if (unlikely(!inspect_module)) goto ignore;
- inspect_module = __Pyx_patch_inspect(inspect_module);
- if (unlikely(!inspect_module)) {
- Py_DECREF(module);
- module = NULL;
- }
- Py_XDECREF(inspect_module);
- }
-#else
- // avoid "unused" warning for __Pyx_patch_inspect()
+ asyncio_patched = 1;
+#ifdef __Pyx_Generator_USED
+ // now patch inspect.isgenerator() by looking up the imported module in the patched asyncio module
+ {
+ PyObject *inspect_module;
+ if (patch_module) {
+ inspect_module = PyObject_GetAttr(patch_module, PYIDENT("inspect"));
+ Py_DECREF(patch_module);
+ } else {
+ inspect_module = __Pyx_Import(PYIDENT("inspect"), NULL, 0);
+ }
+ if (unlikely(!inspect_module)) goto ignore;
+ inspect_module = __Pyx_patch_inspect(inspect_module);
+ if (unlikely(!inspect_module)) {
+ Py_DECREF(module);
+ module = NULL;
+ }
+ Py_XDECREF(inspect_module);
+ }
+#else
+ // avoid "unused" warning for __Pyx_patch_inspect()
if ((0)) return __Pyx_patch_inspect(module);
-#endif
- }
- return module;
-ignore:
- PyErr_WriteUnraisable(module);
- if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch asyncio package with custom generator type", 1) < 0)) {
- Py_DECREF(module);
- module = NULL;
- }
-#else
- // avoid "unused" warning for __Pyx_Coroutine_patch_module()
+#endif
+ }
+ return module;
+ignore:
+ PyErr_WriteUnraisable(module);
+ if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch asyncio package with custom generator type", 1) < 0)) {
+ Py_DECREF(module);
+ module = NULL;
+ }
+#else
+ // avoid "unused" warning for __Pyx_Coroutine_patch_module()
if ((0)) return __Pyx_patch_inspect(__Pyx_Coroutine_patch_module(module, NULL));
-#endif
- return module;
-}
-
-
-//////////////////// PatchInspect.proto ////////////////////
-
-// run after importing "inspect" to patch Cython generator support into it
-static PyObject* __Pyx_patch_inspect(PyObject* module); /*proto*/
-
-//////////////////// PatchInspect ////////////////////
-//@requires: PatchModuleWithCoroutine
-
-static PyObject* __Pyx_patch_inspect(PyObject* module) {
-#if defined(__Pyx_Generator_USED) && (!defined(CYTHON_PATCH_INSPECT) || CYTHON_PATCH_INSPECT)
- static int inspect_patched = 0;
- if (unlikely((!inspect_patched) && module)) {
- module = __Pyx_Coroutine_patch_module(
- module, CSTRING("""\
-old_types = getattr(_module.isgenerator, '_cython_generator_types', None)
-if old_types is None or not isinstance(old_types, set):
- old_types = set()
- def cy_wrap(orig_func, type=type, cython_generator_types=old_types):
- def cy_isgenerator(obj): return type(obj) in cython_generator_types or orig_func(obj)
- cy_isgenerator._cython_generator_types = cython_generator_types
- return cy_isgenerator
- _module.isgenerator = cy_wrap(_module.isgenerator)
-old_types.add(_cython_generator_type)
-""")
- );
- inspect_patched = 1;
- }
-#else
- // avoid "unused" warning for __Pyx_Coroutine_patch_module()
+#endif
+ return module;
+}
+
+
+//////////////////// PatchInspect.proto ////////////////////
+
+// run after importing "inspect" to patch Cython generator support into it
+static PyObject* __Pyx_patch_inspect(PyObject* module); /*proto*/
+
+//////////////////// PatchInspect ////////////////////
+//@requires: PatchModuleWithCoroutine
+
+static PyObject* __Pyx_patch_inspect(PyObject* module) {
+#if defined(__Pyx_Generator_USED) && (!defined(CYTHON_PATCH_INSPECT) || CYTHON_PATCH_INSPECT)
+ static int inspect_patched = 0;
+ if (unlikely((!inspect_patched) && module)) {
+ module = __Pyx_Coroutine_patch_module(
+ module, CSTRING("""\
+old_types = getattr(_module.isgenerator, '_cython_generator_types', None)
+if old_types is None or not isinstance(old_types, set):
+ old_types = set()
+ def cy_wrap(orig_func, type=type, cython_generator_types=old_types):
+ def cy_isgenerator(obj): return type(obj) in cython_generator_types or orig_func(obj)
+ cy_isgenerator._cython_generator_types = cython_generator_types
+ return cy_isgenerator
+ _module.isgenerator = cy_wrap(_module.isgenerator)
+old_types.add(_cython_generator_type)
+""")
+ );
+ inspect_patched = 1;
+ }
+#else
+ // avoid "unused" warning for __Pyx_Coroutine_patch_module()
if ((0)) return __Pyx_Coroutine_patch_module(module, NULL);
-#endif
- return module;
-}
-
-
-//////////////////// StopAsyncIteration.proto ////////////////////
-
-#define __Pyx_StopAsyncIteration_USED
-static PyObject *__Pyx_PyExc_StopAsyncIteration;
-static int __pyx_StopAsyncIteration_init(void); /*proto*/
-
-//////////////////// StopAsyncIteration ////////////////////
-
-#if PY_VERSION_HEX < 0x030500B1
-static PyTypeObject __Pyx__PyExc_StopAsyncIteration_type = {
- PyVarObject_HEAD_INIT(0, 0)
- "StopAsyncIteration", /*tp_name*/
- sizeof(PyBaseExceptionObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare / reserved*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
- PyDoc_STR("Signal the end from iterator.__anext__()."), /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- 0, /*tp_methods*/
- 0, /*tp_members*/
- 0, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- 0, /*tp_init*/
- 0, /*tp_alloc*/
- 0, /*tp_new*/
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
- 0, /*tp_bases*/
- 0, /*tp_mro*/
- 0, /*tp_cache*/
- 0, /*tp_subclasses*/
- 0, /*tp_weaklist*/
- 0, /*tp_del*/
- 0, /*tp_version_tag*/
-#if PY_VERSION_HEX >= 0x030400a1
- 0, /*tp_finalize*/
-#endif
+#endif
+ return module;
+}
+
+
+//////////////////// StopAsyncIteration.proto ////////////////////
+
+#define __Pyx_StopAsyncIteration_USED
+static PyObject *__Pyx_PyExc_StopAsyncIteration;
+static int __pyx_StopAsyncIteration_init(void); /*proto*/
+
+//////////////////// StopAsyncIteration ////////////////////
+
+#if PY_VERSION_HEX < 0x030500B1
+static PyTypeObject __Pyx__PyExc_StopAsyncIteration_type = {
+ PyVarObject_HEAD_INIT(0, 0)
+ "StopAsyncIteration", /*tp_name*/
+ sizeof(PyBaseExceptionObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ 0, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare / reserved*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ PyDoc_STR("Signal the end from iterator.__anext__()."), /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ 0, /*tp_methods*/
+ 0, /*tp_members*/
+ 0, /*tp_getset*/
+ 0, /*tp_base*/
+ 0, /*tp_dict*/
+ 0, /*tp_descr_get*/
+ 0, /*tp_descr_set*/
+ 0, /*tp_dictoffset*/
+ 0, /*tp_init*/
+ 0, /*tp_alloc*/
+ 0, /*tp_new*/
+ 0, /*tp_free*/
+ 0, /*tp_is_gc*/
+ 0, /*tp_bases*/
+ 0, /*tp_mro*/
+ 0, /*tp_cache*/
+ 0, /*tp_subclasses*/
+ 0, /*tp_weaklist*/
+ 0, /*tp_del*/
+ 0, /*tp_version_tag*/
+#if PY_VERSION_HEX >= 0x030400a1
+ 0, /*tp_finalize*/
+#endif
#if CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM+0 >= 0x06000000
0, /*tp_pypy_flags*/
#endif
-};
-#endif
-
-static int __pyx_StopAsyncIteration_init(void) {
-#if PY_VERSION_HEX >= 0x030500B1
- __Pyx_PyExc_StopAsyncIteration = PyExc_StopAsyncIteration;
-#else
- PyObject *builtins = PyEval_GetBuiltins();
- if (likely(builtins)) {
- PyObject *exc = PyMapping_GetItemString(builtins, (char*) "StopAsyncIteration");
- if (exc) {
- __Pyx_PyExc_StopAsyncIteration = exc;
- return 0;
- }
- }
- PyErr_Clear();
-
- __Pyx__PyExc_StopAsyncIteration_type.tp_traverse = ((PyTypeObject*)PyExc_BaseException)->tp_traverse;
- __Pyx__PyExc_StopAsyncIteration_type.tp_clear = ((PyTypeObject*)PyExc_BaseException)->tp_clear;
- __Pyx__PyExc_StopAsyncIteration_type.tp_dictoffset = ((PyTypeObject*)PyExc_BaseException)->tp_dictoffset;
- __Pyx__PyExc_StopAsyncIteration_type.tp_base = (PyTypeObject*)PyExc_Exception;
-
- __Pyx_PyExc_StopAsyncIteration = (PyObject*) __Pyx_FetchCommonType(&__Pyx__PyExc_StopAsyncIteration_type);
- if (unlikely(!__Pyx_PyExc_StopAsyncIteration))
- return -1;
- if (builtins && unlikely(PyMapping_SetItemString(builtins, (char*) "StopAsyncIteration", __Pyx_PyExc_StopAsyncIteration) < 0))
- return -1;
-#endif
- return 0;
-}
+};
+#endif
+
+static int __pyx_StopAsyncIteration_init(void) {
+#if PY_VERSION_HEX >= 0x030500B1
+ __Pyx_PyExc_StopAsyncIteration = PyExc_StopAsyncIteration;
+#else
+ PyObject *builtins = PyEval_GetBuiltins();
+ if (likely(builtins)) {
+ PyObject *exc = PyMapping_GetItemString(builtins, (char*) "StopAsyncIteration");
+ if (exc) {
+ __Pyx_PyExc_StopAsyncIteration = exc;
+ return 0;
+ }
+ }
+ PyErr_Clear();
+
+ __Pyx__PyExc_StopAsyncIteration_type.tp_traverse = ((PyTypeObject*)PyExc_BaseException)->tp_traverse;
+ __Pyx__PyExc_StopAsyncIteration_type.tp_clear = ((PyTypeObject*)PyExc_BaseException)->tp_clear;
+ __Pyx__PyExc_StopAsyncIteration_type.tp_dictoffset = ((PyTypeObject*)PyExc_BaseException)->tp_dictoffset;
+ __Pyx__PyExc_StopAsyncIteration_type.tp_base = (PyTypeObject*)PyExc_Exception;
+
+ __Pyx_PyExc_StopAsyncIteration = (PyObject*) __Pyx_FetchCommonType(&__Pyx__PyExc_StopAsyncIteration_type);
+ if (unlikely(!__Pyx_PyExc_StopAsyncIteration))
+ return -1;
+ if (builtins && unlikely(PyMapping_SetItemString(builtins, (char*) "StopAsyncIteration", __Pyx_PyExc_StopAsyncIteration) < 0))
+ return -1;
+#endif
+ return 0;
+}
diff --git a/contrib/tools/cython/Cython/Utility/CpdefEnums.pyx b/contrib/tools/cython/Cython/Utility/CpdefEnums.pyx
index 148d776c29..ad2b0ea427 100644
--- a/contrib/tools/cython/Cython/Utility/CpdefEnums.pyx
+++ b/contrib/tools/cython/Cython/Utility/CpdefEnums.pyx
@@ -1,66 +1,66 @@
-#################### EnumBase ####################
-
-cimport cython
-
-cdef extern from *:
- int PY_VERSION_HEX
-
-cdef object __Pyx_OrderedDict
-if PY_VERSION_HEX >= 0x02070000:
- from collections import OrderedDict as __Pyx_OrderedDict
-else:
- __Pyx_OrderedDict = dict
-
-@cython.internal
-cdef class __Pyx_EnumMeta(type):
- def __init__(cls, name, parents, dct):
- type.__init__(cls, name, parents, dct)
- cls.__members__ = __Pyx_OrderedDict()
- def __iter__(cls):
- return iter(cls.__members__.values())
- def __getitem__(cls, name):
- return cls.__members__[name]
-
-# @cython.internal
-cdef object __Pyx_EnumBase
-class __Pyx_EnumBase(int):
- __metaclass__ = __Pyx_EnumMeta
- def __new__(cls, value, name=None):
- for v in cls:
- if v == value:
- return v
- if name is None:
- raise ValueError("Unknown enum value: '%s'" % value)
- res = int.__new__(cls, value)
- res.name = name
- setattr(cls, name, res)
- cls.__members__[name] = res
- return res
- def __repr__(self):
- return "<%s.%s: %d>" % (self.__class__.__name__, self.name, self)
- def __str__(self):
- return "%s.%s" % (self.__class__.__name__, self.name)
-
-if PY_VERSION_HEX >= 0x03040000:
- from enum import IntEnum as __Pyx_EnumBase
-
-#################### EnumType ####################
-#@requires: EnumBase
-
-cdef dict __Pyx_globals = globals()
-if PY_VERSION_HEX >= 0x03040000:
- # create new IntEnum()
- {{name}} = __Pyx_EnumBase('{{name}}', __Pyx_OrderedDict([
- {{for item in items}}
- ('{{item}}', {{item}}),
- {{endfor}}
- ]))
- {{for item in items}}
- __Pyx_globals['{{item}}'] = {{name}}.{{item}}
- {{endfor}}
-else:
- class {{name}}(__Pyx_EnumBase):
- pass
- {{for item in items}}
- __Pyx_globals['{{item}}'] = {{name}}({{item}}, '{{item}}')
- {{endfor}}
+#################### EnumBase ####################
+
+cimport cython
+
+cdef extern from *:
+ int PY_VERSION_HEX
+
+cdef object __Pyx_OrderedDict
+if PY_VERSION_HEX >= 0x02070000:
+ from collections import OrderedDict as __Pyx_OrderedDict
+else:
+ __Pyx_OrderedDict = dict
+
+@cython.internal
+cdef class __Pyx_EnumMeta(type):
+ def __init__(cls, name, parents, dct):
+ type.__init__(cls, name, parents, dct)
+ cls.__members__ = __Pyx_OrderedDict()
+ def __iter__(cls):
+ return iter(cls.__members__.values())
+ def __getitem__(cls, name):
+ return cls.__members__[name]
+
+# @cython.internal
+cdef object __Pyx_EnumBase
+class __Pyx_EnumBase(int):
+ __metaclass__ = __Pyx_EnumMeta
+ def __new__(cls, value, name=None):
+ for v in cls:
+ if v == value:
+ return v
+ if name is None:
+ raise ValueError("Unknown enum value: '%s'" % value)
+ res = int.__new__(cls, value)
+ res.name = name
+ setattr(cls, name, res)
+ cls.__members__[name] = res
+ return res
+ def __repr__(self):
+ return "<%s.%s: %d>" % (self.__class__.__name__, self.name, self)
+ def __str__(self):
+ return "%s.%s" % (self.__class__.__name__, self.name)
+
+if PY_VERSION_HEX >= 0x03040000:
+ from enum import IntEnum as __Pyx_EnumBase
+
+#################### EnumType ####################
+#@requires: EnumBase
+
+cdef dict __Pyx_globals = globals()
+if PY_VERSION_HEX >= 0x03040000:
+ # create new IntEnum()
+ {{name}} = __Pyx_EnumBase('{{name}}', __Pyx_OrderedDict([
+ {{for item in items}}
+ ('{{item}}', {{item}}),
+ {{endfor}}
+ ]))
+ {{for item in items}}
+ __Pyx_globals['{{item}}'] = {{name}}.{{item}}
+ {{endfor}}
+else:
+ class {{name}}(__Pyx_EnumBase):
+ pass
+ {{for item in items}}
+ __Pyx_globals['{{item}}'] = {{name}}({{item}}, '{{item}}')
+ {{endfor}}
diff --git a/contrib/tools/cython/Cython/Utility/CppConvert.pyx b/contrib/tools/cython/Cython/Utility/CppConvert.pyx
index 5f7859dd0e..9988f2f49a 100644
--- a/contrib/tools/cython/Cython/Utility/CppConvert.pyx
+++ b/contrib/tools/cython/Cython/Utility/CppConvert.pyx
@@ -25,16 +25,16 @@ cdef extern from *:
char* data()
size_t size()
-{{for py_type in ['PyObject', 'PyUnicode', 'PyStr', 'PyBytes', 'PyByteArray']}}
-cdef extern from *:
+{{for py_type in ['PyObject', 'PyUnicode', 'PyStr', 'PyBytes', 'PyByteArray']}}
+cdef extern from *:
cdef object __Pyx_{{py_type}}_FromStringAndSize(const char*, size_t)
-@cname("{{cname.replace("PyObject", py_type, 1)}}")
-cdef inline object {{cname.replace("PyObject", py_type, 1)}}(const string& s):
- return __Pyx_{{py_type}}_FromStringAndSize(s.data(), s.size())
-{{endfor}}
-
+@cname("{{cname.replace("PyObject", py_type, 1)}}")
+cdef inline object {{cname.replace("PyObject", py_type, 1)}}(const string& s):
+ return __Pyx_{{py_type}}_FromStringAndSize(s.data(), s.size())
+{{endfor}}
+
#################### vector.from_py ####################
cdef extern from *:
@@ -209,34 +209,34 @@ cdef object {{cname}}(const map[X,Y]& s):
return o
-#################### complex.from_py ####################
-
-cdef extern from *:
- cdef cppclass std_complex "std::complex" [T]:
- std_complex()
- std_complex(T, T) except +
-
-@cname("{{cname}}")
-cdef std_complex[X] {{cname}}(object o) except *:
- cdef double complex z = o
- return std_complex[X](<X>z.real, <X>z.imag)
-
-
-#################### complex.to_py ####################
-
-cdef extern from *:
- cdef cppclass std_complex "std::complex" [T]:
- X real()
- X imag()
-
-@cname("{{cname}}")
-cdef object {{cname}}(const std_complex[X]& z):
- cdef double complex tmp
- tmp.real = <double>z.real()
- tmp.imag = <double>z.imag()
- return tmp
-
-
+#################### complex.from_py ####################
+
+cdef extern from *:
+ cdef cppclass std_complex "std::complex" [T]:
+ std_complex()
+ std_complex(T, T) except +
+
+@cname("{{cname}}")
+cdef std_complex[X] {{cname}}(object o) except *:
+ cdef double complex z = o
+ return std_complex[X](<X>z.real, <X>z.imag)
+
+
+#################### complex.to_py ####################
+
+cdef extern from *:
+ cdef cppclass std_complex "std::complex" [T]:
+ X real()
+ X imag()
+
+@cname("{{cname}}")
+cdef object {{cname}}(const std_complex[X]& z):
+ cdef double complex tmp
+ tmp.real = <double>z.real()
+ tmp.imag = <double>z.imag()
+ return tmp
+
+
#################### arcadia_TMaybe.from_py ####################
cdef extern from *:
diff --git a/contrib/tools/cython/Cython/Utility/CppSupport.cpp b/contrib/tools/cython/Cython/Utility/CppSupport.cpp
index b8fcff0643..9876135dd8 100644
--- a/contrib/tools/cython/Cython/Utility/CppSupport.cpp
+++ b/contrib/tools/cython/Cython/Utility/CppSupport.cpp
@@ -18,8 +18,8 @@ static void __Pyx_CppExn2PyErr() {
PyErr_SetString(PyExc_MemoryError, exn.what());
} catch (const std::bad_cast& exn) {
PyErr_SetString(PyExc_TypeError, exn.what());
- } catch (const std::bad_typeid& exn) {
- PyErr_SetString(PyExc_TypeError, exn.what());
+ } catch (const std::bad_typeid& exn) {
+ PyErr_SetString(PyExc_TypeError, exn.what());
} catch (const std::domain_error& exn) {
PyErr_SetString(PyExc_ValueError, exn.what());
} catch (const std::invalid_argument& exn) {
diff --git a/contrib/tools/cython/Cython/Utility/CythonFunction.c b/contrib/tools/cython/Cython/Utility/CythonFunction.c
index d51b308a8d..e2ae4df14a 100644
--- a/contrib/tools/cython/Cython/Utility/CythonFunction.c
+++ b/contrib/tools/cython/Cython/Utility/CythonFunction.c
@@ -48,8 +48,8 @@ typedef struct {
static PyTypeObject *__pyx_CyFunctionType = 0;
-#define __Pyx_CyFunction_Check(obj) (__Pyx_TypeCheck(obj, __pyx_CyFunctionType))
-
+#define __Pyx_CyFunction_Check(obj) (__Pyx_TypeCheck(obj, __pyx_CyFunctionType))
+
static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml,
int flags, PyObject* qualname,
PyObject *self,
@@ -67,7 +67,7 @@ static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m,
PyObject *dict);
-static int __pyx_CyFunction_init(void);
+static int __pyx_CyFunction_init(void);
//////////////////// CythonFunctionShared ////////////////////
@@ -99,7 +99,7 @@ __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure
}
static int
-__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNUSED void *context)
{
PyObject *tmp = op->func_doc;
if (value == NULL) {
@@ -113,7 +113,7 @@ __Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNU
}
static PyObject *
-__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
{
if (unlikely(op->func_name == NULL)) {
#if PY_MAJOR_VERSION >= 3
@@ -129,16 +129,16 @@ __Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *contex
}
static int
-__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNUSED void *context)
{
PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
- if (unlikely(value == NULL || !PyUnicode_Check(value)))
+ if (unlikely(value == NULL || !PyUnicode_Check(value)))
#else
- if (unlikely(value == NULL || !PyString_Check(value)))
+ if (unlikely(value == NULL || !PyString_Check(value)))
#endif
- {
+ {
PyErr_SetString(PyExc_TypeError,
"__name__ must be set to a string object");
return -1;
@@ -151,23 +151,23 @@ __Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UN
}
static PyObject *
-__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
{
Py_INCREF(op->func_qualname);
return op->func_qualname;
}
static int
-__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNUSED void *context)
{
PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
- if (unlikely(value == NULL || !PyUnicode_Check(value)))
+ if (unlikely(value == NULL || !PyUnicode_Check(value)))
#else
- if (unlikely(value == NULL || !PyString_Check(value)))
+ if (unlikely(value == NULL || !PyString_Check(value)))
#endif
- {
+ {
PyErr_SetString(PyExc_TypeError,
"__qualname__ must be set to a string object");
return -1;
@@ -192,7 +192,7 @@ __Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure
}
static PyObject *
-__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
{
if (unlikely(op->func_dict == NULL)) {
op->func_dict = PyDict_New();
@@ -204,7 +204,7 @@ __Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *contex
}
static int
-__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UNUSED void *context)
{
PyObject *tmp;
@@ -226,21 +226,21 @@ __Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, CYTHON_UN
}
static PyObject *
-__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
{
Py_INCREF(op->func_globals);
return op->func_globals;
}
static PyObject *
-__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
{
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
-__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
+__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context)
{
PyObject* result = (op->func_code) ? op->func_code : Py_None;
Py_INCREF(result);
@@ -249,31 +249,31 @@ __Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *contex
static int
__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) {
- int result = 0;
+ int result = 0;
PyObject *res = op->defaults_getter((PyObject *) op);
if (unlikely(!res))
return -1;
// Cache result
- #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
op->defaults_tuple = PyTuple_GET_ITEM(res, 0);
Py_INCREF(op->defaults_tuple);
op->defaults_kwdict = PyTuple_GET_ITEM(res, 1);
Py_INCREF(op->defaults_kwdict);
- #else
- op->defaults_tuple = PySequence_ITEM(res, 0);
- if (unlikely(!op->defaults_tuple)) result = -1;
- else {
- op->defaults_kwdict = PySequence_ITEM(res, 1);
- if (unlikely(!op->defaults_kwdict)) result = -1;
- }
- #endif
+ #else
+ op->defaults_tuple = PySequence_ITEM(res, 0);
+ if (unlikely(!op->defaults_tuple)) result = -1;
+ else {
+ op->defaults_kwdict = PySequence_ITEM(res, 1);
+ if (unlikely(!op->defaults_kwdict)) result = -1;
+ }
+ #endif
Py_DECREF(res);
- return result;
+ return result;
}
static int
-__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, CYTHON_UNUSED void *context) {
+__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, CYTHON_UNUSED void *context) {
PyObject* tmp;
if (!value) {
// del => explicit None to prevent rebuilding
@@ -291,7 +291,7 @@ __Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, CYTHO
}
static PyObject *
-__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context) {
+__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context) {
PyObject* result = op->defaults_tuple;
if (unlikely(!result)) {
if (op->defaults_getter) {
@@ -306,7 +306,7 @@ __Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *co
}
static int
-__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, CYTHON_UNUSED void *context) {
+__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, CYTHON_UNUSED void *context) {
PyObject* tmp;
if (!value) {
// del => explicit None to prevent rebuilding
@@ -324,7 +324,7 @@ __Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, CYT
}
static PyObject *
-__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context) {
+__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context) {
PyObject* result = op->defaults_kwdict;
if (unlikely(!result)) {
if (op->defaults_getter) {
@@ -339,7 +339,7 @@ __Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *
}
static int
-__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, CYTHON_UNUSED void *context) {
+__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, CYTHON_UNUSED void *context) {
PyObject* tmp;
if (!value || value == Py_None) {
value = NULL;
@@ -356,7 +356,7 @@ __Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, CY
}
static PyObject *
-__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context) {
+__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context) {
PyObject* result = op->func_annotations;
if (unlikely(!result)) {
result = PyDict_New();
@@ -369,7 +369,7 @@ __Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, CYTHON_UNUSED void
//#if PY_VERSION_HEX >= 0x030400C1
//static PyObject *
-//__Pyx_CyFunction_get_signature(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context) {
+//__Pyx_CyFunction_get_signature(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *context) {
// PyObject *inspect_module, *signature_class, *signature;
// // from inspect import Signature
// inspect_module = PyImport_ImportModuleLevelObject(PYIDENT("inspect"), NULL, NULL, NULL, 0);
@@ -501,7 +501,7 @@ __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
for (i = 0; i < m->defaults_pyobjects; i++)
Py_XDECREF(pydefaults[i]);
- PyObject_Free(m->defaults);
+ PyObject_Free(m->defaults);
m->defaults = NULL;
}
@@ -561,13 +561,13 @@ static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObj
if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
if (type == NULL)
type = (PyObject *)(Py_TYPE(obj));
- return __Pyx_PyMethod_New(func, type, (PyObject *)(Py_TYPE(type)));
+ return __Pyx_PyMethod_New(func, type, (PyObject *)(Py_TYPE(type)));
}
if (obj == Py_None)
obj = NULL;
#endif
- return __Pyx_PyMethod_New(func, obj, type);
+ return __Pyx_PyMethod_New(func, obj, type);
}
static PyObject*
@@ -582,48 +582,48 @@ __Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
#endif
}
-static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) {
- // originally copied from PyCFunction_Call() in CPython's Objects/methodobject.c
+static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) {
+ // originally copied from PyCFunction_Call() in CPython's Objects/methodobject.c
PyCFunctionObject* f = (PyCFunctionObject*)func;
- PyCFunction meth = f->m_ml->ml_meth;
+ PyCFunction meth = f->m_ml->ml_meth;
Py_ssize_t size;
- switch (f->m_ml->ml_flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) {
+ switch (f->m_ml->ml_flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) {
case METH_VARARGS:
- if (likely(kw == NULL || PyDict_Size(kw) == 0))
+ if (likely(kw == NULL || PyDict_Size(kw) == 0))
return (*meth)(self, arg);
break;
case METH_VARARGS | METH_KEYWORDS:
- return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw);
+ return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw);
case METH_NOARGS:
- if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
+ if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
size = PyTuple_GET_SIZE(arg);
- if (likely(size == 0))
+ if (likely(size == 0))
return (*meth)(self, NULL);
PyErr_Format(PyExc_TypeError,
- "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)",
+ "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)",
f->m_ml->ml_name, size);
return NULL;
}
break;
case METH_O:
- if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
+ if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
size = PyTuple_GET_SIZE(arg);
- if (likely(size == 1)) {
+ if (likely(size == 1)) {
PyObject *result, *arg0;
#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
arg0 = PyTuple_GET_ITEM(arg, 0);
#else
arg0 = PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL;
#endif
- result = (*meth)(self, arg0);
+ result = (*meth)(self, arg0);
#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
- Py_DECREF(arg0);
+ Py_DECREF(arg0);
#endif
- return result;
- }
+ return result;
+ }
PyErr_Format(PyExc_TypeError,
- "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)",
+ "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)",
f->m_ml->ml_name, size);
return NULL;
}
@@ -639,39 +639,39 @@ static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, Py
f->m_ml->ml_name);
return NULL;
}
-
-static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
- return __Pyx_CyFunction_CallMethod(func, ((PyCFunctionObject*)func)->m_self, arg, kw);
-}
-
-static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) {
- PyObject *result;
- __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func;
- if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) {
- Py_ssize_t argc;
- PyObject *new_args;
- PyObject *self;
-
- argc = PyTuple_GET_SIZE(args);
- new_args = PyTuple_GetSlice(args, 1, argc);
-
- if (unlikely(!new_args))
- return NULL;
-
- self = PyTuple_GetItem(args, 0);
- if (unlikely(!self)) {
- Py_DECREF(new_args);
- return NULL;
- }
-
- result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw);
- Py_DECREF(new_args);
- } else {
- result = __Pyx_CyFunction_Call(func, args, kw);
- }
- return result;
+
+static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+ return __Pyx_CyFunction_CallMethod(func, ((PyCFunctionObject*)func)->m_self, arg, kw);
}
+static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) {
+ PyObject *result;
+ __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func;
+ if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) {
+ Py_ssize_t argc;
+ PyObject *new_args;
+ PyObject *self;
+
+ argc = PyTuple_GET_SIZE(args);
+ new_args = PyTuple_GetSlice(args, 1, argc);
+
+ if (unlikely(!new_args))
+ return NULL;
+
+ self = PyTuple_GetItem(args, 0);
+ if (unlikely(!self)) {
+ Py_DECREF(new_args);
+ return NULL;
+ }
+
+ result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw);
+ Py_DECREF(new_args);
+ } else {
+ result = __Pyx_CyFunction_Call(func, args, kw);
+ }
+ return result;
+}
+
static PyTypeObject __pyx_CyFunctionType_type = {
PyVarObject_HEAD_INIT(0, 0)
"cython_function_or_method", /*tp_name*/
@@ -691,7 +691,7 @@ static PyTypeObject __pyx_CyFunctionType_type = {
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash*/
- __Pyx_CyFunction_CallAsMethod, /*tp_call*/
+ __Pyx_CyFunction_CallAsMethod, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_setattro*/
@@ -732,18 +732,18 @@ static PyTypeObject __pyx_CyFunctionType_type = {
0, /*tp_finalize*/
#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
- 0, /*tp_print*/
-#endif
+ 0, /*tp_print*/
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
};
-static int __pyx_CyFunction_init(void) {
+static int __pyx_CyFunction_init(void) {
__pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type);
if (unlikely(__pyx_CyFunctionType == NULL)) {
return -1;
@@ -754,7 +754,7 @@ static int __pyx_CyFunction_init(void) {
static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
__pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
- m->defaults = PyObject_Malloc(size);
+ m->defaults = PyObject_Malloc(size);
if (unlikely(!m->defaults))
return PyErr_NoMemory();
memset(m->defaults, 0, size);
@@ -813,24 +813,24 @@ static int __Pyx_CyFunction_InitClassCell(PyObject *cyfunctions, PyObject *class
//@requires: CythonFunctionShared
static int __Pyx_CyFunction_InitClassCell(PyObject *cyfunctions, PyObject *classobj) {
- Py_ssize_t i, count = PyList_GET_SIZE(cyfunctions);
-
- for (i = 0; i < count; i++) {
- __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *)
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
- PyList_GET_ITEM(cyfunctions, i);
-#else
- PySequence_ITEM(cyfunctions, i);
- if (unlikely(!m))
- return -1;
-#endif
- Py_INCREF(classobj);
+ Py_ssize_t i, count = PyList_GET_SIZE(cyfunctions);
+
+ for (i = 0; i < count; i++) {
+ __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *)
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ PyList_GET_ITEM(cyfunctions, i);
+#else
+ PySequence_ITEM(cyfunctions, i);
+ if (unlikely(!m))
+ return -1;
+#endif
+ Py_INCREF(classobj);
m->func_classobj = classobj;
-#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
- Py_DECREF((PyObject*)m);
-#endif
+#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
+ Py_DECREF((PyObject*)m);
+#endif
}
- return 0;
+ return 0;
}
@@ -1010,15 +1010,15 @@ __pyx_FusedFunction_getitem(__pyx_FusedFunctionObject *self, PyObject *idx)
for (i = 0; i < n; i++) {
int ret;
PyObject *string;
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
PyObject *item = PyTuple_GET_ITEM(idx, i);
-#else
+#else
PyObject *item = PySequence_ITEM(idx, i); if (unlikely(!item)) goto __pyx_err;
-#endif
+#endif
string = _obj_to_str(item);
-#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
- Py_DECREF(item);
-#endif
+#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
+ Py_DECREF(item);
+#endif
if (unlikely(!string)) goto __pyx_err;
ret = PyList_Append(list, string);
Py_DECREF(string);
@@ -1072,9 +1072,9 @@ __pyx_FusedFunction_callfunction(PyObject *func, PyObject *args, PyObject *kw)
!((__pyx_FusedFunctionObject *) func)->__signatures__);
if (cyfunc->flags & __Pyx_CYFUNCTION_CCLASS && !static_specialized) {
- return __Pyx_CyFunction_CallAsMethod(func, args, kw);
+ return __Pyx_CyFunction_CallAsMethod(func, args, kw);
} else {
- return __Pyx_CyFunction_Call(func, args, kw);
+ return __Pyx_CyFunction_Call(func, args, kw);
}
}
@@ -1104,19 +1104,19 @@ __pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw)
return NULL;
self = binding_func->self;
-#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
- Py_INCREF(self);
-#endif
+#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
Py_INCREF(self);
+#endif
+ Py_INCREF(self);
PyTuple_SET_ITEM(new_args, 0, self);
for (i = 0; i < argc; i++) {
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
PyObject *item = PyTuple_GET_ITEM(args, i);
Py_INCREF(item);
-#else
- PyObject *item = PySequence_ITEM(args, i); if (unlikely(!item)) goto bad;
-#endif
+#else
+ PyObject *item = PySequence_ITEM(args, i); if (unlikely(!item)) goto bad;
+#endif
PyTuple_SET_ITEM(new_args, i + 1, item);
}
@@ -1127,51 +1127,51 @@ __pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw)
PyErr_SetString(PyExc_TypeError, "Need at least one argument, 0 given.");
return NULL;
}
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
self = PyTuple_GET_ITEM(args, 0);
-#else
- self = PySequence_ITEM(args, 0); if (unlikely(!self)) return NULL;
-#endif
+#else
+ self = PySequence_ITEM(args, 0); if (unlikely(!self)) return NULL;
+#endif
}
- if (self && !is_classmethod && !is_staticmethod) {
- int is_instance = PyObject_IsInstance(self, binding_func->type);
- if (unlikely(!is_instance)) {
- PyErr_Format(PyExc_TypeError,
- "First argument should be of type %.200s, got %.200s.",
- ((PyTypeObject *) binding_func->type)->tp_name,
+ if (self && !is_classmethod && !is_staticmethod) {
+ int is_instance = PyObject_IsInstance(self, binding_func->type);
+ if (unlikely(!is_instance)) {
+ PyErr_Format(PyExc_TypeError,
+ "First argument should be of type %.200s, got %.200s.",
+ ((PyTypeObject *) binding_func->type)->tp_name,
Py_TYPE(self)->tp_name);
- goto bad;
- } else if (unlikely(is_instance == -1)) {
- goto bad;
- }
+ goto bad;
+ } else if (unlikely(is_instance == -1)) {
+ goto bad;
+ }
}
-#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
- Py_XDECREF(self);
- self = NULL;
-#endif
+#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
+ Py_XDECREF(self);
+ self = NULL;
+#endif
if (binding_func->__signatures__) {
- PyObject *tup;
- if (is_staticmethod && binding_func->func.flags & __Pyx_CYFUNCTION_CCLASS) {
- // FIXME: this seems wrong, but we must currently pass the signatures dict as 'self' argument
- tup = PyTuple_Pack(3, args,
- kw == NULL ? Py_None : kw,
- binding_func->func.defaults_tuple);
- if (unlikely(!tup)) goto bad;
- new_func = (__pyx_FusedFunctionObject *) __Pyx_CyFunction_CallMethod(
- func, binding_func->__signatures__, tup, NULL);
- } else {
- tup = PyTuple_Pack(4, binding_func->__signatures__, args,
- kw == NULL ? Py_None : kw,
- binding_func->func.defaults_tuple);
- if (unlikely(!tup)) goto bad;
- new_func = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_callfunction(func, tup, NULL);
- }
+ PyObject *tup;
+ if (is_staticmethod && binding_func->func.flags & __Pyx_CYFUNCTION_CCLASS) {
+ // FIXME: this seems wrong, but we must currently pass the signatures dict as 'self' argument
+ tup = PyTuple_Pack(3, args,
+ kw == NULL ? Py_None : kw,
+ binding_func->func.defaults_tuple);
+ if (unlikely(!tup)) goto bad;
+ new_func = (__pyx_FusedFunctionObject *) __Pyx_CyFunction_CallMethod(
+ func, binding_func->__signatures__, tup, NULL);
+ } else {
+ tup = PyTuple_Pack(4, binding_func->__signatures__, args,
+ kw == NULL ? Py_None : kw,
+ binding_func->func.defaults_tuple);
+ if (unlikely(!tup)) goto bad;
+ new_func = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_callfunction(func, tup, NULL);
+ }
Py_DECREF(tup);
- if (unlikely(!new_func))
- goto bad;
+ if (unlikely(!new_func))
+ goto bad;
Py_XINCREF(binding_func->func.func_classobj);
Py_CLEAR(new_func->func.func_classobj);
@@ -1181,10 +1181,10 @@ __pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw)
}
result = __pyx_FusedFunction_callfunction(func, args, kw);
-bad:
-#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
- Py_XDECREF(self);
-#endif
+bad:
+#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
+ Py_XDECREF(self);
+#endif
Py_XDECREF(new_args);
Py_XDECREF((PyObject *) new_func);
return result;
@@ -1264,11 +1264,11 @@ static PyTypeObject __pyx_FusedFunctionType_type = {
0, /*tp_finalize*/
#endif
#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
- 0, /*tp_vectorcall*/
-#endif
+ 0, /*tp_vectorcall*/
+#endif
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
0, /*tp_print*/
-#endif
+#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
0, /*tp_pypy_flags*/
#endif
@@ -1287,7 +1287,7 @@ static int __pyx_FusedFunction_init(void) {
//////////////////// ClassMethod.proto ////////////////////
#include "descrobject.h"
-static CYTHON_UNUSED PyObject* __Pyx_Method_ClassMethod(PyObject *method); /*proto*/
+static CYTHON_UNUSED PyObject* __Pyx_Method_ClassMethod(PyObject *method); /*proto*/
//////////////////// ClassMethod ////////////////////
@@ -1300,8 +1300,8 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) {
#else
#if CYTHON_COMPILING_IN_PYSTON || CYTHON_COMPILING_IN_PYPY
// special C-API function only in Pyston and PyPy >= 5.9
- if (PyMethodDescr_Check(method))
-#else
+ if (PyMethodDescr_Check(method))
+#else
#if PY_MAJOR_VERSION == 2
// PyMethodDescr_Type is not exposed in the CPython C-API in Py2.
static PyTypeObject *methoddescr_type = NULL;
@@ -1314,9 +1314,9 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) {
#else
PyTypeObject *methoddescr_type = &PyMethodDescr_Type;
#endif
- if (__Pyx_TypeCheck(method, methoddescr_type))
-#endif
- {
+ if (__Pyx_TypeCheck(method, methoddescr_type))
+#endif
+ {
// cdef classes
PyMethodDescrObject *descr = (PyMethodDescrObject *)method;
#if PY_VERSION_HEX < 0x03020000
diff --git a/contrib/tools/cython/Cython/Utility/Embed.c b/contrib/tools/cython/Cython/Utility/Embed.c
index 60da8f2330..15b6716ad8 100644
--- a/contrib/tools/cython/Cython/Utility/Embed.c
+++ b/contrib/tools/cython/Cython/Utility/Embed.c
@@ -4,12 +4,12 @@
#include <floatingpoint.h>
#endif
-#if PY_MAJOR_VERSION < 3
-void Py_InitArgcArgv(int argc, char **argv);
-#else
-void Py_InitArgcArgv(int argc, wchar_t **argv);
-#endif
-
+#if PY_MAJOR_VERSION < 3
+void Py_InitArgcArgv(int argc, char **argv);
+#else
+void Py_InitArgcArgv(int argc, wchar_t **argv);
+#endif
+
#if PY_MAJOR_VERSION < 3
int %(main_method)s(int argc, char** argv) {
#elif defined(WIN32) || defined(MS_WINDOWS)
@@ -28,10 +28,10 @@ static int __Pyx_main(int argc, wchar_t **argv) {
m = fpgetmask();
fpsetmask(m & ~FP_X_OFL);
#endif
- if (argc && argv) {
- Py_InitArgcArgv(argc, argv);
+ if (argc && argv) {
+ Py_InitArgcArgv(argc, argv);
Py_SetProgramName(argv[0]);
- }
+ }
Py_Initialize();
if (argc && argv)
PySys_SetArgv(argc, argv);
@@ -122,7 +122,7 @@ __Pyx_char2wchar(char* arg)
/* Overallocate; as multi-byte characters are in the argument, the
actual output could use less memory. */
argsize = strlen(arg) + 1;
- res = (wchar_t *)malloc(argsize*sizeof(wchar_t));
+ res = (wchar_t *)malloc(argsize*sizeof(wchar_t));
if (!res) goto oom;
in = (unsigned char*)arg;
out = res;
@@ -138,7 +138,7 @@ __Pyx_char2wchar(char* arg)
unless there is a bug in the C library, or I
misunderstood how mbrtowc works. */
fprintf(stderr, "unexpected mbrtowc result -2\\n");
- free(res);
+ free(res);
return NULL;
}
if (converted == (size_t)-1) {
@@ -166,7 +166,7 @@ __Pyx_char2wchar(char* arg)
/* Cannot use C locale for escaping; manually escape as if charset
is ASCII (i.e. escape all bytes > 128. This will still roundtrip
correctly in the locale's charset, which must be an ASCII superset. */
- res = (wchar_t *)malloc((strlen(arg)+1)*sizeof(wchar_t));
+ res = (wchar_t *)malloc((strlen(arg)+1)*sizeof(wchar_t));
if (!res) goto oom;
in = (unsigned char*)arg;
out = res;
@@ -190,28 +190,28 @@ int
return __Pyx_main(0, NULL);
}
else {
- int i, res;
+ int i, res;
wchar_t **argv_copy = (wchar_t **)malloc(sizeof(wchar_t*)*argc);
- /* We need a second copy, as Python might modify the first one. */
+ /* We need a second copy, as Python might modify the first one. */
wchar_t **argv_copy2 = (wchar_t **)malloc(sizeof(wchar_t*)*argc);
- char *oldloc = strdup(setlocale(LC_ALL, NULL));
- if (!argv_copy || !argv_copy2 || !oldloc) {
+ char *oldloc = strdup(setlocale(LC_ALL, NULL));
+ if (!argv_copy || !argv_copy2 || !oldloc) {
fprintf(stderr, "out of memory\\n");
- free(argv_copy);
- free(argv_copy2);
- free(oldloc);
+ free(argv_copy);
+ free(argv_copy2);
+ free(oldloc);
return 1;
}
- res = 0;
+ res = 0;
setlocale(LC_ALL, "");
for (i = 0; i < argc; i++) {
argv_copy2[i] = argv_copy[i] = __Pyx_char2wchar(argv[i]);
- if (!argv_copy[i]) res = 1; /* failure, but continue to simplify cleanup */
+ if (!argv_copy[i]) res = 1; /* failure, but continue to simplify cleanup */
}
setlocale(LC_ALL, oldloc);
free(oldloc);
- if (res == 0)
- res = __Pyx_main(argc, argv_copy);
+ if (res == 0)
+ res = __Pyx_main(argc, argv_copy);
for (i = 0; i < argc; i++) {
#if PY_VERSION_HEX < 0x03050000
free(argv_copy2[i]);
diff --git a/contrib/tools/cython/Cython/Utility/Exceptions.c b/contrib/tools/cython/Cython/Utility/Exceptions.c
index b0411f6956..12c08b4331 100644
--- a/contrib/tools/cython/Cython/Utility/Exceptions.c
+++ b/contrib/tools/cython/Cython/Utility/Exceptions.c
@@ -5,34 +5,34 @@
// 'except' statement, curexc_* is moved over to exc_* by
// __Pyx_GetException()
-
-/////////////// PyThreadStateGet.proto ///////////////
-//@substitute: naming
-
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_PyThreadState_declare PyThreadState *$local_tstate_cname;
+
+/////////////// PyThreadStateGet.proto ///////////////
+//@substitute: naming
+
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyThreadState_declare PyThreadState *$local_tstate_cname;
#define __Pyx_PyThreadState_assign $local_tstate_cname = __Pyx_PyThreadState_Current;
#define __Pyx_PyErr_Occurred() $local_tstate_cname->curexc_type
-#else
-#define __Pyx_PyThreadState_declare
-#define __Pyx_PyThreadState_assign
+#else
+#define __Pyx_PyThreadState_declare
+#define __Pyx_PyThreadState_assign
#define __Pyx_PyErr_Occurred() PyErr_Occurred()
-#endif
-
-
-/////////////// PyErrExceptionMatches.proto ///////////////
-//@substitute: naming
-
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState($local_tstate_cname, err)
-static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err);
-#else
-#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err)
-#endif
-
-/////////////// PyErrExceptionMatches ///////////////
-
-#if CYTHON_FAST_THREAD_STATE
+#endif
+
+
+/////////////// PyErrExceptionMatches.proto ///////////////
+//@substitute: naming
+
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState($local_tstate_cname, err)
+static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err);
+#else
+#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err)
+#endif
+
+/////////////// PyErrExceptionMatches ///////////////
+
+#if CYTHON_FAST_THREAD_STATE
static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
Py_ssize_t i, n;
n = PyTuple_GET_SIZE(tuple);
@@ -48,50 +48,50 @@ static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple
return 0;
}
-static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
- PyObject *exc_type = tstate->curexc_type;
- if (exc_type == err) return 1;
- if (unlikely(!exc_type)) return 0;
+static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
+ PyObject *exc_type = tstate->curexc_type;
+ if (exc_type == err) return 1;
+ if (unlikely(!exc_type)) return 0;
if (unlikely(PyTuple_Check(err)))
return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err);
return __Pyx_PyErr_GivenExceptionMatches(exc_type, err);
-}
-#endif
-
+}
+#endif
+
/////////////// PyErrFetchRestore.proto ///////////////
-//@substitute: naming
-//@requires: PyThreadStateGet
+//@substitute: naming
+//@requires: PyThreadStateGet
-#if CYTHON_FAST_THREAD_STATE
+#if CYTHON_FAST_THREAD_STATE
#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL)
-#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
-#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
-#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState($local_tstate_cname, type, value, tb)
-#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState($local_tstate_cname, type, value, tb)
-static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); /*proto*/
+#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
+#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
+#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState($local_tstate_cname, type, value, tb)
+#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState($local_tstate_cname, type, value, tb)
+static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); /*proto*/
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL))
-#else
+#else
#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
#endif
#else
#define __Pyx_PyErr_Clear() PyErr_Clear()
#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
-#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb)
-#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb)
+#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb)
#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb)
#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb)
-#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb)
-#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb)
-#endif
-
+#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb)
+#endif
+
/////////////// PyErrFetchRestore ///////////////
-#if CYTHON_FAST_THREAD_STATE
-static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
PyObject *tmp_type, *tmp_value, *tmp_tb;
tmp_type = tstate->curexc_type;
tmp_value = tstate->curexc_value;
@@ -104,14 +104,14 @@ static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObjec
Py_XDECREF(tmp_tb);
}
-static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
*type = tstate->curexc_type;
*value = tstate->curexc_value;
*tb = tstate->curexc_traceback;
tstate->curexc_type = 0;
tstate->curexc_value = 0;
tstate->curexc_traceback = 0;
-}
+}
#endif
/////////////// RaiseException.proto ///////////////
@@ -120,7 +120,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
/////////////// RaiseException ///////////////
//@requires: PyErrFetchRestore
-//@requires: PyThreadStateGet
+//@requires: PyThreadStateGet
// The following function is based on do_raise() from ceval.c. There
// are separate versions for Python2 and Python3 as exception handling
@@ -129,7 +129,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
#if PY_MAJOR_VERSION < 3
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
CYTHON_UNUSED PyObject *cause) {
- __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_declare
/* 'cause' is only used in Py3 */
Py_XINCREF(type);
if (!value || value == Py_None)
@@ -177,7 +177,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
}
}
- __Pyx_PyThreadState_assign
+ __Pyx_PyThreadState_assign
__Pyx_ErrRestore(type, value, tb);
return;
raise_error:
@@ -215,13 +215,13 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
if (value && PyExceptionInstance_Check(value)) {
instance_class = (PyObject*) Py_TYPE(value);
if (instance_class != type) {
- int is_subclass = PyObject_IsSubclass(instance_class, type);
- if (!is_subclass) {
- instance_class = NULL;
- } else if (unlikely(is_subclass == -1)) {
- // error on subclass test
- goto bad;
- } else {
+ int is_subclass = PyObject_IsSubclass(instance_class, type);
+ if (!is_subclass) {
+ instance_class = NULL;
+ } else if (unlikely(is_subclass == -1)) {
+ // error on subclass test
+ goto bad;
+ } else {
// believe the instance
type = instance_class;
}
@@ -284,13 +284,13 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
PyErr_SetObject(type, value);
if (tb) {
-#if CYTHON_COMPILING_IN_PYPY
- PyObject *tmp_type, *tmp_value, *tmp_tb;
- PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
- Py_INCREF(tb);
- PyErr_Restore(tmp_type, tmp_value, tb);
- Py_XDECREF(tmp_tb);
-#else
+#if CYTHON_COMPILING_IN_PYPY
+ PyObject *tmp_type, *tmp_value, *tmp_tb;
+ PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
+ Py_INCREF(tb);
+ PyErr_Restore(tmp_type, tmp_value, tb);
+ Py_XDECREF(tmp_tb);
+#else
PyThreadState *tstate = __Pyx_PyThreadState_Current;
PyObject* tmp_tb = tstate->curexc_traceback;
if (tb != tmp_tb) {
@@ -298,7 +298,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
tstate->curexc_traceback = tb;
Py_XDECREF(tmp_tb);
}
-#endif
+#endif
}
bad:
@@ -307,52 +307,52 @@ bad:
}
#endif
-
-/////////////// GetTopmostException.proto ///////////////
-
-#if CYTHON_USE_EXC_INFO_STACK
-static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
-#endif
-
-/////////////// GetTopmostException ///////////////
-
-#if CYTHON_USE_EXC_INFO_STACK
-// Copied from errors.c in CPython.
-static _PyErr_StackItem *
-__Pyx_PyErr_GetTopmostException(PyThreadState *tstate)
-{
- _PyErr_StackItem *exc_info = tstate->exc_info;
- while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
- exc_info->previous_item != NULL)
- {
- exc_info = exc_info->previous_item;
- }
- return exc_info;
-}
-#endif
-
-
+
+/////////////// GetTopmostException.proto ///////////////
+
+#if CYTHON_USE_EXC_INFO_STACK
+static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
+#endif
+
+/////////////// GetTopmostException ///////////////
+
+#if CYTHON_USE_EXC_INFO_STACK
+// Copied from errors.c in CPython.
+static _PyErr_StackItem *
+__Pyx_PyErr_GetTopmostException(PyThreadState *tstate)
+{
+ _PyErr_StackItem *exc_info = tstate->exc_info;
+ while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
+ exc_info->previous_item != NULL)
+ {
+ exc_info = exc_info->previous_item;
+ }
+ return exc_info;
+}
+#endif
+
+
/////////////// GetException.proto ///////////////
-//@substitute: naming
-//@requires: PyThreadStateGet
+//@substitute: naming
+//@requires: PyThreadStateGet
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_GetException(type, value, tb) __Pyx__GetException($local_tstate_cname, type, value, tb)
-static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-#else
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_GetException(type, value, tb) __Pyx__GetException($local_tstate_cname, type, value, tb)
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); /*proto*/
+#else
static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-#endif
+#endif
/////////////// GetException ///////////////
-#if CYTHON_FAST_THREAD_STATE
-static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb)
-#else
-static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
-#endif
-{
+#if CYTHON_FAST_THREAD_STATE
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb)
+#else
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
+#endif
+{
PyObject *local_type, *local_value, *local_tb;
-#if CYTHON_FAST_THREAD_STATE
+#if CYTHON_FAST_THREAD_STATE
PyObject *tmp_type, *tmp_value, *tmp_tb;
local_type = tstate->curexc_type;
local_value = tstate->curexc_value;
@@ -364,7 +364,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
PyErr_Fetch(&local_type, &local_value, &local_tb);
#endif
PyErr_NormalizeException(&local_type, &local_value, &local_tb);
-#if CYTHON_FAST_THREAD_STATE
+#if CYTHON_FAST_THREAD_STATE
if (unlikely(tstate->curexc_type))
#else
if (unlikely(PyErr_Occurred()))
@@ -384,17 +384,17 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
*type = local_type;
*value = local_value;
*tb = local_tb;
-#if CYTHON_FAST_THREAD_STATE
- #if CYTHON_USE_EXC_INFO_STACK
- {
- _PyErr_StackItem *exc_info = tstate->exc_info;
- tmp_type = exc_info->exc_type;
- tmp_value = exc_info->exc_value;
- tmp_tb = exc_info->exc_traceback;
- exc_info->exc_type = local_type;
- exc_info->exc_value = local_value;
- exc_info->exc_traceback = local_tb;
- }
+#if CYTHON_FAST_THREAD_STATE
+ #if CYTHON_USE_EXC_INFO_STACK
+ {
+ _PyErr_StackItem *exc_info = tstate->exc_info;
+ tmp_type = exc_info->exc_type;
+ tmp_value = exc_info->exc_value;
+ tmp_tb = exc_info->exc_traceback;
+ exc_info->exc_type = local_type;
+ exc_info->exc_value = local_value;
+ exc_info->exc_traceback = local_tb;
+ }
#else
tmp_type = tstate->exc_type;
tmp_value = tstate->exc_value;
@@ -426,18 +426,18 @@ bad:
static CYTHON_INLINE void __Pyx_ReraiseException(void); /*proto*/
-/////////////// ReRaiseException ///////////////
-//@requires: GetTopmostException
+/////////////// ReRaiseException ///////////////
+//@requires: GetTopmostException
static CYTHON_INLINE void __Pyx_ReraiseException(void) {
PyObject *type = NULL, *value = NULL, *tb = NULL;
-#if CYTHON_FAST_THREAD_STATE
+#if CYTHON_FAST_THREAD_STATE
PyThreadState *tstate = PyThreadState_GET();
- #if CYTHON_USE_EXC_INFO_STACK
- _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
- type = exc_info->exc_type;
- value = exc_info->exc_value;
- tb = exc_info->exc_traceback;
+ #if CYTHON_USE_EXC_INFO_STACK
+ _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
+ type = exc_info->exc_type;
+ value = exc_info->exc_value;
+ tb = exc_info->exc_traceback;
#else
type = tstate->exc_type;
value = tstate->exc_value;
@@ -447,7 +447,7 @@ static CYTHON_INLINE void __Pyx_ReraiseException(void) {
PyErr_GetExcInfo(&type, &value, &tb);
#endif
if (!type || type == Py_None) {
-#if !CYTHON_FAST_THREAD_STATE
+#if !CYTHON_FAST_THREAD_STATE
Py_XDECREF(type);
Py_XDECREF(value);
Py_XDECREF(tb);
@@ -456,7 +456,7 @@ static CYTHON_INLINE void __Pyx_ReraiseException(void) {
PyErr_SetString(PyExc_RuntimeError,
"No active exception to reraise");
} else {
-#if CYTHON_FAST_THREAD_STATE
+#if CYTHON_FAST_THREAD_STATE
Py_INCREF(type);
Py_XINCREF(value);
Py_XINCREF(tb);
@@ -467,31 +467,31 @@ static CYTHON_INLINE void __Pyx_ReraiseException(void) {
}
/////////////// SaveResetException.proto ///////////////
-//@substitute: naming
-//@requires: PyThreadStateGet
-
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave($local_tstate_cname, type, value, tb)
-static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset($local_tstate_cname, type, value, tb)
-static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-
-#else
-
-#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb)
-#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb)
-#endif
-
+//@substitute: naming
+//@requires: PyThreadStateGet
+
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave($local_tstate_cname, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); /*proto*/
+#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset($local_tstate_cname, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+
+#else
+
+#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb)
+#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb)
+#endif
+
/////////////// SaveResetException ///////////////
-//@requires: GetTopmostException
-
-#if CYTHON_FAST_THREAD_STATE
-static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
- #if CYTHON_USE_EXC_INFO_STACK
- _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
- *type = exc_info->exc_type;
- *value = exc_info->exc_value;
- *tb = exc_info->exc_traceback;
+//@requires: GetTopmostException
+
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+ #if CYTHON_USE_EXC_INFO_STACK
+ _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
+ *type = exc_info->exc_type;
+ *value = exc_info->exc_value;
+ *tb = exc_info->exc_traceback;
#else
*type = tstate->exc_type;
*value = tstate->exc_value;
@@ -502,17 +502,17 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject *
Py_XINCREF(*tb);
}
-static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
PyObject *tmp_type, *tmp_value, *tmp_tb;
- #if CYTHON_USE_EXC_INFO_STACK
- _PyErr_StackItem *exc_info = tstate->exc_info;
- tmp_type = exc_info->exc_type;
- tmp_value = exc_info->exc_value;
- tmp_tb = exc_info->exc_traceback;
- exc_info->exc_type = type;
- exc_info->exc_value = value;
- exc_info->exc_traceback = tb;
+ #if CYTHON_USE_EXC_INFO_STACK
+ _PyErr_StackItem *exc_info = tstate->exc_info;
+ tmp_type = exc_info->exc_type;
+ tmp_value = exc_info->exc_value;
+ tmp_tb = exc_info->exc_traceback;
+ exc_info->exc_type = type;
+ exc_info->exc_value = value;
+ exc_info->exc_traceback = tb;
#else
tmp_type = tstate->exc_type;
tmp_value = tstate->exc_value;
@@ -524,35 +524,35 @@ static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject
Py_XDECREF(tmp_type);
Py_XDECREF(tmp_value);
Py_XDECREF(tmp_tb);
-}
+}
#endif
/////////////// SwapException.proto ///////////////
-//@substitute: naming
-//@requires: PyThreadStateGet
+//@substitute: naming
+//@requires: PyThreadStateGet
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap($local_tstate_cname, type, value, tb)
-static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-#else
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap($local_tstate_cname, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); /*proto*/
+#else
static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-#endif
+#endif
/////////////// SwapException ///////////////
-#if CYTHON_FAST_THREAD_STATE
-static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
PyObject *tmp_type, *tmp_value, *tmp_tb;
- #if CYTHON_USE_EXC_INFO_STACK
- _PyErr_StackItem *exc_info = tstate->exc_info;
- tmp_type = exc_info->exc_type;
- tmp_value = exc_info->exc_value;
- tmp_tb = exc_info->exc_traceback;
+ #if CYTHON_USE_EXC_INFO_STACK
+ _PyErr_StackItem *exc_info = tstate->exc_info;
+ tmp_type = exc_info->exc_type;
+ tmp_value = exc_info->exc_value;
+ tmp_tb = exc_info->exc_traceback;
- exc_info->exc_type = *type;
- exc_info->exc_value = *value;
- exc_info->exc_traceback = *tb;
+ exc_info->exc_type = *type;
+ exc_info->exc_value = *value;
+ exc_info->exc_traceback = *tb;
#else
tmp_type = tstate->exc_type;
tmp_value = tstate->exc_value;
@@ -562,50 +562,50 @@ static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject *
tstate->exc_value = *value;
tstate->exc_traceback = *tb;
#endif
-
- *type = tmp_type;
- *value = tmp_value;
- *tb = tmp_tb;
-}
-
+
+ *type = tmp_type;
+ *value = tmp_value;
+ *tb = tmp_tb;
+}
+
#else
-
-static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
- PyObject *tmp_type, *tmp_value, *tmp_tb;
+
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
+ PyObject *tmp_type, *tmp_value, *tmp_tb;
PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
PyErr_SetExcInfo(*type, *value, *tb);
*type = tmp_type;
*value = tmp_value;
*tb = tmp_tb;
}
-#endif
+#endif
/////////////// WriteUnraisableException.proto ///////////////
static void __Pyx_WriteUnraisable(const char *name, int clineno,
int lineno, const char *filename,
- int full_traceback, int nogil); /*proto*/
+ int full_traceback, int nogil); /*proto*/
/////////////// WriteUnraisableException ///////////////
//@requires: PyErrFetchRestore
-//@requires: PyThreadStateGet
+//@requires: PyThreadStateGet
static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
- int full_traceback, CYTHON_UNUSED int nogil) {
+ int full_traceback, CYTHON_UNUSED int nogil) {
PyObject *old_exc, *old_val, *old_tb;
PyObject *ctx;
- __Pyx_PyThreadState_declare
-#ifdef WITH_THREAD
- PyGILState_STATE state;
- if (nogil)
- state = PyGILState_Ensure();
-#ifdef _MSC_VER
- /* arbitrary, to suppress warning */
- else state = (PyGILState_STATE)-1;
-#endif
-#endif
- __Pyx_PyThreadState_assign
+ __Pyx_PyThreadState_declare
+#ifdef WITH_THREAD
+ PyGILState_STATE state;
+ if (nogil)
+ state = PyGILState_Ensure();
+#ifdef _MSC_VER
+ /* arbitrary, to suppress warning */
+ else state = (PyGILState_STATE)-1;
+#endif
+#endif
+ __Pyx_PyThreadState_assign
__Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
if (full_traceback) {
Py_XINCREF(old_exc);
@@ -626,10 +626,10 @@ static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
PyErr_WriteUnraisable(ctx);
Py_DECREF(ctx);
}
-#ifdef WITH_THREAD
- if (nogil)
- PyGILState_Release(state);
-#endif
+#ifdef WITH_THREAD
+ if (nogil)
+ PyGILState_Release(state);
+#endif
}
/////////////// CLineInTraceback.proto ///////////////
@@ -642,7 +642,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line);/*proto*/
/////////////// CLineInTraceback ///////////////
//@requires: ObjectHandling.c::PyObjectGetAttrStr
-//@requires: ObjectHandling.c::PyDictVersioning
+//@requires: ObjectHandling.c::PyDictVersioning
//@requires: PyErrFetchRestore
//@substitute: naming
@@ -653,20 +653,20 @@ static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int
#if CYTHON_COMPILING_IN_CPYTHON
PyObject **cython_runtime_dict;
#endif
-
- if (unlikely(!${cython_runtime_cname})) {
- // Very early error where the runtime module is not set up yet.
- return c_line;
- }
-
+
+ if (unlikely(!${cython_runtime_cname})) {
+ // Very early error where the runtime module is not set up yet.
+ return c_line;
+ }
+
__Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback);
#if CYTHON_COMPILING_IN_CPYTHON
cython_runtime_dict = _PyObject_GetDictPtr(${cython_runtime_cname});
if (likely(cython_runtime_dict)) {
- __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
- use_cline, *cython_runtime_dict,
- __Pyx_PyDict_GetItemStr(*cython_runtime_dict, PYIDENT("cline_in_traceback")))
+ __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
+ use_cline, *cython_runtime_dict,
+ __Pyx_PyDict_GetItemStr(*cython_runtime_dict, PYIDENT("cline_in_traceback")))
} else
#endif
{
@@ -684,7 +684,7 @@ static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int
// No need to handle errors here when we reset the exception state just afterwards.
(void) PyObject_SetAttr(${cython_runtime_cname}, PYIDENT("cline_in_traceback"), Py_False);
}
- else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) {
+ else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) {
c_line = 0;
}
__Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback);
@@ -792,7 +792,7 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line,
0 /*PyObject *locals*/
);
if (!py_frame) goto bad;
- __Pyx_PyFrame_SetLineNumber(py_frame, py_line);
+ __Pyx_PyFrame_SetLineNumber(py_frame, py_line);
PyTraceBack_Here(py_frame);
bad:
Py_XDECREF(py_code);
diff --git a/contrib/tools/cython/Cython/Utility/FunctionArguments.c b/contrib/tools/cython/Cython/Utility/FunctionArguments.c
index 8333d93666..4c9b488e89 100644
--- a/contrib/tools/cython/Cython/Utility/FunctionArguments.c
+++ b/contrib/tools/cython/Cython/Utility/FunctionArguments.c
@@ -104,17 +104,17 @@ static void __Pyx_RaiseDoubleKeywordsError(
}
-//////////////////// RaiseMappingExpected.proto ////////////////////
-
-static void __Pyx_RaiseMappingExpectedError(PyObject* arg); /*proto*/
-
-//////////////////// RaiseMappingExpected ////////////////////
-
-static void __Pyx_RaiseMappingExpectedError(PyObject* arg) {
- PyErr_Format(PyExc_TypeError, "'%.200s' object is not a mapping", Py_TYPE(arg)->tp_name);
-}
-
-
+//////////////////// RaiseMappingExpected.proto ////////////////////
+
+static void __Pyx_RaiseMappingExpectedError(PyObject* arg); /*proto*/
+
+//////////////////// RaiseMappingExpected ////////////////////
+
+static void __Pyx_RaiseMappingExpectedError(PyObject* arg) {
+ PyErr_Format(PyExc_TypeError, "'%.200s' object is not a mapping", Py_TYPE(arg)->tp_name);
+}
+
+
//////////////////// KeywordStringCheck.proto ////////////////////
static int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/
@@ -295,58 +295,58 @@ invalid_keyword:
bad:
return -1;
}
-
-
-//////////////////// MergeKeywords.proto ////////////////////
-
-static int __Pyx_MergeKeywords(PyObject *kwdict, PyObject *source_mapping); /*proto*/
-
-//////////////////// MergeKeywords ////////////////////
-//@requires: RaiseDoubleKeywords
-//@requires: Optimize.c::dict_iter
-
-static int __Pyx_MergeKeywords(PyObject *kwdict, PyObject *source_mapping) {
- PyObject *iter, *key = NULL, *value = NULL;
- int source_is_dict, result;
- Py_ssize_t orig_length, ppos = 0;
-
- iter = __Pyx_dict_iterator(source_mapping, 0, PYIDENT("items"), &orig_length, &source_is_dict);
- if (unlikely(!iter)) {
- // slow fallback: try converting to dict, then iterate
- PyObject *args;
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
- PyErr_Clear();
- args = PyTuple_Pack(1, source_mapping);
- if (likely(args)) {
- PyObject *fallback = PyObject_Call((PyObject*)&PyDict_Type, args, NULL);
- Py_DECREF(args);
- if (likely(fallback)) {
- iter = __Pyx_dict_iterator(fallback, 1, PYIDENT("items"), &orig_length, &source_is_dict);
- Py_DECREF(fallback);
- }
- }
- if (unlikely(!iter)) goto bad;
- }
-
- while (1) {
- result = __Pyx_dict_iter_next(iter, orig_length, &ppos, &key, &value, NULL, source_is_dict);
- if (unlikely(result < 0)) goto bad;
- if (!result) break;
-
- if (unlikely(PyDict_Contains(kwdict, key))) {
- __Pyx_RaiseDoubleKeywordsError("function", key);
- result = -1;
- } else {
- result = PyDict_SetItem(kwdict, key, value);
- }
- Py_DECREF(key);
- Py_DECREF(value);
- if (unlikely(result < 0)) goto bad;
- }
- Py_XDECREF(iter);
- return 0;
-
-bad:
- Py_XDECREF(iter);
- return -1;
-}
+
+
+//////////////////// MergeKeywords.proto ////////////////////
+
+static int __Pyx_MergeKeywords(PyObject *kwdict, PyObject *source_mapping); /*proto*/
+
+//////////////////// MergeKeywords ////////////////////
+//@requires: RaiseDoubleKeywords
+//@requires: Optimize.c::dict_iter
+
+static int __Pyx_MergeKeywords(PyObject *kwdict, PyObject *source_mapping) {
+ PyObject *iter, *key = NULL, *value = NULL;
+ int source_is_dict, result;
+ Py_ssize_t orig_length, ppos = 0;
+
+ iter = __Pyx_dict_iterator(source_mapping, 0, PYIDENT("items"), &orig_length, &source_is_dict);
+ if (unlikely(!iter)) {
+ // slow fallback: try converting to dict, then iterate
+ PyObject *args;
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
+ PyErr_Clear();
+ args = PyTuple_Pack(1, source_mapping);
+ if (likely(args)) {
+ PyObject *fallback = PyObject_Call((PyObject*)&PyDict_Type, args, NULL);
+ Py_DECREF(args);
+ if (likely(fallback)) {
+ iter = __Pyx_dict_iterator(fallback, 1, PYIDENT("items"), &orig_length, &source_is_dict);
+ Py_DECREF(fallback);
+ }
+ }
+ if (unlikely(!iter)) goto bad;
+ }
+
+ while (1) {
+ result = __Pyx_dict_iter_next(iter, orig_length, &ppos, &key, &value, NULL, source_is_dict);
+ if (unlikely(result < 0)) goto bad;
+ if (!result) break;
+
+ if (unlikely(PyDict_Contains(kwdict, key))) {
+ __Pyx_RaiseDoubleKeywordsError("function", key);
+ result = -1;
+ } else {
+ result = PyDict_SetItem(kwdict, key, value);
+ }
+ Py_DECREF(key);
+ Py_DECREF(value);
+ if (unlikely(result < 0)) goto bad;
+ }
+ Py_XDECREF(iter);
+ return 0;
+
+bad:
+ Py_XDECREF(iter);
+ return -1;
+}
diff --git a/contrib/tools/cython/Cython/Utility/ImportExport.c b/contrib/tools/cython/Cython/Utility/ImportExport.c
index 532ec326f6..786726fd85 100644
--- a/contrib/tools/cython/Cython/Utility/ImportExport.c
+++ b/contrib/tools/cython/Cython/Utility/ImportExport.c
@@ -66,7 +66,7 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
if (!py_level)
goto bad;
module = PyObject_CallFunctionObjArgs(py_import,
- name, global_dict, empty_dict, list, py_level, (PyObject *)NULL);
+ name, global_dict, empty_dict, list, py_level, (PyObject *)NULL);
Py_DECREF(py_level);
#else
module = PyImport_ImportModuleLevelObject(
@@ -105,125 +105,125 @@ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
}
-/////////////// ImportStar ///////////////
-//@substitute: naming
-
-/* import_all_from is an unexposed function from ceval.c */
-
-static int
-__Pyx_import_all_from(PyObject *locals, PyObject *v)
-{
- PyObject *all = PyObject_GetAttrString(v, "__all__");
- PyObject *dict, *name, *value;
- int skip_leading_underscores = 0;
- int pos, err;
-
- if (all == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- return -1; /* Unexpected error */
- PyErr_Clear();
- dict = PyObject_GetAttrString(v, "__dict__");
- if (dict == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- return -1;
- PyErr_SetString(PyExc_ImportError,
- "from-import-* object has no __dict__ and no __all__");
- return -1;
- }
-#if PY_MAJOR_VERSION < 3
- all = PyObject_CallMethod(dict, (char *)"keys", NULL);
-#else
- all = PyMapping_Keys(dict);
-#endif
- Py_DECREF(dict);
- if (all == NULL)
- return -1;
- skip_leading_underscores = 1;
- }
-
- for (pos = 0, err = 0; ; pos++) {
- name = PySequence_GetItem(all, pos);
- if (name == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_IndexError))
- err = -1;
- else
- PyErr_Clear();
- break;
- }
- if (skip_leading_underscores &&
-#if PY_MAJOR_VERSION < 3
+/////////////// ImportStar ///////////////
+//@substitute: naming
+
+/* import_all_from is an unexposed function from ceval.c */
+
+static int
+__Pyx_import_all_from(PyObject *locals, PyObject *v)
+{
+ PyObject *all = PyObject_GetAttrString(v, "__all__");
+ PyObject *dict, *name, *value;
+ int skip_leading_underscores = 0;
+ int pos, err;
+
+ if (all == NULL) {
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError))
+ return -1; /* Unexpected error */
+ PyErr_Clear();
+ dict = PyObject_GetAttrString(v, "__dict__");
+ if (dict == NULL) {
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError))
+ return -1;
+ PyErr_SetString(PyExc_ImportError,
+ "from-import-* object has no __dict__ and no __all__");
+ return -1;
+ }
+#if PY_MAJOR_VERSION < 3
+ all = PyObject_CallMethod(dict, (char *)"keys", NULL);
+#else
+ all = PyMapping_Keys(dict);
+#endif
+ Py_DECREF(dict);
+ if (all == NULL)
+ return -1;
+ skip_leading_underscores = 1;
+ }
+
+ for (pos = 0, err = 0; ; pos++) {
+ name = PySequence_GetItem(all, pos);
+ if (name == NULL) {
+ if (!PyErr_ExceptionMatches(PyExc_IndexError))
+ err = -1;
+ else
+ PyErr_Clear();
+ break;
+ }
+ if (skip_leading_underscores &&
+#if PY_MAJOR_VERSION < 3
likely(PyString_Check(name)) &&
- PyString_AS_STRING(name)[0] == '_')
-#else
+ PyString_AS_STRING(name)[0] == '_')
+#else
likely(PyUnicode_Check(name)) &&
likely(__Pyx_PyUnicode_GET_LENGTH(name)) &&
__Pyx_PyUnicode_READ_CHAR(name, 0) == '_')
-#endif
- {
- Py_DECREF(name);
- continue;
- }
- value = PyObject_GetAttr(v, name);
- if (value == NULL)
- err = -1;
- else if (PyDict_CheckExact(locals))
- err = PyDict_SetItem(locals, name, value);
- else
- err = PyObject_SetItem(locals, name, value);
- Py_DECREF(name);
- Py_XDECREF(value);
- if (err != 0)
- break;
- }
- Py_DECREF(all);
- return err;
-}
-
-
-static int ${import_star}(PyObject* m) {
-
- int i;
- int ret = -1;
- char* s;
- PyObject *locals = 0;
- PyObject *list = 0;
-#if PY_MAJOR_VERSION >= 3
- PyObject *utf8_name = 0;
-#endif
- PyObject *name;
- PyObject *item;
-
- locals = PyDict_New(); if (!locals) goto bad;
- if (__Pyx_import_all_from(locals, m) < 0) goto bad;
- list = PyDict_Items(locals); if (!list) goto bad;
-
- for(i=0; i<PyList_GET_SIZE(list); i++) {
- name = PyTuple_GET_ITEM(PyList_GET_ITEM(list, i), 0);
- item = PyTuple_GET_ITEM(PyList_GET_ITEM(list, i), 1);
-#if PY_MAJOR_VERSION >= 3
- utf8_name = PyUnicode_AsUTF8String(name);
- if (!utf8_name) goto bad;
- s = PyBytes_AS_STRING(utf8_name);
- if (${import_star_set}(item, name, s) < 0) goto bad;
- Py_DECREF(utf8_name); utf8_name = 0;
-#else
- s = PyString_AsString(name);
- if (!s) goto bad;
- if (${import_star_set}(item, name, s) < 0) goto bad;
-#endif
- }
- ret = 0;
-
-bad:
- Py_XDECREF(locals);
- Py_XDECREF(list);
-#if PY_MAJOR_VERSION >= 3
- Py_XDECREF(utf8_name);
-#endif
- return ret;
-}
-
-
+#endif
+ {
+ Py_DECREF(name);
+ continue;
+ }
+ value = PyObject_GetAttr(v, name);
+ if (value == NULL)
+ err = -1;
+ else if (PyDict_CheckExact(locals))
+ err = PyDict_SetItem(locals, name, value);
+ else
+ err = PyObject_SetItem(locals, name, value);
+ Py_DECREF(name);
+ Py_XDECREF(value);
+ if (err != 0)
+ break;
+ }
+ Py_DECREF(all);
+ return err;
+}
+
+
+static int ${import_star}(PyObject* m) {
+
+ int i;
+ int ret = -1;
+ char* s;
+ PyObject *locals = 0;
+ PyObject *list = 0;
+#if PY_MAJOR_VERSION >= 3
+ PyObject *utf8_name = 0;
+#endif
+ PyObject *name;
+ PyObject *item;
+
+ locals = PyDict_New(); if (!locals) goto bad;
+ if (__Pyx_import_all_from(locals, m) < 0) goto bad;
+ list = PyDict_Items(locals); if (!list) goto bad;
+
+ for(i=0; i<PyList_GET_SIZE(list); i++) {
+ name = PyTuple_GET_ITEM(PyList_GET_ITEM(list, i), 0);
+ item = PyTuple_GET_ITEM(PyList_GET_ITEM(list, i), 1);
+#if PY_MAJOR_VERSION >= 3
+ utf8_name = PyUnicode_AsUTF8String(name);
+ if (!utf8_name) goto bad;
+ s = PyBytes_AS_STRING(utf8_name);
+ if (${import_star_set}(item, name, s) < 0) goto bad;
+ Py_DECREF(utf8_name); utf8_name = 0;
+#else
+ s = PyString_AsString(name);
+ if (!s) goto bad;
+ if (${import_star_set}(item, name, s) < 0) goto bad;
+#endif
+ }
+ ret = 0;
+
+bad:
+ Py_XDECREF(locals);
+ Py_XDECREF(list);
+#if PY_MAJOR_VERSION >= 3
+ Py_XDECREF(utf8_name);
+#endif
+ return ret;
+}
+
+
/////////////// SetPackagePathFromImportLib.proto ///////////////
// PY_VERSION_HEX >= 0x03030000
@@ -310,25 +310,25 @@ set_path:
/////////////// TypeImport.proto ///////////////
-#ifndef __PYX_HAVE_RT_ImportType_proto
-#define __PYX_HAVE_RT_ImportType_proto
-
-enum __Pyx_ImportType_CheckSize {
- __Pyx_ImportType_CheckSize_Error = 0,
- __Pyx_ImportType_CheckSize_Warn = 1,
- __Pyx_ImportType_CheckSize_Ignore = 2
-};
-
-static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); /*proto*/
-
-#endif
-
+#ifndef __PYX_HAVE_RT_ImportType_proto
+#define __PYX_HAVE_RT_ImportType_proto
+
+enum __Pyx_ImportType_CheckSize {
+ __Pyx_ImportType_CheckSize_Error = 0,
+ __Pyx_ImportType_CheckSize_Warn = 1,
+ __Pyx_ImportType_CheckSize_Ignore = 2
+};
+
+static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); /*proto*/
+
+#endif
+
/////////////// TypeImport ///////////////
#ifndef __PYX_HAVE_RT_ImportType
#define __PYX_HAVE_RT_ImportType
-static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name,
- size_t size, enum __Pyx_ImportType_CheckSize check_size)
+static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name,
+ size_t size, enum __Pyx_ImportType_CheckSize check_size)
{
PyObject *result = 0;
char warning[200];
@@ -337,7 +337,7 @@ static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name,
PyObject *py_basicsize;
#endif
- result = PyObject_GetAttrString(module, class_name);
+ result = PyObject_GetAttrString(module, class_name);
if (!result)
goto bad;
if (!PyType_Check(result)) {
@@ -358,28 +358,28 @@ static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name,
if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred())
goto bad;
#endif
- if ((size_t)basicsize < size) {
- PyErr_Format(PyExc_ValueError,
- "%.200s.%.200s size changed, may indicate binary incompatibility. "
- "Expected %zd from C header, got %zd from PyObject",
- module_name, class_name, size, basicsize);
- goto bad;
+ if ((size_t)basicsize < size) {
+ PyErr_Format(PyExc_ValueError,
+ "%.200s.%.200s size changed, may indicate binary incompatibility. "
+ "Expected %zd from C header, got %zd from PyObject",
+ module_name, class_name, size, basicsize);
+ goto bad;
}
- if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) {
+ if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) {
PyErr_Format(PyExc_ValueError,
- "%.200s.%.200s size changed, may indicate binary incompatibility. "
- "Expected %zd from C header, got %zd from PyObject",
- module_name, class_name, size, basicsize);
+ "%.200s.%.200s size changed, may indicate binary incompatibility. "
+ "Expected %zd from C header, got %zd from PyObject",
+ module_name, class_name, size, basicsize);
goto bad;
}
- else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) {
- PyOS_snprintf(warning, sizeof(warning),
- "%s.%s size changed, may indicate binary incompatibility. "
- "Expected %zd from C header, got %zd from PyObject",
- module_name, class_name, size, basicsize);
- if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;
- }
- /* check_size == __Pyx_ImportType_CheckSize_Ignore does not warn nor error */
+ else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) {
+ PyOS_snprintf(warning, sizeof(warning),
+ "%s.%s size changed, may indicate binary incompatibility. "
+ "Expected %zd from C header, got %zd from PyObject",
+ module_name, class_name, size, basicsize);
+ if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;
+ }
+ /* check_size == __Pyx_ImportType_CheckSize_Ignore does not warn nor error */
return (PyTypeObject *)result;
bad:
Py_XDECREF(result);
diff --git a/contrib/tools/cython/Cython/Utility/MemoryView.pyx b/contrib/tools/cython/Cython/Utility/MemoryView.pyx
index 6ca5fab9ba..75e434757a 100644
--- a/contrib/tools/cython/Cython/Utility/MemoryView.pyx
+++ b/contrib/tools/cython/Cython/Utility/MemoryView.pyx
@@ -2,10 +2,10 @@
# This utility provides cython.array and cython.view.memoryview
-from __future__ import absolute_import
-
-cimport cython
+from __future__ import absolute_import
+cimport cython
+
# from cpython cimport ...
cdef extern from "Python.h":
int PyIndex_Check(object)
@@ -19,7 +19,7 @@ cdef extern from "pythread.h":
int PyThread_acquire_lock(PyThread_type_lock, int mode) nogil
void PyThread_release_lock(PyThread_type_lock) nogil
-cdef extern from "<string.h>":
+cdef extern from "<string.h>":
void *memset(void *b, int c, size_t len)
cdef extern from *:
@@ -33,8 +33,8 @@ cdef extern from *:
void* PyMem_Malloc(size_t n)
void PyMem_Free(void *p)
- void* PyObject_Malloc(size_t n)
- void PyObject_Free(void *p)
+ void* PyObject_Malloc(size_t n)
+ void PyObject_Free(void *p)
cdef struct __pyx_memoryview "__pyx_memoryview_obj":
Py_buffer view
@@ -64,7 +64,7 @@ cdef extern from *:
PyBUF_WRITABLE
PyBUF_STRIDES
PyBUF_INDIRECT
- PyBUF_ND
+ PyBUF_ND
PyBUF_RECORDS
PyBUF_RECORDS_RO
@@ -83,13 +83,13 @@ cdef extern from *:
size_t sizeof_dtype, int contig_flag,
bint dtype_is_object) nogil except *
bint slice_is_contig "__pyx_memviewslice_is_contig" (
- {{memviewslice_name}} mvs, char order, int ndim) nogil
+ {{memviewslice_name}} mvs, char order, int ndim) nogil
bint slices_overlap "__pyx_slices_overlap" ({{memviewslice_name}} *slice1,
{{memviewslice_name}} *slice2,
int ndim, size_t itemsize) nogil
-cdef extern from "<stdlib.h>":
+cdef extern from "<stdlib.h>":
void *malloc(size_t) nogil
void free(void *) nogil
void *memcpy(void *dest, void *src, size_t n) nogil
@@ -135,13 +135,13 @@ cdef class array:
if itemsize <= 0:
raise ValueError("itemsize <= 0 for cython.array")
- if not isinstance(format, bytes):
- format = format.encode('ASCII')
+ if not isinstance(format, bytes):
+ format = format.encode('ASCII')
self._format = format # keep a reference to the byte string
self.format = self._format
# use single malloc() for both shape and strides
- self._shape = <Py_ssize_t *> PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2)
+ self._shape = <Py_ssize_t *> PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2)
self._strides = self._shape + self.ndim
if not self._shape:
@@ -216,20 +216,20 @@ cdef class array:
refcount_objects_in_slice(self.data, self._shape,
self._strides, self.ndim, False)
free(self.data)
- PyObject_Free(self._shape)
+ PyObject_Free(self._shape)
- @property
- def memview(self):
- return self.get_memview()
+ @property
+ def memview(self):
+ return self.get_memview()
- @cname('get_memview')
- cdef get_memview(self):
- flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE
- return memoryview(self, flags, self.dtype_is_object)
+ @cname('get_memview')
+ cdef get_memview(self):
+ flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE
+ return memoryview(self, flags, self.dtype_is_object)
def __len__(self):
return self._shape[0]
-
+
def __getattr__(self, attr):
return getattr(self.memview, attr)
@@ -308,24 +308,24 @@ cdef void *align_pointer(void *memory, size_t alignment) nogil:
return <void *> aligned_p
-
-# pre-allocate thread locks for reuse
-## note that this could be implemented in a more beautiful way in "normal" Cython,
-## but this code gets merged into the user module and not everything works there.
-DEF THREAD_LOCKS_PREALLOCATED = 8
-cdef int __pyx_memoryview_thread_locks_used = 0
-cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [
- PyThread_allocate_lock(),
- PyThread_allocate_lock(),
- PyThread_allocate_lock(),
- PyThread_allocate_lock(),
- PyThread_allocate_lock(),
- PyThread_allocate_lock(),
- PyThread_allocate_lock(),
- PyThread_allocate_lock(),
-]
-
-
+
+# pre-allocate thread locks for reuse
+## note that this could be implemented in a more beautiful way in "normal" Cython,
+## but this code gets merged into the user module and not everything works there.
+DEF THREAD_LOCKS_PREALLOCATED = 8
+cdef int __pyx_memoryview_thread_locks_used = 0
+cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [
+ PyThread_allocate_lock(),
+ PyThread_allocate_lock(),
+ PyThread_allocate_lock(),
+ PyThread_allocate_lock(),
+ PyThread_allocate_lock(),
+ PyThread_allocate_lock(),
+ PyThread_allocate_lock(),
+ PyThread_allocate_lock(),
+]
+
+
@cname('__pyx_memoryview')
cdef class memoryview(object):
@@ -351,17 +351,17 @@ cdef class memoryview(object):
(<__pyx_buffer *> &self.view).obj = Py_None
Py_INCREF(Py_None)
- global __pyx_memoryview_thread_locks_used
- if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED:
- self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]
- __pyx_memoryview_thread_locks_used += 1
- if self.lock is NULL:
- self.lock = PyThread_allocate_lock()
- if self.lock is NULL:
- raise MemoryError
+ global __pyx_memoryview_thread_locks_used
+ if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED:
+ self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]
+ __pyx_memoryview_thread_locks_used += 1
+ if self.lock is NULL:
+ self.lock = PyThread_allocate_lock()
+ if self.lock is NULL:
+ raise MemoryError
if flags & PyBUF_FORMAT:
- self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0')
+ self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0')
else:
self.dtype_is_object = dtype_is_object
@@ -372,23 +372,23 @@ cdef class memoryview(object):
def __dealloc__(memoryview self):
if self.obj is not None:
__Pyx_ReleaseBuffer(&self.view)
- elif (<__pyx_buffer *> &self.view).obj == Py_None:
- # Undo the incref in __cinit__() above.
- (<__pyx_buffer *> &self.view).obj = NULL
- Py_DECREF(Py_None)
+ elif (<__pyx_buffer *> &self.view).obj == Py_None:
+ # Undo the incref in __cinit__() above.
+ (<__pyx_buffer *> &self.view).obj = NULL
+ Py_DECREF(Py_None)
- cdef int i
- global __pyx_memoryview_thread_locks_used
+ cdef int i
+ global __pyx_memoryview_thread_locks_used
if self.lock != NULL:
- for i in range(__pyx_memoryview_thread_locks_used):
- if __pyx_memoryview_thread_locks[i] is self.lock:
- __pyx_memoryview_thread_locks_used -= 1
- if i != __pyx_memoryview_thread_locks_used:
- __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = (
- __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i])
- break
- else:
- PyThread_free_lock(self.lock)
+ for i in range(__pyx_memoryview_thread_locks_used):
+ if __pyx_memoryview_thread_locks[i] is self.lock:
+ __pyx_memoryview_thread_locks_used -= 1
+ if i != __pyx_memoryview_thread_locks_used:
+ __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = (
+ __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i])
+ break
+ else:
+ PyThread_free_lock(self.lock)
cdef char *get_item_pointer(memoryview self, object index) except NULL:
cdef Py_ssize_t dim
@@ -431,7 +431,7 @@ cdef class memoryview(object):
cdef is_slice(self, obj):
if not isinstance(obj, memoryview):
try:
- obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS,
+ obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS,
self.dtype_is_object)
except TypeError:
return None
@@ -519,7 +519,7 @@ cdef class memoryview(object):
if flags & PyBUF_WRITABLE and self.view.readonly:
raise ValueError("Cannot create writable memory view from read-only memoryview")
- if flags & PyBUF_ND:
+ if flags & PyBUF_ND:
info.shape = self.view.shape
else:
info.shape = NULL
@@ -549,58 +549,58 @@ cdef class memoryview(object):
__pyx_getbuffer = capsule(<void *> &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)")
# Some properties that have the same semantics as in NumPy
- @property
- def T(self):
- cdef _memoryviewslice result = memoryview_copy(self)
- transpose_memslice(&result.from_slice)
- return result
+ @property
+ def T(self):
+ cdef _memoryviewslice result = memoryview_copy(self)
+ transpose_memslice(&result.from_slice)
+ return result
- @property
- def base(self):
- return self.obj
+ @property
+ def base(self):
+ return self.obj
- @property
- def shape(self):
- return tuple([length for length in self.view.shape[:self.view.ndim]])
+ @property
+ def shape(self):
+ return tuple([length for length in self.view.shape[:self.view.ndim]])
- @property
- def strides(self):
- if self.view.strides == NULL:
- # Note: we always ask for strides, so if this is not set it's a bug
- raise ValueError("Buffer view does not expose strides")
+ @property
+ def strides(self):
+ if self.view.strides == NULL:
+ # Note: we always ask for strides, so if this is not set it's a bug
+ raise ValueError("Buffer view does not expose strides")
- return tuple([stride for stride in self.view.strides[:self.view.ndim]])
+ return tuple([stride for stride in self.view.strides[:self.view.ndim]])
- @property
- def suboffsets(self):
- if self.view.suboffsets == NULL:
- return (-1,) * self.view.ndim
+ @property
+ def suboffsets(self):
+ if self.view.suboffsets == NULL:
+ return (-1,) * self.view.ndim
- return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]])
+ return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]])
- @property
- def ndim(self):
- return self.view.ndim
+ @property
+ def ndim(self):
+ return self.view.ndim
- @property
- def itemsize(self):
- return self.view.itemsize
+ @property
+ def itemsize(self):
+ return self.view.itemsize
- @property
- def nbytes(self):
- return self.size * self.view.itemsize
+ @property
+ def nbytes(self):
+ return self.size * self.view.itemsize
- @property
- def size(self):
- if self._size is None:
- result = 1
+ @property
+ def size(self):
+ if self._size is None:
+ result = 1
- for length in self.view.shape[:self.view.ndim]:
- result *= length
+ for length in self.view.shape[:self.view.ndim]:
+ result *= length
- self._size = result
+ self._size = result
- return self._size
+ return self._size
def __len__(self):
if self.view.ndim >= 1:
@@ -620,13 +620,13 @@ cdef class memoryview(object):
cdef {{memviewslice_name}} *mslice
cdef {{memviewslice_name}} tmp
mslice = get_slice_from_memview(self, &tmp)
- return slice_is_contig(mslice[0], 'C', self.view.ndim)
+ return slice_is_contig(mslice[0], 'C', self.view.ndim)
def is_f_contig(self):
cdef {{memviewslice_name}} *mslice
cdef {{memviewslice_name}} tmp
mslice = get_slice_from_memview(self, &tmp)
- return slice_is_contig(mslice[0], 'F', self.view.ndim)
+ return slice_is_contig(mslice[0], 'F', self.view.ndim)
def copy(self):
cdef {{memviewslice_name}} mslice
@@ -698,8 +698,8 @@ cdef tuple _unellipsify(object index, int ndim):
return have_slices or nslices, tuple(result)
cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim):
- for suboffset in suboffsets[:ndim]:
- if suboffset >= 0:
+ for suboffset in suboffsets[:ndim]:
+ if suboffset >= 0:
raise ValueError("Indirect dimensions not supported")
#
@@ -787,11 +787,11 @@ cdef memoryview memview_slice(memoryview memview, object indices):
### Slicing in a single dimension of a memoryviewslice
#
-cdef extern from "<stdlib.h>":
+cdef extern from "<stdlib.h>":
void abort() nogil
void printf(char *s, ...) nogil
-cdef extern from "<stdio.h>":
+cdef extern from "<stdio.h>":
ctypedef struct FILE
FILE *stderr
int fputs(char *s, FILE *stream)
@@ -988,9 +988,9 @@ cdef class _memoryviewslice(memoryview):
else:
memoryview.assign_item_from_object(self, itemp, value)
- @property
- def base(self):
- return self.from_object
+ @property
+ def base(self):
+ return self.from_object
__pyx_getbuffer = capsule(<void *> &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)")
@@ -1032,16 +1032,16 @@ cdef memoryview_fromslice({{memviewslice_name}} memviewslice,
result.view.shape = <Py_ssize_t *> result.from_slice.shape
result.view.strides = <Py_ssize_t *> result.from_slice.strides
- # only set suboffsets if actually used, otherwise set to NULL to improve compatibility
- result.view.suboffsets = NULL
- for suboffset in result.from_slice.suboffsets[:ndim]:
- if suboffset >= 0:
- result.view.suboffsets = <Py_ssize_t *> result.from_slice.suboffsets
- break
-
+ # only set suboffsets if actually used, otherwise set to NULL to improve compatibility
+ result.view.suboffsets = NULL
+ for suboffset in result.from_slice.suboffsets[:ndim]:
+ if suboffset >= 0:
+ result.view.suboffsets = <Py_ssize_t *> result.from_slice.suboffsets
+ break
+
result.view.len = result.view.itemsize
- for length in result.view.shape[:ndim]:
- result.view.len *= length
+ for length in result.view.shape[:ndim]:
+ result.view.len *= length
result.to_object_func = to_object_func
result.to_dtype_func = to_dtype_func
@@ -1074,7 +1074,7 @@ cdef void slice_copy(memoryview memview, {{memviewslice_name}} *dst):
for dim in range(memview.view.ndim):
dst.shape[dim] = shape[dim]
dst.strides[dim] = strides[dim]
- dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1
+ dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1
@cname('__pyx_memoryview_copy_object')
cdef memoryview_copy(memoryview memview):
@@ -1238,7 +1238,7 @@ cdef void *copy_data_to_temp({{memviewslice_name}} *src,
if tmpslice.shape[i] == 1:
tmpslice.strides[i] = 0
- if slice_is_contig(src[0], order, ndim):
+ if slice_is_contig(src[0], order, ndim):
memcpy(result, src.data, size)
else:
copy_strided_to_strided(src, tmpslice, ndim, itemsize)
@@ -1301,7 +1301,7 @@ cdef int memoryview_copy_contents({{memviewslice_name}} src,
if slices_overlap(&src, &dst, ndim, itemsize):
# slices overlap, copy to temp, copy temp to dst
- if not slice_is_contig(src, order, ndim):
+ if not slice_is_contig(src, order, ndim):
order = get_best_order(&dst, ndim)
tmpdata = copy_data_to_temp(&src, &tmp, order, ndim)
@@ -1310,10 +1310,10 @@ cdef int memoryview_copy_contents({{memviewslice_name}} src,
if not broadcasting:
# See if both slices have equal contiguity, in that case perform a
# direct copy. This only works when we are not broadcasting.
- if slice_is_contig(src, 'C', ndim):
- direct_copy = slice_is_contig(dst, 'C', ndim)
- elif slice_is_contig(src, 'F', ndim):
- direct_copy = slice_is_contig(dst, 'F', ndim)
+ if slice_is_contig(src, 'C', ndim):
+ direct_copy = slice_is_contig(dst, 'C', ndim)
+ elif slice_is_contig(src, 'F', ndim):
+ direct_copy = slice_is_contig(dst, 'F', ndim)
if direct_copy:
# Contiguous slices with same order
@@ -1337,21 +1337,21 @@ cdef int memoryview_copy_contents({{memviewslice_name}} src,
return 0
@cname('__pyx_memoryview_broadcast_leading')
-cdef void broadcast_leading({{memviewslice_name}} *mslice,
+cdef void broadcast_leading({{memviewslice_name}} *mslice,
int ndim,
int ndim_other) nogil:
cdef int i
cdef int offset = ndim_other - ndim
for i in range(ndim - 1, -1, -1):
- mslice.shape[i + offset] = mslice.shape[i]
- mslice.strides[i + offset] = mslice.strides[i]
- mslice.suboffsets[i + offset] = mslice.suboffsets[i]
+ mslice.shape[i + offset] = mslice.shape[i]
+ mslice.strides[i + offset] = mslice.strides[i]
+ mslice.suboffsets[i + offset] = mslice.suboffsets[i]
for i in range(offset):
- mslice.shape[i] = 1
- mslice.strides[i] = mslice.strides[0]
- mslice.suboffsets[i] = -1
+ mslice.shape[i] = 1
+ mslice.strides[i] = mslice.strides[0]
+ mslice.suboffsets[i] = -1
#
### Take care of refcounting the objects in slices. Do this separately from any copying,
diff --git a/contrib/tools/cython/Cython/Utility/MemoryView_C.c b/contrib/tools/cython/Cython/Utility/MemoryView_C.c
index 0a5d8ee2c2..3c0e8a2f4b 100644
--- a/contrib/tools/cython/Cython/Utility/MemoryView_C.c
+++ b/contrib/tools/cython/Cython/Utility/MemoryView_C.c
@@ -38,16 +38,16 @@ typedef struct {
#ifdef __PYX_DEBUG_ATOMICS
#warning "Using GNU atomics"
#endif
-#elif CYTHON_ATOMICS && defined(_MSC_VER) && 0
+#elif CYTHON_ATOMICS && defined(_MSC_VER) && 0
/* msvc */
#include <Windows.h>
- #undef __pyx_atomic_int_type
+ #undef __pyx_atomic_int_type
#define __pyx_atomic_int_type LONG
#define __pyx_atomic_incr_aligned(value, lock) InterlockedIncrement(value)
#define __pyx_atomic_decr_aligned(value, lock) InterlockedDecrement(value)
#ifdef __PYX_DEBUG_ATOMICS
- #pragma message ("Using MSVC atomics")
+ #pragma message ("Using MSVC atomics")
#endif
#elif CYTHON_ATOMICS && (defined(__ICC) || defined(__INTEL_COMPILER)) && 0
#define __pyx_atomic_incr_aligned(value, lock) _InterlockedIncrement(value)
@@ -713,7 +713,7 @@ static int
__pyx_memviewslice_is_contig(const {{memviewslice_name}} mvs, char order, int ndim)
{
int i, index, step, start;
- Py_ssize_t itemsize = mvs.memview->view.itemsize;
+ Py_ssize_t itemsize = mvs.memview->view.itemsize;
if (order == 'F') {
step = 1;
@@ -725,10 +725,10 @@ __pyx_memviewslice_is_contig(const {{memviewslice_name}} mvs, char order, int nd
for (i = 0; i < ndim; i++) {
index = start + step * i;
- if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize)
+ if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize)
return 0;
- itemsize *= mvs.shape[index];
+ itemsize *= mvs.shape[index];
}
return 1;
@@ -752,11 +752,11 @@ __pyx_memviewslice_index_full(const char *bufp, Py_ssize_t idx,
/////////////// MemviewDtypeToObject.proto ///////////////
{{if to_py_function}}
-static CYTHON_INLINE PyObject *{{get_function}}(const char *itemp); /* proto */
+static CYTHON_INLINE PyObject *{{get_function}}(const char *itemp); /* proto */
{{endif}}
{{if from_py_function}}
-static CYTHON_INLINE int {{set_function}}(const char *itemp, PyObject *obj); /* proto */
+static CYTHON_INLINE int {{set_function}}(const char *itemp, PyObject *obj); /* proto */
{{endif}}
/////////////// MemviewDtypeToObject ///////////////
@@ -766,13 +766,13 @@ static CYTHON_INLINE int {{set_function}}(const char *itemp, PyObject *obj); /*
/* Convert a dtype to or from a Python object */
{{if to_py_function}}
-static CYTHON_INLINE PyObject *{{get_function}}(const char *itemp) {
+static CYTHON_INLINE PyObject *{{get_function}}(const char *itemp) {
return (PyObject *) {{to_py_function}}(*({{dtype}} *) itemp);
}
{{endif}}
{{if from_py_function}}
-static CYTHON_INLINE int {{set_function}}(const char *itemp, PyObject *obj) {
+static CYTHON_INLINE int {{set_function}}(const char *itemp, PyObject *obj) {
{{dtype}} value = {{from_py_function}}(obj);
if ({{error_condition}})
return 0;
@@ -813,7 +813,7 @@ if (unlikely(__pyx_memoryview_slice_memviewslice(
{{src}}.shape[{{dim}}], {{src}}.strides[{{dim}}], {{src}}.suboffsets[{{dim}}],
{{dim}},
{{new_ndim}},
- &{{get_suboffset_dim()}},
+ &{{get_suboffset_dim()}},
{{start}},
{{stop}},
{{step}},
@@ -838,7 +838,7 @@ if (unlikely(__pyx_memoryview_slice_memviewslice(
{{else}}
{{dst}}.suboffsets[{{new_ndim}}] = {{src}}.suboffsets[{{dim}}];
if ({{src}}.suboffsets[{{dim}}] >= 0)
- {{get_suboffset_dim()}} = {{new_ndim}};
+ {{get_suboffset_dim()}} = {{new_ndim}};
{{endif}}
@@ -849,42 +849,42 @@ if (unlikely(__pyx_memoryview_slice_memviewslice(
{
Py_ssize_t __pyx_tmp_idx = {{idx}};
-
- {{if wraparound or boundscheck}}
- Py_ssize_t __pyx_tmp_shape = {{src}}.shape[{{dim}}];
- {{endif}}
-
+
+ {{if wraparound or boundscheck}}
+ Py_ssize_t __pyx_tmp_shape = {{src}}.shape[{{dim}}];
+ {{endif}}
+
Py_ssize_t __pyx_tmp_stride = {{src}}.strides[{{dim}}];
- {{if wraparound}}
- if (__pyx_tmp_idx < 0)
- __pyx_tmp_idx += __pyx_tmp_shape;
- {{endif}}
+ {{if wraparound}}
+ if (__pyx_tmp_idx < 0)
+ __pyx_tmp_idx += __pyx_tmp_shape;
+ {{endif}}
- {{if boundscheck}}
+ {{if boundscheck}}
if (unlikely(!__Pyx_is_valid_index(__pyx_tmp_idx, __pyx_tmp_shape))) {
- {{if not have_gil}}
- #ifdef WITH_THREAD
- PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
- #endif
- {{endif}}
+ {{if not have_gil}}
+ #ifdef WITH_THREAD
+ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
+ #endif
+ {{endif}}
- PyErr_SetString(PyExc_IndexError,
- "Index out of bounds (axis {{dim}})");
+ PyErr_SetString(PyExc_IndexError,
+ "Index out of bounds (axis {{dim}})");
- {{if not have_gil}}
- #ifdef WITH_THREAD
- PyGILState_Release(__pyx_gilstate_save);
- #endif
- {{endif}}
+ {{if not have_gil}}
+ #ifdef WITH_THREAD
+ PyGILState_Release(__pyx_gilstate_save);
+ #endif
+ {{endif}}
- {{error_goto}}
- }
- {{endif}}
+ {{error_goto}}
+ }
+ {{endif}}
{{if all_dimensions_direct}}
{{dst}}.data += __pyx_tmp_idx * __pyx_tmp_stride;
{{else}}
- if ({{get_suboffset_dim()}} < 0) {
+ if ({{get_suboffset_dim()}} < 0) {
{{dst}}.data += __pyx_tmp_idx * __pyx_tmp_stride;
/* This dimension is the first dimension, or is preceded by */
@@ -906,7 +906,7 @@ if (unlikely(__pyx_memoryview_slice_memviewslice(
{{endif}}
} else {
- {{dst}}.suboffsets[{{get_suboffset_dim()}}] += __pyx_tmp_idx * __pyx_tmp_stride;
+ {{dst}}.suboffsets[{{get_suboffset_dim()}}] += __pyx_tmp_idx * __pyx_tmp_stride;
/* Note: dimension can not be indirect, the compiler will have */
/* issued an error */
diff --git a/contrib/tools/cython/Cython/Utility/ModuleSetupCode.c b/contrib/tools/cython/Cython/Utility/ModuleSetupCode.c
index 0c7059b354..787b87c525 100644
--- a/contrib/tools/cython/Cython/Utility/ModuleSetupCode.c
+++ b/contrib/tools/cython/Cython/Utility/ModuleSetupCode.c
@@ -1,9 +1,9 @@
/////////////// CModulePreamble ///////////////
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wshadow"
-#pragma GCC diagnostic ignored "-Wunused-function"
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
+#pragma GCC diagnostic ignored "-Wunused-function"
#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
// Ignore tp_print initializer. Need for ya make -DUSE_SYSTEM_PYTHON=3.8
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
@@ -12,7 +12,7 @@
#include <stddef.h> /* For offsetof */
#ifndef offsetof
- #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
+ #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
#endif
#if !defined(WIN32) && !defined(MS_WINDOWS)
@@ -37,13 +37,13 @@
// For use in DL_IMPORT/DL_EXPORT macros.
#define __PYX_COMMA ,
-#ifndef HAVE_LONG_LONG
- // CPython has required PY_LONG_LONG support for years, even if HAVE_LONG_LONG is not defined for us
+#ifndef HAVE_LONG_LONG
+ // CPython has required PY_LONG_LONG support for years, even if HAVE_LONG_LONG is not defined for us
#if PY_VERSION_HEX >= 0x02070000
- #define HAVE_LONG_LONG
- #endif
-#endif
-
+ #define HAVE_LONG_LONG
+ #endif
+#endif
+
#ifndef PY_LONG_LONG
#define PY_LONG_LONG LONG_LONG
#endif
@@ -53,12 +53,12 @@
#endif
#ifdef PYPY_VERSION
- #define CYTHON_COMPILING_IN_PYPY 1
- #define CYTHON_COMPILING_IN_PYSTON 0
- #define CYTHON_COMPILING_IN_CPYTHON 0
-
- #undef CYTHON_USE_TYPE_SLOTS
- #define CYTHON_USE_TYPE_SLOTS 0
+ #define CYTHON_COMPILING_IN_PYPY 1
+ #define CYTHON_COMPILING_IN_PYSTON 0
+ #define CYTHON_COMPILING_IN_CPYTHON 0
+
+ #undef CYTHON_USE_TYPE_SLOTS
+ #define CYTHON_USE_TYPE_SLOTS 0
#undef CYTHON_USE_PYTYPE_LOOKUP
#define CYTHON_USE_PYTYPE_LOOKUP 0
#if PY_VERSION_HEX < 0x03050000
@@ -67,84 +67,84 @@
#elif !defined(CYTHON_USE_ASYNC_SLOTS)
#define CYTHON_USE_ASYNC_SLOTS 1
#endif
- #undef CYTHON_USE_PYLIST_INTERNALS
- #define CYTHON_USE_PYLIST_INTERNALS 0
- #undef CYTHON_USE_UNICODE_INTERNALS
- #define CYTHON_USE_UNICODE_INTERNALS 0
- #undef CYTHON_USE_UNICODE_WRITER
- #define CYTHON_USE_UNICODE_WRITER 0
- #undef CYTHON_USE_PYLONG_INTERNALS
- #define CYTHON_USE_PYLONG_INTERNALS 0
- #undef CYTHON_AVOID_BORROWED_REFS
- #define CYTHON_AVOID_BORROWED_REFS 1
- #undef CYTHON_ASSUME_SAFE_MACROS
- #define CYTHON_ASSUME_SAFE_MACROS 0
- #undef CYTHON_UNPACK_METHODS
- #define CYTHON_UNPACK_METHODS 0
- #undef CYTHON_FAST_THREAD_STATE
- #define CYTHON_FAST_THREAD_STATE 0
- #undef CYTHON_FAST_PYCALL
- #define CYTHON_FAST_PYCALL 0
+ #undef CYTHON_USE_PYLIST_INTERNALS
+ #define CYTHON_USE_PYLIST_INTERNALS 0
+ #undef CYTHON_USE_UNICODE_INTERNALS
+ #define CYTHON_USE_UNICODE_INTERNALS 0
+ #undef CYTHON_USE_UNICODE_WRITER
+ #define CYTHON_USE_UNICODE_WRITER 0
+ #undef CYTHON_USE_PYLONG_INTERNALS
+ #define CYTHON_USE_PYLONG_INTERNALS 0
+ #undef CYTHON_AVOID_BORROWED_REFS
+ #define CYTHON_AVOID_BORROWED_REFS 1
+ #undef CYTHON_ASSUME_SAFE_MACROS
+ #define CYTHON_ASSUME_SAFE_MACROS 0
+ #undef CYTHON_UNPACK_METHODS
+ #define CYTHON_UNPACK_METHODS 0
+ #undef CYTHON_FAST_THREAD_STATE
+ #define CYTHON_FAST_THREAD_STATE 0
+ #undef CYTHON_FAST_PYCALL
+ #define CYTHON_FAST_PYCALL 0
#undef CYTHON_PEP489_MULTI_PHASE_INIT
#define CYTHON_PEP489_MULTI_PHASE_INIT 0
#undef CYTHON_USE_TP_FINALIZE
#define CYTHON_USE_TP_FINALIZE 0
- #undef CYTHON_USE_DICT_VERSIONS
- #define CYTHON_USE_DICT_VERSIONS 0
- #undef CYTHON_USE_EXC_INFO_STACK
- #define CYTHON_USE_EXC_INFO_STACK 0
-
-#elif defined(PYSTON_VERSION)
- #define CYTHON_COMPILING_IN_PYPY 0
- #define CYTHON_COMPILING_IN_PYSTON 1
- #define CYTHON_COMPILING_IN_CPYTHON 0
-
- #ifndef CYTHON_USE_TYPE_SLOTS
- #define CYTHON_USE_TYPE_SLOTS 1
- #endif
+ #undef CYTHON_USE_DICT_VERSIONS
+ #define CYTHON_USE_DICT_VERSIONS 0
+ #undef CYTHON_USE_EXC_INFO_STACK
+ #define CYTHON_USE_EXC_INFO_STACK 0
+
+#elif defined(PYSTON_VERSION)
+ #define CYTHON_COMPILING_IN_PYPY 0
+ #define CYTHON_COMPILING_IN_PYSTON 1
+ #define CYTHON_COMPILING_IN_CPYTHON 0
+
+ #ifndef CYTHON_USE_TYPE_SLOTS
+ #define CYTHON_USE_TYPE_SLOTS 1
+ #endif
#undef CYTHON_USE_PYTYPE_LOOKUP
#define CYTHON_USE_PYTYPE_LOOKUP 0
- #undef CYTHON_USE_ASYNC_SLOTS
- #define CYTHON_USE_ASYNC_SLOTS 0
- #undef CYTHON_USE_PYLIST_INTERNALS
- #define CYTHON_USE_PYLIST_INTERNALS 0
- #ifndef CYTHON_USE_UNICODE_INTERNALS
- #define CYTHON_USE_UNICODE_INTERNALS 1
- #endif
- #undef CYTHON_USE_UNICODE_WRITER
- #define CYTHON_USE_UNICODE_WRITER 0
- #undef CYTHON_USE_PYLONG_INTERNALS
- #define CYTHON_USE_PYLONG_INTERNALS 0
- #ifndef CYTHON_AVOID_BORROWED_REFS
- #define CYTHON_AVOID_BORROWED_REFS 0
- #endif
- #ifndef CYTHON_ASSUME_SAFE_MACROS
- #define CYTHON_ASSUME_SAFE_MACROS 1
- #endif
- #ifndef CYTHON_UNPACK_METHODS
- #define CYTHON_UNPACK_METHODS 1
- #endif
- #undef CYTHON_FAST_THREAD_STATE
- #define CYTHON_FAST_THREAD_STATE 0
- #undef CYTHON_FAST_PYCALL
- #define CYTHON_FAST_PYCALL 0
+ #undef CYTHON_USE_ASYNC_SLOTS
+ #define CYTHON_USE_ASYNC_SLOTS 0
+ #undef CYTHON_USE_PYLIST_INTERNALS
+ #define CYTHON_USE_PYLIST_INTERNALS 0
+ #ifndef CYTHON_USE_UNICODE_INTERNALS
+ #define CYTHON_USE_UNICODE_INTERNALS 1
+ #endif
+ #undef CYTHON_USE_UNICODE_WRITER
+ #define CYTHON_USE_UNICODE_WRITER 0
+ #undef CYTHON_USE_PYLONG_INTERNALS
+ #define CYTHON_USE_PYLONG_INTERNALS 0
+ #ifndef CYTHON_AVOID_BORROWED_REFS
+ #define CYTHON_AVOID_BORROWED_REFS 0
+ #endif
+ #ifndef CYTHON_ASSUME_SAFE_MACROS
+ #define CYTHON_ASSUME_SAFE_MACROS 1
+ #endif
+ #ifndef CYTHON_UNPACK_METHODS
+ #define CYTHON_UNPACK_METHODS 1
+ #endif
+ #undef CYTHON_FAST_THREAD_STATE
+ #define CYTHON_FAST_THREAD_STATE 0
+ #undef CYTHON_FAST_PYCALL
+ #define CYTHON_FAST_PYCALL 0
#undef CYTHON_PEP489_MULTI_PHASE_INIT
#define CYTHON_PEP489_MULTI_PHASE_INIT 0
#undef CYTHON_USE_TP_FINALIZE
#define CYTHON_USE_TP_FINALIZE 0
- #undef CYTHON_USE_DICT_VERSIONS
- #define CYTHON_USE_DICT_VERSIONS 0
- #undef CYTHON_USE_EXC_INFO_STACK
- #define CYTHON_USE_EXC_INFO_STACK 0
-
+ #undef CYTHON_USE_DICT_VERSIONS
+ #define CYTHON_USE_DICT_VERSIONS 0
+ #undef CYTHON_USE_EXC_INFO_STACK
+ #define CYTHON_USE_EXC_INFO_STACK 0
+
#else
- #define CYTHON_COMPILING_IN_PYPY 0
- #define CYTHON_COMPILING_IN_PYSTON 0
- #define CYTHON_COMPILING_IN_CPYTHON 1
-
- #ifndef CYTHON_USE_TYPE_SLOTS
- #define CYTHON_USE_TYPE_SLOTS 1
- #endif
+ #define CYTHON_COMPILING_IN_PYPY 0
+ #define CYTHON_COMPILING_IN_PYSTON 0
+ #define CYTHON_COMPILING_IN_CPYTHON 1
+
+ #ifndef CYTHON_USE_TYPE_SLOTS
+ #define CYTHON_USE_TYPE_SLOTS 1
+ #endif
#if PY_VERSION_HEX < 0x02070000
// looks like calling _PyType_Lookup() isn't safe in Py<=2.6/3.1
#undef CYTHON_USE_PYTYPE_LOOKUP
@@ -152,81 +152,81 @@
#elif !defined(CYTHON_USE_PYTYPE_LOOKUP)
#define CYTHON_USE_PYTYPE_LOOKUP 1
#endif
- #if PY_MAJOR_VERSION < 3
- #undef CYTHON_USE_ASYNC_SLOTS
- #define CYTHON_USE_ASYNC_SLOTS 0
- #elif !defined(CYTHON_USE_ASYNC_SLOTS)
- #define CYTHON_USE_ASYNC_SLOTS 1
- #endif
- #if PY_VERSION_HEX < 0x02070000
- #undef CYTHON_USE_PYLONG_INTERNALS
- #define CYTHON_USE_PYLONG_INTERNALS 0
- #elif !defined(CYTHON_USE_PYLONG_INTERNALS)
- #define CYTHON_USE_PYLONG_INTERNALS 1
- #endif
- #ifndef CYTHON_USE_PYLIST_INTERNALS
- #define CYTHON_USE_PYLIST_INTERNALS 1
- #endif
- #ifndef CYTHON_USE_UNICODE_INTERNALS
- #define CYTHON_USE_UNICODE_INTERNALS 1
- #endif
+ #if PY_MAJOR_VERSION < 3
+ #undef CYTHON_USE_ASYNC_SLOTS
+ #define CYTHON_USE_ASYNC_SLOTS 0
+ #elif !defined(CYTHON_USE_ASYNC_SLOTS)
+ #define CYTHON_USE_ASYNC_SLOTS 1
+ #endif
+ #if PY_VERSION_HEX < 0x02070000
+ #undef CYTHON_USE_PYLONG_INTERNALS
+ #define CYTHON_USE_PYLONG_INTERNALS 0
+ #elif !defined(CYTHON_USE_PYLONG_INTERNALS)
+ #define CYTHON_USE_PYLONG_INTERNALS 1
+ #endif
+ #ifndef CYTHON_USE_PYLIST_INTERNALS
+ #define CYTHON_USE_PYLIST_INTERNALS 1
+ #endif
+ #ifndef CYTHON_USE_UNICODE_INTERNALS
+ #define CYTHON_USE_UNICODE_INTERNALS 1
+ #endif
#if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2
// Python 3.11a2 hid _PyLong_FormatAdvancedWriter and _PyFloat_FormatAdvancedWriter
// therefore disable unicode writer until a better alternative appears
- #undef CYTHON_USE_UNICODE_WRITER
- #define CYTHON_USE_UNICODE_WRITER 0
- #elif !defined(CYTHON_USE_UNICODE_WRITER)
- #define CYTHON_USE_UNICODE_WRITER 1
- #endif
- #ifndef CYTHON_AVOID_BORROWED_REFS
- #define CYTHON_AVOID_BORROWED_REFS 0
- #endif
- #ifndef CYTHON_ASSUME_SAFE_MACROS
- #define CYTHON_ASSUME_SAFE_MACROS 1
- #endif
- #ifndef CYTHON_UNPACK_METHODS
- #define CYTHON_UNPACK_METHODS 1
- #endif
- #ifndef CYTHON_FAST_THREAD_STATE
- #define CYTHON_FAST_THREAD_STATE 1
- #endif
- #ifndef CYTHON_FAST_PYCALL
+ #undef CYTHON_USE_UNICODE_WRITER
+ #define CYTHON_USE_UNICODE_WRITER 0
+ #elif !defined(CYTHON_USE_UNICODE_WRITER)
+ #define CYTHON_USE_UNICODE_WRITER 1
+ #endif
+ #ifndef CYTHON_AVOID_BORROWED_REFS
+ #define CYTHON_AVOID_BORROWED_REFS 0
+ #endif
+ #ifndef CYTHON_ASSUME_SAFE_MACROS
+ #define CYTHON_ASSUME_SAFE_MACROS 1
+ #endif
+ #ifndef CYTHON_UNPACK_METHODS
+ #define CYTHON_UNPACK_METHODS 1
+ #endif
+ #ifndef CYTHON_FAST_THREAD_STATE
+ #define CYTHON_FAST_THREAD_STATE 1
+ #endif
+ #ifndef CYTHON_FAST_PYCALL
// Python 3.11 deleted localplus argument from frame object, which is used in our
// fast_pycall code
#define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030B00A1)
- #endif
+ #endif
#ifndef CYTHON_PEP489_MULTI_PHASE_INIT
- #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
+ #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
#endif
#ifndef CYTHON_USE_TP_FINALIZE
#define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1)
#endif
- #ifndef CYTHON_USE_DICT_VERSIONS
- #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1)
- #endif
- #ifndef CYTHON_USE_EXC_INFO_STACK
- #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3)
- #endif
-#endif
-
-#if !defined(CYTHON_FAST_PYCCALL)
-#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1)
-#endif
-
-#if CYTHON_USE_PYLONG_INTERNALS
+ #ifndef CYTHON_USE_DICT_VERSIONS
+ #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1)
+ #endif
+ #ifndef CYTHON_USE_EXC_INFO_STACK
+ #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3)
+ #endif
+#endif
+
+#if !defined(CYTHON_FAST_PYCCALL)
+#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1)
+#endif
+
+#if CYTHON_USE_PYLONG_INTERNALS
#if PY_MAJOR_VERSION < 3
#include "longintrepr.h"
#endif
- /* These short defines can easily conflict with other code */
- #undef SHIFT
- #undef BASE
- #undef MASK
- /* Compile-time sanity check that these are indeed equal. Github issue #2670. */
- #ifdef SIZEOF_VOID_P
- enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
- #endif
-#endif
-
+ /* These short defines can easily conflict with other code */
+ #undef SHIFT
+ #undef BASE
+ #undef MASK
+ /* Compile-time sanity check that these are indeed equal. Github issue #2670. */
+ #ifdef SIZEOF_VOID_P
+ enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
+ #endif
+#endif
+
#ifndef __has_attribute
#define __has_attribute(x) 0
#endif
@@ -383,8 +383,8 @@ class __Pyx_FakeReference {
/////////////// PythonCompatibility ///////////////
-#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
- #define Py_OptimizeFlag 0
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
+ #define Py_OptimizeFlag 0
#endif
#define __PYX_BUILD_PY_SSIZE_T "n"
@@ -468,31 +468,31 @@ class __Pyx_FakeReference {
}
return co;
}
-#else
- #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+#else
+ #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
-#endif
+#endif
#define __Pyx_DefaultClassType PyType_Type
#endif
-#ifndef Py_TPFLAGS_CHECKTYPES
+#ifndef Py_TPFLAGS_CHECKTYPES
#define Py_TPFLAGS_CHECKTYPES 0
-#endif
-#ifndef Py_TPFLAGS_HAVE_INDEX
+#endif
+#ifndef Py_TPFLAGS_HAVE_INDEX
#define Py_TPFLAGS_HAVE_INDEX 0
#endif
-#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
+#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
#define Py_TPFLAGS_HAVE_NEWBUFFER 0
#endif
-#ifndef Py_TPFLAGS_HAVE_FINALIZE
+#ifndef Py_TPFLAGS_HAVE_FINALIZE
#define Py_TPFLAGS_HAVE_FINALIZE 0
#endif
-#ifndef METH_STACKLESS
- // already defined for Stackless Python (all versions) and C-Python >= 3.7
- // value if defined: Stackless Python < 3.6: 0x80 else 0x100
- #define METH_STACKLESS 0
-#endif
+#ifndef METH_STACKLESS
+ // already defined for Stackless Python (all versions) and C-Python >= 3.7
+ // value if defined: Stackless Python < 3.6: 0x80 else 0x100
+ #define METH_STACKLESS 0
+#endif
#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL)
// new in CPython 3.6, but changed in 3.7 - see
// positional-only parameters:
@@ -506,29 +506,29 @@ class __Pyx_FakeReference {
// new in CPython 3.7, used to be old signature of _PyCFunctionFast() in 3.6
typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args,
Py_ssize_t nargs, PyObject *kwnames);
-#else
- #define __Pyx_PyCFunctionFast _PyCFunctionFast
+#else
+ #define __Pyx_PyCFunctionFast _PyCFunctionFast
#define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords
-#endif
-#if CYTHON_FAST_PYCCALL
-#define __Pyx_PyFastCFunction_Check(func) \
- ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)))))
-#else
-#define __Pyx_PyFastCFunction_Check(func) 0
-#endif
-
+#endif
+#if CYTHON_FAST_PYCCALL
+#define __Pyx_PyFastCFunction_Check(func) \
+ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)))))
+#else
+#define __Pyx_PyFastCFunction_Check(func) 0
+#endif
+
#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc)
#define PyObject_Malloc(s) PyMem_Malloc(s)
#define PyObject_Free(p) PyMem_Free(p)
#define PyObject_Realloc(p) PyMem_Realloc(p)
#endif
-#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1
- #define PyMem_RawMalloc(n) PyMem_Malloc(n)
- #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n)
- #define PyMem_RawFree(p) PyMem_Free(p)
-#endif
-
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1
+ #define PyMem_RawMalloc(n) PyMem_Malloc(n)
+ #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n)
+ #define PyMem_RawFree(p) PyMem_Free(p)
+#endif
+
#if CYTHON_COMPILING_IN_PYSTON
// special C-API functions only in Pyston
#define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co)
@@ -557,7 +557,7 @@ class __Pyx_FakeReference {
typedef int Py_tss_t;
static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) {
*key = PyThread_create_key();
- return 0; /* PyThread_create_key reports success always */
+ return 0; /* PyThread_create_key reports success always */
}
static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) {
Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t));
@@ -582,7 +582,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
}
// PyThread_delete_key_value(key) is equalivalent to PyThread_set_key_value(key, NULL)
// PyThread_ReInitTLS() is a no-op
-#endif /* TSS (Thread Specific Storage) API */
+#endif /* TSS (Thread Specific Storage) API */
#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized)
#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n))
@@ -618,37 +618,37 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
#define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u)
#define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
- #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u)
+ #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u)
#define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u)
#define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u)
#define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i)
- #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch)
+ #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch)
#if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE)
#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000
// Avoid calling deprecated C-API functions in Py3.9+ that PEP-623 schedules for removal in Py3.12.
// https://www.python.org/dev/peps/pep-0623/
#define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length))
#else
- #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u)))
+ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u)))
#endif
#else
#define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u))
#endif
#else
#define CYTHON_PEP393_ENABLED 0
- #define PyUnicode_1BYTE_KIND 1
- #define PyUnicode_2BYTE_KIND 2
- #define PyUnicode_4BYTE_KIND 4
+ #define PyUnicode_1BYTE_KIND 1
+ #define PyUnicode_2BYTE_KIND 2
+ #define PyUnicode_4BYTE_KIND 4
#define __Pyx_PyUnicode_READY(op) (0)
#define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u)
#define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
- #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111)
+ #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111)
#define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE))
#define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u))
/* (void)(k) => avoid unused variable warning due to macro: */
#define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
- #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch)
- #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u))
+ #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch)
+ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u))
#endif
#if CYTHON_COMPILING_IN_PYPY
@@ -660,21 +660,21 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
#endif
-#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
- #define PyUnicode_Contains(u, s) PySequence_Contains(u, s)
-#endif
-
-#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check)
- #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type)
-#endif
-
-#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format)
- #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt)
-#endif
-
-// ("..." % x) must call PyNumber_Remainder() if x is a string subclass that implements "__rmod__()".
-#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
-#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
+ #define PyUnicode_Contains(u, s) PySequence_Contains(u, s)
+#endif
+
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check)
+ #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type)
+#endif
+
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format)
+ #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt)
+#endif
+
+// ("..." % x) must call PyNumber_Remainder() if x is a string subclass that implements "__rmod__()".
+#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
+#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
#if PY_MAJOR_VERSION >= 3
#define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b)
@@ -682,10 +682,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
#define __Pyx_PyString_Format(a, b) PyString_Format(a, b)
#endif
-#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII)
- #define PyObject_ASCII(o) PyObject_Repr(o)
-#endif
-
+#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII)
+ #define PyObject_ASCII(o) PyObject_Repr(o)
+#endif
+
#if PY_MAJOR_VERSION >= 3
#define PyBaseString_Type PyUnicode_Type
#define PyStringObject PyUnicodeObject
@@ -694,7 +694,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
#define PyString_CheckExact PyUnicode_CheckExact
// PyPy3 used to define "PyObject_Unicode"
#ifndef PyObject_Unicode
- #define PyObject_Unicode PyObject_Str
+ #define PyObject_Unicode PyObject_Str
#endif
#endif
@@ -748,12 +748,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
#define PyBoolObject PyLongObject
#endif
-#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
- #ifndef PyUnicode_InternFromString
- #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
- #endif
-#endif
-
+#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
+ #ifndef PyUnicode_InternFromString
+ #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
+ #endif
+#endif
+
#if PY_VERSION_HEX < 0x030200A4
typedef long Py_hash_t;
#define __Pyx_PyInt_FromHash_t PyInt_FromLong
@@ -765,57 +765,57 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
#if PY_MAJOR_VERSION >= 3
#define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
-#else
- #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
+#else
+ #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
#endif
-// backport of PyAsyncMethods from Py3.5 to older Py3.x versions
-// (mis-)using the "tp_reserved" type slot which is re-activated as "tp_as_async" in Py3.5
-#if CYTHON_USE_ASYNC_SLOTS
- #if PY_VERSION_HEX >= 0x030500B1
- #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
- #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
- #else
+// backport of PyAsyncMethods from Py3.5 to older Py3.x versions
+// (mis-)using the "tp_reserved" type slot which is re-activated as "tp_as_async" in Py3.5
+#if CYTHON_USE_ASYNC_SLOTS
+ #if PY_VERSION_HEX >= 0x030500B1
+ #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
+ #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
+ #else
#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
#endif
#else
#define __Pyx_PyType_AsAsync(obj) NULL
#endif
#ifndef __Pyx_PyAsyncMethodsStruct
- typedef struct {
- unaryfunc am_await;
- unaryfunc am_aiter;
- unaryfunc am_anext;
- } __Pyx_PyAsyncMethodsStruct;
-#endif
-
-
-/////////////// SmallCodeConfig.proto ///////////////
-
-#ifndef CYTHON_SMALL_CODE
-#if defined(__clang__)
- #define CYTHON_SMALL_CODE
-#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
- #define CYTHON_SMALL_CODE __attribute__((cold))
-#else
- #define CYTHON_SMALL_CODE
-#endif
-#endif
-
-
+ typedef struct {
+ unaryfunc am_await;
+ unaryfunc am_aiter;
+ unaryfunc am_anext;
+ } __Pyx_PyAsyncMethodsStruct;
+#endif
+
+
+/////////////// SmallCodeConfig.proto ///////////////
+
+#ifndef CYTHON_SMALL_CODE
+#if defined(__clang__)
+ #define CYTHON_SMALL_CODE
+#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+ #define CYTHON_SMALL_CODE __attribute__((cold))
+#else
+ #define CYTHON_SMALL_CODE
+#endif
+#endif
+
+
/////////////// PyModInitFuncType.proto ///////////////
-
+
#ifndef CYTHON_NO_PYINIT_EXPORT
#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC
-
+
#elif PY_MAJOR_VERSION < 3
// Py2: define this to void manually because PyMODINIT_FUNC adds __declspec(dllexport) to it's definition.
#ifdef __cplusplus
#define __Pyx_PyMODINIT_FUNC extern "C" void
#else
#define __Pyx_PyMODINIT_FUNC void
-#endif
-
+#endif
+
#else
// Py3+: define this to PyObject * manually because PyMODINIT_FUNC adds __declspec(dllexport) to it's definition.
#ifdef __cplusplus
@@ -825,7 +825,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
#endif
#endif
-
+
/////////////// FastTypeChecks.proto ///////////////
#if CYTHON_COMPILING_IN_CPYTHON
@@ -913,48 +913,48 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err,
// so far, we only call PyErr_GivenExceptionMatches() with an exception type (not instance) as first argument
// => optimise for that case
-static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
- Py_ssize_t i, n;
- assert(PyExceptionClass_Check(exc_type));
- n = PyTuple_GET_SIZE(tuple);
-#if PY_MAJOR_VERSION >= 3
- // the tighter subtype checking in Py3 allows faster out-of-order comparison
- for (i=0; i<n; i++) {
- if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
- }
-#endif
- for (i=0; i<n; i++) {
- PyObject *t = PyTuple_GET_ITEM(tuple, i);
- #if PY_MAJOR_VERSION < 3
- if (likely(exc_type == t)) return 1;
- #endif
- if (likely(PyExceptionClass_Check(t))) {
- if (__Pyx_inner_PyErr_GivenExceptionMatches2(exc_type, NULL, t)) return 1;
- } else {
- // FIXME: Py3: PyErr_SetString(PyExc_TypeError, "catching classes that do not inherit from BaseException is not allowed");
- }
- }
- return 0;
-}
-
+static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
+ Py_ssize_t i, n;
+ assert(PyExceptionClass_Check(exc_type));
+ n = PyTuple_GET_SIZE(tuple);
+#if PY_MAJOR_VERSION >= 3
+ // the tighter subtype checking in Py3 allows faster out-of-order comparison
+ for (i=0; i<n; i++) {
+ if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
+ }
+#endif
+ for (i=0; i<n; i++) {
+ PyObject *t = PyTuple_GET_ITEM(tuple, i);
+ #if PY_MAJOR_VERSION < 3
+ if (likely(exc_type == t)) return 1;
+ #endif
+ if (likely(PyExceptionClass_Check(t))) {
+ if (__Pyx_inner_PyErr_GivenExceptionMatches2(exc_type, NULL, t)) return 1;
+ } else {
+ // FIXME: Py3: PyErr_SetString(PyExc_TypeError, "catching classes that do not inherit from BaseException is not allowed");
+ }
+ }
+ return 0;
+}
+
static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject* exc_type) {
if (likely(err == exc_type)) return 1;
if (likely(PyExceptionClass_Check(err))) {
- if (likely(PyExceptionClass_Check(exc_type))) {
- return __Pyx_inner_PyErr_GivenExceptionMatches2(err, NULL, exc_type);
- } else if (likely(PyTuple_Check(exc_type))) {
- return __Pyx_PyErr_GivenExceptionMatchesTuple(err, exc_type);
- } else {
- // FIXME: Py3: PyErr_SetString(PyExc_TypeError, "catching classes that do not inherit from BaseException is not allowed");
- }
+ if (likely(PyExceptionClass_Check(exc_type))) {
+ return __Pyx_inner_PyErr_GivenExceptionMatches2(err, NULL, exc_type);
+ } else if (likely(PyTuple_Check(exc_type))) {
+ return __Pyx_PyErr_GivenExceptionMatchesTuple(err, exc_type);
+ } else {
+ // FIXME: Py3: PyErr_SetString(PyExc_TypeError, "catching classes that do not inherit from BaseException is not allowed");
+ }
}
return PyErr_GivenExceptionMatches(err, exc_type);
}
static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *exc_type1, PyObject *exc_type2) {
- // Only used internally with known exception types => pure safety check assertions.
- assert(PyExceptionClass_Check(exc_type1));
- assert(PyExceptionClass_Check(exc_type2));
+ // Only used internally with known exception types => pure safety check assertions.
+ assert(PyExceptionClass_Check(exc_type1));
+ assert(PyExceptionClass_Check(exc_type2));
if (likely(err == exc_type1 || err == exc_type2)) return 1;
if (likely(PyExceptionClass_Check(err))) {
return __Pyx_inner_PyErr_GivenExceptionMatches2(err, exc_type1, exc_type2);
@@ -965,36 +965,36 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj
#endif
-/////////////// MathInitCode ///////////////
-
-#if defined(WIN32) || defined(MS_WINDOWS)
- #define _USE_MATH_DEFINES
-#endif
-#include <math.h>
-
+/////////////// MathInitCode ///////////////
+
+#if defined(WIN32) || defined(MS_WINDOWS)
+ #define _USE_MATH_DEFINES
+#endif
+#include <math.h>
+
#ifdef NAN
#define __PYX_NAN() ((float) NAN)
#else
static CYTHON_INLINE float __PYX_NAN() {
- // Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and
- // a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is
- // a quiet NaN.
+ // Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and
+ // a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is
+ // a quiet NaN.
float value;
memset(&value, 0xFF, sizeof(value));
return value;
}
#endif
-#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL)
-#define __Pyx_truncl trunc
-#else
-#define __Pyx_truncl truncl
-#endif
-
+#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL)
+#define __Pyx_truncl trunc
+#else
+#define __Pyx_truncl truncl
+#endif
+
/////////////// UtilityFunctionPredeclarations.proto ///////////////
-typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding;
+typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding;
const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
/////////////// ForceInitThreads.proto ///////////////
@@ -1015,39 +1015,39 @@ PyEval_InitThreads();
//@substitute: naming
//#if CYTHON_PEP489_MULTI_PHASE_INIT
-static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
- #if PY_VERSION_HEX >= 0x030700A1
- static PY_INT64_T main_interpreter_id = -1;
- PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp);
- if (main_interpreter_id == -1) {
- main_interpreter_id = current_id;
- return (unlikely(current_id == -1)) ? -1 : 0;
- } else if (unlikely(main_interpreter_id != current_id))
-
- #else
- static PyInterpreterState *main_interpreter = NULL;
- PyInterpreterState *current_interpreter = PyThreadState_Get()->interp;
- if (!main_interpreter) {
- main_interpreter = current_interpreter;
- } else if (unlikely(main_interpreter != current_interpreter))
- #endif
-
- {
- PyErr_SetString(
- PyExc_ImportError,
- "Interpreter change detected - this module can only be loaded into one interpreter per process.");
- return -1;
- }
- return 0;
-}
-
-static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) {
+static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
+ #if PY_VERSION_HEX >= 0x030700A1
+ static PY_INT64_T main_interpreter_id = -1;
+ PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp);
+ if (main_interpreter_id == -1) {
+ main_interpreter_id = current_id;
+ return (unlikely(current_id == -1)) ? -1 : 0;
+ } else if (unlikely(main_interpreter_id != current_id))
+
+ #else
+ static PyInterpreterState *main_interpreter = NULL;
+ PyInterpreterState *current_interpreter = PyThreadState_Get()->interp;
+ if (!main_interpreter) {
+ main_interpreter = current_interpreter;
+ } else if (unlikely(main_interpreter != current_interpreter))
+ #endif
+
+ {
+ PyErr_SetString(
+ PyExc_ImportError,
+ "Interpreter change detected - this module can only be loaded into one interpreter per process.");
+ return -1;
+ }
+ return 0;
+}
+
+static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) {
PyObject *value = PyObject_GetAttrString(spec, from_name);
int result = 0;
if (likely(value)) {
- if (allow_none || value != Py_None) {
- result = PyDict_SetItemString(moddict, to_name, value);
- }
+ if (allow_none || value != Py_None) {
+ result = PyDict_SetItemString(moddict, to_name, value);
+ }
Py_DECREF(value);
} else if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
PyErr_Clear();
@@ -1057,12 +1057,12 @@ static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject
return result;
}
-static CYTHON_SMALL_CODE PyObject* ${pymodule_create_func_cname}(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) {
+static CYTHON_SMALL_CODE PyObject* ${pymodule_create_func_cname}(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) {
PyObject *module = NULL, *moddict, *modname;
// For now, we only have exactly one module instance.
- if (__Pyx_check_single_interpreter())
- return NULL;
+ if (__Pyx_check_single_interpreter())
+ return NULL;
if (${module_cname})
return __Pyx_NewRef(${module_cname});
@@ -1077,10 +1077,10 @@ static CYTHON_SMALL_CODE PyObject* ${pymodule_create_func_cname}(PyObject *spec,
if (unlikely(!moddict)) goto bad;
// moddict is a borrowed reference
- if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad;
- if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad;
- if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad;
- if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad;
+ if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad;
+ if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad;
+ if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad;
+ if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad;
return module;
bad:
@@ -1093,7 +1093,7 @@ bad:
/////////////// CodeObjectCache.proto ///////////////
typedef struct {
- PyCodeObject* code_object;
+ PyCodeObject* code_object;
int code_line;
} __Pyx_CodeObjectCacheEntry;
@@ -1119,7 +1119,7 @@ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int co
return count;
}
while (start < end) {
- mid = start + (end - start) / 2;
+ mid = start + (end - start) / 2;
if (code_line < entries[mid].code_line) {
end = mid;
} else if (code_line > entries[mid].code_line) {
@@ -1318,9 +1318,9 @@ static CYTHON_INLINE int __Pyx_Is_Little_Endian(void)
static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
PyObject *m = NULL, *p = NULL;
void *r = NULL;
- m = PyImport_ImportModule(modname);
+ m = PyImport_ImportModule(modname);
if (!m) goto end;
- p = PyObject_GetAttrString(m, "RefNannyAPI");
+ p = PyObject_GetAttrString(m, "RefNannyAPI");
if (!p) goto end;
r = PyLong_AsVoidPtr(p);
end:
@@ -1348,12 +1348,12 @@ if (!__Pyx_RefNanny) {
//@substitute: naming
static void ${cleanup_cname}(PyObject *self); /*proto*/
-
-#if PY_MAJOR_VERSION < 3 || CYTHON_COMPILING_IN_PYPY
+
+#if PY_MAJOR_VERSION < 3 || CYTHON_COMPILING_IN_PYPY
static int __Pyx_RegisterCleanup(void); /*proto*/
-#else
-#define __Pyx_RegisterCleanup() (0)
-#endif
+#else
+#define __Pyx_RegisterCleanup() (0)
+#endif
/////////////// RegisterModuleCleanup ///////////////
//@substitute: naming
@@ -1386,7 +1386,7 @@ static int __Pyx_RegisterCleanup(void) {
if (!cleanup_func)
goto bad;
- atexit = PyImport_ImportModule("atexit");
+ atexit = PyImport_ImportModule("atexit");
if (!atexit)
goto bad;
reg = PyObject_GetAttrString(atexit, "_exithandlers");
@@ -1528,9 +1528,9 @@ static CYTHON_INLINE PyThreadState *__Pyx_FastGil_get_tcur(void) {
static PyGILState_STATE __Pyx_FastGil_PyGILState_Ensure(void) {
int current;
- PyThreadState *tcur;
+ PyThreadState *tcur;
__Pyx_FastGIL_Remember0();
- tcur = __Pyx_FastGil_get_tcur();
+ tcur = __Pyx_FastGil_get_tcur();
if (tcur == NULL) {
// Uninitialized, need to initialize now.
return PyGILState_Ensure();
diff --git a/contrib/tools/cython/Cython/Utility/ObjectHandling.c b/contrib/tools/cython/Cython/Utility/ObjectHandling.c
index c1b1c60bda..e362b7b7c3 100644
--- a/contrib/tools/cython/Cython/Utility/ObjectHandling.c
+++ b/contrib/tools/cython/Cython/Utility/ObjectHandling.c
@@ -195,7 +195,7 @@ static CYTHON_INLINE PyObject *__Pyx_PyIter_Next2(PyObject* iterator, PyObject*
// We always do a quick slot check because calling PyIter_Check() is so wasteful.
iternextfunc iternext = Py_TYPE(iterator)->tp_iternext;
if (likely(iternext)) {
-#if CYTHON_USE_TYPE_SLOTS
+#if CYTHON_USE_TYPE_SLOTS
next = iternext(iterator);
if (likely(next))
return next;
@@ -238,7 +238,7 @@ static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/
// detects an error that occurred in the iterator, it returns -1.
static CYTHON_INLINE int __Pyx_IterFinish(void) {
-#if CYTHON_FAST_THREAD_STATE
+#if CYTHON_FAST_THREAD_STATE
PyThreadState *tstate = __Pyx_PyThreadState_Current;
PyObject* exc_type = tstate->curexc_type;
if (unlikely(exc_type)) {
@@ -318,7 +318,7 @@ static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) {
/////////////// DictGetItem.proto ///////////////
-#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
+#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key);/*proto*/
#define __Pyx_PyObject_Dict_GetItem(obj, name) \
@@ -338,17 +338,17 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
value = PyDict_GetItemWithError(d, key);
if (unlikely(!value)) {
if (!PyErr_Occurred()) {
- if (unlikely(PyTuple_Check(key))) {
- // CPython interprets tuples as separate arguments => must wrap them in another tuple.
- PyObject* args = PyTuple_Pack(1, key);
- if (likely(args)) {
- PyErr_SetObject(PyExc_KeyError, args);
- Py_DECREF(args);
- }
- } else {
- // Avoid tuple packing if possible.
- PyErr_SetObject(PyExc_KeyError, key);
- }
+ if (unlikely(PyTuple_Check(key))) {
+ // CPython interprets tuples as separate arguments => must wrap them in another tuple.
+ PyObject* args = PyTuple_Pack(1, key);
+ if (likely(args)) {
+ PyErr_SetObject(PyExc_KeyError, args);
+ Py_DECREF(args);
+ }
+ } else {
+ // Avoid tuple packing if possible.
+ PyErr_SetObject(PyExc_KeyError, key);
+ }
}
return NULL;
}
@@ -391,14 +391,14 @@ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
{{for type in ['List', 'Tuple']}}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_{{type}}_Fast(PyObject *o, Py_ssize_t i,
- CYTHON_NCP_UNUSED int wraparound,
- CYTHON_NCP_UNUSED int boundscheck) {
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ CYTHON_NCP_UNUSED int wraparound,
+ CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
Py_ssize_t wrapped_i = i;
if (wraparound & unlikely(i < 0)) {
wrapped_i += Py{{type}}_GET_SIZE(o);
}
- if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, Py{{type}}_GET_SIZE(o)))) {
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, Py{{type}}_GET_SIZE(o)))) {
PyObject *r = Py{{type}}_GET_ITEM(o, wrapped_i);
Py_INCREF(r);
return r;
@@ -410,13 +410,13 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_{{type}}_Fast(PyObject *o, Py_ss
}
{{endfor}}
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list,
- CYTHON_NCP_UNUSED int wraparound,
- CYTHON_NCP_UNUSED int boundscheck) {
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list,
+ CYTHON_NCP_UNUSED int wraparound,
+ CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS
if (is_list || PyList_CheckExact(o)) {
Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
- if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) {
+ if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) {
PyObject *r = PyList_GET_ITEM(o, n);
Py_INCREF(r);
return r;
@@ -424,7 +424,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
}
else if (PyTuple_CheckExact(o)) {
Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
- if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) {
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) {
PyObject *r = PyTuple_GET_ITEM(o, n);
Py_INCREF(r);
return r;
@@ -439,9 +439,9 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
i += l;
} else {
// if length > max(Py_ssize_t), maybe the object can wrap around itself?
- if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
return NULL;
- PyErr_Clear();
+ PyErr_Clear();
}
}
return m->sq_item(o, i);
@@ -477,12 +477,12 @@ static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
return r;
}
-static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list,
- CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) {
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list,
+ CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS
if (is_list || PyList_CheckExact(o)) {
Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o));
- if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o)))) {
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o)))) {
PyObject* old = PyList_GET_ITEM(o, n);
Py_INCREF(v);
PyList_SET_ITEM(o, n, v);
@@ -499,9 +499,9 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObje
i += l;
} else {
// if length > max(Py_ssize_t), maybe the object can wrap around itself?
- if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
return -1;
- PyErr_Clear();
+ PyErr_Clear();
}
}
return m->sq_ass_item(o, i, v);
@@ -509,11 +509,11 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObje
}
#else
#if CYTHON_COMPILING_IN_PYPY
- if (is_list || (PySequence_Check(o) && !PyDict_Check(o)))
+ if (is_list || (PySequence_Check(o) && !PyDict_Check(o)))
#else
- if (is_list || PySequence_Check(o))
+ if (is_list || PySequence_Check(o))
#endif
- {
+ {
return PySequence_SetItem(o, i, v);
}
#endif
@@ -531,7 +531,7 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObje
static int __Pyx_DelItem_Generic(PyObject *o, PyObject *j);
static CYTHON_INLINE int __Pyx_DelItemInt_Fast(PyObject *o, Py_ssize_t i,
- int is_list, int wraparound);
+ int is_list, int wraparound);
/////////////// DelItemInt ///////////////
@@ -544,8 +544,8 @@ static int __Pyx_DelItem_Generic(PyObject *o, PyObject *j) {
}
static CYTHON_INLINE int __Pyx_DelItemInt_Fast(PyObject *o, Py_ssize_t i,
- CYTHON_UNUSED int is_list, CYTHON_NCP_UNUSED int wraparound) {
-#if !CYTHON_USE_TYPE_SLOTS
+ CYTHON_UNUSED int is_list, CYTHON_NCP_UNUSED int wraparound) {
+#if !CYTHON_USE_TYPE_SLOTS
if (is_list || PySequence_Check(o)) {
return PySequence_DelItem(o, i);
}
@@ -559,9 +559,9 @@ static CYTHON_INLINE int __Pyx_DelItemInt_Fast(PyObject *o, Py_ssize_t i,
i += l;
} else {
// if length > max(Py_ssize_t), maybe the object can wrap around itself?
- if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
return -1;
- PyErr_Clear();
+ PyErr_Clear();
}
}
return m->sq_ass_item(o, i, (PyObject *)NULL);
@@ -593,14 +593,14 @@ static CYTHON_INLINE int __Pyx_PyObject_SetSlice(
/////////////// SliceObject ///////////////
{{if access == 'Get'}}
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj,
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj,
{{else}}
-static CYTHON_INLINE int __Pyx_PyObject_SetSlice(PyObject* obj, PyObject* value,
+static CYTHON_INLINE int __Pyx_PyObject_SetSlice(PyObject* obj, PyObject* value,
{{endif}}
- Py_ssize_t cstart, Py_ssize_t cstop,
+ Py_ssize_t cstart, Py_ssize_t cstop,
PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
-#if CYTHON_USE_TYPE_SLOTS
+#if CYTHON_USE_TYPE_SLOTS
PyMappingMethods* mp;
#if PY_MAJOR_VERSION < 3
PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
@@ -632,9 +632,9 @@ static CYTHON_INLINE int __Pyx_PyObject_SetSlice(PyObject* obj, PyObject* value,
}
} else {
// if length > max(Py_ssize_t), maybe the object can wrap around itself?
- if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
goto bad;
- PyErr_Clear();
+ PyErr_Clear();
}
}
{{if access == 'Get'}}
@@ -686,7 +686,7 @@ static CYTHON_INLINE int __Pyx_PyObject_SetSlice(PyObject* obj, PyObject* value,
Py_XDECREF(owned_stop);
if (unlikely(!py_slice)) goto bad;
}
-#if CYTHON_USE_TYPE_SLOTS
+#if CYTHON_USE_TYPE_SLOTS
{{if access == 'Get'}}
result = mp->mp_subscript(obj, py_slice);
#else
@@ -836,11 +836,11 @@ static PyObject *__Pyx_FindInheritedMetaclass(PyObject *bases) {
PyObject *metaclass;
if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
PyTypeObject *metatype;
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
PyObject *base = PyTuple_GET_ITEM(bases, 0);
-#else
- PyObject *base = PySequence_ITEM(bases, 0);
-#endif
+#else
+ PyObject *base = PySequence_ITEM(bases, 0);
+#endif
#if PY_MAJOR_VERSION < 3
PyObject* basetype = __Pyx_PyObject_GetAttrStr(base, PYIDENT("__class__"));
if (basetype) {
@@ -855,9 +855,9 @@ static PyObject *__Pyx_FindInheritedMetaclass(PyObject *bases) {
metatype = Py_TYPE(base);
#endif
metaclass = __Pyx_CalculateMetaclass(metatype, bases);
-#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
- Py_DECREF(base);
-#endif
+#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
+ Py_DECREF(base);
+#endif
#if PY_MAJOR_VERSION < 3
Py_DECREF(basetype);
#endif
@@ -1039,7 +1039,7 @@ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
/////////////// CallableCheck.proto ///////////////
-#if CYTHON_USE_TYPE_SLOTS && PY_MAJOR_VERSION >= 3
+#if CYTHON_USE_TYPE_SLOTS && PY_MAJOR_VERSION >= 3
#define __Pyx_PyCallable_Check(obj) (Py_TYPE(obj)->tp_call != NULL)
#else
#define __Pyx_PyCallable_Check(obj) PyCallable_Check(obj)
@@ -1047,7 +1047,7 @@ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
/////////////// PyDictContains.proto ///////////////
-static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) {
+static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) {
int result = PyDict_Contains(dict, item);
return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
}
@@ -1085,7 +1085,7 @@ static CYTHON_INLINE int __Pyx_PySet_ContainsTF(PyObject* key, PyObject* set, in
/////////////// PySequenceContains.proto ///////////////
-static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) {
+static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) {
int result = PySequence_Contains(seq, item);
return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
}
@@ -1119,8 +1119,8 @@ static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
/////////////// GetNameInClass.proto ///////////////
-#define __Pyx_GetNameInClass(var, nmspace, name) (var) = __Pyx__GetNameInClass(nmspace, name)
-static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name); /*proto*/
+#define __Pyx_GetNameInClass(var, nmspace, name) (var) = __Pyx__GetNameInClass(nmspace, name)
+static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name); /*proto*/
/////////////// GetNameInClass ///////////////
//@requires: PyObjectGetAttrStr
@@ -1130,17 +1130,17 @@ static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name); /*pro
//@requires: Exceptions.c::PyErrExceptionMatches
static PyObject *__Pyx_GetGlobalNameAfterAttributeLookup(PyObject *name) {
- PyObject *result;
+ PyObject *result;
__Pyx_PyThreadState_declare
__Pyx_PyThreadState_assign
if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError)))
return NULL;
__Pyx_PyErr_Clear();
- __Pyx_GetModuleGlobalNameUncached(result, name);
- return result;
+ __Pyx_GetModuleGlobalNameUncached(result, name);
+ return result;
}
-static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name) {
+static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name) {
PyObject *result;
result = __Pyx_PyObject_GetAttrStr(nmspace, name);
if (!result) {
@@ -1165,67 +1165,67 @@ static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name) {
/////////////// GetModuleGlobalName.proto ///////////////
-//@requires: PyDictVersioning
-//@substitute: naming
-
-#if CYTHON_USE_DICT_VERSIONS
-#define __Pyx_GetModuleGlobalName(var, name) { \
- static PY_UINT64_T __pyx_dict_version = 0; \
- static PyObject *__pyx_dict_cached_value = NULL; \
- (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION($moddict_cname))) ? \
- (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) : \
- __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value); \
-}
-#define __Pyx_GetModuleGlobalNameUncached(var, name) { \
- PY_UINT64_T __pyx_dict_version; \
- PyObject *__pyx_dict_cached_value; \
- (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value); \
-}
-static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); /*proto*/
-#else
-#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name)
-#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name)
-static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); /*proto*/
-#endif
-
-
+//@requires: PyDictVersioning
+//@substitute: naming
+
+#if CYTHON_USE_DICT_VERSIONS
+#define __Pyx_GetModuleGlobalName(var, name) { \
+ static PY_UINT64_T __pyx_dict_version = 0; \
+ static PyObject *__pyx_dict_cached_value = NULL; \
+ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION($moddict_cname))) ? \
+ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) : \
+ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value); \
+}
+#define __Pyx_GetModuleGlobalNameUncached(var, name) { \
+ PY_UINT64_T __pyx_dict_version; \
+ PyObject *__pyx_dict_cached_value; \
+ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value); \
+}
+static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); /*proto*/
+#else
+#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name)
+#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name)
+static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); /*proto*/
+#endif
+
+
/////////////// GetModuleGlobalName ///////////////
//@requires: GetBuiltinName
//@substitute: naming
-#if CYTHON_USE_DICT_VERSIONS
-static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value)
-#else
-static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name)
-#endif
-{
+#if CYTHON_USE_DICT_VERSIONS
+static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value)
+#else
+static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name)
+#endif
+{
PyObject *result;
-#if !CYTHON_AVOID_BORROWED_REFS
+#if !CYTHON_AVOID_BORROWED_REFS
#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1
// Identifier names are always interned and have a pre-calculated hash value.
result = _PyDict_GetItem_KnownHash($moddict_cname, name, ((PyASCIIObject *) name)->hash);
- __PYX_UPDATE_DICT_CACHE($moddict_cname, result, *dict_cached_value, *dict_version)
+ __PYX_UPDATE_DICT_CACHE($moddict_cname, result, *dict_cached_value, *dict_version)
if (likely(result)) {
- return __Pyx_NewRef(result);
+ return __Pyx_NewRef(result);
} else if (unlikely(PyErr_Occurred())) {
- return NULL;
- }
+ return NULL;
+ }
#else
result = PyDict_GetItem($moddict_cname, name);
- __PYX_UPDATE_DICT_CACHE($moddict_cname, result, *dict_cached_value, *dict_version)
+ __PYX_UPDATE_DICT_CACHE($moddict_cname, result, *dict_cached_value, *dict_version)
if (likely(result)) {
- return __Pyx_NewRef(result);
- }
+ return __Pyx_NewRef(result);
+ }
#endif
#else
result = PyObject_GetItem($moddict_cname, name);
- __PYX_UPDATE_DICT_CACHE($moddict_cname, result, *dict_cached_value, *dict_version)
- if (likely(result)) {
- return __Pyx_NewRef(result);
- }
- PyErr_Clear();
-#endif
- return __Pyx_GetBuiltinName(name);
+ __PYX_UPDATE_DICT_CACHE($moddict_cname, result, *dict_cached_value, *dict_version)
+ if (likely(result)) {
+ return __Pyx_NewRef(result);
+ }
+ PyErr_Clear();
+#endif
+ return __Pyx_GetBuiltinName(name);
}
//////////////////// GetAttr.proto ////////////////////
@@ -1398,7 +1398,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, P
/////////////// PyObjectGetAttrStr.proto ///////////////
-#if CYTHON_USE_TYPE_SLOTS
+#if CYTHON_USE_TYPE_SLOTS
static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name);/*proto*/
#else
#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
@@ -1422,7 +1422,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject
/////////////// PyObjectSetAttrStr.proto ///////////////
-#if CYTHON_USE_TYPE_SLOTS
+#if CYTHON_USE_TYPE_SLOTS
#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o, n, NULL)
static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value);/*proto*/
#else
@@ -1446,220 +1446,220 @@ static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr
#endif
-/////////////// PyObjectGetMethod.proto ///////////////
-
-static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method);/*proto*/
-
-/////////////// PyObjectGetMethod ///////////////
-//@requires: PyObjectGetAttrStr
-
-static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) {
- PyObject *attr;
-#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP
- // Copied from _PyObject_GetMethod() in CPython 3.7
- PyTypeObject *tp = Py_TYPE(obj);
- PyObject *descr;
- descrgetfunc f = NULL;
- PyObject **dictptr, *dict;
- int meth_found = 0;
-
- assert (*method == NULL);
-
- if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) {
- attr = __Pyx_PyObject_GetAttrStr(obj, name);
- goto try_unpack;
- }
- if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) {
- return 0;
- }
-
- descr = _PyType_Lookup(tp, name);
- if (likely(descr != NULL)) {
- Py_INCREF(descr);
- // Repeating the condition below accommodates for MSVC's inability to test macros inside of macro expansions.
-#if PY_MAJOR_VERSION >= 3
- #ifdef __Pyx_CyFunction_USED
- if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr)))
- #else
- if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type)))
- #endif
-#else
- // "PyMethodDescr_Type" is not part of the C-API in Py2.
- #ifdef __Pyx_CyFunction_USED
- if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr)))
- #else
- if (likely(PyFunction_Check(descr)))
- #endif
-#endif
- {
- meth_found = 1;
- } else {
- f = Py_TYPE(descr)->tp_descr_get;
- if (f != NULL && PyDescr_IsData(descr)) {
- attr = f(descr, obj, (PyObject *)Py_TYPE(obj));
- Py_DECREF(descr);
- goto try_unpack;
- }
- }
- }
-
- dictptr = _PyObject_GetDictPtr(obj);
- if (dictptr != NULL && (dict = *dictptr) != NULL) {
- Py_INCREF(dict);
- attr = __Pyx_PyDict_GetItemStr(dict, name);
- if (attr != NULL) {
- Py_INCREF(attr);
- Py_DECREF(dict);
- Py_XDECREF(descr);
- goto try_unpack;
- }
- Py_DECREF(dict);
- }
-
- if (meth_found) {
- *method = descr;
- return 1;
- }
-
- if (f != NULL) {
- attr = f(descr, obj, (PyObject *)Py_TYPE(obj));
- Py_DECREF(descr);
- goto try_unpack;
- }
-
- if (descr != NULL) {
- *method = descr;
- return 0;
- }
-
- PyErr_Format(PyExc_AttributeError,
-#if PY_MAJOR_VERSION >= 3
- "'%.50s' object has no attribute '%U'",
- tp->tp_name, name);
-#else
- "'%.50s' object has no attribute '%.400s'",
- tp->tp_name, PyString_AS_STRING(name));
-#endif
- return 0;
-
-// Generic fallback implementation using normal attribute lookup.
-#else
- attr = __Pyx_PyObject_GetAttrStr(obj, name);
- goto try_unpack;
-#endif
-
-try_unpack:
-#if CYTHON_UNPACK_METHODS
- // Even if we failed to avoid creating a bound method object, it's still worth unpacking it now, if possible.
- if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) {
- PyObject *function = PyMethod_GET_FUNCTION(attr);
- Py_INCREF(function);
- Py_DECREF(attr);
- *method = function;
- return 1;
- }
-#endif
- *method = attr;
- return 0;
-}
-
-
-/////////////// UnpackUnboundCMethod.proto ///////////////
-
-typedef struct {
- PyObject *type;
- PyObject **method_name;
- // "func" is set on first access (direct C function pointer)
- PyCFunction func;
- // "method" is set on first access (fallback)
- PyObject *method;
- int flag;
-} __Pyx_CachedCFunction;
-
-/////////////// UnpackUnboundCMethod ///////////////
-//@requires: PyObjectGetAttrStr
-
-static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) {
- PyObject *method;
- method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name);
- if (unlikely(!method))
- return -1;
- target->method = method;
-#if CYTHON_COMPILING_IN_CPYTHON
- #if PY_MAJOR_VERSION >= 3
- // method dscriptor type isn't exported in Py2.x, cannot easily check the type there
+/////////////// PyObjectGetMethod.proto ///////////////
+
+static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method);/*proto*/
+
+/////////////// PyObjectGetMethod ///////////////
+//@requires: PyObjectGetAttrStr
+
+static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) {
+ PyObject *attr;
+#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP
+ // Copied from _PyObject_GetMethod() in CPython 3.7
+ PyTypeObject *tp = Py_TYPE(obj);
+ PyObject *descr;
+ descrgetfunc f = NULL;
+ PyObject **dictptr, *dict;
+ int meth_found = 0;
+
+ assert (*method == NULL);
+
+ if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) {
+ attr = __Pyx_PyObject_GetAttrStr(obj, name);
+ goto try_unpack;
+ }
+ if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) {
+ return 0;
+ }
+
+ descr = _PyType_Lookup(tp, name);
+ if (likely(descr != NULL)) {
+ Py_INCREF(descr);
+ // Repeating the condition below accommodates for MSVC's inability to test macros inside of macro expansions.
+#if PY_MAJOR_VERSION >= 3
+ #ifdef __Pyx_CyFunction_USED
+ if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr)))
+ #else
+ if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type)))
+ #endif
+#else
+ // "PyMethodDescr_Type" is not part of the C-API in Py2.
+ #ifdef __Pyx_CyFunction_USED
+ if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr)))
+ #else
+ if (likely(PyFunction_Check(descr)))
+ #endif
+#endif
+ {
+ meth_found = 1;
+ } else {
+ f = Py_TYPE(descr)->tp_descr_get;
+ if (f != NULL && PyDescr_IsData(descr)) {
+ attr = f(descr, obj, (PyObject *)Py_TYPE(obj));
+ Py_DECREF(descr);
+ goto try_unpack;
+ }
+ }
+ }
+
+ dictptr = _PyObject_GetDictPtr(obj);
+ if (dictptr != NULL && (dict = *dictptr) != NULL) {
+ Py_INCREF(dict);
+ attr = __Pyx_PyDict_GetItemStr(dict, name);
+ if (attr != NULL) {
+ Py_INCREF(attr);
+ Py_DECREF(dict);
+ Py_XDECREF(descr);
+ goto try_unpack;
+ }
+ Py_DECREF(dict);
+ }
+
+ if (meth_found) {
+ *method = descr;
+ return 1;
+ }
+
+ if (f != NULL) {
+ attr = f(descr, obj, (PyObject *)Py_TYPE(obj));
+ Py_DECREF(descr);
+ goto try_unpack;
+ }
+
+ if (descr != NULL) {
+ *method = descr;
+ return 0;
+ }
+
+ PyErr_Format(PyExc_AttributeError,
+#if PY_MAJOR_VERSION >= 3
+ "'%.50s' object has no attribute '%U'",
+ tp->tp_name, name);
+#else
+ "'%.50s' object has no attribute '%.400s'",
+ tp->tp_name, PyString_AS_STRING(name));
+#endif
+ return 0;
+
+// Generic fallback implementation using normal attribute lookup.
+#else
+ attr = __Pyx_PyObject_GetAttrStr(obj, name);
+ goto try_unpack;
+#endif
+
+try_unpack:
+#if CYTHON_UNPACK_METHODS
+ // Even if we failed to avoid creating a bound method object, it's still worth unpacking it now, if possible.
+ if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) {
+ PyObject *function = PyMethod_GET_FUNCTION(attr);
+ Py_INCREF(function);
+ Py_DECREF(attr);
+ *method = function;
+ return 1;
+ }
+#endif
+ *method = attr;
+ return 0;
+}
+
+
+/////////////// UnpackUnboundCMethod.proto ///////////////
+
+typedef struct {
+ PyObject *type;
+ PyObject **method_name;
+ // "func" is set on first access (direct C function pointer)
+ PyCFunction func;
+ // "method" is set on first access (fallback)
+ PyObject *method;
+ int flag;
+} __Pyx_CachedCFunction;
+
+/////////////// UnpackUnboundCMethod ///////////////
+//@requires: PyObjectGetAttrStr
+
+static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) {
+ PyObject *method;
+ method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name);
+ if (unlikely(!method))
+ return -1;
+ target->method = method;
+#if CYTHON_COMPILING_IN_CPYTHON
+ #if PY_MAJOR_VERSION >= 3
+ // method dscriptor type isn't exported in Py2.x, cannot easily check the type there
if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type)))
- #endif
- {
- PyMethodDescrObject *descr = (PyMethodDescrObject*) method;
- target->func = descr->d_method->ml_meth;
- target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS);
- }
-#endif
- return 0;
-}
-
-
-/////////////// CallUnboundCMethod0.proto ///////////////
-//@substitute: naming
-
-static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self); /*proto*/
-#if CYTHON_COMPILING_IN_CPYTHON
+ #endif
+ {
+ PyMethodDescrObject *descr = (PyMethodDescrObject*) method;
+ target->func = descr->d_method->ml_meth;
+ target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS);
+ }
+#endif
+ return 0;
+}
+
+
+/////////////// CallUnboundCMethod0.proto ///////////////
+//@substitute: naming
+
+static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self); /*proto*/
+#if CYTHON_COMPILING_IN_CPYTHON
// FASTCALL methods receive "&empty_tuple" as simple "PyObject[0]*"
-#define __Pyx_CallUnboundCMethod0(cfunc, self) \
+#define __Pyx_CallUnboundCMethod0(cfunc, self) \
(likely((cfunc)->func) ? \
- (likely((cfunc)->flag == METH_NOARGS) ? (*((cfunc)->func))(self, NULL) : \
+ (likely((cfunc)->flag == METH_NOARGS) ? (*((cfunc)->func))(self, NULL) : \
(PY_VERSION_HEX >= 0x030600B1 && likely((cfunc)->flag == METH_FASTCALL) ? \
(PY_VERSION_HEX >= 0x030700A0 ? \
- (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &$empty_tuple, 0) : \
- (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &$empty_tuple, 0, NULL)) : \
+ (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &$empty_tuple, 0) : \
+ (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &$empty_tuple, 0, NULL)) : \
(PY_VERSION_HEX >= 0x030700A0 && (cfunc)->flag == (METH_FASTCALL | METH_KEYWORDS) ? \
- (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &$empty_tuple, 0, NULL) : \
- (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ? ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, $empty_tuple, NULL)) : \
+ (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &$empty_tuple, 0, NULL) : \
+ (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ? ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, $empty_tuple, NULL)) : \
((cfunc)->flag == METH_VARARGS ? (*((cfunc)->func))(self, $empty_tuple) : \
__Pyx__CallUnboundCMethod0(cfunc, self)))))) : \
- __Pyx__CallUnboundCMethod0(cfunc, self))
-#else
-#define __Pyx_CallUnboundCMethod0(cfunc, self) __Pyx__CallUnboundCMethod0(cfunc, self)
-#endif
-
-/////////////// CallUnboundCMethod0 ///////////////
-//@requires: UnpackUnboundCMethod
-//@requires: PyObjectCall
-
-static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) {
- PyObject *args, *result = NULL;
- if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL;
-#if CYTHON_ASSUME_SAFE_MACROS
- args = PyTuple_New(1);
- if (unlikely(!args)) goto bad;
- Py_INCREF(self);
- PyTuple_SET_ITEM(args, 0, self);
-#else
- args = PyTuple_Pack(1, self);
- if (unlikely(!args)) goto bad;
-#endif
- result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
- Py_DECREF(args);
-bad:
- return result;
-}
-
-
-/////////////// CallUnboundCMethod1.proto ///////////////
-
+ __Pyx__CallUnboundCMethod0(cfunc, self))
+#else
+#define __Pyx_CallUnboundCMethod0(cfunc, self) __Pyx__CallUnboundCMethod0(cfunc, self)
+#endif
+
+/////////////// CallUnboundCMethod0 ///////////////
+//@requires: UnpackUnboundCMethod
+//@requires: PyObjectCall
+
+static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) {
+ PyObject *args, *result = NULL;
+ if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL;
+#if CYTHON_ASSUME_SAFE_MACROS
+ args = PyTuple_New(1);
+ if (unlikely(!args)) goto bad;
+ Py_INCREF(self);
+ PyTuple_SET_ITEM(args, 0, self);
+#else
+ args = PyTuple_Pack(1, self);
+ if (unlikely(!args)) goto bad;
+#endif
+ result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
+ Py_DECREF(args);
+bad:
+ return result;
+}
+
+
+/////////////// CallUnboundCMethod1.proto ///////////////
+
static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg);/*proto*/
-
-#if CYTHON_COMPILING_IN_CPYTHON
+
+#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg);/*proto*/
-#else
-#define __Pyx_CallUnboundCMethod1(cfunc, self, arg) __Pyx__CallUnboundCMethod1(cfunc, self, arg)
-#endif
-
-/////////////// CallUnboundCMethod1 ///////////////
-//@requires: UnpackUnboundCMethod
-//@requires: PyObjectCall
-
+#else
+#define __Pyx_CallUnboundCMethod1(cfunc, self, arg) __Pyx__CallUnboundCMethod1(cfunc, self, arg)
+#endif
+
+/////////////// CallUnboundCMethod1 ///////////////
+//@requires: UnpackUnboundCMethod
+//@requires: PyObjectCall
+
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg) {
if (likely(cfunc->func)) {
@@ -1669,51 +1669,51 @@ static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction*
return (*(cfunc->func))(self, arg);
} else if (PY_VERSION_HEX >= 0x030600B1 && flag == METH_FASTCALL) {
if (PY_VERSION_HEX >= 0x030700A0) {
- return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1);
+ return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1);
} else {
- return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL);
+ return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL);
}
} else if (PY_VERSION_HEX >= 0x030700A0 && flag == (METH_FASTCALL | METH_KEYWORDS)) {
- return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL);
+ return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL);
}
}
return __Pyx__CallUnboundCMethod1(cfunc, self, arg);
}
#endif
-static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){
- PyObject *args, *result = NULL;
+static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){
+ PyObject *args, *result = NULL;
if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL;
-#if CYTHON_COMPILING_IN_CPYTHON
- if (cfunc->func && (cfunc->flag & METH_VARARGS)) {
- args = PyTuple_New(1);
- if (unlikely(!args)) goto bad;
- Py_INCREF(arg);
- PyTuple_SET_ITEM(args, 0, arg);
- if (cfunc->flag & METH_KEYWORDS)
- result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL);
- else
- result = (*cfunc->func)(self, args);
- } else {
- args = PyTuple_New(2);
- if (unlikely(!args)) goto bad;
- Py_INCREF(self);
- PyTuple_SET_ITEM(args, 0, self);
- Py_INCREF(arg);
- PyTuple_SET_ITEM(args, 1, arg);
- result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
- }
-#else
- args = PyTuple_Pack(2, self, arg);
- if (unlikely(!args)) goto bad;
- result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
-#endif
-bad:
- Py_XDECREF(args);
- return result;
-}
-
-
+#if CYTHON_COMPILING_IN_CPYTHON
+ if (cfunc->func && (cfunc->flag & METH_VARARGS)) {
+ args = PyTuple_New(1);
+ if (unlikely(!args)) goto bad;
+ Py_INCREF(arg);
+ PyTuple_SET_ITEM(args, 0, arg);
+ if (cfunc->flag & METH_KEYWORDS)
+ result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL);
+ else
+ result = (*cfunc->func)(self, args);
+ } else {
+ args = PyTuple_New(2);
+ if (unlikely(!args)) goto bad;
+ Py_INCREF(self);
+ PyTuple_SET_ITEM(args, 0, self);
+ Py_INCREF(arg);
+ PyTuple_SET_ITEM(args, 1, arg);
+ result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
+ }
+#else
+ args = PyTuple_Pack(2, self, arg);
+ if (unlikely(!args)) goto bad;
+ result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
+#endif
+bad:
+ Py_XDECREF(args);
+ return result;
+}
+
+
/////////////// CallUnboundCMethod2.proto ///////////////
static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2); /*proto*/
@@ -1734,14 +1734,14 @@ static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *
PyObject *args[2] = {arg1, arg2};
if (cfunc->flag == METH_FASTCALL) {
#if PY_VERSION_HEX >= 0x030700A0
- return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2);
+ return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2);
#else
- return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL);
+ return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL);
#endif
}
#if PY_VERSION_HEX >= 0x030700A0
if (cfunc->flag == (METH_FASTCALL | METH_KEYWORDS))
- return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL);
+ return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL);
#endif
}
return __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2);
@@ -1760,7 +1760,7 @@ static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObje
Py_INCREF(arg2);
PyTuple_SET_ITEM(args, 1, arg2);
if (cfunc->flag & METH_KEYWORDS)
- result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL);
+ result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL);
else
result = (*cfunc->func)(self, args);
} else {
@@ -1790,19 +1790,19 @@ bad:
static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); /*proto*/
/////////////// PyObjectCallMethod0 ///////////////
-//@requires: PyObjectGetMethod
+//@requires: PyObjectGetMethod
//@requires: PyObjectCallOneArg
//@requires: PyObjectCallNoArg
static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) {
- PyObject *method = NULL, *result = NULL;
- int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
- if (likely(is_method)) {
- result = __Pyx_PyObject_CallOneArg(method, obj);
- Py_DECREF(method);
- return result;
- }
- if (unlikely(!method)) goto bad;
+ PyObject *method = NULL, *result = NULL;
+ int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
+ if (likely(is_method)) {
+ result = __Pyx_PyObject_CallOneArg(method, obj);
+ Py_DECREF(method);
+ return result;
+ }
+ if (unlikely(!method)) goto bad;
result = __Pyx_PyObject_CallNoArg(method);
Py_DECREF(method);
bad:
@@ -1815,27 +1815,27 @@ bad:
static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); /*proto*/
/////////////// PyObjectCallMethod1 ///////////////
-//@requires: PyObjectGetMethod
+//@requires: PyObjectGetMethod
//@requires: PyObjectCallOneArg
-//@requires: PyObjectCall2Args
+//@requires: PyObjectCall2Args
static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) {
- // Separate function to avoid excessive inlining.
- PyObject *result = __Pyx_PyObject_CallOneArg(method, arg);
- Py_DECREF(method);
+ // Separate function to avoid excessive inlining.
+ PyObject *result = __Pyx_PyObject_CallOneArg(method, arg);
+ Py_DECREF(method);
return result;
}
static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
- PyObject *method = NULL, *result;
- int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
- if (likely(is_method)) {
- result = __Pyx_PyObject_Call2Args(method, obj, arg);
- Py_DECREF(method);
- return result;
- }
+ PyObject *method = NULL, *result;
+ int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
+ if (likely(is_method)) {
+ result = __Pyx_PyObject_Call2Args(method, obj, arg);
+ Py_DECREF(method);
+ return result;
+ }
if (unlikely(!method)) return NULL;
- return __Pyx__PyObject_CallMethod1(method, arg);
+ return __Pyx__PyObject_CallMethod1(method, arg);
}
@@ -1845,48 +1845,48 @@ static PyObject* __Pyx_PyObject_CallMethod2(PyObject* obj, PyObject* method_name
/////////////// PyObjectCallMethod2 ///////////////
//@requires: PyObjectCall
-//@requires: PyFunctionFastCall
-//@requires: PyCFunctionFastCall
-//@requires: PyObjectCall2Args
-
-static PyObject* __Pyx_PyObject_Call3Args(PyObject* function, PyObject* arg1, PyObject* arg2, PyObject* arg3) {
- #if CYTHON_FAST_PYCALL
- if (PyFunction_Check(function)) {
- PyObject *args[3] = {arg1, arg2, arg3};
- return __Pyx_PyFunction_FastCall(function, args, 3);
- }
- #endif
- #if CYTHON_FAST_PYCCALL
- if (__Pyx_PyFastCFunction_Check(function)) {
- PyObject *args[3] = {arg1, arg2, arg3};
- return __Pyx_PyFunction_FastCall(function, args, 3);
- }
- #endif
-
- args = PyTuple_New(3);
- if (unlikely(!args)) goto done;
- Py_INCREF(arg1);
- PyTuple_SET_ITEM(args, 0, arg1);
- Py_INCREF(arg2);
- PyTuple_SET_ITEM(args, 1, arg2);
- Py_INCREF(arg3);
- PyTuple_SET_ITEM(args, 2, arg3);
-
- result = __Pyx_PyObject_Call(function, args, NULL);
- Py_DECREF(args);
- return result;
-}
-
+//@requires: PyFunctionFastCall
+//@requires: PyCFunctionFastCall
+//@requires: PyObjectCall2Args
+
+static PyObject* __Pyx_PyObject_Call3Args(PyObject* function, PyObject* arg1, PyObject* arg2, PyObject* arg3) {
+ #if CYTHON_FAST_PYCALL
+ if (PyFunction_Check(function)) {
+ PyObject *args[3] = {arg1, arg2, arg3};
+ return __Pyx_PyFunction_FastCall(function, args, 3);
+ }
+ #endif
+ #if CYTHON_FAST_PYCCALL
+ if (__Pyx_PyFastCFunction_Check(function)) {
+ PyObject *args[3] = {arg1, arg2, arg3};
+ return __Pyx_PyFunction_FastCall(function, args, 3);
+ }
+ #endif
+
+ args = PyTuple_New(3);
+ if (unlikely(!args)) goto done;
+ Py_INCREF(arg1);
+ PyTuple_SET_ITEM(args, 0, arg1);
+ Py_INCREF(arg2);
+ PyTuple_SET_ITEM(args, 1, arg2);
+ Py_INCREF(arg3);
+ PyTuple_SET_ITEM(args, 2, arg3);
+
+ result = __Pyx_PyObject_Call(function, args, NULL);
+ Py_DECREF(args);
+ return result;
+}
+
static PyObject* __Pyx_PyObject_CallMethod2(PyObject* obj, PyObject* method_name, PyObject* arg1, PyObject* arg2) {
- PyObject *args, *method = NULL, *result = NULL;
- int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
- if (likely(is_method)) {
- result = __Pyx_PyObject_Call3Args(method, obj, arg1, arg2);
+ PyObject *args, *method = NULL, *result = NULL;
+ int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
+ if (likely(is_method)) {
+ result = __Pyx_PyObject_Call3Args(method, obj, arg1, arg2);
Py_DECREF(method);
- return result;
+ return result;
}
- if (unlikely(!method)) return NULL;
- result = __Pyx_PyObject_Call2Args(method, arg1, arg2);
+ if (unlikely(!method)) return NULL;
+ result = __Pyx_PyObject_Call2Args(method, arg1, arg2);
Py_DECREF(method);
return result;
}
@@ -1960,286 +1960,286 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject
#endif
-/////////////// PyFunctionFastCall.proto ///////////////
-
-#if CYTHON_FAST_PYCALL
-#define __Pyx_PyFunction_FastCall(func, args, nargs) \
- __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL)
-
-// let's assume that the non-public C-API function might still change during the 3.6 beta phase
-#if 1 || PY_VERSION_HEX < 0x030600B1
-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs);
-#else
-#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs)
-#endif
-
-// Backport from Python 3
-// Assert a build-time dependency, as an expression.
-// Your compile will fail if the condition isn't true, or can't be evaluated
-// by the compiler. This can be used in an expression: its value is 0.
-// Example:
-// #define foo_to_char(foo) \
-// ((char *)(foo) \
-// + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0))
-//
-// Written by Rusty Russell, public domain, http://ccodearchive.net/
-#define __Pyx_BUILD_ASSERT_EXPR(cond) \
- (sizeof(char [1 - 2*!(cond)]) - 1)
-
-#ifndef Py_MEMBER_SIZE
-// Get the size of a structure member in bytes
-#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
-#endif
-
+/////////////// PyFunctionFastCall.proto ///////////////
+
+#if CYTHON_FAST_PYCALL
+#define __Pyx_PyFunction_FastCall(func, args, nargs) \
+ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL)
+
+// let's assume that the non-public C-API function might still change during the 3.6 beta phase
+#if 1 || PY_VERSION_HEX < 0x030600B1
+static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs);
+#else
+#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs)
+#endif
+
+// Backport from Python 3
+// Assert a build-time dependency, as an expression.
+// Your compile will fail if the condition isn't true, or can't be evaluated
+// by the compiler. This can be used in an expression: its value is 0.
+// Example:
+// #define foo_to_char(foo) \
+// ((char *)(foo) \
+// + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0))
+//
+// Written by Rusty Russell, public domain, http://ccodearchive.net/
+#define __Pyx_BUILD_ASSERT_EXPR(cond) \
+ (sizeof(char [1 - 2*!(cond)]) - 1)
+
+#ifndef Py_MEMBER_SIZE
+// Get the size of a structure member in bytes
+#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
+#endif
+
#if CYTHON_FAST_PYCALL
- // Initialised by module init code.
- static size_t __pyx_pyframe_localsplus_offset = 0;
-
- #include "frameobject.h"
- // This is the long runtime version of
- // #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus)
- // offsetof(PyFrameObject, f_localsplus) differs between regular C-Python and Stackless Python.
- // Therefore the offset is computed at run time from PyFrame_type.tp_basicsize. That is feasible,
- // because f_localsplus is the last field of PyFrameObject (checked by Py_BUILD_ASSERT_EXPR below).
- #define __Pxy_PyFrame_Initialize_Offsets() \
- ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)), \
- (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
- #define __Pyx_PyFrame_GetLocalsplus(frame) \
- (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
+ // Initialised by module init code.
+ static size_t __pyx_pyframe_localsplus_offset = 0;
+
+ #include "frameobject.h"
+ // This is the long runtime version of
+ // #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus)
+ // offsetof(PyFrameObject, f_localsplus) differs between regular C-Python and Stackless Python.
+ // Therefore the offset is computed at run time from PyFrame_type.tp_basicsize. That is feasible,
+ // because f_localsplus is the last field of PyFrameObject (checked by Py_BUILD_ASSERT_EXPR below).
+ #define __Pxy_PyFrame_Initialize_Offsets() \
+ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)), \
+ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
+ #define __Pyx_PyFrame_GetLocalsplus(frame) \
+ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
#endif // CYTHON_FAST_PYCALL
-#endif
-
-
-/////////////// PyFunctionFastCall ///////////////
-// copied from CPython 3.6 ceval.c
-
-#if CYTHON_FAST_PYCALL
-
-static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na,
- PyObject *globals) {
- PyFrameObject *f;
+#endif
+
+
+/////////////// PyFunctionFastCall ///////////////
+// copied from CPython 3.6 ceval.c
+
+#if CYTHON_FAST_PYCALL
+
+static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na,
+ PyObject *globals) {
+ PyFrameObject *f;
PyThreadState *tstate = __Pyx_PyThreadState_Current;
- PyObject **fastlocals;
- Py_ssize_t i;
- PyObject *result;
-
- assert(globals != NULL);
- /* XXX Perhaps we should create a specialized
- PyFrame_New() that doesn't take locals, but does
- take builtins without sanity checking them.
- */
- assert(tstate != NULL);
- f = PyFrame_New(tstate, co, globals, NULL);
- if (f == NULL) {
- return NULL;
- }
-
- fastlocals = __Pyx_PyFrame_GetLocalsplus(f);
-
- for (i = 0; i < na; i++) {
- Py_INCREF(*args);
- fastlocals[i] = *args++;
- }
- result = PyEval_EvalFrameEx(f,0);
-
- ++tstate->recursion_depth;
- Py_DECREF(f);
- --tstate->recursion_depth;
-
- return result;
-}
-
-
-#if 1 || PY_VERSION_HEX < 0x030600B1
-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) {
- PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
- PyObject *globals = PyFunction_GET_GLOBALS(func);
- PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
- PyObject *closure;
-#if PY_MAJOR_VERSION >= 3
- PyObject *kwdefs;
- //#if PY_VERSION_HEX >= 0x03050000
- //PyObject *name, *qualname;
- //#endif
-#endif
- PyObject *kwtuple, **k;
- PyObject **d;
- Py_ssize_t nd;
- Py_ssize_t nk;
- PyObject *result;
-
- assert(kwargs == NULL || PyDict_Check(kwargs));
- nk = kwargs ? PyDict_Size(kwargs) : 0;
-
- if (Py_EnterRecursiveCall((char*)" while calling a Python object")) {
- return NULL;
- }
-
- if (
-#if PY_MAJOR_VERSION >= 3
- co->co_kwonlyargcount == 0 &&
-#endif
- likely(kwargs == NULL || nk == 0) &&
- co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
- /* Fast paths */
- if (argdefs == NULL && co->co_argcount == nargs) {
- result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals);
- goto done;
- }
- else if (nargs == 0 && argdefs != NULL
- && co->co_argcount == Py_SIZE(argdefs)) {
- /* function called with no arguments, but all parameters have
- a default value: use default values as arguments .*/
- args = &PyTuple_GET_ITEM(argdefs, 0);
- result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals);
- goto done;
- }
- }
-
- if (kwargs != NULL) {
- Py_ssize_t pos, i;
- kwtuple = PyTuple_New(2 * nk);
- if (kwtuple == NULL) {
- result = NULL;
- goto done;
- }
-
- k = &PyTuple_GET_ITEM(kwtuple, 0);
- pos = i = 0;
- while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
- Py_INCREF(k[i]);
- Py_INCREF(k[i+1]);
- i += 2;
- }
- nk = i / 2;
- }
- else {
- kwtuple = NULL;
- k = NULL;
- }
-
- closure = PyFunction_GET_CLOSURE(func);
-#if PY_MAJOR_VERSION >= 3
- kwdefs = PyFunction_GET_KW_DEFAULTS(func);
- //#if PY_VERSION_HEX >= 0x03050000
- //name = ((PyFunctionObject *)func) -> func_name;
- //qualname = ((PyFunctionObject *)func) -> func_qualname;
- //#endif
-#endif
-
- if (argdefs != NULL) {
- d = &PyTuple_GET_ITEM(argdefs, 0);
- nd = Py_SIZE(argdefs);
- }
- else {
- d = NULL;
- nd = 0;
- }
-
- //#if PY_VERSION_HEX >= 0x03050000
- //return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
- // args, nargs,
- // NULL, 0,
- // d, nd, kwdefs,
- // closure, name, qualname);
- //#elif PY_MAJOR_VERSION >= 3
-#if PY_MAJOR_VERSION >= 3
- result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL,
- args, (int)nargs,
- k, (int)nk,
- d, (int)nd, kwdefs, closure);
-#else
- result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL,
- args, (int)nargs,
- k, (int)nk,
- d, (int)nd, closure);
-#endif
- Py_XDECREF(kwtuple);
-
-done:
- Py_LeaveRecursiveCall();
- return result;
-}
+ PyObject **fastlocals;
+ Py_ssize_t i;
+ PyObject *result;
+
+ assert(globals != NULL);
+ /* XXX Perhaps we should create a specialized
+ PyFrame_New() that doesn't take locals, but does
+ take builtins without sanity checking them.
+ */
+ assert(tstate != NULL);
+ f = PyFrame_New(tstate, co, globals, NULL);
+ if (f == NULL) {
+ return NULL;
+ }
+
+ fastlocals = __Pyx_PyFrame_GetLocalsplus(f);
+
+ for (i = 0; i < na; i++) {
+ Py_INCREF(*args);
+ fastlocals[i] = *args++;
+ }
+ result = PyEval_EvalFrameEx(f,0);
+
+ ++tstate->recursion_depth;
+ Py_DECREF(f);
+ --tstate->recursion_depth;
+
+ return result;
+}
+
+
+#if 1 || PY_VERSION_HEX < 0x030600B1
+static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) {
+ PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
+ PyObject *globals = PyFunction_GET_GLOBALS(func);
+ PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
+ PyObject *closure;
+#if PY_MAJOR_VERSION >= 3
+ PyObject *kwdefs;
+ //#if PY_VERSION_HEX >= 0x03050000
+ //PyObject *name, *qualname;
+ //#endif
+#endif
+ PyObject *kwtuple, **k;
+ PyObject **d;
+ Py_ssize_t nd;
+ Py_ssize_t nk;
+ PyObject *result;
+
+ assert(kwargs == NULL || PyDict_Check(kwargs));
+ nk = kwargs ? PyDict_Size(kwargs) : 0;
+
+ if (Py_EnterRecursiveCall((char*)" while calling a Python object")) {
+ return NULL;
+ }
+
+ if (
+#if PY_MAJOR_VERSION >= 3
+ co->co_kwonlyargcount == 0 &&
+#endif
+ likely(kwargs == NULL || nk == 0) &&
+ co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
+ /* Fast paths */
+ if (argdefs == NULL && co->co_argcount == nargs) {
+ result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals);
+ goto done;
+ }
+ else if (nargs == 0 && argdefs != NULL
+ && co->co_argcount == Py_SIZE(argdefs)) {
+ /* function called with no arguments, but all parameters have
+ a default value: use default values as arguments .*/
+ args = &PyTuple_GET_ITEM(argdefs, 0);
+ result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals);
+ goto done;
+ }
+ }
+
+ if (kwargs != NULL) {
+ Py_ssize_t pos, i;
+ kwtuple = PyTuple_New(2 * nk);
+ if (kwtuple == NULL) {
+ result = NULL;
+ goto done;
+ }
+
+ k = &PyTuple_GET_ITEM(kwtuple, 0);
+ pos = i = 0;
+ while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
+ Py_INCREF(k[i]);
+ Py_INCREF(k[i+1]);
+ i += 2;
+ }
+ nk = i / 2;
+ }
+ else {
+ kwtuple = NULL;
+ k = NULL;
+ }
+
+ closure = PyFunction_GET_CLOSURE(func);
+#if PY_MAJOR_VERSION >= 3
+ kwdefs = PyFunction_GET_KW_DEFAULTS(func);
+ //#if PY_VERSION_HEX >= 0x03050000
+ //name = ((PyFunctionObject *)func) -> func_name;
+ //qualname = ((PyFunctionObject *)func) -> func_qualname;
+ //#endif
+#endif
+
+ if (argdefs != NULL) {
+ d = &PyTuple_GET_ITEM(argdefs, 0);
+ nd = Py_SIZE(argdefs);
+ }
+ else {
+ d = NULL;
+ nd = 0;
+ }
+
+ //#if PY_VERSION_HEX >= 0x03050000
+ //return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
+ // args, nargs,
+ // NULL, 0,
+ // d, nd, kwdefs,
+ // closure, name, qualname);
+ //#elif PY_MAJOR_VERSION >= 3
+#if PY_MAJOR_VERSION >= 3
+ result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL,
+ args, (int)nargs,
+ k, (int)nk,
+ d, (int)nd, kwdefs, closure);
+#else
+ result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL,
+ args, (int)nargs,
+ k, (int)nk,
+ d, (int)nd, closure);
+#endif
+ Py_XDECREF(kwtuple);
+
+done:
+ Py_LeaveRecursiveCall();
+ return result;
+}
#endif /* CPython < 3.6 */
#endif /* CYTHON_FAST_PYCALL */
-
-
-/////////////// PyCFunctionFastCall.proto ///////////////
-
-#if CYTHON_FAST_PYCCALL
-static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs);
-#else
-#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL)
-#endif
-
-/////////////// PyCFunctionFastCall ///////////////
-
-#if CYTHON_FAST_PYCCALL
-static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) {
- PyCFunctionObject *func = (PyCFunctionObject*)func_obj;
- PyCFunction meth = PyCFunction_GET_FUNCTION(func);
- PyObject *self = PyCFunction_GET_SELF(func);
+
+
+/////////////// PyCFunctionFastCall.proto ///////////////
+
+#if CYTHON_FAST_PYCCALL
+static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs);
+#else
+#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL)
+#endif
+
+/////////////// PyCFunctionFastCall ///////////////
+
+#if CYTHON_FAST_PYCCALL
+static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) {
+ PyCFunctionObject *func = (PyCFunctionObject*)func_obj;
+ PyCFunction meth = PyCFunction_GET_FUNCTION(func);
+ PyObject *self = PyCFunction_GET_SELF(func);
int flags = PyCFunction_GET_FLAGS(func);
-
- assert(PyCFunction_Check(func));
- assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)));
- assert(nargs >= 0);
- assert(nargs == 0 || args != NULL);
-
- /* _PyCFunction_FastCallDict() must not be called with an exception set,
- because it may clear it (directly or indirectly) and so the
- caller loses its exception */
- assert(!PyErr_Occurred());
-
+
+ assert(PyCFunction_Check(func));
+ assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)));
+ assert(nargs >= 0);
+ assert(nargs == 0 || args != NULL);
+
+ /* _PyCFunction_FastCallDict() must not be called with an exception set,
+ because it may clear it (directly or indirectly) and so the
+ caller loses its exception */
+ assert(!PyErr_Occurred());
+
if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) {
- return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL);
+ return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL);
} else {
- return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs);
+ return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs);
}
-}
+}
#endif /* CYTHON_FAST_PYCCALL */
-
-
-/////////////// PyObjectCall2Args.proto ///////////////
-
-static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); /*proto*/
-
-/////////////// PyObjectCall2Args ///////////////
-//@requires: PyObjectCall
-//@requires: PyFunctionFastCall
-//@requires: PyCFunctionFastCall
-
-static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) {
- PyObject *args, *result = NULL;
- #if CYTHON_FAST_PYCALL
- if (PyFunction_Check(function)) {
- PyObject *args[2] = {arg1, arg2};
- return __Pyx_PyFunction_FastCall(function, args, 2);
- }
- #endif
- #if CYTHON_FAST_PYCCALL
- if (__Pyx_PyFastCFunction_Check(function)) {
- PyObject *args[2] = {arg1, arg2};
- return __Pyx_PyCFunction_FastCall(function, args, 2);
- }
- #endif
-
- args = PyTuple_New(2);
- if (unlikely(!args)) goto done;
- Py_INCREF(arg1);
- PyTuple_SET_ITEM(args, 0, arg1);
- Py_INCREF(arg2);
- PyTuple_SET_ITEM(args, 1, arg2);
-
- Py_INCREF(function);
- result = __Pyx_PyObject_Call(function, args, NULL);
- Py_DECREF(args);
- Py_DECREF(function);
-done:
- return result;
-}
-
-
+
+
+/////////////// PyObjectCall2Args.proto ///////////////
+
+static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); /*proto*/
+
+/////////////// PyObjectCall2Args ///////////////
+//@requires: PyObjectCall
+//@requires: PyFunctionFastCall
+//@requires: PyCFunctionFastCall
+
+static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) {
+ PyObject *args, *result = NULL;
+ #if CYTHON_FAST_PYCALL
+ if (PyFunction_Check(function)) {
+ PyObject *args[2] = {arg1, arg2};
+ return __Pyx_PyFunction_FastCall(function, args, 2);
+ }
+ #endif
+ #if CYTHON_FAST_PYCCALL
+ if (__Pyx_PyFastCFunction_Check(function)) {
+ PyObject *args[2] = {arg1, arg2};
+ return __Pyx_PyCFunction_FastCall(function, args, 2);
+ }
+ #endif
+
+ args = PyTuple_New(2);
+ if (unlikely(!args)) goto done;
+ Py_INCREF(arg1);
+ PyTuple_SET_ITEM(args, 0, arg1);
+ Py_INCREF(arg2);
+ PyTuple_SET_ITEM(args, 1, arg2);
+
+ Py_INCREF(function);
+ result = __Pyx_PyObject_Call(function, args, NULL);
+ Py_DECREF(args);
+ Py_DECREF(function);
+done:
+ return result;
+}
+
+
/////////////// PyObjectCallOneArg.proto ///////////////
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /*proto*/
@@ -2247,8 +2247,8 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec
/////////////// PyObjectCallOneArg ///////////////
//@requires: PyObjectCallMethO
//@requires: PyObjectCall
-//@requires: PyFunctionFastCall
-//@requires: PyCFunctionFastCall
+//@requires: PyFunctionFastCall
+//@requires: PyCFunctionFastCall
#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
@@ -2263,31 +2263,31 @@ static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
}
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-#if CYTHON_FAST_PYCALL
- if (PyFunction_Check(func)) {
- return __Pyx_PyFunction_FastCall(func, &arg, 1);
- }
-#endif
+#if CYTHON_FAST_PYCALL
+ if (PyFunction_Check(func)) {
+ return __Pyx_PyFunction_FastCall(func, &arg, 1);
+ }
+#endif
if (likely(PyCFunction_Check(func))) {
if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
// fast and simple case that we are optimising for
return __Pyx_PyObject_CallMethO(func, arg);
-#if CYTHON_FAST_PYCCALL
+#if CYTHON_FAST_PYCCALL
} else if (__Pyx_PyFastCFunction_Check(func)) {
- return __Pyx_PyCFunction_FastCall(func, &arg, 1);
-#endif
+ return __Pyx_PyCFunction_FastCall(func, &arg, 1);
+#endif
}
}
return __Pyx__PyObject_CallOneArg(func, arg);
}
#else
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
- PyObject *result;
- PyObject *args = PyTuple_Pack(1, arg);
- if (unlikely(!args)) return NULL;
- result = __Pyx_PyObject_Call(func, args, NULL);
- Py_DECREF(args);
- return result;
+ PyObject *result;
+ PyObject *args = PyTuple_Pack(1, arg);
+ if (unlikely(!args)) return NULL;
+ result = __Pyx_PyObject_Call(func, args, NULL);
+ Py_DECREF(args);
+ return result;
}
#endif
@@ -2305,22 +2305,22 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); /*proto
/////////////// PyObjectCallNoArg ///////////////
//@requires: PyObjectCallMethO
//@requires: PyObjectCall
-//@requires: PyFunctionFastCall
+//@requires: PyFunctionFastCall
//@substitute: naming
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
-#if CYTHON_FAST_PYCALL
- if (PyFunction_Check(func)) {
- return __Pyx_PyFunction_FastCall(func, NULL, 0);
- }
-#endif
+#if CYTHON_FAST_PYCALL
+ if (PyFunction_Check(func)) {
+ return __Pyx_PyFunction_FastCall(func, NULL, 0);
+ }
+#endif
#ifdef __Pyx_CyFunction_USED
- if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func)))
+ if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func)))
#else
- if (likely(PyCFunction_Check(func)))
+ if (likely(PyCFunction_Check(func)))
#endif
- {
+ {
if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
// fast and simple case that we are optimising for
return __Pyx_PyObject_CallMethO(func, NULL);
@@ -2345,35 +2345,35 @@ static PyObject* __Pyx_PyNumber_InPlaceMatrixMultiply(PyObject* x, PyObject* y);
/////////////// MatrixMultiply ///////////////
//@requires: PyObjectGetAttrStr
//@requires: PyObjectCallOneArg
-//@requires: PyFunctionFastCall
-//@requires: PyCFunctionFastCall
+//@requires: PyFunctionFastCall
+//@requires: PyCFunctionFastCall
#if PY_VERSION_HEX < 0x03050000
static PyObject* __Pyx_PyObject_CallMatrixMethod(PyObject* method, PyObject* arg) {
// NOTE: eats the method reference
PyObject *result = NULL;
-#if CYTHON_UNPACK_METHODS
+#if CYTHON_UNPACK_METHODS
if (likely(PyMethod_Check(method))) {
PyObject *self = PyMethod_GET_SELF(method);
if (likely(self)) {
PyObject *args;
PyObject *function = PyMethod_GET_FUNCTION(method);
- #if CYTHON_FAST_PYCALL
- if (PyFunction_Check(function)) {
- PyObject *args[2] = {self, arg};
- result = __Pyx_PyFunction_FastCall(function, args, 2);
- goto done;
- }
- #endif
- #if CYTHON_FAST_PYCCALL
- if (__Pyx_PyFastCFunction_Check(function)) {
- PyObject *args[2] = {self, arg};
- result = __Pyx_PyCFunction_FastCall(function, args, 2);
- goto done;
- }
- #endif
+ #if CYTHON_FAST_PYCALL
+ if (PyFunction_Check(function)) {
+ PyObject *args[2] = {self, arg};
+ result = __Pyx_PyFunction_FastCall(function, args, 2);
+ goto done;
+ }
+ #endif
+ #if CYTHON_FAST_PYCCALL
+ if (__Pyx_PyFastCFunction_Check(function)) {
+ PyObject *args[2] = {self, arg};
+ result = __Pyx_PyCFunction_FastCall(function, args, 2);
+ goto done;
+ }
+ #endif
args = PyTuple_New(2);
- if (unlikely(!args)) goto done;
+ if (unlikely(!args)) goto done;
Py_INCREF(self);
PyTuple_SET_ITEM(args, 0, self);
Py_INCREF(arg);
@@ -2388,7 +2388,7 @@ static PyObject* __Pyx_PyObject_CallMatrixMethod(PyObject* method, PyObject* arg
}
#endif
result = __Pyx_PyObject_CallOneArg(method, arg);
-done:
+done:
Py_DECREF(method);
return result;
}
@@ -2409,8 +2409,8 @@ done:
static PyObject* __Pyx__PyNumber_MatrixMultiply(PyObject* x, PyObject* y, const char* op_name) {
int right_is_subtype = PyObject_IsSubclass((PyObject*)Py_TYPE(y), (PyObject*)Py_TYPE(x));
- if (unlikely(right_is_subtype == -1))
- return NULL;
+ if (unlikely(right_is_subtype == -1))
+ return NULL;
if (right_is_subtype) {
// to allow subtypes to override parent behaviour, try reversed operation first
// see note at https://docs.python.org/3/reference/datamodel.html#emulating-numeric-types
@@ -2435,63 +2435,63 @@ static PyObject* __Pyx_PyNumber_InPlaceMatrixMultiply(PyObject* x, PyObject* y)
#undef __Pyx_TryMatrixMethod
#endif
-
-
-/////////////// PyDictVersioning.proto ///////////////
-
-#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
-#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1)
-#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag)
-#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) \
- (version_var) = __PYX_GET_DICT_VERSION(dict); \
- (cache_var) = (value);
-
-#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) { \
- static PY_UINT64_T __pyx_dict_version = 0; \
- static PyObject *__pyx_dict_cached_value = NULL; \
- if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) { \
- (VAR) = __pyx_dict_cached_value; \
- } else { \
- (VAR) = __pyx_dict_cached_value = (LOOKUP); \
- __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT); \
- } \
-}
-
-static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); /*proto*/
-static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); /*proto*/
-static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); /*proto*/
-
-#else
-#define __PYX_GET_DICT_VERSION(dict) (0)
-#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)
-#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP);
-#endif
-
-/////////////// PyDictVersioning ///////////////
-
-#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
-static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) {
- PyObject *dict = Py_TYPE(obj)->tp_dict;
- return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0;
-}
-
-static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) {
- PyObject **dictptr = NULL;
- Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset;
- if (offset) {
-#if CYTHON_COMPILING_IN_CPYTHON
- dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj);
-#else
- dictptr = _PyObject_GetDictPtr(obj);
-#endif
- }
- return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0;
-}
-
-static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) {
- PyObject *dict = Py_TYPE(obj)->tp_dict;
- if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict)))
- return 0;
- return obj_dict_version == __Pyx_get_object_dict_version(obj);
-}
-#endif
+
+
+/////////////// PyDictVersioning.proto ///////////////
+
+#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
+#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1)
+#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag)
+#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) \
+ (version_var) = __PYX_GET_DICT_VERSION(dict); \
+ (cache_var) = (value);
+
+#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) { \
+ static PY_UINT64_T __pyx_dict_version = 0; \
+ static PyObject *__pyx_dict_cached_value = NULL; \
+ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) { \
+ (VAR) = __pyx_dict_cached_value; \
+ } else { \
+ (VAR) = __pyx_dict_cached_value = (LOOKUP); \
+ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT); \
+ } \
+}
+
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); /*proto*/
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); /*proto*/
+static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); /*proto*/
+
+#else
+#define __PYX_GET_DICT_VERSION(dict) (0)
+#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)
+#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP);
+#endif
+
+/////////////// PyDictVersioning ///////////////
+
+#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) {
+ PyObject *dict = Py_TYPE(obj)->tp_dict;
+ return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0;
+}
+
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) {
+ PyObject **dictptr = NULL;
+ Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset;
+ if (offset) {
+#if CYTHON_COMPILING_IN_CPYTHON
+ dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj);
+#else
+ dictptr = _PyObject_GetDictPtr(obj);
+#endif
+ }
+ return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0;
+}
+
+static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) {
+ PyObject *dict = Py_TYPE(obj)->tp_dict;
+ if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict)))
+ return 0;
+ return obj_dict_version == __Pyx_get_object_dict_version(obj);
+}
+#endif
diff --git a/contrib/tools/cython/Cython/Utility/Optimize.c b/contrib/tools/cython/Cython/Utility/Optimize.c
index d18c9b78ec..fb155140ff 100644
--- a/contrib/tools/cython/Cython/Utility/Optimize.c
+++ b/contrib/tools/cython/Cython/Utility/Optimize.c
@@ -28,7 +28,7 @@ static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
/////////////// ListAppend.proto ///////////////
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
+#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
PyListObject* L = (PyListObject*) list;
Py_ssize_t len = Py_SIZE(list);
@@ -46,7 +46,7 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
/////////////// ListCompAppend.proto ///////////////
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
+#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) {
PyListObject* L = (PyListObject*) list;
Py_ssize_t len = Py_SIZE(list);
@@ -78,18 +78,18 @@ static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) {
/////////////// pop.proto ///////////////
-static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L); /*proto*/
+static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L); /*proto*/
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
+#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L); /*proto*/
-#define __Pyx_PyObject_Pop(L) (likely(PyList_CheckExact(L)) ? \
- __Pyx_PyList_Pop(L) : __Pyx__PyObject_Pop(L))
-
-#else
-#define __Pyx_PyList_Pop(L) __Pyx__PyObject_Pop(L)
-#define __Pyx_PyObject_Pop(L) __Pyx__PyObject_Pop(L)
-#endif
-
+#define __Pyx_PyObject_Pop(L) (likely(PyList_CheckExact(L)) ? \
+ __Pyx_PyList_Pop(L) : __Pyx__PyObject_Pop(L))
+
+#else
+#define __Pyx_PyList_Pop(L) __Pyx__PyObject_Pop(L)
+#define __Pyx_PyObject_Pop(L) __Pyx__PyObject_Pop(L)
+#endif
+
/////////////// pop ///////////////
//@requires: ObjectHandling.c::PyObjectCallMethod0
@@ -100,72 +100,72 @@ static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L) {
return __Pyx_PyObject_CallMethod0(L, PYIDENT("pop"));
}
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
+#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L) {
/* Check that both the size is positive and no reallocation shrinking needs to be done. */
if (likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
__Pyx_SET_SIZE(L, Py_SIZE(L) - 1);
return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
}
- return CALL_UNBOUND_METHOD(PyList_Type, "pop", L);
-}
+ return CALL_UNBOUND_METHOD(PyList_Type, "pop", L);
+}
#endif
/////////////// pop_index.proto ///////////////
-static PyObject* __Pyx__PyObject_PopNewIndex(PyObject* L, PyObject* py_ix); /*proto*/
-static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, PyObject* py_ix); /*proto*/
-
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
-static PyObject* __Pyx__PyList_PopIndex(PyObject* L, PyObject* py_ix, Py_ssize_t ix); /*proto*/
-
-#define __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) ( \
- (likely(PyList_CheckExact(L) && __Pyx_fits_Py_ssize_t(ix, type, is_signed))) ? \
- __Pyx__PyList_PopIndex(L, py_ix, ix) : ( \
- (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) : \
- __Pyx__PyObject_PopIndex(L, py_ix)))
-
-#define __Pyx_PyList_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) ( \
+static PyObject* __Pyx__PyObject_PopNewIndex(PyObject* L, PyObject* py_ix); /*proto*/
+static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, PyObject* py_ix); /*proto*/
+
+#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
+static PyObject* __Pyx__PyList_PopIndex(PyObject* L, PyObject* py_ix, Py_ssize_t ix); /*proto*/
+
+#define __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) ( \
+ (likely(PyList_CheckExact(L) && __Pyx_fits_Py_ssize_t(ix, type, is_signed))) ? \
+ __Pyx__PyList_PopIndex(L, py_ix, ix) : ( \
+ (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) : \
+ __Pyx__PyObject_PopIndex(L, py_ix)))
+
+#define __Pyx_PyList_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) ( \
__Pyx_fits_Py_ssize_t(ix, type, is_signed) ? \
- __Pyx__PyList_PopIndex(L, py_ix, ix) : ( \
- (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) : \
- __Pyx__PyObject_PopIndex(L, py_ix)))
-
-#else
-
-#define __Pyx_PyList_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) \
- __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func)
-
-#define __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) ( \
- (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) : \
- __Pyx__PyObject_PopIndex(L, py_ix))
-#endif
-
+ __Pyx__PyList_PopIndex(L, py_ix, ix) : ( \
+ (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) : \
+ __Pyx__PyObject_PopIndex(L, py_ix)))
+
+#else
+
+#define __Pyx_PyList_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) \
+ __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func)
+
+#define __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) ( \
+ (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) : \
+ __Pyx__PyObject_PopIndex(L, py_ix))
+#endif
+
/////////////// pop_index ///////////////
//@requires: ObjectHandling.c::PyObjectCallMethod1
-static PyObject* __Pyx__PyObject_PopNewIndex(PyObject* L, PyObject* py_ix) {
+static PyObject* __Pyx__PyObject_PopNewIndex(PyObject* L, PyObject* py_ix) {
PyObject *r;
if (unlikely(!py_ix)) return NULL;
- r = __Pyx__PyObject_PopIndex(L, py_ix);
+ r = __Pyx__PyObject_PopIndex(L, py_ix);
Py_DECREF(py_ix);
return r;
}
-static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, PyObject* py_ix) {
- return __Pyx_PyObject_CallMethod1(L, PYIDENT("pop"), py_ix);
-}
-
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
-static PyObject* __Pyx__PyList_PopIndex(PyObject* L, PyObject* py_ix, Py_ssize_t ix) {
+static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, PyObject* py_ix) {
+ return __Pyx_PyObject_CallMethod1(L, PYIDENT("pop"), py_ix);
+}
+
+#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
+static PyObject* __Pyx__PyList_PopIndex(PyObject* L, PyObject* py_ix, Py_ssize_t ix) {
Py_ssize_t size = PyList_GET_SIZE(L);
if (likely(size > (((PyListObject*)L)->allocated >> 1))) {
Py_ssize_t cix = ix;
if (cix < 0) {
cix += size;
}
- if (likely(__Pyx_is_valid_index(cix, size))) {
+ if (likely(__Pyx_is_valid_index(cix, size))) {
PyObject* v = PyList_GET_ITEM(L, cix);
__Pyx_SET_SIZE(L, Py_SIZE(L) - 1);
size -= 1;
@@ -173,12 +173,12 @@ static PyObject* __Pyx__PyList_PopIndex(PyObject* L, PyObject* py_ix, Py_ssize_t
return v;
}
}
- if (py_ix == Py_None) {
- return __Pyx__PyObject_PopNewIndex(L, PyInt_FromSsize_t(ix));
- } else {
- return __Pyx__PyObject_PopIndex(L, py_ix);
- }
-}
+ if (py_ix == Py_None) {
+ return __Pyx__PyObject_PopNewIndex(L, PyInt_FromSsize_t(ix));
+ } else {
+ return __Pyx__PyObject_PopIndex(L, py_ix);
+ }
+}
#endif
@@ -190,7 +190,7 @@ static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObjec
static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) {
PyObject* value;
-#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
+#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
value = PyDict_GetItemWithError(d, key);
if (unlikely(!value)) {
if (unlikely(PyErr_Occurred()))
@@ -238,7 +238,7 @@ static CYTHON_INLINE PyObject *__Pyx_PyDict_SetDefault(PyObject *d, PyObject *ke
#else
if (is_safe_type == 1 || (is_safe_type == -1 &&
/* the following builtins presumably have repeatably safe and fast hash functions */
-#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
+#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
(PyUnicode_CheckExact(key) || PyString_CheckExact(key) || PyLong_CheckExact(key)))) {
value = PyDict_GetItemWithError(d, key);
if (unlikely(!value)) {
@@ -352,9 +352,9 @@ static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_di
return PyObject_GetIter(iterable);
}
-static CYTHON_INLINE int __Pyx_dict_iter_next(
- PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos,
- PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
+static CYTHON_INLINE int __Pyx_dict_iter_next(
+ PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos,
+ PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
PyObject* next_item;
#if !CYTHON_COMPILING_IN_PYPY
if (source_is_dict) {
@@ -438,15 +438,15 @@ static CYTHON_INLINE PyObject* __Pyx_set_iterator(PyObject* iterable, int is_set
#if CYTHON_COMPILING_IN_CPYTHON
is_set = is_set || likely(PySet_CheckExact(iterable) || PyFrozenSet_CheckExact(iterable));
*p_source_is_set = is_set;
- if (likely(is_set)) {
- *p_orig_length = PySet_Size(iterable);
- Py_INCREF(iterable);
- return iterable;
- }
+ if (likely(is_set)) {
+ *p_orig_length = PySet_Size(iterable);
+ Py_INCREF(iterable);
+ return iterable;
+ }
#else
(void)is_set;
*p_source_is_set = 0;
-#endif
+#endif
*p_orig_length = 0;
return PyObject_GetIter(iterable);
}
@@ -462,7 +462,7 @@ static CYTHON_INLINE int __Pyx_set_iter_next(
}
(void)orig_length;
(void)ppos;
- return 1;
+ return 1;
}
#if CYTHON_COMPILING_IN_CPYTHON
if (unlikely(PySet_GET_SIZE(iter_obj) != orig_length)) {
@@ -482,7 +482,7 @@ static CYTHON_INLINE int __Pyx_set_iter_next(
}
}
#endif
- return 0;
+ return 0;
}
/////////////// py_set_discard_unhashable ///////////////
@@ -599,8 +599,8 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */
static double __Pyx__PyObject_AsDouble(PyObject* obj) {
PyObject* float_value;
-#if !CYTHON_USE_TYPE_SLOTS
- float_value = PyNumber_Float(obj); if ((0)) goto bad;
+#if !CYTHON_USE_TYPE_SLOTS
+ float_value = PyNumber_Float(obj); if ((0)) goto bad;
#else
PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number;
if (likely(nb) && likely(nb->nb_float)) {
@@ -649,25 +649,25 @@ static PyObject* __Pyx__PyNumber_PowerOf2(PyObject *two, PyObject *exp, PyObject
static PyObject* __Pyx__PyNumber_PowerOf2(PyObject *two, PyObject *exp, PyObject *none, int inplace) {
// in CPython, 1<<N is substantially faster than 2**N
// see http://bugs.python.org/issue21420
-#if !CYTHON_COMPILING_IN_PYPY
+#if !CYTHON_COMPILING_IN_PYPY
Py_ssize_t shiftby;
-#if PY_MAJOR_VERSION < 3
- if (likely(PyInt_CheckExact(exp))) {
- shiftby = PyInt_AS_LONG(exp);
- } else
-#endif
+#if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_CheckExact(exp))) {
+ shiftby = PyInt_AS_LONG(exp);
+ } else
+#endif
if (likely(PyLong_CheckExact(exp))) {
- #if CYTHON_USE_PYLONG_INTERNALS
- const Py_ssize_t size = Py_SIZE(exp);
- // tuned to optimise branch prediction
- if (likely(size == 1)) {
- shiftby = ((PyLongObject*)exp)->ob_digit[0];
- } else if (size == 0) {
- return PyInt_FromLong(1L);
- } else if (unlikely(size < 0)) {
- goto fallback;
- } else {
- shiftby = PyLong_AsSsize_t(exp);
+ #if CYTHON_USE_PYLONG_INTERNALS
+ const Py_ssize_t size = Py_SIZE(exp);
+ // tuned to optimise branch prediction
+ if (likely(size == 1)) {
+ shiftby = ((PyLongObject*)exp)->ob_digit[0];
+ } else if (size == 0) {
+ return PyInt_FromLong(1L);
+ } else if (unlikely(size < 0)) {
+ goto fallback;
+ } else {
+ shiftby = PyLong_AsSsize_t(exp);
}
#else
shiftby = PyLong_AsSsize_t(exp);
@@ -679,17 +679,17 @@ static PyObject* __Pyx__PyNumber_PowerOf2(PyObject *two, PyObject *exp, PyObject
if ((size_t)shiftby <= sizeof(long) * 8 - 2) {
long value = 1L << shiftby;
return PyInt_FromLong(value);
-#ifdef HAVE_LONG_LONG
- } else if ((size_t)shiftby <= sizeof(unsigned PY_LONG_LONG) * 8 - 1) {
- unsigned PY_LONG_LONG value = ((unsigned PY_LONG_LONG)1) << shiftby;
- return PyLong_FromUnsignedLongLong(value);
-#endif
+#ifdef HAVE_LONG_LONG
+ } else if ((size_t)shiftby <= sizeof(unsigned PY_LONG_LONG) * 8 - 1) {
+ unsigned PY_LONG_LONG value = ((unsigned PY_LONG_LONG)1) << shiftby;
+ return PyLong_FromUnsignedLongLong(value);
+#endif
} else {
- PyObject *result, *one = PyInt_FromLong(1L);
+ PyObject *result, *one = PyInt_FromLong(1L);
if (unlikely(!one)) return NULL;
- result = PyNumber_Lshift(one, exp);
- Py_DECREF(one);
- return result;
+ result = PyNumber_Lshift(one, exp);
+ Py_DECREF(one);
+ return result;
}
} else if (shiftby == -1 && PyErr_Occurred()) {
PyErr_Clear();
@@ -698,498 +698,498 @@ fallback:
#endif
return (inplace ? PyNumber_InPlacePower : PyNumber_Power)(two, exp, none);
}
-
-
-/////////////// PyIntCompare.proto ///////////////
-
-{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
-static CYTHON_INLINE {{c_ret_type}} __Pyx_PyInt_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(PyObject *op1, PyObject *op2, long intval, long inplace); /*proto*/
-
-/////////////// PyIntCompare ///////////////
-
-{{py: pyval, ival = ('op2', 'b') if order == 'CObj' else ('op1', 'a') }}
-{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
-{{py: return_true = 'Py_RETURN_TRUE' if ret_type.is_pyobject else 'return 1'}}
-{{py: return_false = 'Py_RETURN_FALSE' if ret_type.is_pyobject else 'return 0'}}
-{{py: slot_name = op.lower() }}
-{{py: c_op = {'Eq': '==', 'Ne': '!='}[op] }}
-{{py:
-return_compare = (
- (lambda a,b,c_op, return_true=return_true, return_false=return_false: "if ({a} {c_op} {b}) {return_true}; else {return_false};".format(
- a=a, b=b, c_op=c_op, return_true=return_true, return_false=return_false))
- if ret_type.is_pyobject else
- (lambda a,b,c_op: "return ({a} {c_op} {b});".format(a=a, b=b, c_op=c_op))
- )
-}}
-
-static CYTHON_INLINE {{c_ret_type}} __Pyx_PyInt_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED long inplace) {
- if (op1 == op2) {
- {{return_true if op == 'Eq' else return_false}};
- }
-
- #if PY_MAJOR_VERSION < 3
- if (likely(PyInt_CheckExact({{pyval}}))) {
- const long {{'a' if order == 'CObj' else 'b'}} = intval;
- long {{ival}} = PyInt_AS_LONG({{pyval}});
- {{return_compare('a', 'b', c_op)}}
- }
- #endif
-
- #if CYTHON_USE_PYLONG_INTERNALS
- if (likely(PyLong_CheckExact({{pyval}}))) {
- int unequal;
- unsigned long uintval;
- Py_ssize_t size = Py_SIZE({{pyval}});
- const digit* digits = ((PyLongObject*){{pyval}})->ob_digit;
- if (intval == 0) {
- // == 0 => Py_SIZE(pyval) == 0
- {{return_compare('size', '0', c_op)}}
- } else if (intval < 0) {
- // < 0 => Py_SIZE(pyval) < 0
- if (size >= 0)
- {{return_false if op == 'Eq' else return_true}};
- // both are negative => can use absolute values now.
- intval = -intval;
- size = -size;
- } else {
- // > 0 => Py_SIZE(pyval) > 0
- if (size <= 0)
- {{return_false if op == 'Eq' else return_true}};
- }
- // After checking that the sign is the same (and excluding 0), now compare the absolute values.
- // When inlining, the C compiler should select exactly one line from this unrolled loop.
- uintval = (unsigned long) intval;
- {{for _size in range(4, 0, -1)}}
-#if PyLong_SHIFT * {{_size}} < SIZEOF_LONG*8
- if (uintval >> (PyLong_SHIFT * {{_size}})) {
- // The C integer value is between (PyLong_BASE ** _size) and MIN(PyLong_BASE ** _size, LONG_MAX).
- unequal = (size != {{_size+1}}) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
- {{for _i in range(1, _size+1)}} | (digits[{{_i}}] != ((uintval >> ({{_i}} * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)){{endfor}};
- } else
-#endif
- {{endfor}}
- unequal = (size != 1) || (((unsigned long) digits[0]) != (uintval & (unsigned long) PyLong_MASK));
-
- {{return_compare('unequal', '0', c_op)}}
- }
- #endif
-
- if (PyFloat_CheckExact({{pyval}})) {
- const long {{'a' if order == 'CObj' else 'b'}} = intval;
- double {{ival}} = PyFloat_AS_DOUBLE({{pyval}});
- {{return_compare('(double)a', '(double)b', c_op)}}
- }
-
- return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
- PyObject_RichCompare(op1, op2, Py_{{op.upper()}}));
-}
-
-
-/////////////// PyIntBinop.proto ///////////////
-
-{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
-#if !CYTHON_COMPILING_IN_PYPY
-static {{c_ret_type}} __Pyx_PyInt_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); /*proto*/
-#else
-#define __Pyx_PyInt_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(op1, op2, intval, inplace, zerodivision_check) \
- {{if op in ('Eq', 'Ne')}}{{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(PyObject_RichCompare(op1, op2, Py_{{op.upper()}}))
- {{else}}(inplace ? PyNumber_InPlace{{op}}(op1, op2) : PyNumber_{{op}}(op1, op2))
- {{endif}}
-#endif
-
-/////////////// PyIntBinop ///////////////
-
-#if !CYTHON_COMPILING_IN_PYPY
-{{py: from Cython.Utility import pylong_join }}
-{{py: pyval, ival = ('op2', 'b') if order == 'CObj' else ('op1', 'a') }}
-{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
-{{py: return_true = 'Py_RETURN_TRUE' if ret_type.is_pyobject else 'return 1'}}
-{{py: return_false = 'Py_RETURN_FALSE' if ret_type.is_pyobject else 'return 0'}}
-{{py: slot_name = {'TrueDivide': 'true_divide', 'FloorDivide': 'floor_divide'}.get(op, op.lower()) }}
-{{py: cfunc_name = '__Pyx_PyInt_%s%s%s' % ('' if ret_type.is_pyobject else 'Bool', op, order)}}
-{{py: zerodiv_check = lambda operand, _cfunc_name=cfunc_name: '%s_ZeroDivisionError(%s)' % (_cfunc_name, operand)}}
-{{py:
-c_op = {
- 'Add': '+', 'Subtract': '-', 'Remainder': '%', 'TrueDivide': '/', 'FloorDivide': '/',
- 'Or': '|', 'Xor': '^', 'And': '&', 'Rshift': '>>', 'Lshift': '<<',
- 'Eq': '==', 'Ne': '!=',
- }[op]
-}}
-
-{{if op in ('TrueDivide', 'FloorDivide', 'Remainder')}}
-#if PY_MAJOR_VERSION < 3 || CYTHON_USE_PYLONG_INTERNALS
-#define {{zerodiv_check('operand')}} \
- if (unlikely(zerodivision_check && ((operand) == 0))) { \
- PyErr_SetString(PyExc_ZeroDivisionError, "integer division{{if op == 'Remainder'}} or modulo{{endif}} by zero"); \
- return NULL; \
- }
-#endif
-{{endif}}
-
-static {{c_ret_type}} {{cfunc_name}}(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, int inplace, int zerodivision_check) {
- // Prevent "unused" warnings.
- (void)inplace;
- (void)zerodivision_check;
-
- {{if op in ('Eq', 'Ne')}}
- if (op1 == op2) {
- {{return_true if op == 'Eq' else return_false}};
- }
- {{endif}}
-
- #if PY_MAJOR_VERSION < 3
- if (likely(PyInt_CheckExact({{pyval}}))) {
- const long {{'a' if order == 'CObj' else 'b'}} = intval;
- {{if c_op in '+-%' or op == 'FloorDivide'}}
- long x;
- {{endif}}
- long {{ival}} = PyInt_AS_LONG({{pyval}});
-
- {{if op in ('Eq', 'Ne')}}
- if (a {{c_op}} b) {
- {{return_true}};
- } else {
- {{return_false}};
- }
- {{elif c_op in '+-'}}
- // adapted from intobject.c in Py2.7:
- // casts in the line below avoid undefined behaviour on overflow
- x = (long)((unsigned long)a {{c_op}} b);
- if (likely((x^a) >= 0 || (x^{{ '~' if op == 'Subtract' else '' }}b) >= 0))
- return PyInt_FromLong(x);
- return PyLong_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
- {{elif c_op == '%'}}
- {{zerodiv_check('b')}}
- // see ExprNodes.py :: mod_int_utility_code
- x = a % b;
- x += ((x != 0) & ((x ^ b) < 0)) * b;
- return PyInt_FromLong(x);
- {{elif op == 'TrueDivide'}}
- {{zerodiv_check('b')}}
+
+
+/////////////// PyIntCompare.proto ///////////////
+
+{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
+static CYTHON_INLINE {{c_ret_type}} __Pyx_PyInt_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(PyObject *op1, PyObject *op2, long intval, long inplace); /*proto*/
+
+/////////////// PyIntCompare ///////////////
+
+{{py: pyval, ival = ('op2', 'b') if order == 'CObj' else ('op1', 'a') }}
+{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
+{{py: return_true = 'Py_RETURN_TRUE' if ret_type.is_pyobject else 'return 1'}}
+{{py: return_false = 'Py_RETURN_FALSE' if ret_type.is_pyobject else 'return 0'}}
+{{py: slot_name = op.lower() }}
+{{py: c_op = {'Eq': '==', 'Ne': '!='}[op] }}
+{{py:
+return_compare = (
+ (lambda a,b,c_op, return_true=return_true, return_false=return_false: "if ({a} {c_op} {b}) {return_true}; else {return_false};".format(
+ a=a, b=b, c_op=c_op, return_true=return_true, return_false=return_false))
+ if ret_type.is_pyobject else
+ (lambda a,b,c_op: "return ({a} {c_op} {b});".format(a=a, b=b, c_op=c_op))
+ )
+}}
+
+static CYTHON_INLINE {{c_ret_type}} __Pyx_PyInt_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED long inplace) {
+ if (op1 == op2) {
+ {{return_true if op == 'Eq' else return_false}};
+ }
+
+ #if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_CheckExact({{pyval}}))) {
+ const long {{'a' if order == 'CObj' else 'b'}} = intval;
+ long {{ival}} = PyInt_AS_LONG({{pyval}});
+ {{return_compare('a', 'b', c_op)}}
+ }
+ #endif
+
+ #if CYTHON_USE_PYLONG_INTERNALS
+ if (likely(PyLong_CheckExact({{pyval}}))) {
+ int unequal;
+ unsigned long uintval;
+ Py_ssize_t size = Py_SIZE({{pyval}});
+ const digit* digits = ((PyLongObject*){{pyval}})->ob_digit;
+ if (intval == 0) {
+ // == 0 => Py_SIZE(pyval) == 0
+ {{return_compare('size', '0', c_op)}}
+ } else if (intval < 0) {
+ // < 0 => Py_SIZE(pyval) < 0
+ if (size >= 0)
+ {{return_false if op == 'Eq' else return_true}};
+ // both are negative => can use absolute values now.
+ intval = -intval;
+ size = -size;
+ } else {
+ // > 0 => Py_SIZE(pyval) > 0
+ if (size <= 0)
+ {{return_false if op == 'Eq' else return_true}};
+ }
+ // After checking that the sign is the same (and excluding 0), now compare the absolute values.
+ // When inlining, the C compiler should select exactly one line from this unrolled loop.
+ uintval = (unsigned long) intval;
+ {{for _size in range(4, 0, -1)}}
+#if PyLong_SHIFT * {{_size}} < SIZEOF_LONG*8
+ if (uintval >> (PyLong_SHIFT * {{_size}})) {
+ // The C integer value is between (PyLong_BASE ** _size) and MIN(PyLong_BASE ** _size, LONG_MAX).
+ unequal = (size != {{_size+1}}) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
+ {{for _i in range(1, _size+1)}} | (digits[{{_i}}] != ((uintval >> ({{_i}} * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)){{endfor}};
+ } else
+#endif
+ {{endfor}}
+ unequal = (size != 1) || (((unsigned long) digits[0]) != (uintval & (unsigned long) PyLong_MASK));
+
+ {{return_compare('unequal', '0', c_op)}}
+ }
+ #endif
+
+ if (PyFloat_CheckExact({{pyval}})) {
+ const long {{'a' if order == 'CObj' else 'b'}} = intval;
+ double {{ival}} = PyFloat_AS_DOUBLE({{pyval}});
+ {{return_compare('(double)a', '(double)b', c_op)}}
+ }
+
+ return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
+ PyObject_RichCompare(op1, op2, Py_{{op.upper()}}));
+}
+
+
+/////////////// PyIntBinop.proto ///////////////
+
+{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
+#if !CYTHON_COMPILING_IN_PYPY
+static {{c_ret_type}} __Pyx_PyInt_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); /*proto*/
+#else
+#define __Pyx_PyInt_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(op1, op2, intval, inplace, zerodivision_check) \
+ {{if op in ('Eq', 'Ne')}}{{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(PyObject_RichCompare(op1, op2, Py_{{op.upper()}}))
+ {{else}}(inplace ? PyNumber_InPlace{{op}}(op1, op2) : PyNumber_{{op}}(op1, op2))
+ {{endif}}
+#endif
+
+/////////////// PyIntBinop ///////////////
+
+#if !CYTHON_COMPILING_IN_PYPY
+{{py: from Cython.Utility import pylong_join }}
+{{py: pyval, ival = ('op2', 'b') if order == 'CObj' else ('op1', 'a') }}
+{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
+{{py: return_true = 'Py_RETURN_TRUE' if ret_type.is_pyobject else 'return 1'}}
+{{py: return_false = 'Py_RETURN_FALSE' if ret_type.is_pyobject else 'return 0'}}
+{{py: slot_name = {'TrueDivide': 'true_divide', 'FloorDivide': 'floor_divide'}.get(op, op.lower()) }}
+{{py: cfunc_name = '__Pyx_PyInt_%s%s%s' % ('' if ret_type.is_pyobject else 'Bool', op, order)}}
+{{py: zerodiv_check = lambda operand, _cfunc_name=cfunc_name: '%s_ZeroDivisionError(%s)' % (_cfunc_name, operand)}}
+{{py:
+c_op = {
+ 'Add': '+', 'Subtract': '-', 'Remainder': '%', 'TrueDivide': '/', 'FloorDivide': '/',
+ 'Or': '|', 'Xor': '^', 'And': '&', 'Rshift': '>>', 'Lshift': '<<',
+ 'Eq': '==', 'Ne': '!=',
+ }[op]
+}}
+
+{{if op in ('TrueDivide', 'FloorDivide', 'Remainder')}}
+#if PY_MAJOR_VERSION < 3 || CYTHON_USE_PYLONG_INTERNALS
+#define {{zerodiv_check('operand')}} \
+ if (unlikely(zerodivision_check && ((operand) == 0))) { \
+ PyErr_SetString(PyExc_ZeroDivisionError, "integer division{{if op == 'Remainder'}} or modulo{{endif}} by zero"); \
+ return NULL; \
+ }
+#endif
+{{endif}}
+
+static {{c_ret_type}} {{cfunc_name}}(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, int inplace, int zerodivision_check) {
+ // Prevent "unused" warnings.
+ (void)inplace;
+ (void)zerodivision_check;
+
+ {{if op in ('Eq', 'Ne')}}
+ if (op1 == op2) {
+ {{return_true if op == 'Eq' else return_false}};
+ }
+ {{endif}}
+
+ #if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_CheckExact({{pyval}}))) {
+ const long {{'a' if order == 'CObj' else 'b'}} = intval;
+ {{if c_op in '+-%' or op == 'FloorDivide'}}
+ long x;
+ {{endif}}
+ long {{ival}} = PyInt_AS_LONG({{pyval}});
+
+ {{if op in ('Eq', 'Ne')}}
+ if (a {{c_op}} b) {
+ {{return_true}};
+ } else {
+ {{return_false}};
+ }
+ {{elif c_op in '+-'}}
+ // adapted from intobject.c in Py2.7:
+ // casts in the line below avoid undefined behaviour on overflow
+ x = (long)((unsigned long)a {{c_op}} b);
+ if (likely((x^a) >= 0 || (x^{{ '~' if op == 'Subtract' else '' }}b) >= 0))
+ return PyInt_FromLong(x);
+ return PyLong_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
+ {{elif c_op == '%'}}
+ {{zerodiv_check('b')}}
+ // see ExprNodes.py :: mod_int_utility_code
+ x = a % b;
+ x += ((x != 0) & ((x ^ b) < 0)) * b;
+ return PyInt_FromLong(x);
+ {{elif op == 'TrueDivide'}}
+ {{zerodiv_check('b')}}
if (8 * sizeof(long) <= 53 || likely(labs({{ival}}) <= ((PY_LONG_LONG)1 << 53))) {
- return PyFloat_FromDouble((double)a / (double)b);
- }
- // let Python do the rounding
- return PyInt_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
- {{elif op == 'FloorDivide'}}
- // INT_MIN / -1 is the only case that overflows, b == 0 is an error case
- {{zerodiv_check('b')}}
- if (unlikely(b == -1 && ((unsigned long)a) == 0-(unsigned long)a))
- return PyInt_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
- else {
- long q, r;
- // see ExprNodes.py :: div_int_utility_code
- q = a / b;
- r = a - q*b;
- q -= ((r != 0) & ((r ^ b) < 0));
- x = q;
- }
- return PyInt_FromLong(x);
- {{elif op == 'Lshift'}}
- if (likely(b < (int)(sizeof(long)*8) && a == (a << b) >> b) || !a) {
- return PyInt_FromLong(a {{c_op}} b);
- }
- {{else}}
- // other operations are safe, no overflow
- return PyInt_FromLong(a {{c_op}} b);
- {{endif}}
- }
- #endif
-
- #if CYTHON_USE_PYLONG_INTERNALS
- if (likely(PyLong_CheckExact({{pyval}}))) {
- const long {{'a' if order == 'CObj' else 'b'}} = intval;
- long {{ival}}{{if op not in ('Eq', 'Ne')}}, x{{endif}};
- {{if op not in ('Eq', 'Ne', 'TrueDivide')}}
-#ifdef HAVE_LONG_LONG
- const PY_LONG_LONG ll{{'a' if order == 'CObj' else 'b'}} = intval;
- PY_LONG_LONG ll{{ival}}, llx;
-#endif
- {{endif}}
- const digit* digits = ((PyLongObject*){{pyval}})->ob_digit;
- const Py_ssize_t size = Py_SIZE({{pyval}});
- // handle most common case first to avoid indirect branch and optimise branch prediction
- if (likely(__Pyx_sst_abs(size) <= 1)) {
- {{ival}} = likely(size) ? digits[0] : 0;
- if (size == -1) {{ival}} = -{{ival}};
- } else {
- switch (size) {
- {{for _size in range(2, 5)}}
- {{for _case in (-_size, _size)}}
- case {{_case}}:
- if (8 * sizeof(long) - 1 > {{_size}} * PyLong_SHIFT{{if op == 'TrueDivide'}} && {{_size-1}} * PyLong_SHIFT < 53{{endif}}) {
- {{ival}} = {{'-' if _case < 0 else ''}}(long) {{pylong_join(_size, 'digits')}};
- break;
- {{if op not in ('Eq', 'Ne', 'TrueDivide')}}
-#ifdef HAVE_LONG_LONG
- } else if (8 * sizeof(PY_LONG_LONG) - 1 > {{_size}} * PyLong_SHIFT) {
- ll{{ival}} = {{'-' if _case < 0 else ''}}(PY_LONG_LONG) {{pylong_join(_size, 'digits', 'unsigned PY_LONG_LONG')}};
- goto long_long;
-#endif
- {{endif}}
- }
- // if size doesn't fit into a long or PY_LONG_LONG anymore, fall through to default
+ return PyFloat_FromDouble((double)a / (double)b);
+ }
+ // let Python do the rounding
+ return PyInt_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
+ {{elif op == 'FloorDivide'}}
+ // INT_MIN / -1 is the only case that overflows, b == 0 is an error case
+ {{zerodiv_check('b')}}
+ if (unlikely(b == -1 && ((unsigned long)a) == 0-(unsigned long)a))
+ return PyInt_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
+ else {
+ long q, r;
+ // see ExprNodes.py :: div_int_utility_code
+ q = a / b;
+ r = a - q*b;
+ q -= ((r != 0) & ((r ^ b) < 0));
+ x = q;
+ }
+ return PyInt_FromLong(x);
+ {{elif op == 'Lshift'}}
+ if (likely(b < (int)(sizeof(long)*8) && a == (a << b) >> b) || !a) {
+ return PyInt_FromLong(a {{c_op}} b);
+ }
+ {{else}}
+ // other operations are safe, no overflow
+ return PyInt_FromLong(a {{c_op}} b);
+ {{endif}}
+ }
+ #endif
+
+ #if CYTHON_USE_PYLONG_INTERNALS
+ if (likely(PyLong_CheckExact({{pyval}}))) {
+ const long {{'a' if order == 'CObj' else 'b'}} = intval;
+ long {{ival}}{{if op not in ('Eq', 'Ne')}}, x{{endif}};
+ {{if op not in ('Eq', 'Ne', 'TrueDivide')}}
+#ifdef HAVE_LONG_LONG
+ const PY_LONG_LONG ll{{'a' if order == 'CObj' else 'b'}} = intval;
+ PY_LONG_LONG ll{{ival}}, llx;
+#endif
+ {{endif}}
+ const digit* digits = ((PyLongObject*){{pyval}})->ob_digit;
+ const Py_ssize_t size = Py_SIZE({{pyval}});
+ // handle most common case first to avoid indirect branch and optimise branch prediction
+ if (likely(__Pyx_sst_abs(size) <= 1)) {
+ {{ival}} = likely(size) ? digits[0] : 0;
+ if (size == -1) {{ival}} = -{{ival}};
+ } else {
+ switch (size) {
+ {{for _size in range(2, 5)}}
+ {{for _case in (-_size, _size)}}
+ case {{_case}}:
+ if (8 * sizeof(long) - 1 > {{_size}} * PyLong_SHIFT{{if op == 'TrueDivide'}} && {{_size-1}} * PyLong_SHIFT < 53{{endif}}) {
+ {{ival}} = {{'-' if _case < 0 else ''}}(long) {{pylong_join(_size, 'digits')}};
+ break;
+ {{if op not in ('Eq', 'Ne', 'TrueDivide')}}
+#ifdef HAVE_LONG_LONG
+ } else if (8 * sizeof(PY_LONG_LONG) - 1 > {{_size}} * PyLong_SHIFT) {
+ ll{{ival}} = {{'-' if _case < 0 else ''}}(PY_LONG_LONG) {{pylong_join(_size, 'digits', 'unsigned PY_LONG_LONG')}};
+ goto long_long;
+#endif
+ {{endif}}
+ }
+ // if size doesn't fit into a long or PY_LONG_LONG anymore, fall through to default
CYTHON_FALLTHROUGH;
- {{endfor}}
- {{endfor}}
-
- {{if op in ('Eq', 'Ne')}}
- #if PyLong_SHIFT < 30 && PyLong_SHIFT != 15
- // unusual setup - your fault
- default: return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
- PyLong_Type.tp_richcompare({{'op1, op2' if order == 'ObjC' else 'op2, op1'}}, Py_{{op.upper()}}));
- #else
- // too large for the long values we allow => definitely not equal
- default: {{return_false if op == 'Eq' else return_true}};
- #endif
- {{else}}
- default: return PyLong_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
- {{endif}}
- }
- }
- {{if op in ('Eq', 'Ne')}}
- if (a {{c_op}} b) {
- {{return_true}};
- } else {
- {{return_false}};
- }
- {{else}}
- {{if c_op == '%'}}
- {{zerodiv_check('b')}}
- // see ExprNodes.py :: mod_int_utility_code
- x = a % b;
- x += ((x != 0) & ((x ^ b) < 0)) * b;
- {{elif op == 'TrueDivide'}}
- {{zerodiv_check('b')}}
+ {{endfor}}
+ {{endfor}}
+
+ {{if op in ('Eq', 'Ne')}}
+ #if PyLong_SHIFT < 30 && PyLong_SHIFT != 15
+ // unusual setup - your fault
+ default: return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
+ PyLong_Type.tp_richcompare({{'op1, op2' if order == 'ObjC' else 'op2, op1'}}, Py_{{op.upper()}}));
+ #else
+ // too large for the long values we allow => definitely not equal
+ default: {{return_false if op == 'Eq' else return_true}};
+ #endif
+ {{else}}
+ default: return PyLong_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
+ {{endif}}
+ }
+ }
+ {{if op in ('Eq', 'Ne')}}
+ if (a {{c_op}} b) {
+ {{return_true}};
+ } else {
+ {{return_false}};
+ }
+ {{else}}
+ {{if c_op == '%'}}
+ {{zerodiv_check('b')}}
+ // see ExprNodes.py :: mod_int_utility_code
+ x = a % b;
+ x += ((x != 0) & ((x ^ b) < 0)) * b;
+ {{elif op == 'TrueDivide'}}
+ {{zerodiv_check('b')}}
if ((8 * sizeof(long) <= 53 || likely(labs({{ival}}) <= ((PY_LONG_LONG)1 << 53)))
- || __Pyx_sst_abs(size) <= 52 / PyLong_SHIFT) {
- return PyFloat_FromDouble((double)a / (double)b);
- }
- return PyLong_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
- {{elif op == 'FloorDivide'}}
- {{zerodiv_check('b')}}
- {
- long q, r;
- // see ExprNodes.py :: div_int_utility_code
- q = a / b;
- r = a - q*b;
- q -= ((r != 0) & ((r ^ b) < 0));
- x = q;
- }
- {{else}}
- x = a {{c_op}} b;
- {{if op == 'Lshift'}}
-#ifdef HAVE_LONG_LONG
- if (unlikely(!(b < (int)(sizeof(long)*8) && a == x >> b)) && a) {
- ll{{ival}} = {{ival}};
- goto long_long;
- }
-#else
- if (likely(b < (int)(sizeof(long)*8) && a == x >> b) || !a) /* execute return statement below */
-#endif
- {{endif}}
- {{endif}}
- return PyLong_FromLong(x);
-
- {{if op != 'TrueDivide'}}
-#ifdef HAVE_LONG_LONG
- long_long:
- {{if c_op == '%'}}
- // see ExprNodes.py :: mod_int_utility_code
- llx = lla % llb;
- llx += ((llx != 0) & ((llx ^ llb) < 0)) * llb;
- {{elif op == 'FloorDivide'}}
- {
- PY_LONG_LONG q, r;
- // see ExprNodes.py :: div_int_utility_code
- q = lla / llb;
- r = lla - q*llb;
- q -= ((r != 0) & ((r ^ llb) < 0));
- llx = q;
- }
- {{else}}
- llx = lla {{c_op}} llb;
- {{if op == 'Lshift'}}
- if (likely(lla == llx >> llb)) /* then execute 'return' below */
- {{endif}}
- {{endif}}
- return PyLong_FromLongLong(llx);
-#endif
- {{endif}}{{# if op != 'TrueDivide' #}}
- {{endif}}{{# if op in ('Eq', 'Ne') #}}
- }
- #endif
-
- {{if c_op in '+-' or op in ('TrueDivide', 'Eq', 'Ne')}}
- if (PyFloat_CheckExact({{pyval}})) {
- const long {{'a' if order == 'CObj' else 'b'}} = intval;
- double {{ival}} = PyFloat_AS_DOUBLE({{pyval}});
- {{if op in ('Eq', 'Ne')}}
- if ((double)a {{c_op}} (double)b) {
- {{return_true}};
- } else {
- {{return_false}};
- }
- {{else}}
- double result;
- {{if op == 'TrueDivide'}}
- if (unlikely(zerodivision_check && b == 0)) {
- PyErr_SetString(PyExc_ZeroDivisionError, "float division by zero");
- return NULL;
- }
- {{endif}}
- // copied from floatobject.c in Py3.5:
+ || __Pyx_sst_abs(size) <= 52 / PyLong_SHIFT) {
+ return PyFloat_FromDouble((double)a / (double)b);
+ }
+ return PyLong_Type.tp_as_number->nb_{{slot_name}}(op1, op2);
+ {{elif op == 'FloorDivide'}}
+ {{zerodiv_check('b')}}
+ {
+ long q, r;
+ // see ExprNodes.py :: div_int_utility_code
+ q = a / b;
+ r = a - q*b;
+ q -= ((r != 0) & ((r ^ b) < 0));
+ x = q;
+ }
+ {{else}}
+ x = a {{c_op}} b;
+ {{if op == 'Lshift'}}
+#ifdef HAVE_LONG_LONG
+ if (unlikely(!(b < (int)(sizeof(long)*8) && a == x >> b)) && a) {
+ ll{{ival}} = {{ival}};
+ goto long_long;
+ }
+#else
+ if (likely(b < (int)(sizeof(long)*8) && a == x >> b) || !a) /* execute return statement below */
+#endif
+ {{endif}}
+ {{endif}}
+ return PyLong_FromLong(x);
+
+ {{if op != 'TrueDivide'}}
+#ifdef HAVE_LONG_LONG
+ long_long:
+ {{if c_op == '%'}}
+ // see ExprNodes.py :: mod_int_utility_code
+ llx = lla % llb;
+ llx += ((llx != 0) & ((llx ^ llb) < 0)) * llb;
+ {{elif op == 'FloorDivide'}}
+ {
+ PY_LONG_LONG q, r;
+ // see ExprNodes.py :: div_int_utility_code
+ q = lla / llb;
+ r = lla - q*llb;
+ q -= ((r != 0) & ((r ^ llb) < 0));
+ llx = q;
+ }
+ {{else}}
+ llx = lla {{c_op}} llb;
+ {{if op == 'Lshift'}}
+ if (likely(lla == llx >> llb)) /* then execute 'return' below */
+ {{endif}}
+ {{endif}}
+ return PyLong_FromLongLong(llx);
+#endif
+ {{endif}}{{# if op != 'TrueDivide' #}}
+ {{endif}}{{# if op in ('Eq', 'Ne') #}}
+ }
+ #endif
+
+ {{if c_op in '+-' or op in ('TrueDivide', 'Eq', 'Ne')}}
+ if (PyFloat_CheckExact({{pyval}})) {
+ const long {{'a' if order == 'CObj' else 'b'}} = intval;
+ double {{ival}} = PyFloat_AS_DOUBLE({{pyval}});
+ {{if op in ('Eq', 'Ne')}}
+ if ((double)a {{c_op}} (double)b) {
+ {{return_true}};
+ } else {
+ {{return_false}};
+ }
+ {{else}}
+ double result;
+ {{if op == 'TrueDivide'}}
+ if (unlikely(zerodivision_check && b == 0)) {
+ PyErr_SetString(PyExc_ZeroDivisionError, "float division by zero");
+ return NULL;
+ }
+ {{endif}}
+ // copied from floatobject.c in Py3.5:
// PyFPE_START_PROTECT("{{op.lower() if not op.endswith('Divide') else 'divide'}}", return NULL)
- result = ((double)a) {{c_op}} (double)b;
+ result = ((double)a) {{c_op}} (double)b;
// PyFPE_END_PROTECT(result)
- return PyFloat_FromDouble(result);
- {{endif}}
- }
- {{endif}}
-
- {{if op in ('Eq', 'Ne')}}
- return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
- PyObject_RichCompare(op1, op2, Py_{{op.upper()}}));
- {{else}}
- return (inplace ? PyNumber_InPlace{{op}} : PyNumber_{{op}})(op1, op2);
- {{endif}}
-}
-#endif
-
-/////////////// PyFloatBinop.proto ///////////////
-
-{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
-#if !CYTHON_COMPILING_IN_PYPY
-static {{c_ret_type}} __Pyx_PyFloat_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(PyObject *op1, PyObject *op2, double floatval, int inplace, int zerodivision_check); /*proto*/
-#else
-#define __Pyx_PyFloat_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(op1, op2, floatval, inplace, zerodivision_check) \
- {{if op in ('Eq', 'Ne')}}{{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(PyObject_RichCompare(op1, op2, Py_{{op.upper()}}))
- {{elif op == 'Divide'}}((inplace ? __Pyx_PyNumber_InPlaceDivide(op1, op2) : __Pyx_PyNumber_Divide(op1, op2)))
- {{else}}(inplace ? PyNumber_InPlace{{op}}(op1, op2) : PyNumber_{{op}}(op1, op2))
- {{endif}}
-#endif
-
-/////////////// PyFloatBinop ///////////////
-
-#if !CYTHON_COMPILING_IN_PYPY
-{{py: from Cython.Utility import pylong_join }}
-{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
-{{py: return_true = 'Py_RETURN_TRUE' if ret_type.is_pyobject else 'return 1'}}
-{{py: return_false = 'Py_RETURN_FALSE' if ret_type.is_pyobject else 'return 0'}}
-{{py: pyval, fval = ('op2', 'b') if order == 'CObj' else ('op1', 'a') }}
-{{py: cfunc_name = '__Pyx_PyFloat_%s%s%s' % ('' if ret_type.is_pyobject else 'Bool', op, order) }}
-{{py: zerodiv_check = lambda operand, _cfunc_name=cfunc_name: '%s_ZeroDivisionError(%s)' % (_cfunc_name, operand)}}
-{{py:
-c_op = {
- 'Add': '+', 'Subtract': '-', 'TrueDivide': '/', 'Divide': '/', 'Remainder': '%',
- 'Eq': '==', 'Ne': '!=',
- }[op]
-}}
-
-{{if order == 'CObj' and c_op in '%/'}}
-#define {{zerodiv_check('operand')}} if (unlikely(zerodivision_check && ((operand) == 0))) { \
- PyErr_SetString(PyExc_ZeroDivisionError, "float division{{if op == 'Remainder'}} or modulo{{endif}} by zero"); \
- return NULL; \
-}
-{{endif}}
-
-static {{c_ret_type}} {{cfunc_name}}(PyObject *op1, PyObject *op2, double floatval, int inplace, int zerodivision_check) {
- const double {{'a' if order == 'CObj' else 'b'}} = floatval;
- double {{fval}}{{if op not in ('Eq', 'Ne')}}, result{{endif}};
- // Prevent "unused" warnings.
- (void)inplace;
- (void)zerodivision_check;
-
- {{if op in ('Eq', 'Ne')}}
- if (op1 == op2) {
- {{return_true if op == 'Eq' else return_false}};
- }
- {{endif}}
-
- if (likely(PyFloat_CheckExact({{pyval}}))) {
- {{fval}} = PyFloat_AS_DOUBLE({{pyval}});
- {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check(fval)}}{{endif}}
- } else
-
- #if PY_MAJOR_VERSION < 3
- if (likely(PyInt_CheckExact({{pyval}}))) {
- {{fval}} = (double) PyInt_AS_LONG({{pyval}});
- {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check(fval)}}{{endif}}
- } else
- #endif
-
- if (likely(PyLong_CheckExact({{pyval}}))) {
- #if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*){{pyval}})->ob_digit;
- const Py_ssize_t size = Py_SIZE({{pyval}});
- switch (size) {
- case 0: {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check('0')}}{{else}}{{fval}} = 0.0;{{endif}} break;
- case -1: {{fval}} = -(double) digits[0]; break;
- case 1: {{fval}} = (double) digits[0]; break;
- {{for _size in (2, 3, 4)}}
- case -{{_size}}:
- case {{_size}}:
- if (8 * sizeof(unsigned long) > {{_size}} * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || ({{_size-1}} * PyLong_SHIFT < 53))) {
- {{fval}} = (double) {{pylong_join(_size, 'digits')}};
- // let CPython do its own float rounding from 2**53 on (max. consecutive integer in double float)
+ return PyFloat_FromDouble(result);
+ {{endif}}
+ }
+ {{endif}}
+
+ {{if op in ('Eq', 'Ne')}}
+ return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
+ PyObject_RichCompare(op1, op2, Py_{{op.upper()}}));
+ {{else}}
+ return (inplace ? PyNumber_InPlace{{op}} : PyNumber_{{op}})(op1, op2);
+ {{endif}}
+}
+#endif
+
+/////////////// PyFloatBinop.proto ///////////////
+
+{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
+#if !CYTHON_COMPILING_IN_PYPY
+static {{c_ret_type}} __Pyx_PyFloat_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(PyObject *op1, PyObject *op2, double floatval, int inplace, int zerodivision_check); /*proto*/
+#else
+#define __Pyx_PyFloat_{{'' if ret_type.is_pyobject else 'Bool'}}{{op}}{{order}}(op1, op2, floatval, inplace, zerodivision_check) \
+ {{if op in ('Eq', 'Ne')}}{{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(PyObject_RichCompare(op1, op2, Py_{{op.upper()}}))
+ {{elif op == 'Divide'}}((inplace ? __Pyx_PyNumber_InPlaceDivide(op1, op2) : __Pyx_PyNumber_Divide(op1, op2)))
+ {{else}}(inplace ? PyNumber_InPlace{{op}}(op1, op2) : PyNumber_{{op}}(op1, op2))
+ {{endif}}
+#endif
+
+/////////////// PyFloatBinop ///////////////
+
+#if !CYTHON_COMPILING_IN_PYPY
+{{py: from Cython.Utility import pylong_join }}
+{{py: c_ret_type = 'PyObject*' if ret_type.is_pyobject else 'int'}}
+{{py: return_true = 'Py_RETURN_TRUE' if ret_type.is_pyobject else 'return 1'}}
+{{py: return_false = 'Py_RETURN_FALSE' if ret_type.is_pyobject else 'return 0'}}
+{{py: pyval, fval = ('op2', 'b') if order == 'CObj' else ('op1', 'a') }}
+{{py: cfunc_name = '__Pyx_PyFloat_%s%s%s' % ('' if ret_type.is_pyobject else 'Bool', op, order) }}
+{{py: zerodiv_check = lambda operand, _cfunc_name=cfunc_name: '%s_ZeroDivisionError(%s)' % (_cfunc_name, operand)}}
+{{py:
+c_op = {
+ 'Add': '+', 'Subtract': '-', 'TrueDivide': '/', 'Divide': '/', 'Remainder': '%',
+ 'Eq': '==', 'Ne': '!=',
+ }[op]
+}}
+
+{{if order == 'CObj' and c_op in '%/'}}
+#define {{zerodiv_check('operand')}} if (unlikely(zerodivision_check && ((operand) == 0))) { \
+ PyErr_SetString(PyExc_ZeroDivisionError, "float division{{if op == 'Remainder'}} or modulo{{endif}} by zero"); \
+ return NULL; \
+}
+{{endif}}
+
+static {{c_ret_type}} {{cfunc_name}}(PyObject *op1, PyObject *op2, double floatval, int inplace, int zerodivision_check) {
+ const double {{'a' if order == 'CObj' else 'b'}} = floatval;
+ double {{fval}}{{if op not in ('Eq', 'Ne')}}, result{{endif}};
+ // Prevent "unused" warnings.
+ (void)inplace;
+ (void)zerodivision_check;
+
+ {{if op in ('Eq', 'Ne')}}
+ if (op1 == op2) {
+ {{return_true if op == 'Eq' else return_false}};
+ }
+ {{endif}}
+
+ if (likely(PyFloat_CheckExact({{pyval}}))) {
+ {{fval}} = PyFloat_AS_DOUBLE({{pyval}});
+ {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check(fval)}}{{endif}}
+ } else
+
+ #if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_CheckExact({{pyval}}))) {
+ {{fval}} = (double) PyInt_AS_LONG({{pyval}});
+ {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check(fval)}}{{endif}}
+ } else
+ #endif
+
+ if (likely(PyLong_CheckExact({{pyval}}))) {
+ #if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*){{pyval}})->ob_digit;
+ const Py_ssize_t size = Py_SIZE({{pyval}});
+ switch (size) {
+ case 0: {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check('0')}}{{else}}{{fval}} = 0.0;{{endif}} break;
+ case -1: {{fval}} = -(double) digits[0]; break;
+ case 1: {{fval}} = (double) digits[0]; break;
+ {{for _size in (2, 3, 4)}}
+ case -{{_size}}:
+ case {{_size}}:
+ if (8 * sizeof(unsigned long) > {{_size}} * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || ({{_size-1}} * PyLong_SHIFT < 53))) {
+ {{fval}} = (double) {{pylong_join(_size, 'digits')}};
+ // let CPython do its own float rounding from 2**53 on (max. consecutive integer in double float)
if ((8 * sizeof(unsigned long) < 53) || ({{_size}} * PyLong_SHIFT < 53) || ({{fval}} < (double) ((PY_LONG_LONG)1 << 53))) {
- if (size == {{-_size}})
- {{fval}} = -{{fval}};
- break;
- }
- }
- // Fall through if size doesn't fit safely into a double anymore.
- // It may not be obvious that this is a safe fall-through given the "fval < 2**53"
- // check above. However, the number of digits that CPython uses for a given PyLong
- // value is minimal, and together with the "(size-1) * SHIFT < 53" check above,
- // this should make it safe.
+ if (size == {{-_size}})
+ {{fval}} = -{{fval}};
+ break;
+ }
+ }
+ // Fall through if size doesn't fit safely into a double anymore.
+ // It may not be obvious that this is a safe fall-through given the "fval < 2**53"
+ // check above. However, the number of digits that CPython uses for a given PyLong
+ // value is minimal, and together with the "(size-1) * SHIFT < 53" check above,
+ // this should make it safe.
CYTHON_FALLTHROUGH;
- {{endfor}}
- default:
- #else
- {
- #endif
- {{if op in ('Eq', 'Ne')}}
- return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
- PyFloat_Type.tp_richcompare({{'op1, op2' if order == 'CObj' else 'op2, op1'}}, Py_{{op.upper()}}));
- {{else}}
- {{fval}} = PyLong_AsDouble({{pyval}});
- if (unlikely({{fval}} == -1.0 && PyErr_Occurred())) return NULL;
- {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check(fval)}}{{endif}}
- {{endif}}
- }
- } else {
- {{if op in ('Eq', 'Ne')}}
- return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
- PyObject_RichCompare(op1, op2, Py_{{op.upper()}}));
- {{elif op == 'Divide'}}
- return (inplace ? __Pyx_PyNumber_InPlaceDivide(op1, op2) : __Pyx_PyNumber_Divide(op1, op2));
- {{else}}
- return (inplace ? PyNumber_InPlace{{op}} : PyNumber_{{op}})(op1, op2);
- {{endif}}
- }
-
- {{if op in ('Eq', 'Ne')}}
- if (a {{c_op}} b) {
- {{return_true}};
- } else {
- {{return_false}};
- }
- {{else}}
- // copied from floatobject.c in Py3.5:
- {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check('b')}}{{endif}}
+ {{endfor}}
+ default:
+ #else
+ {
+ #endif
+ {{if op in ('Eq', 'Ne')}}
+ return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
+ PyFloat_Type.tp_richcompare({{'op1, op2' if order == 'CObj' else 'op2, op1'}}, Py_{{op.upper()}}));
+ {{else}}
+ {{fval}} = PyLong_AsDouble({{pyval}});
+ if (unlikely({{fval}} == -1.0 && PyErr_Occurred())) return NULL;
+ {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check(fval)}}{{endif}}
+ {{endif}}
+ }
+ } else {
+ {{if op in ('Eq', 'Ne')}}
+ return {{'' if ret_type.is_pyobject else '__Pyx_PyObject_IsTrueAndDecref'}}(
+ PyObject_RichCompare(op1, op2, Py_{{op.upper()}}));
+ {{elif op == 'Divide'}}
+ return (inplace ? __Pyx_PyNumber_InPlaceDivide(op1, op2) : __Pyx_PyNumber_Divide(op1, op2));
+ {{else}}
+ return (inplace ? PyNumber_InPlace{{op}} : PyNumber_{{op}})(op1, op2);
+ {{endif}}
+ }
+
+ {{if op in ('Eq', 'Ne')}}
+ if (a {{c_op}} b) {
+ {{return_true}};
+ } else {
+ {{return_false}};
+ }
+ {{else}}
+ // copied from floatobject.c in Py3.5:
+ {{if order == 'CObj' and c_op in '%/'}}{{zerodiv_check('b')}}{{endif}}
// PyFPE_START_PROTECT("{{op.lower() if not op.endswith('Divide') else 'divide'}}", return NULL)
- {{if c_op == '%'}}
- result = fmod(a, b);
- if (result)
- result += ((result < 0) ^ (b < 0)) * b;
- else
- result = copysign(0.0, b);
- {{else}}
- result = a {{c_op}} b;
- {{endif}}
+ {{if c_op == '%'}}
+ result = fmod(a, b);
+ if (result)
+ result += ((result < 0) ^ (b < 0)) * b;
+ else
+ result = copysign(0.0, b);
+ {{else}}
+ result = a {{c_op}} b;
+ {{endif}}
// PyFPE_END_PROTECT(result)
- return PyFloat_FromDouble(result);
- {{endif}}
-}
-#endif
+ return PyFloat_FromDouble(result);
+ {{endif}}
+}
+#endif
diff --git a/contrib/tools/cython/Cython/Utility/Overflow.c b/contrib/tools/cython/Cython/Utility/Overflow.c
index 0259c58f01..7add2b822d 100644
--- a/contrib/tools/cython/Cython/Utility/Overflow.c
+++ b/contrib/tools/cython/Cython/Utility/Overflow.c
@@ -47,12 +47,12 @@ static int __Pyx_check_twos_complement(void) {
#define __Pyx_div_const_no_overflow(a, b, overflow) ((a) / (b))
/////////////// Common.init ///////////////
-//@substitute: naming
+//@substitute: naming
-// FIXME: Propagate the error here instead of just printing it.
-if (unlikely(__Pyx_check_twos_complement())) {
- PyErr_WriteUnraisable($module_cname);
-}
+// FIXME: Propagate the error here instead of just printing it.
+if (unlikely(__Pyx_check_twos_complement())) {
+ PyErr_WriteUnraisable($module_cname);
+}
/////////////// BaseCaseUnsigned.proto ///////////////
@@ -87,13 +87,13 @@ static CYTHON_INLINE {{UINT}} __Pyx_mul_{{NAME}}_checking_overflow({{UINT}} a, {
{{UINT}} r = ({{UINT}}) big_r;
*overflow |= big_r != r;
return r;
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG
} else if ((sizeof({{UINT}}) < sizeof(unsigned PY_LONG_LONG))) {
- unsigned PY_LONG_LONG big_r = ((unsigned PY_LONG_LONG) a) * ((unsigned PY_LONG_LONG) b);
+ unsigned PY_LONG_LONG big_r = ((unsigned PY_LONG_LONG) a) * ((unsigned PY_LONG_LONG) b);
{{UINT}} r = ({{UINT}}) big_r;
*overflow |= big_r != r;
return r;
-#endif
+#endif
} else {
{{UINT}} prod = a * b;
double dprod = ((double) a) * ((double) b);
@@ -143,13 +143,13 @@ static CYTHON_INLINE {{INT}} __Pyx_add_{{NAME}}_checking_overflow({{INT}} a, {{I
{{INT}} r = ({{INT}}) big_r;
*overflow |= big_r != r;
return r;
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG
} else if ((sizeof({{INT}}) < sizeof(PY_LONG_LONG))) {
- PY_LONG_LONG big_r = ((PY_LONG_LONG) a) + ((PY_LONG_LONG) b);
+ PY_LONG_LONG big_r = ((PY_LONG_LONG) a) + ((PY_LONG_LONG) b);
{{INT}} r = ({{INT}}) big_r;
*overflow |= big_r != r;
return r;
-#endif
+#endif
} else {
// Signed overflow undefined, but unsigned overflow is well defined.
{{INT}} r = ({{INT}}) ((unsigned {{INT}}) a + (unsigned {{INT}}) b);
@@ -189,13 +189,13 @@ static CYTHON_INLINE {{INT}} __Pyx_mul_{{NAME}}_checking_overflow({{INT}} a, {{I
{{INT}} r = ({{INT}}) big_r;
*overflow |= big_r != r;
return ({{INT}}) r;
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG
} else if ((sizeof({{INT}}) < sizeof(PY_LONG_LONG))) {
- PY_LONG_LONG big_r = ((PY_LONG_LONG) a) * ((PY_LONG_LONG) b);
+ PY_LONG_LONG big_r = ((PY_LONG_LONG) a) * ((PY_LONG_LONG) b);
{{INT}} r = ({{INT}}) big_r;
*overflow |= big_r != r;
return ({{INT}}) r;
-#endif
+#endif
} else {
{{INT}} prod = a * b;
double dprod = ((double) a) * ((double) b);
@@ -230,20 +230,20 @@ static CYTHON_INLINE {{INT}} __Pyx_div_{{NAME}}_checking_overflow({{INT}} a, {{I
/////////////// SizeCheck.init ///////////////
-//@substitute: naming
+//@substitute: naming
-// FIXME: Propagate the error here instead of just printing it.
-if (unlikely(__Pyx_check_sane_{{NAME}}())) {
- PyErr_WriteUnraisable($module_cname);
-}
+// FIXME: Propagate the error here instead of just printing it.
+if (unlikely(__Pyx_check_sane_{{NAME}}())) {
+ PyErr_WriteUnraisable($module_cname);
+}
/////////////// SizeCheck.proto ///////////////
static int __Pyx_check_sane_{{NAME}}(void) {
if (((sizeof({{TYPE}}) <= sizeof(int)) ||
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG
(sizeof({{TYPE}}) == sizeof(PY_LONG_LONG)) ||
-#endif
+#endif
(sizeof({{TYPE}}) == sizeof(long)))) {
return 0;
} else {
@@ -268,10 +268,10 @@ static CYTHON_INLINE {{TYPE}} __Pyx_{{BINOP}}_{{NAME}}_checking_overflow({{TYPE}
return ({{TYPE}}) __Pyx_{{BINOP}}_unsigned_int_checking_overflow(a, b, overflow);
} else if ((sizeof({{TYPE}}) == sizeof(unsigned long))) {
return ({{TYPE}}) __Pyx_{{BINOP}}_unsigned_long_checking_overflow(a, b, overflow);
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG
} else if ((sizeof({{TYPE}}) == sizeof(unsigned PY_LONG_LONG))) {
return ({{TYPE}}) __Pyx_{{BINOP}}_unsigned_long_long_checking_overflow(a, b, overflow);
-#endif
+#endif
} else {
abort(); return 0; /* handled elsewhere */
}
@@ -280,10 +280,10 @@ static CYTHON_INLINE {{TYPE}} __Pyx_{{BINOP}}_{{NAME}}_checking_overflow({{TYPE}
return ({{TYPE}}) __Pyx_{{BINOP}}_int_checking_overflow(a, b, overflow);
} else if ((sizeof({{TYPE}}) == sizeof(long))) {
return ({{TYPE}}) __Pyx_{{BINOP}}_long_checking_overflow(a, b, overflow);
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG
} else if ((sizeof({{TYPE}}) == sizeof(PY_LONG_LONG))) {
return ({{TYPE}}) __Pyx_{{BINOP}}_long_long_checking_overflow(a, b, overflow);
-#endif
+#endif
} else {
abort(); return 0; /* handled elsewhere */
}
@@ -302,10 +302,10 @@ static CYTHON_INLINE {{TYPE}} __Pyx_lshift_{{NAME}}_checking_overflow({{TYPE}} a
}
#define __Pyx_lshift_const_{{NAME}}_checking_overflow __Pyx_lshift_{{NAME}}_checking_overflow
-
-/////////////// UnaryNegOverflows.proto ///////////////
-
-//FIXME: shouldn't the macro name be prefixed by "__Pyx_" ? Too late now, I guess...
-// from intobject.c
-#define UNARY_NEG_WOULD_OVERFLOW(x) \
- (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
+
+/////////////// UnaryNegOverflows.proto ///////////////
+
+//FIXME: shouldn't the macro name be prefixed by "__Pyx_" ? Too late now, I guess...
+// from intobject.c
+#define UNARY_NEG_WOULD_OVERFLOW(x) \
+ (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
diff --git a/contrib/tools/cython/Cython/Utility/Profile.c b/contrib/tools/cython/Cython/Utility/Profile.c
index 921eb67529..5844bae89d 100644
--- a/contrib/tools/cython/Cython/Utility/Profile.c
+++ b/contrib/tools/cython/Cython/Utility/Profile.c
@@ -6,21 +6,21 @@
// but maybe some other profilers don't.
#ifndef CYTHON_PROFILE
-#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON
- #define CYTHON_PROFILE 0
-#else
+#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON
+ #define CYTHON_PROFILE 0
+#else
#define CYTHON_PROFILE 1
#endif
-#endif
-
-#ifndef CYTHON_TRACE_NOGIL
- #define CYTHON_TRACE_NOGIL 0
-#else
- #if CYTHON_TRACE_NOGIL && !defined(CYTHON_TRACE)
- #define CYTHON_TRACE 1
- #endif
-#endif
-
+#endif
+
+#ifndef CYTHON_TRACE_NOGIL
+ #define CYTHON_TRACE_NOGIL 0
+#else
+ #if CYTHON_TRACE_NOGIL && !defined(CYTHON_TRACE)
+ #define CYTHON_TRACE 1
+ #endif
+#endif
+
#ifndef CYTHON_TRACE
#define CYTHON_TRACE 0
#endif
@@ -41,10 +41,10 @@
#if CYTHON_PROFILE_REUSE_FRAME
#define CYTHON_FRAME_MODIFIER static
- #define CYTHON_FRAME_DEL(frame)
+ #define CYTHON_FRAME_DEL(frame)
#else
#define CYTHON_FRAME_MODIFIER
- #define CYTHON_FRAME_DEL(frame) Py_CLEAR(frame)
+ #define CYTHON_FRAME_DEL(frame) Py_CLEAR(frame)
#endif
#define __Pyx_TraceDeclarations \
@@ -54,7 +54,7 @@
#define __Pyx_TraceFrameInit(codeobj) \
if (codeobj) $frame_code_cname = (PyCodeObject*) codeobj;
-
+
#if PY_VERSION_HEX >= 0x030b00a2
#define __Pyx_IsTracing(tstate, check_tracing, check_funcs) \
(unlikely((tstate)->cframe->use_tracing) && \
@@ -99,175 +99,175 @@
#endif
- #ifdef WITH_THREAD
- #define __Pyx_TraceCall(funcname, srcfile, firstlineno, nogil, goto_error) \
- if (nogil) { \
- if (CYTHON_TRACE_NOGIL) { \
- PyThreadState *tstate; \
- PyGILState_STATE state = PyGILState_Ensure(); \
+ #ifdef WITH_THREAD
+ #define __Pyx_TraceCall(funcname, srcfile, firstlineno, nogil, goto_error) \
+ if (nogil) { \
+ if (CYTHON_TRACE_NOGIL) { \
+ PyThreadState *tstate; \
+ PyGILState_STATE state = PyGILState_Ensure(); \
tstate = __Pyx_PyThreadState_Current; \
if (__Pyx_IsTracing(tstate, 1, 1)) { \
__Pyx_use_tracing = __Pyx_TraceSetupAndCall(&$frame_code_cname, &$frame_cname, tstate, funcname, srcfile, firstlineno); \
- } \
- PyGILState_Release(state); \
- if (unlikely(__Pyx_use_tracing < 0)) goto_error; \
- } \
- } else { \
- PyThreadState* tstate = PyThreadState_GET(); \
+ } \
+ PyGILState_Release(state); \
+ if (unlikely(__Pyx_use_tracing < 0)) goto_error; \
+ } \
+ } else { \
+ PyThreadState* tstate = PyThreadState_GET(); \
if (__Pyx_IsTracing(tstate, 1, 1)) { \
__Pyx_use_tracing = __Pyx_TraceSetupAndCall(&$frame_code_cname, &$frame_cname, tstate, funcname, srcfile, firstlineno); \
- if (unlikely(__Pyx_use_tracing < 0)) goto_error; \
- } \
+ if (unlikely(__Pyx_use_tracing < 0)) goto_error; \
+ } \
}
- #else
- #define __Pyx_TraceCall(funcname, srcfile, firstlineno, nogil, goto_error) \
- { PyThreadState* tstate = PyThreadState_GET(); \
+ #else
+ #define __Pyx_TraceCall(funcname, srcfile, firstlineno, nogil, goto_error) \
+ { PyThreadState* tstate = PyThreadState_GET(); \
if (__Pyx_IsTracing(tstate, 1, 1)) { \
__Pyx_use_tracing = __Pyx_TraceSetupAndCall(&$frame_code_cname, &$frame_cname, tstate, funcname, srcfile, firstlineno); \
- if (unlikely(__Pyx_use_tracing < 0)) goto_error; \
- } \
- }
- #endif
+ if (unlikely(__Pyx_use_tracing < 0)) goto_error; \
+ } \
+ }
+ #endif
#define __Pyx_TraceException() \
- if (likely(!__Pyx_use_tracing)); else { \
+ if (likely(!__Pyx_use_tracing)); else { \
PyThreadState* tstate = __Pyx_PyThreadState_Current; \
if (__Pyx_IsTracing(tstate, 0, 1)) { \
__Pyx_EnterTracing(tstate); \
- PyObject *exc_info = __Pyx_GetExceptionTuple(tstate); \
- if (exc_info) { \
- if (CYTHON_TRACE && tstate->c_tracefunc) \
- tstate->c_tracefunc( \
- tstate->c_traceobj, $frame_cname, PyTrace_EXCEPTION, exc_info); \
- tstate->c_profilefunc( \
- tstate->c_profileobj, $frame_cname, PyTrace_EXCEPTION, exc_info); \
- Py_DECREF(exc_info); \
- } \
+ PyObject *exc_info = __Pyx_GetExceptionTuple(tstate); \
+ if (exc_info) { \
+ if (CYTHON_TRACE && tstate->c_tracefunc) \
+ tstate->c_tracefunc( \
+ tstate->c_traceobj, $frame_cname, PyTrace_EXCEPTION, exc_info); \
+ tstate->c_profilefunc( \
+ tstate->c_profileobj, $frame_cname, PyTrace_EXCEPTION, exc_info); \
+ Py_DECREF(exc_info); \
+ } \
__Pyx_LeaveTracing(tstate); \
} \
}
- static void __Pyx_call_return_trace_func(PyThreadState *tstate, PyFrameObject *frame, PyObject *result) {
- PyObject *type, *value, *traceback;
+ static void __Pyx_call_return_trace_func(PyThreadState *tstate, PyFrameObject *frame, PyObject *result) {
+ PyObject *type, *value, *traceback;
__Pyx_ErrFetchInState(tstate, &type, &value, &traceback);
__Pyx_EnterTracing(tstate);
- if (CYTHON_TRACE && tstate->c_tracefunc)
- tstate->c_tracefunc(tstate->c_traceobj, frame, PyTrace_RETURN, result);
- if (tstate->c_profilefunc)
- tstate->c_profilefunc(tstate->c_profileobj, frame, PyTrace_RETURN, result);
- CYTHON_FRAME_DEL(frame);
+ if (CYTHON_TRACE && tstate->c_tracefunc)
+ tstate->c_tracefunc(tstate->c_traceobj, frame, PyTrace_RETURN, result);
+ if (tstate->c_profilefunc)
+ tstate->c_profilefunc(tstate->c_profileobj, frame, PyTrace_RETURN, result);
+ CYTHON_FRAME_DEL(frame);
__Pyx_LeaveTracing(tstate);
__Pyx_ErrRestoreInState(tstate, type, value, traceback);
}
- #ifdef WITH_THREAD
- #define __Pyx_TraceReturn(result, nogil) \
- if (likely(!__Pyx_use_tracing)); else { \
- if (nogil) { \
- if (CYTHON_TRACE_NOGIL) { \
- PyThreadState *tstate; \
- PyGILState_STATE state = PyGILState_Ensure(); \
+ #ifdef WITH_THREAD
+ #define __Pyx_TraceReturn(result, nogil) \
+ if (likely(!__Pyx_use_tracing)); else { \
+ if (nogil) { \
+ if (CYTHON_TRACE_NOGIL) { \
+ PyThreadState *tstate; \
+ PyGILState_STATE state = PyGILState_Ensure(); \
tstate = __Pyx_PyThreadState_Current; \
if (__Pyx_IsTracing(tstate, 0, 0)) { \
- __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result); \
- } \
- PyGILState_Release(state); \
- } \
- } else { \
+ __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result); \
+ } \
+ PyGILState_Release(state); \
+ } \
+ } else { \
PyThreadState* tstate = __Pyx_PyThreadState_Current; \
if (__Pyx_IsTracing(tstate, 0, 0)) { \
- __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result); \
- } \
- } \
- }
- #else
- #define __Pyx_TraceReturn(result, nogil) \
- if (likely(!__Pyx_use_tracing)); else { \
+ __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result); \
+ } \
+ } \
+ }
+ #else
+ #define __Pyx_TraceReturn(result, nogil) \
+ if (likely(!__Pyx_use_tracing)); else { \
PyThreadState* tstate = __Pyx_PyThreadState_Current; \
if (__Pyx_IsTracing(tstate, 0, 0)) { \
- __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result); \
- } \
- }
- #endif
-
+ __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result); \
+ } \
+ }
+ #endif
+
static PyCodeObject *__Pyx_createFrameCodeObject(const char *funcname, const char *srcfile, int firstlineno); /*proto*/
static int __Pyx_TraceSetupAndCall(PyCodeObject** code, PyFrameObject** frame, PyThreadState* tstate, const char *funcname, const char *srcfile, int firstlineno); /*proto*/
#else
#define __Pyx_TraceDeclarations
- #define __Pyx_TraceFrameInit(codeobj)
- // mark error label as used to avoid compiler warnings
+ #define __Pyx_TraceFrameInit(codeobj)
+ // mark error label as used to avoid compiler warnings
#define __Pyx_TraceCall(funcname, srcfile, firstlineno, nogil, goto_error) if ((1)); else goto_error;
#define __Pyx_TraceException()
- #define __Pyx_TraceReturn(result, nogil)
+ #define __Pyx_TraceReturn(result, nogil)
#endif /* CYTHON_PROFILE */
#if CYTHON_TRACE
- // see call_trace_protected() in CPython's ceval.c
- static int __Pyx_call_line_trace_func(PyThreadState *tstate, PyFrameObject *frame, int lineno) {
- int ret;
- PyObject *type, *value, *traceback;
+ // see call_trace_protected() in CPython's ceval.c
+ static int __Pyx_call_line_trace_func(PyThreadState *tstate, PyFrameObject *frame, int lineno) {
+ int ret;
+ PyObject *type, *value, *traceback;
__Pyx_ErrFetchInState(tstate, &type, &value, &traceback);
- __Pyx_PyFrame_SetLineNumber(frame, lineno);
+ __Pyx_PyFrame_SetLineNumber(frame, lineno);
__Pyx_EnterTracing(tstate);
- ret = tstate->c_tracefunc(tstate->c_traceobj, frame, PyTrace_LINE, NULL);
+ ret = tstate->c_tracefunc(tstate->c_traceobj, frame, PyTrace_LINE, NULL);
__Pyx_LeaveTracing(tstate);
- if (likely(!ret)) {
+ if (likely(!ret)) {
__Pyx_ErrRestoreInState(tstate, type, value, traceback);
- } else {
- Py_XDECREF(type);
- Py_XDECREF(value);
- Py_XDECREF(traceback);
- }
- return ret;
- }
-
- #ifdef WITH_THREAD
- #define __Pyx_TraceLine(lineno, nogil, goto_error) \
- if (likely(!__Pyx_use_tracing)); else { \
+ } else {
+ Py_XDECREF(type);
+ Py_XDECREF(value);
+ Py_XDECREF(traceback);
+ }
+ return ret;
+ }
+
+ #ifdef WITH_THREAD
+ #define __Pyx_TraceLine(lineno, nogil, goto_error) \
+ if (likely(!__Pyx_use_tracing)); else { \
// mark error label as used to avoid compiler warnings \
if ((1)); else goto_error; \
- if (nogil) { \
- if (CYTHON_TRACE_NOGIL) { \
- int ret = 0; \
- PyThreadState *tstate; \
- PyGILState_STATE state = PyGILState_Ensure(); \
+ if (nogil) { \
+ if (CYTHON_TRACE_NOGIL) { \
+ int ret = 0; \
+ PyThreadState *tstate; \
+ PyGILState_STATE state = PyGILState_Ensure(); \
tstate = __Pyx_PyThreadState_Current; \
if (__Pyx_IsTracing(tstate, 0, 0) && tstate->c_tracefunc && $frame_cname->f_trace) { \
- ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno); \
- } \
- PyGILState_Release(state); \
+ ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno); \
+ } \
+ PyGILState_Release(state); \
// XXX https://github.com/cython/cython/issues/2274 \
if (unlikely(ret)) { fprintf(stderr, "cython: line_trace_func returned %d\n", ret); } \
- } \
- } else { \
+ } \
+ } else { \
PyThreadState* tstate = __Pyx_PyThreadState_Current; \
if (__Pyx_IsTracing(tstate, 0, 0) && tstate->c_tracefunc && $frame_cname->f_trace) { \
- int ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno); \
+ int ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno); \
// XXX https://github.com/cython/cython/issues/2274 \
if (unlikely(ret)) { fprintf(stderr, "cython: line_trace_func returned %d\n", ret); } \
- } \
- } \
- }
- #else
- #define __Pyx_TraceLine(lineno, nogil, goto_error) \
- if (likely(!__Pyx_use_tracing)); else { \
+ } \
+ } \
+ }
+ #else
+ #define __Pyx_TraceLine(lineno, nogil, goto_error) \
+ if (likely(!__Pyx_use_tracing)); else { \
// mark error label as used to avoid compiler warnings \
if ((1)); else goto_error; \
PyThreadState* tstate = __Pyx_PyThreadState_Current; \
if (__Pyx_IsTracing(tstate, 0, 0) && tstate->c_tracefunc && $frame_cname->f_trace) { \
- int ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno); \
+ int ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno); \
// XXX https://github.com/cython/cython/issues/2274 \
if (unlikely(ret)) { fprintf(stderr, "cython: line_trace_func returned %d\n", ret); } \
- } \
+ } \
}
- #endif
+ #endif
#else
- // mark error label as used to avoid compiler warnings
+ // mark error label as used to avoid compiler warnings
#define __Pyx_TraceLine(lineno, nogil, goto_error) if ((1)); else goto_error;
#endif
@@ -282,7 +282,7 @@ static int __Pyx_TraceSetupAndCall(PyCodeObject** code,
const char *funcname,
const char *srcfile,
int firstlineno) {
- PyObject *type, *value, *traceback;
+ PyObject *type, *value, *traceback;
int retval;
if (*frame == NULL || !CYTHON_PROFILE_REUSE_FRAME) {
if (*code == NULL) {
@@ -308,46 +308,46 @@ static int __Pyx_TraceSetupAndCall(PyCodeObject** code,
}
__Pyx_PyFrame_SetLineNumber(*frame, firstlineno);
- retval = 1;
+ retval = 1;
__Pyx_EnterTracing(tstate);
__Pyx_ErrFetchInState(tstate, &type, &value, &traceback);
#if CYTHON_TRACE
if (tstate->c_tracefunc)
- retval = tstate->c_tracefunc(tstate->c_traceobj, *frame, PyTrace_CALL, NULL) == 0;
- if (retval && tstate->c_profilefunc)
+ retval = tstate->c_tracefunc(tstate->c_traceobj, *frame, PyTrace_CALL, NULL) == 0;
+ if (retval && tstate->c_profilefunc)
#endif
retval = tstate->c_profilefunc(tstate->c_profileobj, *frame, PyTrace_CALL, NULL) == 0;
__Pyx_LeaveTracing(tstate);
- if (retval) {
+ if (retval) {
__Pyx_ErrRestoreInState(tstate, type, value, traceback);
return __Pyx_IsTracing(tstate, 0, 0) && retval;
- } else {
- Py_XDECREF(type);
- Py_XDECREF(value);
- Py_XDECREF(traceback);
- return -1;
- }
+ } else {
+ Py_XDECREF(type);
+ Py_XDECREF(value);
+ Py_XDECREF(traceback);
+ return -1;
+ }
}
static PyCodeObject *__Pyx_createFrameCodeObject(const char *funcname, const char *srcfile, int firstlineno) {
- PyCodeObject *py_code = 0;
-
-#if PY_MAJOR_VERSION >= 3
- py_code = PyCode_NewEmpty(srcfile, funcname, firstlineno);
- // make CPython use a fresh dict for "f_locals" at need (see GH #1836)
- if (likely(py_code)) {
- py_code->co_flags |= CO_OPTIMIZED | CO_NEWLOCALS;
- }
-#else
+ PyCodeObject *py_code = 0;
+
+#if PY_MAJOR_VERSION >= 3
+ py_code = PyCode_NewEmpty(srcfile, funcname, firstlineno);
+ // make CPython use a fresh dict for "f_locals" at need (see GH #1836)
+ if (likely(py_code)) {
+ py_code->co_flags |= CO_OPTIMIZED | CO_NEWLOCALS;
+ }
+#else
PyObject *py_srcfile = 0;
PyObject *py_funcname = 0;
py_funcname = PyString_FromString(funcname);
- if (unlikely(!py_funcname)) goto bad;
+ if (unlikely(!py_funcname)) goto bad;
py_srcfile = PyString_FromString(srcfile);
- if (unlikely(!py_srcfile)) goto bad;
+ if (unlikely(!py_srcfile)) goto bad;
py_code = PyCode_New(
0, /*int argcount,*/
@@ -370,7 +370,7 @@ static PyCodeObject *__Pyx_createFrameCodeObject(const char *funcname, const cha
bad:
Py_XDECREF(py_srcfile);
Py_XDECREF(py_funcname);
-#endif
+#endif
return py_code;
}
diff --git a/contrib/tools/cython/Cython/Utility/StringTools.c b/contrib/tools/cython/Cython/Utility/StringTools.c
index 2fdae812a0..25255f2630 100644
--- a/contrib/tools/cython/Cython/Utility/StringTools.c
+++ b/contrib/tools/cython/Cython/Utility/StringTools.c
@@ -51,12 +51,12 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char character); /*proto*/
//////////////////// BytesContains ////////////////////
-//@requires: IncludeStringH
+//@requires: IncludeStringH
static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char character) {
const Py_ssize_t length = PyBytes_GET_SIZE(bytes);
char* char_start = PyBytes_AS_STRING(bytes);
- return memchr(char_start, (unsigned char)character, (size_t)length) != NULL;
+ return memchr(char_start, (unsigned char)character, (size_t)length) != NULL;
}
@@ -146,24 +146,24 @@ static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 ch
//////////////////// PyUnicodeContains.proto ////////////////////
-static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) {
+static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) {
int result = PyUnicode_Contains(text, substring);
return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
}
-//////////////////// CStringEquals.proto ////////////////////
-
-static CYTHON_INLINE int __Pyx_StrEq(const char *, const char *); /*proto*/
-
-//////////////////// CStringEquals ////////////////////
-
-static CYTHON_INLINE int __Pyx_StrEq(const char *s1, const char *s2) {
- while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
- return *s1 == *s2;
-}
-
-
+//////////////////// CStringEquals.proto ////////////////////
+
+static CYTHON_INLINE int __Pyx_StrEq(const char *, const char *); /*proto*/
+
+//////////////////// CStringEquals ////////////////////
+
+static CYTHON_INLINE int __Pyx_StrEq(const char *s1, const char *s2) {
+ while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
+ return *s1 == *s2;
+}
+
+
//////////////////// StrEquals.proto ////////////////////
//@requires: BytesEquals
//@requires: UnicodeEquals
@@ -263,9 +263,9 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int
} else {
int result;
PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
- #if PY_MAJOR_VERSION < 3
- Py_XDECREF(owned_ref);
- #endif
+ #if PY_MAJOR_VERSION < 3
+ Py_XDECREF(owned_ref);
+ #endif
if (!py_result)
return -1;
result = __Pyx_PyObject_IsTrue(py_result);
@@ -359,7 +359,7 @@ static CYTHON_INLINE int __Pyx_GetItemInt_ByteArray_Fast(PyObject* string, Py_ss
if (wraparound | boundscheck) {
length = PyByteArray_GET_SIZE(string);
if (wraparound & unlikely(i < 0)) i += length;
- if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) {
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) {
return (unsigned char) (PyByteArray_AS_STRING(string)[i]);
} else {
PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
@@ -389,7 +389,7 @@ static CYTHON_INLINE int __Pyx_SetItemInt_ByteArray_Fast(PyObject* string, Py_ss
if (wraparound | boundscheck) {
length = PyByteArray_GET_SIZE(string);
if (wraparound & unlikely(i < 0)) i += length;
- if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) {
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) {
PyByteArray_AS_STRING(string)[i] = (char) v;
return 0;
} else {
@@ -422,7 +422,7 @@ static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py
if (wraparound | boundscheck) {
length = __Pyx_PyUnicode_GET_LENGTH(ustring);
if (wraparound & unlikely(i < 0)) i += length;
- if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) {
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) {
return __Pyx_PyUnicode_READ_CHAR(ustring, i);
} else {
PyErr_SetString(PyExc_IndexError, "string index out of range");
@@ -480,13 +480,13 @@ static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
Py_ssize_t length;
if (unlikely((start < 0) | (stop < 0))) {
- size_t slen = strlen(cstring);
- if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) {
- PyErr_SetString(PyExc_OverflowError,
- "c-string too long to convert to Python");
- return NULL;
- }
- length = (Py_ssize_t) slen;
+ size_t slen = strlen(cstring);
+ if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) {
+ PyErr_SetString(PyExc_OverflowError,
+ "c-string too long to convert to Python");
+ return NULL;
+ }
+ length = (Py_ssize_t) slen;
if (start < 0) {
start += length;
if (start < 0)
@@ -586,7 +586,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring(
start = 0;
}
if (stop < 0)
- stop += length;
+ stop += length;
else if (stop > length)
stop = length;
if (stop <= start)
@@ -619,9 +619,9 @@ static CYTHON_INLINE int __Pyx_Py_UNICODE_ISTITLE(Py_UCS4 uchar)
static int __Pyx_PyUnicode_Tailmatch(
PyObject* s, PyObject* substr, Py_ssize_t start, Py_ssize_t end, int direction); /*proto*/
-
-/////////////// unicode_tailmatch ///////////////
-
+
+/////////////// unicode_tailmatch ///////////////
+
// Python's unicode.startswith() and unicode.endswith() support a
// tuple of prefixes/suffixes, whereas it's much more common to
// test for a single unicode string.
@@ -631,7 +631,7 @@ static int __Pyx_PyUnicode_TailmatchTuple(PyObject* s, PyObject* substrings,
Py_ssize_t i, count = PyTuple_GET_SIZE(substrings);
for (i = 0; i < count; i++) {
Py_ssize_t result;
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
result = PyUnicode_Tailmatch(s, PyTuple_GET_ITEM(substrings, i),
start, end, direction);
#else
@@ -652,21 +652,21 @@ static int __Pyx_PyUnicode_Tailmatch(PyObject* s, PyObject* substr,
if (unlikely(PyTuple_Check(substr))) {
return __Pyx_PyUnicode_TailmatchTuple(s, substr, start, end, direction);
}
- return (int) PyUnicode_Tailmatch(s, substr, start, end, direction);
+ return (int) PyUnicode_Tailmatch(s, substr, start, end, direction);
}
/////////////// bytes_tailmatch.proto ///////////////
-static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg,
- Py_ssize_t start, Py_ssize_t end, int direction); /*proto*/
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr,
- Py_ssize_t start, Py_ssize_t end, int direction); /*proto*/
-
-/////////////// bytes_tailmatch ///////////////
-
-static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg,
- Py_ssize_t start, Py_ssize_t end, int direction) {
+static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg,
+ Py_ssize_t start, Py_ssize_t end, int direction); /*proto*/
+static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr,
+ Py_ssize_t start, Py_ssize_t end, int direction); /*proto*/
+
+/////////////// bytes_tailmatch ///////////////
+
+static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg,
+ Py_ssize_t start, Py_ssize_t end, int direction) {
const char* self_ptr = PyBytes_AS_STRING(self);
Py_ssize_t self_len = PyBytes_GET_SIZE(self);
const char* sub_ptr;
@@ -683,7 +683,7 @@ static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg,
#if PY_MAJOR_VERSION < 3
// Python 2.x allows mixing unicode and str
else if ( PyUnicode_Check(arg) ) {
- return (int) PyUnicode_Tailmatch(self, arg, start, end, direction);
+ return (int) PyUnicode_Tailmatch(self, arg, start, end, direction);
}
#endif
else {
@@ -726,7 +726,7 @@ static int __Pyx_PyBytes_TailmatchTuple(PyObject* self, PyObject* substrings,
Py_ssize_t i, count = PyTuple_GET_SIZE(substrings);
for (i = 0; i < count; i++) {
int result;
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substrings, i),
start, end, direction);
#else
@@ -755,7 +755,7 @@ static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr,
/////////////// str_tailmatch.proto ///////////////
static CYTHON_INLINE int __Pyx_PyStr_Tailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
- Py_ssize_t end, int direction); /*proto*/
+ Py_ssize_t end, int direction); /*proto*/
/////////////// str_tailmatch ///////////////
//@requires: bytes_tailmatch
@@ -777,16 +777,16 @@ static CYTHON_INLINE int __Pyx_PyStr_Tailmatch(PyObject* self, PyObject* arg, Py
/////////////// bytes_index.proto ///////////////
-static CYTHON_INLINE char __Pyx_PyBytes_GetItemInt(PyObject* bytes, Py_ssize_t index, int check_bounds); /*proto*/
-
-/////////////// bytes_index ///////////////
-
+static CYTHON_INLINE char __Pyx_PyBytes_GetItemInt(PyObject* bytes, Py_ssize_t index, int check_bounds); /*proto*/
+
+/////////////// bytes_index ///////////////
+
static CYTHON_INLINE char __Pyx_PyBytes_GetItemInt(PyObject* bytes, Py_ssize_t index, int check_bounds) {
- if (index < 0)
- index += PyBytes_GET_SIZE(bytes);
+ if (index < 0)
+ index += PyBytes_GET_SIZE(bytes);
if (check_bounds) {
Py_ssize_t size = PyBytes_GET_SIZE(bytes);
- if (unlikely(!__Pyx_is_valid_index(index, size))) {
+ if (unlikely(!__Pyx_is_valid_index(index, size))) {
PyErr_SetString(PyExc_IndexError, "string index out of range");
return (char) -1;
}
@@ -825,170 +825,170 @@ static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* value
#endif
-/////////////// JoinPyUnicode.proto ///////////////
-
-static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength,
- Py_UCS4 max_char);
-
-/////////////// JoinPyUnicode ///////////////
-//@requires: IncludeStringH
-//@substitute: naming
-
-static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength,
- CYTHON_UNUSED Py_UCS4 max_char) {
-#if CYTHON_USE_UNICODE_INTERNALS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
- PyObject *result_uval;
- int result_ukind;
- Py_ssize_t i, char_pos;
- void *result_udata;
-#if CYTHON_PEP393_ENABLED
- // Py 3.3+ (post PEP-393)
- result_uval = PyUnicode_New(result_ulength, max_char);
- if (unlikely(!result_uval)) return NULL;
- result_ukind = (max_char <= 255) ? PyUnicode_1BYTE_KIND : (max_char <= 65535) ? PyUnicode_2BYTE_KIND : PyUnicode_4BYTE_KIND;
- result_udata = PyUnicode_DATA(result_uval);
-#else
- // Py 2.x/3.2 (pre PEP-393)
- result_uval = PyUnicode_FromUnicode(NULL, result_ulength);
- if (unlikely(!result_uval)) return NULL;
- result_ukind = sizeof(Py_UNICODE);
- result_udata = PyUnicode_AS_UNICODE(result_uval);
-#endif
-
- char_pos = 0;
- for (i=0; i < value_count; i++) {
- int ukind;
- Py_ssize_t ulength;
- void *udata;
- PyObject *uval = PyTuple_GET_ITEM(value_tuple, i);
- if (unlikely(__Pyx_PyUnicode_READY(uval)))
- goto bad;
- ulength = __Pyx_PyUnicode_GET_LENGTH(uval);
- if (unlikely(!ulength))
- continue;
- if (unlikely(char_pos + ulength < 0))
- goto overflow;
- ukind = __Pyx_PyUnicode_KIND(uval);
- udata = __Pyx_PyUnicode_DATA(uval);
- if (!CYTHON_PEP393_ENABLED || ukind == result_ukind) {
- memcpy((char *)result_udata + char_pos * result_ukind, udata, (size_t) (ulength * result_ukind));
- } else {
+/////////////// JoinPyUnicode.proto ///////////////
+
+static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength,
+ Py_UCS4 max_char);
+
+/////////////// JoinPyUnicode ///////////////
+//@requires: IncludeStringH
+//@substitute: naming
+
+static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength,
+ CYTHON_UNUSED Py_UCS4 max_char) {
+#if CYTHON_USE_UNICODE_INTERNALS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ PyObject *result_uval;
+ int result_ukind;
+ Py_ssize_t i, char_pos;
+ void *result_udata;
+#if CYTHON_PEP393_ENABLED
+ // Py 3.3+ (post PEP-393)
+ result_uval = PyUnicode_New(result_ulength, max_char);
+ if (unlikely(!result_uval)) return NULL;
+ result_ukind = (max_char <= 255) ? PyUnicode_1BYTE_KIND : (max_char <= 65535) ? PyUnicode_2BYTE_KIND : PyUnicode_4BYTE_KIND;
+ result_udata = PyUnicode_DATA(result_uval);
+#else
+ // Py 2.x/3.2 (pre PEP-393)
+ result_uval = PyUnicode_FromUnicode(NULL, result_ulength);
+ if (unlikely(!result_uval)) return NULL;
+ result_ukind = sizeof(Py_UNICODE);
+ result_udata = PyUnicode_AS_UNICODE(result_uval);
+#endif
+
+ char_pos = 0;
+ for (i=0; i < value_count; i++) {
+ int ukind;
+ Py_ssize_t ulength;
+ void *udata;
+ PyObject *uval = PyTuple_GET_ITEM(value_tuple, i);
+ if (unlikely(__Pyx_PyUnicode_READY(uval)))
+ goto bad;
+ ulength = __Pyx_PyUnicode_GET_LENGTH(uval);
+ if (unlikely(!ulength))
+ continue;
+ if (unlikely(char_pos + ulength < 0))
+ goto overflow;
+ ukind = __Pyx_PyUnicode_KIND(uval);
+ udata = __Pyx_PyUnicode_DATA(uval);
+ if (!CYTHON_PEP393_ENABLED || ukind == result_ukind) {
+ memcpy((char *)result_udata + char_pos * result_ukind, udata, (size_t) (ulength * result_ukind));
+ } else {
#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030300F0 || defined(_PyUnicode_FastCopyCharacters)
- _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength);
- #else
- Py_ssize_t j;
- for (j=0; j < ulength; j++) {
- Py_UCS4 uchar = __Pyx_PyUnicode_READ(ukind, udata, j);
- __Pyx_PyUnicode_WRITE(result_ukind, result_udata, char_pos+j, uchar);
- }
- #endif
- }
- char_pos += ulength;
- }
- return result_uval;
-overflow:
- PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string");
-bad:
- Py_DECREF(result_uval);
- return NULL;
-#else
- // non-CPython fallback
- result_ulength++;
- value_count++;
- return PyUnicode_Join($empty_unicode, value_tuple);
-#endif
-}
-
-
-/////////////// BuildPyUnicode.proto ///////////////
-
-static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength,
- int prepend_sign, char padding_char);
-
-/////////////// BuildPyUnicode ///////////////
-
-// Create a PyUnicode object from an ASCII char*, e.g. a formatted number.
-
-static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength,
- int prepend_sign, char padding_char) {
- PyObject *uval;
- Py_ssize_t uoffset = ulength - clength;
-#if CYTHON_USE_UNICODE_INTERNALS
- Py_ssize_t i;
-#if CYTHON_PEP393_ENABLED
- // Py 3.3+ (post PEP-393)
- void *udata;
- uval = PyUnicode_New(ulength, 127);
- if (unlikely(!uval)) return NULL;
- udata = PyUnicode_DATA(uval);
-#else
- // Py 2.x/3.2 (pre PEP-393)
- Py_UNICODE *udata;
- uval = PyUnicode_FromUnicode(NULL, ulength);
- if (unlikely(!uval)) return NULL;
- udata = PyUnicode_AS_UNICODE(uval);
-#endif
- if (uoffset > 0) {
- i = 0;
- if (prepend_sign) {
- __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, 0, '-');
- i++;
- }
- for (; i < uoffset; i++) {
- __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, i, padding_char);
- }
- }
- for (i=0; i < clength; i++) {
- __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, uoffset+i, chars[i]);
- }
-
-#else
- // non-CPython
- {
- PyObject *sign = NULL, *padding = NULL;
- uval = NULL;
- if (uoffset > 0) {
- prepend_sign = !!prepend_sign;
- if (uoffset > prepend_sign) {
- padding = PyUnicode_FromOrdinal(padding_char);
- if (likely(padding) && uoffset > prepend_sign + 1) {
- PyObject *tmp;
- PyObject *repeat = PyInt_FromSize_t(uoffset - prepend_sign);
- if (unlikely(!repeat)) goto done_or_error;
- tmp = PyNumber_Multiply(padding, repeat);
- Py_DECREF(repeat);
- Py_DECREF(padding);
- padding = tmp;
- }
- if (unlikely(!padding)) goto done_or_error;
- }
- if (prepend_sign) {
- sign = PyUnicode_FromOrdinal('-');
- if (unlikely(!sign)) goto done_or_error;
- }
- }
-
- uval = PyUnicode_DecodeASCII(chars, clength, NULL);
- if (likely(uval) && padding) {
- PyObject *tmp = PyNumber_Add(padding, uval);
- Py_DECREF(uval);
- uval = tmp;
- }
- if (likely(uval) && sign) {
- PyObject *tmp = PyNumber_Add(sign, uval);
- Py_DECREF(uval);
- uval = tmp;
- }
-done_or_error:
- Py_XDECREF(padding);
- Py_XDECREF(sign);
- }
-#endif
-
- return uval;
-}
-
-
+ _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength);
+ #else
+ Py_ssize_t j;
+ for (j=0; j < ulength; j++) {
+ Py_UCS4 uchar = __Pyx_PyUnicode_READ(ukind, udata, j);
+ __Pyx_PyUnicode_WRITE(result_ukind, result_udata, char_pos+j, uchar);
+ }
+ #endif
+ }
+ char_pos += ulength;
+ }
+ return result_uval;
+overflow:
+ PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string");
+bad:
+ Py_DECREF(result_uval);
+ return NULL;
+#else
+ // non-CPython fallback
+ result_ulength++;
+ value_count++;
+ return PyUnicode_Join($empty_unicode, value_tuple);
+#endif
+}
+
+
+/////////////// BuildPyUnicode.proto ///////////////
+
+static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength,
+ int prepend_sign, char padding_char);
+
+/////////////// BuildPyUnicode ///////////////
+
+// Create a PyUnicode object from an ASCII char*, e.g. a formatted number.
+
+static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength,
+ int prepend_sign, char padding_char) {
+ PyObject *uval;
+ Py_ssize_t uoffset = ulength - clength;
+#if CYTHON_USE_UNICODE_INTERNALS
+ Py_ssize_t i;
+#if CYTHON_PEP393_ENABLED
+ // Py 3.3+ (post PEP-393)
+ void *udata;
+ uval = PyUnicode_New(ulength, 127);
+ if (unlikely(!uval)) return NULL;
+ udata = PyUnicode_DATA(uval);
+#else
+ // Py 2.x/3.2 (pre PEP-393)
+ Py_UNICODE *udata;
+ uval = PyUnicode_FromUnicode(NULL, ulength);
+ if (unlikely(!uval)) return NULL;
+ udata = PyUnicode_AS_UNICODE(uval);
+#endif
+ if (uoffset > 0) {
+ i = 0;
+ if (prepend_sign) {
+ __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, 0, '-');
+ i++;
+ }
+ for (; i < uoffset; i++) {
+ __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, i, padding_char);
+ }
+ }
+ for (i=0; i < clength; i++) {
+ __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, uoffset+i, chars[i]);
+ }
+
+#else
+ // non-CPython
+ {
+ PyObject *sign = NULL, *padding = NULL;
+ uval = NULL;
+ if (uoffset > 0) {
+ prepend_sign = !!prepend_sign;
+ if (uoffset > prepend_sign) {
+ padding = PyUnicode_FromOrdinal(padding_char);
+ if (likely(padding) && uoffset > prepend_sign + 1) {
+ PyObject *tmp;
+ PyObject *repeat = PyInt_FromSize_t(uoffset - prepend_sign);
+ if (unlikely(!repeat)) goto done_or_error;
+ tmp = PyNumber_Multiply(padding, repeat);
+ Py_DECREF(repeat);
+ Py_DECREF(padding);
+ padding = tmp;
+ }
+ if (unlikely(!padding)) goto done_or_error;
+ }
+ if (prepend_sign) {
+ sign = PyUnicode_FromOrdinal('-');
+ if (unlikely(!sign)) goto done_or_error;
+ }
+ }
+
+ uval = PyUnicode_DecodeASCII(chars, clength, NULL);
+ if (likely(uval) && padding) {
+ PyObject *tmp = PyNumber_Add(padding, uval);
+ Py_DECREF(uval);
+ uval = tmp;
+ }
+ if (likely(uval) && sign) {
+ PyObject *tmp = PyNumber_Add(sign, uval);
+ Py_DECREF(uval);
+ uval = tmp;
+ }
+done_or_error:
+ Py_XDECREF(padding);
+ Py_XDECREF(sign);
+ }
+#endif
+
+ return uval;
+}
+
+
//////////////////// ByteArrayAppendObject.proto ////////////////////
static CYTHON_INLINE int __Pyx_PyByteArray_AppendObject(PyObject* bytearray, PyObject* value);
@@ -1006,7 +1006,7 @@ static CYTHON_INLINE int __Pyx_PyByteArray_AppendObject(PyObject* bytearray, PyO
}
ival = (unsigned char) (PyString_AS_STRING(value)[0]);
} else
-#endif
+#endif
#if CYTHON_USE_PYLONG_INTERNALS
if (likely(PyLong_CheckExact(value)) && likely(Py_SIZE(value) == 1 || Py_SIZE(value) == 0)) {
if (Py_SIZE(value) == 0) {
@@ -1020,7 +1020,7 @@ static CYTHON_INLINE int __Pyx_PyByteArray_AppendObject(PyObject* bytearray, PyO
{
// CPython calls PyNumber_Index() internally
ival = __Pyx_PyIndex_AsSsize_t(value);
- if (unlikely(!__Pyx_is_valid_index(ival, 256))) {
+ if (unlikely(!__Pyx_is_valid_index(ival, 256))) {
if (ival == -1 && PyErr_Occurred())
return -1;
goto bad_range;
@@ -1042,7 +1042,7 @@ static CYTHON_INLINE int __Pyx_PyByteArray_Append(PyObject* bytearray, int value
static CYTHON_INLINE int __Pyx_PyByteArray_Append(PyObject* bytearray, int value) {
PyObject *pyval, *retval;
#if CYTHON_COMPILING_IN_CPYTHON
- if (likely(__Pyx_is_valid_index(value, 256))) {
+ if (likely(__Pyx_is_valid_index(value, 256))) {
Py_ssize_t n = Py_SIZE(bytearray);
if (likely(n != PY_SSIZE_T_MAX)) {
if (unlikely(PyByteArray_Resize(bytearray, n + 1) < 0))
@@ -1065,110 +1065,110 @@ static CYTHON_INLINE int __Pyx_PyByteArray_Append(PyObject* bytearray, int value
Py_DECREF(retval);
return 0;
}
-
-
-//////////////////// PyObjectFormat.proto ////////////////////
-
-#if CYTHON_USE_UNICODE_WRITER
-static PyObject* __Pyx_PyObject_Format(PyObject* s, PyObject* f);
-#else
-#define __Pyx_PyObject_Format(s, f) PyObject_Format(s, f)
-#endif
-
-//////////////////// PyObjectFormat ////////////////////
-
-#if CYTHON_USE_UNICODE_WRITER
-static PyObject* __Pyx_PyObject_Format(PyObject* obj, PyObject* format_spec) {
- int ret;
- _PyUnicodeWriter writer;
-
- if (likely(PyFloat_CheckExact(obj))) {
- // copied from CPython 3.5 "float__format__()" in floatobject.c
-#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x03040000
- _PyUnicodeWriter_Init(&writer, 0);
-#else
- _PyUnicodeWriter_Init(&writer);
-#endif
- ret = _PyFloat_FormatAdvancedWriter(
- &writer,
- obj,
- format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
- } else if (likely(PyLong_CheckExact(obj))) {
- // copied from CPython 3.5 "long__format__()" in longobject.c
-#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x03040000
- _PyUnicodeWriter_Init(&writer, 0);
-#else
- _PyUnicodeWriter_Init(&writer);
-#endif
- ret = _PyLong_FormatAdvancedWriter(
- &writer,
- obj,
- format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
- } else {
- return PyObject_Format(obj, format_spec);
- }
-
- if (unlikely(ret == -1)) {
- _PyUnicodeWriter_Dealloc(&writer);
- return NULL;
- }
- return _PyUnicodeWriter_Finish(&writer);
-}
-#endif
-
-
-//////////////////// PyObjectFormatSimple.proto ////////////////////
-
-#if CYTHON_COMPILING_IN_PYPY
- #define __Pyx_PyObject_FormatSimple(s, f) ( \
- likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) : \
- PyObject_Format(s, f))
-#elif PY_MAJOR_VERSION < 3
- // str is common in Py2, but formatting must return a Unicode string
- #define __Pyx_PyObject_FormatSimple(s, f) ( \
- likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) : \
- likely(PyString_CheckExact(s)) ? PyUnicode_FromEncodedObject(s, NULL, "strict") : \
- PyObject_Format(s, f))
-#elif CYTHON_USE_TYPE_SLOTS
- // Py3 nicely returns unicode strings from str() which makes this quite efficient for builtin types
- #define __Pyx_PyObject_FormatSimple(s, f) ( \
- likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) : \
- likely(PyLong_CheckExact(s)) ? PyLong_Type.tp_str(s) : \
- likely(PyFloat_CheckExact(s)) ? PyFloat_Type.tp_str(s) : \
- PyObject_Format(s, f))
-#else
- #define __Pyx_PyObject_FormatSimple(s, f) ( \
- likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) : \
- PyObject_Format(s, f))
-#endif
-
-
-//////////////////// PyObjectFormatAndDecref.proto ////////////////////
-
-static CYTHON_INLINE PyObject* __Pyx_PyObject_FormatSimpleAndDecref(PyObject* s, PyObject* f);
-static CYTHON_INLINE PyObject* __Pyx_PyObject_FormatAndDecref(PyObject* s, PyObject* f);
-
-//////////////////// PyObjectFormatAndDecref ////////////////////
-
-static CYTHON_INLINE PyObject* __Pyx_PyObject_FormatSimpleAndDecref(PyObject* s, PyObject* f) {
- if (unlikely(!s)) return NULL;
- if (likely(PyUnicode_CheckExact(s))) return s;
- #if PY_MAJOR_VERSION < 3
- // str is common in Py2, but formatting must return a Unicode string
- if (likely(PyString_CheckExact(s))) {
- PyObject *result = PyUnicode_FromEncodedObject(s, NULL, "strict");
- Py_DECREF(s);
- return result;
- }
- #endif
- return __Pyx_PyObject_FormatAndDecref(s, f);
-}
-
-static CYTHON_INLINE PyObject* __Pyx_PyObject_FormatAndDecref(PyObject* s, PyObject* f) {
- PyObject *result = PyObject_Format(s, f);
- Py_DECREF(s);
- return result;
-}
+
+
+//////////////////// PyObjectFormat.proto ////////////////////
+
+#if CYTHON_USE_UNICODE_WRITER
+static PyObject* __Pyx_PyObject_Format(PyObject* s, PyObject* f);
+#else
+#define __Pyx_PyObject_Format(s, f) PyObject_Format(s, f)
+#endif
+
+//////////////////// PyObjectFormat ////////////////////
+
+#if CYTHON_USE_UNICODE_WRITER
+static PyObject* __Pyx_PyObject_Format(PyObject* obj, PyObject* format_spec) {
+ int ret;
+ _PyUnicodeWriter writer;
+
+ if (likely(PyFloat_CheckExact(obj))) {
+ // copied from CPython 3.5 "float__format__()" in floatobject.c
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x03040000
+ _PyUnicodeWriter_Init(&writer, 0);
+#else
+ _PyUnicodeWriter_Init(&writer);
+#endif
+ ret = _PyFloat_FormatAdvancedWriter(
+ &writer,
+ obj,
+ format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
+ } else if (likely(PyLong_CheckExact(obj))) {
+ // copied from CPython 3.5 "long__format__()" in longobject.c
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x03040000
+ _PyUnicodeWriter_Init(&writer, 0);
+#else
+ _PyUnicodeWriter_Init(&writer);
+#endif
+ ret = _PyLong_FormatAdvancedWriter(
+ &writer,
+ obj,
+ format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
+ } else {
+ return PyObject_Format(obj, format_spec);
+ }
+
+ if (unlikely(ret == -1)) {
+ _PyUnicodeWriter_Dealloc(&writer);
+ return NULL;
+ }
+ return _PyUnicodeWriter_Finish(&writer);
+}
+#endif
+
+
+//////////////////// PyObjectFormatSimple.proto ////////////////////
+
+#if CYTHON_COMPILING_IN_PYPY
+ #define __Pyx_PyObject_FormatSimple(s, f) ( \
+ likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) : \
+ PyObject_Format(s, f))
+#elif PY_MAJOR_VERSION < 3
+ // str is common in Py2, but formatting must return a Unicode string
+ #define __Pyx_PyObject_FormatSimple(s, f) ( \
+ likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) : \
+ likely(PyString_CheckExact(s)) ? PyUnicode_FromEncodedObject(s, NULL, "strict") : \
+ PyObject_Format(s, f))
+#elif CYTHON_USE_TYPE_SLOTS
+ // Py3 nicely returns unicode strings from str() which makes this quite efficient for builtin types
+ #define __Pyx_PyObject_FormatSimple(s, f) ( \
+ likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) : \
+ likely(PyLong_CheckExact(s)) ? PyLong_Type.tp_str(s) : \
+ likely(PyFloat_CheckExact(s)) ? PyFloat_Type.tp_str(s) : \
+ PyObject_Format(s, f))
+#else
+ #define __Pyx_PyObject_FormatSimple(s, f) ( \
+ likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) : \
+ PyObject_Format(s, f))
+#endif
+
+
+//////////////////// PyObjectFormatAndDecref.proto ////////////////////
+
+static CYTHON_INLINE PyObject* __Pyx_PyObject_FormatSimpleAndDecref(PyObject* s, PyObject* f);
+static CYTHON_INLINE PyObject* __Pyx_PyObject_FormatAndDecref(PyObject* s, PyObject* f);
+
+//////////////////// PyObjectFormatAndDecref ////////////////////
+
+static CYTHON_INLINE PyObject* __Pyx_PyObject_FormatSimpleAndDecref(PyObject* s, PyObject* f) {
+ if (unlikely(!s)) return NULL;
+ if (likely(PyUnicode_CheckExact(s))) return s;
+ #if PY_MAJOR_VERSION < 3
+ // str is common in Py2, but formatting must return a Unicode string
+ if (likely(PyString_CheckExact(s))) {
+ PyObject *result = PyUnicode_FromEncodedObject(s, NULL, "strict");
+ Py_DECREF(s);
+ return result;
+ }
+ #endif
+ return __Pyx_PyObject_FormatAndDecref(s, f);
+}
+
+static CYTHON_INLINE PyObject* __Pyx_PyObject_FormatAndDecref(PyObject* s, PyObject* f) {
+ PyObject *result = PyObject_Format(s, f);
+ Py_DECREF(s);
+ return result;
+}
//////////////////// PyUnicode_Unicode.proto ////////////////////
diff --git a/contrib/tools/cython/Cython/Utility/TypeConversion.c b/contrib/tools/cython/Cython/Utility/TypeConversion.c
index 7a7bf0f799..b7456a33a6 100644
--- a/contrib/tools/cython/Cython/Utility/TypeConversion.c
+++ b/contrib/tools/cython/Cython/Utility/TypeConversion.c
@@ -2,9 +2,9 @@
/* Type Conversion Predeclarations */
-#define __Pyx_uchar_cast(c) ((unsigned char)c)
-#define __Pyx_long_cast(x) ((long)x)
-
+#define __Pyx_uchar_cast(c) ((unsigned char)c)
+#define __Pyx_long_cast(x) ((long)x)
+
#define __Pyx_fits_Py_ssize_t(v, type, is_signed) ( \
(sizeof(type) < sizeof(Py_ssize_t)) || \
(sizeof(type) > sizeof(Py_ssize_t) && \
@@ -16,35 +16,35 @@
(is_signed || likely(v < (type)PY_SSIZE_T_MAX || \
v == (type)PY_SSIZE_T_MAX))) )
-static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) {
- // Optimisation from Section 14.2 "Bounds Checking" in
- // https://www.agner.org/optimize/optimizing_cpp.pdf
- // See https://bugs.python.org/issue28397
- // The cast to unsigned effectively tests for "0 <= i < limit".
- return (size_t) i < (size_t) limit;
-}
-
-// fast and unsafe abs(Py_ssize_t) that ignores the overflow for (-PY_SSIZE_T_MAX-1)
-#if defined (__cplusplus) && __cplusplus >= 201103L
- #include <cstdlib>
- #define __Pyx_sst_abs(value) std::abs(value)
-#elif SIZEOF_INT >= SIZEOF_SIZE_T
- #define __Pyx_sst_abs(value) abs(value)
-#elif SIZEOF_LONG >= SIZEOF_SIZE_T
- #define __Pyx_sst_abs(value) labs(value)
+static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) {
+ // Optimisation from Section 14.2 "Bounds Checking" in
+ // https://www.agner.org/optimize/optimizing_cpp.pdf
+ // See https://bugs.python.org/issue28397
+ // The cast to unsigned effectively tests for "0 <= i < limit".
+ return (size_t) i < (size_t) limit;
+}
+
+// fast and unsafe abs(Py_ssize_t) that ignores the overflow for (-PY_SSIZE_T_MAX-1)
+#if defined (__cplusplus) && __cplusplus >= 201103L
+ #include <cstdlib>
+ #define __Pyx_sst_abs(value) std::abs(value)
+#elif SIZEOF_INT >= SIZEOF_SIZE_T
+ #define __Pyx_sst_abs(value) abs(value)
+#elif SIZEOF_LONG >= SIZEOF_SIZE_T
+ #define __Pyx_sst_abs(value) labs(value)
#elif defined (_MSC_VER)
- // abs() is defined for long, but 64-bits type on MSVC is long long.
- // Use MS-specific _abs64 instead.
+ // abs() is defined for long, but 64-bits type on MSVC is long long.
+ // Use MS-specific _abs64 instead.
#define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value))
-#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- #define __Pyx_sst_abs(value) llabs(value)
-#elif defined (__GNUC__)
- // gcc or clang on 64 bit windows.
- #define __Pyx_sst_abs(value) __builtin_llabs(value)
-#else
- #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
-#endif
-
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+ #define __Pyx_sst_abs(value) llabs(value)
+#elif defined (__GNUC__)
+ // gcc or clang on 64 bit windows.
+ #define __Pyx_sst_abs(value) __builtin_llabs(value)
+#else
+ #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
+#endif
+
static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*);
static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
@@ -73,11 +73,11 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s)
-#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s)
-#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s)
-#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s)
-#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
+#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s)
+#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s)
+#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s)
+#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s)
+#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
// There used to be a Py_UNICODE_strlen() in CPython 3.x, but it is deprecated since Py3.3.
static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) {
@@ -90,12 +90,12 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) {
#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode
-#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
-#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
-static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b);
+#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
+#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
+static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b);
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
-static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*);
-static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
+static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*);
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
#define __Pyx_PySequence_Tuple(obj) \
(likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj))
@@ -104,20 +104,20 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*);
-#if CYTHON_ASSUME_SAFE_MACROS
+#if CYTHON_ASSUME_SAFE_MACROS
#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
#else
#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
#endif
#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
-#if PY_MAJOR_VERSION >= 3
-#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x))
-#else
-#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x))
-#endif
-#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x))
-
+#if PY_MAJOR_VERSION >= 3
+#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x))
+#else
+#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x))
+#endif
+#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x))
+
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
static int __Pyx_sys_getdefaultencoding_not_ascii;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
@@ -128,7 +128,7 @@ static int __Pyx_init_sys_getdefaultencoding_params(void) {
const char* default_encoding_c;
sys = PyImport_ImportModule("sys");
if (!sys) goto bad;
- default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
+ default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
Py_DECREF(sys);
if (!default_encoding) goto bad;
default_encoding_c = PyBytes_AsString(default_encoding);
@@ -163,7 +163,7 @@ bad:
Py_XDECREF(ascii_chars_b);
return -1;
}
-#endif
+#endif
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL)
@@ -187,7 +187,7 @@ static int __Pyx_init_sys_getdefaultencoding_params(void) {
if (!default_encoding) goto bad;
default_encoding_c = PyBytes_AsString(default_encoding);
if (!default_encoding_c) goto bad;
- __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1);
+ __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1);
if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
Py_DECREF(default_encoding);
@@ -271,7 +271,7 @@ static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_
} else
#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT */
-#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
+#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
if (PyByteArray_Check(o)) {
*length = PyByteArray_GET_SIZE(o);
return PyByteArray_AS_STRING(o);
@@ -295,14 +295,14 @@ static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
else return PyObject_IsTrue(x);
}
-static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) {
- int retval;
- if (unlikely(!x)) return -1;
- retval = __Pyx_PyObject_IsTrue(x);
- Py_DECREF(x);
- return retval;
-}
-
+static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) {
+ int retval;
+ if (unlikely(!x)) return -1;
+ retval = __Pyx_PyObject_IsTrue(x);
+ Py_DECREF(x);
+ return retval;
+}
+
static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) {
#if PY_MAJOR_VERSION >= 3
if (PyLong_Check(result)) {
@@ -325,10 +325,10 @@ static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const
return NULL;
}
-static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
-#if CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
+#if CYTHON_USE_TYPE_SLOTS
PyNumberMethods *m;
-#endif
+#endif
const char *name = NULL;
PyObject *res = NULL;
#if PY_MAJOR_VERSION < 3
@@ -336,10 +336,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
#else
if (likely(PyLong_Check(x)))
#endif
- return __Pyx_NewRef(x);
-#if CYTHON_USE_TYPE_SLOTS
+ return __Pyx_NewRef(x);
+#if CYTHON_USE_TYPE_SLOTS
m = Py_TYPE(x)->tp_as_number;
- #if PY_MAJOR_VERSION < 3
+ #if PY_MAJOR_VERSION < 3
if (m && m->nb_int) {
name = "int";
res = m->nb_int(x);
@@ -348,13 +348,13 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
name = "long";
res = m->nb_long(x);
}
- #else
+ #else
if (likely(m && m->nb_int)) {
name = "int";
res = m->nb_int(x);
}
- #endif
-#else
+ #endif
+#else
if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) {
res = PyNumber_Int(x);
}
@@ -375,41 +375,41 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
return res;
}
-{{py: from Cython.Utility import pylong_join }}
-
+{{py: from Cython.Utility import pylong_join }}
+
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
Py_ssize_t ival;
PyObject *x;
#if PY_MAJOR_VERSION < 3
- if (likely(PyInt_CheckExact(b))) {
- if (sizeof(Py_ssize_t) >= sizeof(long))
- return PyInt_AS_LONG(b);
- else
- return PyInt_AsSsize_t(b);
- }
+ if (likely(PyInt_CheckExact(b))) {
+ if (sizeof(Py_ssize_t) >= sizeof(long))
+ return PyInt_AS_LONG(b);
+ else
+ return PyInt_AsSsize_t(b);
+ }
#endif
if (likely(PyLong_CheckExact(b))) {
- #if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*)b)->ob_digit;
- const Py_ssize_t size = Py_SIZE(b);
- // handle most common case first to avoid indirect branch and optimise branch prediction
- if (likely(__Pyx_sst_abs(size) <= 1)) {
- ival = likely(size) ? digits[0] : 0;
- if (size == -1) ival = -ival;
- return ival;
- } else {
- switch (size) {
- {{for _size in (2, 3, 4)}}
- {{for _case in (_size, -_size)}}
- case {{_case}}:
- if (8 * sizeof(Py_ssize_t) > {{_size}} * PyLong_SHIFT) {
- return {{'-' if _case < 0 else ''}}(Py_ssize_t) {{pylong_join(_size, 'digits', 'size_t')}};
- }
- break;
- {{endfor}}
- {{endfor}}
- }
- }
+ #if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)b)->ob_digit;
+ const Py_ssize_t size = Py_SIZE(b);
+ // handle most common case first to avoid indirect branch and optimise branch prediction
+ if (likely(__Pyx_sst_abs(size) <= 1)) {
+ ival = likely(size) ? digits[0] : 0;
+ if (size == -1) ival = -ival;
+ return ival;
+ } else {
+ switch (size) {
+ {{for _size in (2, 3, 4)}}
+ {{for _case in (_size, -_size)}}
+ case {{_case}}:
+ if (8 * sizeof(Py_ssize_t) > {{_size}} * PyLong_SHIFT) {
+ return {{'-' if _case < 0 else ''}}(Py_ssize_t) {{pylong_join(_size, 'digits', 'size_t')}};
+ }
+ break;
+ {{endfor}}
+ {{endfor}}
+ }
+ }
#endif
return PyLong_AsSsize_t(b);
}
@@ -420,7 +420,7 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
return ival;
}
-
+
static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) {
if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) {
return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o);
@@ -440,11 +440,11 @@ static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) {
}
-static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
- return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False);
-}
-
-
+static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
+ return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False);
+}
+
+
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
return PyInt_FromSize_t(ival);
}
@@ -459,135 +459,135 @@ static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
#endif
-/////////////// ToPyCTupleUtility.proto ///////////////
-static PyObject* {{funcname}}({{struct_type_decl}});
-
-/////////////// ToPyCTupleUtility ///////////////
-static PyObject* {{funcname}}({{struct_type_decl}} value) {
- PyObject* item = NULL;
- PyObject* result = PyTuple_New({{size}});
- if (!result) goto bad;
-
- {{for ix, component in enumerate(components):}}
- {{py:attr = "value.f%s" % ix}}
- item = {{component.to_py_function}}({{attr}});
- if (!item) goto bad;
- PyTuple_SET_ITEM(result, {{ix}}, item);
- {{endfor}}
-
- return result;
-bad:
- Py_XDECREF(item);
- Py_XDECREF(result);
- return NULL;
-}
-
-
-/////////////// FromPyCTupleUtility.proto ///////////////
+/////////////// ToPyCTupleUtility.proto ///////////////
+static PyObject* {{funcname}}({{struct_type_decl}});
+
+/////////////// ToPyCTupleUtility ///////////////
+static PyObject* {{funcname}}({{struct_type_decl}} value) {
+ PyObject* item = NULL;
+ PyObject* result = PyTuple_New({{size}});
+ if (!result) goto bad;
+
+ {{for ix, component in enumerate(components):}}
+ {{py:attr = "value.f%s" % ix}}
+ item = {{component.to_py_function}}({{attr}});
+ if (!item) goto bad;
+ PyTuple_SET_ITEM(result, {{ix}}, item);
+ {{endfor}}
+
+ return result;
+bad:
+ Py_XDECREF(item);
+ Py_XDECREF(result);
+ return NULL;
+}
+
+
+/////////////// FromPyCTupleUtility.proto ///////////////
static {{struct_type_decl}} {{funcname}}(PyObject *);
-/////////////// FromPyCTupleUtility ///////////////
+/////////////// FromPyCTupleUtility ///////////////
static {{struct_type_decl}} {{funcname}}(PyObject * o) {
{{struct_type_decl}} result;
- if (!PyTuple_Check(o) || PyTuple_GET_SIZE(o) != {{size}}) {
- PyErr_Format(PyExc_TypeError, "Expected %.16s of size %d, got %.200s", "a tuple", {{size}}, Py_TYPE(o)->tp_name);
+ if (!PyTuple_Check(o) || PyTuple_GET_SIZE(o) != {{size}}) {
+ PyErr_Format(PyExc_TypeError, "Expected %.16s of size %d, got %.200s", "a tuple", {{size}}, Py_TYPE(o)->tp_name);
goto bad;
}
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
- {{for ix, component in enumerate(components):}}
- {{py:attr = "result.f%s" % ix}}
- {{attr}} = {{component.from_py_function}}(PyTuple_GET_ITEM(o, {{ix}}));
- if ({{component.error_condition(attr)}}) goto bad;
- {{endfor}}
-#else
- {
- PyObject *item;
- {{for ix, component in enumerate(components):}}
- {{py:attr = "result.f%s" % ix}}
- item = PySequence_ITEM(o, {{ix}}); if (unlikely(!item)) goto bad;
- {{attr}} = {{component.from_py_function}}(item);
- Py_DECREF(item);
- if ({{component.error_condition(attr)}}) goto bad;
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ {{for ix, component in enumerate(components):}}
+ {{py:attr = "result.f%s" % ix}}
+ {{attr}} = {{component.from_py_function}}(PyTuple_GET_ITEM(o, {{ix}}));
+ if ({{component.error_condition(attr)}}) goto bad;
{{endfor}}
- }
-#endif
+#else
+ {
+ PyObject *item;
+ {{for ix, component in enumerate(components):}}
+ {{py:attr = "result.f%s" % ix}}
+ item = PySequence_ITEM(o, {{ix}}); if (unlikely(!item)) goto bad;
+ {{attr}} = {{component.from_py_function}}(item);
+ Py_DECREF(item);
+ if ({{component.error_condition(attr)}}) goto bad;
+ {{endfor}}
+ }
+#endif
return result;
bad:
return result;
}
-
-/////////////// UnicodeAsUCS4.proto ///////////////
-
-static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*);
-
-/////////////// UnicodeAsUCS4 ///////////////
-
-static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) {
- Py_ssize_t length;
- #if CYTHON_PEP393_ENABLED
- length = PyUnicode_GET_LENGTH(x);
- if (likely(length == 1)) {
- return PyUnicode_READ_CHAR(x, 0);
- }
- #else
- length = PyUnicode_GET_SIZE(x);
- if (likely(length == 1)) {
- return PyUnicode_AS_UNICODE(x)[0];
- }
- #if Py_UNICODE_SIZE == 2
- else if (PyUnicode_GET_SIZE(x) == 2) {
- Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0];
- if (high_val >= 0xD800 && high_val <= 0xDBFF) {
- Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1];
- if (low_val >= 0xDC00 && low_val <= 0xDFFF) {
- return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1)));
- }
- }
- }
- #endif
- #endif
- PyErr_Format(PyExc_ValueError,
- "only single character unicode strings can be converted to Py_UCS4, "
- "got length %" CYTHON_FORMAT_SSIZE_T "d", length);
- return (Py_UCS4)-1;
-}
-
-
+
+/////////////// UnicodeAsUCS4.proto ///////////////
+
+static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*);
+
+/////////////// UnicodeAsUCS4 ///////////////
+
+static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) {
+ Py_ssize_t length;
+ #if CYTHON_PEP393_ENABLED
+ length = PyUnicode_GET_LENGTH(x);
+ if (likely(length == 1)) {
+ return PyUnicode_READ_CHAR(x, 0);
+ }
+ #else
+ length = PyUnicode_GET_SIZE(x);
+ if (likely(length == 1)) {
+ return PyUnicode_AS_UNICODE(x)[0];
+ }
+ #if Py_UNICODE_SIZE == 2
+ else if (PyUnicode_GET_SIZE(x) == 2) {
+ Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0];
+ if (high_val >= 0xD800 && high_val <= 0xDBFF) {
+ Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1];
+ if (low_val >= 0xDC00 && low_val <= 0xDFFF) {
+ return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1)));
+ }
+ }
+ }
+ #endif
+ #endif
+ PyErr_Format(PyExc_ValueError,
+ "only single character unicode strings can be converted to Py_UCS4, "
+ "got length %" CYTHON_FORMAT_SSIZE_T "d", length);
+ return (Py_UCS4)-1;
+}
+
+
/////////////// ObjectAsUCS4.proto ///////////////
-//@requires: UnicodeAsUCS4
+//@requires: UnicodeAsUCS4
-#define __Pyx_PyObject_AsPy_UCS4(x) \
- (likely(PyUnicode_Check(x)) ? __Pyx_PyUnicode_AsPy_UCS4(x) : __Pyx__PyObject_AsPy_UCS4(x))
-static Py_UCS4 __Pyx__PyObject_AsPy_UCS4(PyObject*);
+#define __Pyx_PyObject_AsPy_UCS4(x) \
+ (likely(PyUnicode_Check(x)) ? __Pyx_PyUnicode_AsPy_UCS4(x) : __Pyx__PyObject_AsPy_UCS4(x))
+static Py_UCS4 __Pyx__PyObject_AsPy_UCS4(PyObject*);
/////////////// ObjectAsUCS4 ///////////////
-static Py_UCS4 __Pyx__PyObject_AsPy_UCS4_raise_error(long ival) {
- if (ival < 0) {
+static Py_UCS4 __Pyx__PyObject_AsPy_UCS4_raise_error(long ival) {
+ if (ival < 0) {
if (!PyErr_Occurred())
PyErr_SetString(PyExc_OverflowError,
"cannot convert negative value to Py_UCS4");
- } else {
+ } else {
PyErr_SetString(PyExc_OverflowError,
"value too large to convert to Py_UCS4");
}
- return (Py_UCS4)-1;
-}
-
-static Py_UCS4 __Pyx__PyObject_AsPy_UCS4(PyObject* x) {
- long ival;
- ival = __Pyx_PyInt_As_long(x);
- if (unlikely(!__Pyx_is_valid_index(ival, 1114111 + 1))) {
- return __Pyx__PyObject_AsPy_UCS4_raise_error(ival);
- }
+ return (Py_UCS4)-1;
+}
+
+static Py_UCS4 __Pyx__PyObject_AsPy_UCS4(PyObject* x) {
+ long ival;
+ ival = __Pyx_PyInt_As_long(x);
+ if (unlikely(!__Pyx_is_valid_index(ival, 1114111 + 1))) {
+ return __Pyx__PyObject_AsPy_UCS4_raise_error(ival);
+ }
return (Py_UCS4)ival;
}
-
+
/////////////// ObjectAsPyUnicode.proto ///////////////
static CYTHON_INLINE Py_UNICODE __Pyx_PyObject_AsPy_UNICODE(PyObject*);
@@ -624,16 +624,16 @@ static CYTHON_INLINE Py_UNICODE __Pyx_PyObject_AsPy_UNICODE(PyObject* x) {
#endif
ival = __Pyx_PyInt_As_long(x);
}
- if (unlikely(!__Pyx_is_valid_index(ival, maxval + 1))) {
- if (ival < 0) {
- if (!PyErr_Occurred())
- PyErr_SetString(PyExc_OverflowError,
- "cannot convert negative value to Py_UNICODE");
- return (Py_UNICODE)-1;
- } else {
+ if (unlikely(!__Pyx_is_valid_index(ival, maxval + 1))) {
+ if (ival < 0) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(PyExc_OverflowError,
+ "cannot convert negative value to Py_UNICODE");
+ return (Py_UNICODE)-1;
+ } else {
PyErr_SetString(PyExc_OverflowError,
- "value too large to convert to Py_UNICODE");
- }
+ "value too large to convert to Py_UNICODE");
+ }
return (Py_UNICODE)-1;
}
return (Py_UNICODE)ival;
@@ -652,7 +652,7 @@ static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value) {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#endif
- const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = ({{TYPE}}) 0;
+ const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = ({{TYPE}}) 0;
#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
#pragma GCC diagnostic pop
#endif
@@ -662,18 +662,18 @@ static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value) {
return PyInt_FromLong((long) value);
} else if (sizeof({{TYPE}}) <= sizeof(unsigned long)) {
return PyLong_FromUnsignedLong((unsigned long) value);
-#ifdef HAVE_LONG_LONG
- } else if (sizeof({{TYPE}}) <= sizeof(unsigned PY_LONG_LONG)) {
- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
-#endif
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof({{TYPE}}) <= sizeof(unsigned PY_LONG_LONG)) {
+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
}
} else {
if (sizeof({{TYPE}}) <= sizeof(long)) {
return PyInt_FromLong((long) value);
-#ifdef HAVE_LONG_LONG
- } else if (sizeof({{TYPE}}) <= sizeof(PY_LONG_LONG)) {
- return PyLong_FromLongLong((PY_LONG_LONG) value);
-#endif
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof({{TYPE}}) <= sizeof(PY_LONG_LONG)) {
+ return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
}
}
{
@@ -685,175 +685,175 @@ static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value) {
}
-/////////////// CIntToDigits ///////////////
-
-static const char DIGIT_PAIRS_10[2*10*10+1] = {
- "00010203040506070809"
- "10111213141516171819"
- "20212223242526272829"
- "30313233343536373839"
- "40414243444546474849"
- "50515253545556575859"
- "60616263646566676869"
- "70717273747576777879"
- "80818283848586878889"
- "90919293949596979899"
-};
-
-static const char DIGIT_PAIRS_8[2*8*8+1] = {
- "0001020304050607"
- "1011121314151617"
- "2021222324252627"
- "3031323334353637"
- "4041424344454647"
- "5051525354555657"
- "6061626364656667"
- "7071727374757677"
-};
-
-static const char DIGITS_HEX[2*16+1] = {
+/////////////// CIntToDigits ///////////////
+
+static const char DIGIT_PAIRS_10[2*10*10+1] = {
+ "00010203040506070809"
+ "10111213141516171819"
+ "20212223242526272829"
+ "30313233343536373839"
+ "40414243444546474849"
+ "50515253545556575859"
+ "60616263646566676869"
+ "70717273747576777879"
+ "80818283848586878889"
+ "90919293949596979899"
+};
+
+static const char DIGIT_PAIRS_8[2*8*8+1] = {
+ "0001020304050607"
+ "1011121314151617"
+ "2021222324252627"
+ "3031323334353637"
+ "4041424344454647"
+ "5051525354555657"
+ "6061626364656667"
+ "7071727374757677"
+};
+
+static const char DIGITS_HEX[2*16+1] = {
"0123456789abcdef"
"0123456789ABCDEF"
-};
-
-
-/////////////// CIntToPyUnicode.proto ///////////////
-
-static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t width, char padding_char, char format_char);
-
-/////////////// CIntToPyUnicode ///////////////
+};
+
+
+/////////////// CIntToPyUnicode.proto ///////////////
+
+static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t width, char padding_char, char format_char);
+
+/////////////// CIntToPyUnicode ///////////////
//@requires: StringTools.c::IncludeStringH
-//@requires: StringTools.c::BuildPyUnicode
-//@requires: CIntToDigits
+//@requires: StringTools.c::BuildPyUnicode
+//@requires: CIntToDigits
//@requires: GCCDiagnostics
-
-// NOTE: inlining because most arguments are constant, which collapses lots of code below
-
-static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t width, char padding_char, char format_char) {
- // simple and conservative C string allocation on the stack: each byte gives at most 3 digits, plus sign
- char digits[sizeof({{TYPE}})*3+2];
- // 'dpos' points to end of digits array + 1 initially to allow for pre-decrement looping
- char *dpos, *end = digits + sizeof({{TYPE}})*3+2;
- const char *hex_digits = DIGITS_HEX;
- Py_ssize_t length, ulength;
- int prepend_sign, last_one_off;
- {{TYPE}} remaining;
+
+// NOTE: inlining because most arguments are constant, which collapses lots of code below
+
+static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t width, char padding_char, char format_char) {
+ // simple and conservative C string allocation on the stack: each byte gives at most 3 digits, plus sign
+ char digits[sizeof({{TYPE}})*3+2];
+ // 'dpos' points to end of digits array + 1 initially to allow for pre-decrement looping
+ char *dpos, *end = digits + sizeof({{TYPE}})*3+2;
+ const char *hex_digits = DIGITS_HEX;
+ Py_ssize_t length, ulength;
+ int prepend_sign, last_one_off;
+ {{TYPE}} remaining;
#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
- const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = ({{TYPE}}) 0;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+ const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = ({{TYPE}}) 0;
#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
-#pragma GCC diagnostic pop
-#endif
- const int is_unsigned = neg_one > const_zero;
-
- if (format_char == 'X') {
- hex_digits += 16;
- format_char = 'x';
+#pragma GCC diagnostic pop
+#endif
+ const int is_unsigned = neg_one > const_zero;
+
+ if (format_char == 'X') {
+ hex_digits += 16;
+ format_char = 'x';
}
-
- // surprise: even trivial sprintf() calls don't get optimised in gcc (4.8)
- remaining = value; /* not using abs(value) to avoid overflow problems */
- last_one_off = 0;
- dpos = end;
+
+ // surprise: even trivial sprintf() calls don't get optimised in gcc (4.8)
+ remaining = value; /* not using abs(value) to avoid overflow problems */
+ last_one_off = 0;
+ dpos = end;
do {
- int digit_pos;
- switch (format_char) {
- case 'o':
+ int digit_pos;
+ switch (format_char) {
+ case 'o':
digit_pos = abs((int)(remaining % (8*8)));
remaining = ({{TYPE}}) (remaining / (8*8));
- dpos -= 2;
+ dpos -= 2;
memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); /* copy 2 digits at a time, unaligned */
- last_one_off = (digit_pos < 8);
- break;
- case 'd':
+ last_one_off = (digit_pos < 8);
+ break;
+ case 'd':
digit_pos = abs((int)(remaining % (10*10)));
remaining = ({{TYPE}}) (remaining / (10*10));
- dpos -= 2;
+ dpos -= 2;
memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); /* copy 2 digits at a time, unaligned */
- last_one_off = (digit_pos < 10);
- break;
- case 'x':
+ last_one_off = (digit_pos < 10);
+ break;
+ case 'x':
*(--dpos) = hex_digits[abs((int)(remaining % 16))];
remaining = ({{TYPE}}) (remaining / 16);
- break;
- default:
- assert(0);
- break;
- }
+ break;
+ default:
+ assert(0);
+ break;
+ }
} while (unlikely(remaining != 0));
- if (last_one_off) {
- assert(*dpos == '0');
- dpos++;
- }
- length = end - dpos;
- ulength = length;
- prepend_sign = 0;
- if (!is_unsigned && value <= neg_one) {
- if (padding_char == ' ' || width <= length + 1) {
- *(--dpos) = '-';
- ++length;
- } else {
- prepend_sign = 1;
- }
- ++ulength;
- }
- if (width > ulength) {
- ulength = width;
- }
- // single character unicode strings are cached in CPython => use PyUnicode_FromOrdinal() for them
- if (ulength == 1) {
- return PyUnicode_FromOrdinal(*dpos);
- }
- return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char);
-}
-
-
-/////////////// CBIntToPyUnicode.proto ///////////////
-
-#define {{TO_PY_FUNCTION}}(value) \
- ((value) ? __Pyx_NewRef({{TRUE_CONST}}) : __Pyx_NewRef({{FALSE_CONST}}))
-
-
-/////////////// PyIntFromDouble.proto ///////////////
-
-#if PY_MAJOR_VERSION < 3
-static CYTHON_INLINE PyObject* __Pyx_PyInt_FromDouble(double value);
-#else
-#define __Pyx_PyInt_FromDouble(value) PyLong_FromDouble(value)
-#endif
-
-/////////////// PyIntFromDouble ///////////////
-
-#if PY_MAJOR_VERSION < 3
-static CYTHON_INLINE PyObject* __Pyx_PyInt_FromDouble(double value) {
- if (value >= (double)LONG_MIN && value <= (double)LONG_MAX) {
- return PyInt_FromLong((long)value);
- }
- return PyLong_FromDouble(value);
-}
-#endif
-
-
+ if (last_one_off) {
+ assert(*dpos == '0');
+ dpos++;
+ }
+ length = end - dpos;
+ ulength = length;
+ prepend_sign = 0;
+ if (!is_unsigned && value <= neg_one) {
+ if (padding_char == ' ' || width <= length + 1) {
+ *(--dpos) = '-';
+ ++length;
+ } else {
+ prepend_sign = 1;
+ }
+ ++ulength;
+ }
+ if (width > ulength) {
+ ulength = width;
+ }
+ // single character unicode strings are cached in CPython => use PyUnicode_FromOrdinal() for them
+ if (ulength == 1) {
+ return PyUnicode_FromOrdinal(*dpos);
+ }
+ return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char);
+}
+
+
+/////////////// CBIntToPyUnicode.proto ///////////////
+
+#define {{TO_PY_FUNCTION}}(value) \
+ ((value) ? __Pyx_NewRef({{TRUE_CONST}}) : __Pyx_NewRef({{FALSE_CONST}}))
+
+
+/////////////// PyIntFromDouble.proto ///////////////
+
+#if PY_MAJOR_VERSION < 3
+static CYTHON_INLINE PyObject* __Pyx_PyInt_FromDouble(double value);
+#else
+#define __Pyx_PyInt_FromDouble(value) PyLong_FromDouble(value)
+#endif
+
+/////////////// PyIntFromDouble ///////////////
+
+#if PY_MAJOR_VERSION < 3
+static CYTHON_INLINE PyObject* __Pyx_PyInt_FromDouble(double value) {
+ if (value >= (double)LONG_MIN && value <= (double)LONG_MAX) {
+ return PyInt_FromLong((long)value);
+ }
+ return PyLong_FromDouble(value);
+}
+#endif
+
+
/////////////// CIntFromPyVerify ///////////////
// see CIntFromPy
#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value) \
- __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
-
-#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value) \
- __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
-
-#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc) \
+ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
+
+#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value) \
+ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
+
+#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc) \
{ \
func_type value = func_value; \
if (sizeof(target_type) < sizeof(func_type)) { \
if (unlikely(value != (func_type) (target_type) value)) { \
func_type zero = 0; \
- if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred())) \
- return (target_type) -1; \
+ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred())) \
+ return (target_type) -1; \
if (is_unsigned && unlikely(value < zero)) \
goto raise_neg_overflow; \
else \
@@ -872,14 +872,14 @@ static CYTHON_INLINE {{TYPE}} {{FROM_PY_FUNCTION}}(PyObject *);
//@requires: CIntFromPyVerify
//@requires: GCCDiagnostics
-{{py: from Cython.Utility import pylong_join }}
-
+{{py: from Cython.Utility import pylong_join }}
+
static CYTHON_INLINE {{TYPE}} {{FROM_PY_FUNCTION}}(PyObject *x) {
#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#endif
- const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = ({{TYPE}}) 0;
+ const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = ({{TYPE}}) 0;
#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
#pragma GCC diagnostic pop
#endif
@@ -899,74 +899,74 @@ static CYTHON_INLINE {{TYPE}} {{FROM_PY_FUNCTION}}(PyObject *x) {
#endif
if (likely(PyLong_Check(x))) {
if (is_unsigned) {
-#if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*)x)->ob_digit;
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
switch (Py_SIZE(x)) {
- case 0: return ({{TYPE}}) 0;
- case 1: __PYX_VERIFY_RETURN_INT({{TYPE}}, digit, digits[0])
- {{for _size in (2, 3, 4)}}
- case {{_size}}:
- if (8 * sizeof({{TYPE}}) > {{_size-1}} * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > {{_size}} * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT({{TYPE}}, unsigned long, {{pylong_join(_size, 'digits')}})
- } else if (8 * sizeof({{TYPE}}) >= {{_size}} * PyLong_SHIFT) {
- return ({{TYPE}}) {{pylong_join(_size, 'digits', TYPE)}};
- }
- }
- break;
- {{endfor}}
+ case 0: return ({{TYPE}}) 0;
+ case 1: __PYX_VERIFY_RETURN_INT({{TYPE}}, digit, digits[0])
+ {{for _size in (2, 3, 4)}}
+ case {{_size}}:
+ if (8 * sizeof({{TYPE}}) > {{_size-1}} * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > {{_size}} * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT({{TYPE}}, unsigned long, {{pylong_join(_size, 'digits')}})
+ } else if (8 * sizeof({{TYPE}}) >= {{_size}} * PyLong_SHIFT) {
+ return ({{TYPE}}) {{pylong_join(_size, 'digits', TYPE)}};
+ }
+ }
+ break;
+ {{endfor}}
}
#endif
-#if CYTHON_COMPILING_IN_CPYTHON
+#if CYTHON_COMPILING_IN_CPYTHON
if (unlikely(Py_SIZE(x) < 0)) {
goto raise_neg_overflow;
}
-#else
- {
- // misuse Py_False as a quick way to compare to a '0' int object in PyPy
- int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
- if (unlikely(result < 0))
- return ({{TYPE}}) -1;
- if (unlikely(result == 1))
- goto raise_neg_overflow;
- }
-#endif
+#else
+ {
+ // misuse Py_False as a quick way to compare to a '0' int object in PyPy
+ int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+ if (unlikely(result < 0))
+ return ({{TYPE}}) -1;
+ if (unlikely(result == 1))
+ goto raise_neg_overflow;
+ }
+#endif
if (sizeof({{TYPE}}) <= sizeof(unsigned long)) {
- __PYX_VERIFY_RETURN_INT_EXC({{TYPE}}, unsigned long, PyLong_AsUnsignedLong(x))
-#ifdef HAVE_LONG_LONG
- } else if (sizeof({{TYPE}}) <= sizeof(unsigned PY_LONG_LONG)) {
- __PYX_VERIFY_RETURN_INT_EXC({{TYPE}}, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
-#endif
+ __PYX_VERIFY_RETURN_INT_EXC({{TYPE}}, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof({{TYPE}}) <= sizeof(unsigned PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC({{TYPE}}, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
}
} else {
- // signed
-#if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*)x)->ob_digit;
+ // signed
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
switch (Py_SIZE(x)) {
- case 0: return ({{TYPE}}) 0;
- case -1: __PYX_VERIFY_RETURN_INT({{TYPE}}, sdigit, (sdigit) (-(sdigit)digits[0]))
- case 1: __PYX_VERIFY_RETURN_INT({{TYPE}}, digit, +digits[0])
- {{for _size in (2, 3, 4)}}
- {{for _case in (-_size, _size)}}
- case {{_case}}:
- if (8 * sizeof({{TYPE}}){{' - 1' if _case < 0 else ''}} > {{_size-1}} * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > {{_size}} * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT({{TYPE}}, {{'long' if _case < 0 else 'unsigned long'}}, {{'-(long) ' if _case < 0 else ''}}{{pylong_join(_size, 'digits')}})
- } else if (8 * sizeof({{TYPE}}) - 1 > {{_size}} * PyLong_SHIFT) {
- return ({{TYPE}}) ({{'((%s)-1)*' % TYPE if _case < 0 else ''}}{{pylong_join(_size, 'digits', TYPE)}});
- }
- }
- break;
- {{endfor}}
- {{endfor}}
+ case 0: return ({{TYPE}}) 0;
+ case -1: __PYX_VERIFY_RETURN_INT({{TYPE}}, sdigit, (sdigit) (-(sdigit)digits[0]))
+ case 1: __PYX_VERIFY_RETURN_INT({{TYPE}}, digit, +digits[0])
+ {{for _size in (2, 3, 4)}}
+ {{for _case in (-_size, _size)}}
+ case {{_case}}:
+ if (8 * sizeof({{TYPE}}){{' - 1' if _case < 0 else ''}} > {{_size-1}} * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > {{_size}} * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT({{TYPE}}, {{'long' if _case < 0 else 'unsigned long'}}, {{'-(long) ' if _case < 0 else ''}}{{pylong_join(_size, 'digits')}})
+ } else if (8 * sizeof({{TYPE}}) - 1 > {{_size}} * PyLong_SHIFT) {
+ return ({{TYPE}}) ({{'((%s)-1)*' % TYPE if _case < 0 else ''}}{{pylong_join(_size, 'digits', TYPE)}});
+ }
+ }
+ break;
+ {{endfor}}
+ {{endfor}}
}
#endif
if (sizeof({{TYPE}}) <= sizeof(long)) {
- __PYX_VERIFY_RETURN_INT_EXC({{TYPE}}, long, PyLong_AsLong(x))
-#ifdef HAVE_LONG_LONG
- } else if (sizeof({{TYPE}}) <= sizeof(PY_LONG_LONG)) {
- __PYX_VERIFY_RETURN_INT_EXC({{TYPE}}, PY_LONG_LONG, PyLong_AsLongLong(x))
-#endif
+ __PYX_VERIFY_RETURN_INT_EXC({{TYPE}}, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof({{TYPE}}) <= sizeof(PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC({{TYPE}}, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
}
}
{
@@ -975,7 +975,7 @@ static CYTHON_INLINE {{TYPE}} {{FROM_PY_FUNCTION}}(PyObject *x) {
"_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
{{TYPE}} val;
- PyObject *v = __Pyx_PyNumber_IntOrLong(x);
+ PyObject *v = __Pyx_PyNumber_IntOrLong(x);
#if PY_MAJOR_VERSION < 3
if (likely(v) && !PyLong_Check(v)) {
PyObject *tmp = v;
@@ -998,7 +998,7 @@ static CYTHON_INLINE {{TYPE}} {{FROM_PY_FUNCTION}}(PyObject *x) {
}
} else {
{{TYPE}} val;
- PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+ PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
if (!tmp) return ({{TYPE}}) -1;
val = {{FROM_PY_FUNCTION}}(tmp);
Py_DECREF(tmp);
diff --git a/contrib/tools/cython/Cython/Utility/__init__.py b/contrib/tools/cython/Cython/Utility/__init__.py
index 73ccc1e2cb..95094222e6 100644
--- a/contrib/tools/cython/Cython/Utility/__init__.py
+++ b/contrib/tools/cython/Cython/Utility/__init__.py
@@ -1,29 +1,29 @@
-
-def pylong_join(count, digits_ptr='digits', join_type='unsigned long'):
- """
- Generate an unrolled shift-then-or loop over the first 'count' digits.
- Assumes that they fit into 'join_type'.
-
- (((d[2] << n) | d[1]) << n) | d[0]
- """
- return ('(' * (count * 2) + ' | '.join(
- "(%s)%s[%d])%s)" % (join_type, digits_ptr, _i, " << PyLong_SHIFT" if _i else '')
- for _i in range(count-1, -1, -1)))
-
-
-# although it could potentially make use of data independence,
-# this implementation is a bit slower than the simpler one above
-def _pylong_join(count, digits_ptr='digits', join_type='unsigned long'):
- """
- Generate an or-ed series of shifts for the first 'count' digits.
- Assumes that they fit into 'join_type'.
-
- (d[2] << 2*n) | (d[1] << 1*n) | d[0]
- """
- def shift(n):
- # avoid compiler warnings for overly large shifts that will be discarded anyway
- return " << (%d * PyLong_SHIFT < 8 * sizeof(%s) ? %d * PyLong_SHIFT : 0)" % (n, join_type, n) if n else ''
-
- return '(%s)' % ' | '.join(
- "(((%s)%s[%d])%s)" % (join_type, digits_ptr, i, shift(i))
- for i in range(count-1, -1, -1))
+
+def pylong_join(count, digits_ptr='digits', join_type='unsigned long'):
+ """
+ Generate an unrolled shift-then-or loop over the first 'count' digits.
+ Assumes that they fit into 'join_type'.
+
+ (((d[2] << n) | d[1]) << n) | d[0]
+ """
+ return ('(' * (count * 2) + ' | '.join(
+ "(%s)%s[%d])%s)" % (join_type, digits_ptr, _i, " << PyLong_SHIFT" if _i else '')
+ for _i in range(count-1, -1, -1)))
+
+
+# although it could potentially make use of data independence,
+# this implementation is a bit slower than the simpler one above
+def _pylong_join(count, digits_ptr='digits', join_type='unsigned long'):
+ """
+ Generate an or-ed series of shifts for the first 'count' digits.
+ Assumes that they fit into 'join_type'.
+
+ (d[2] << 2*n) | (d[1] << 1*n) | d[0]
+ """
+ def shift(n):
+ # avoid compiler warnings for overly large shifts that will be discarded anyway
+ return " << (%d * PyLong_SHIFT < 8 * sizeof(%s) ? %d * PyLong_SHIFT : 0)" % (n, join_type, n) if n else ''
+
+ return '(%s)' % ' | '.join(
+ "(((%s)%s[%d])%s)" % (join_type, digits_ptr, i, shift(i))
+ for i in range(count-1, -1, -1))
diff --git a/contrib/tools/cython/Cython/Utility/arrayarray.h b/contrib/tools/cython/Cython/Utility/arrayarray.h
index a9e4923785..e9558ca6c3 100644
--- a/contrib/tools/cython/Cython/Utility/arrayarray.h
+++ b/contrib/tools/cython/Cython/Utility/arrayarray.h
@@ -125,20 +125,20 @@ static CYTHON_INLINE int resize(arrayobject *self, Py_ssize_t n) {
static CYTHON_INLINE int resize_smart(arrayobject *self, Py_ssize_t n) {
void *items = (void*) self->data.ob_item;
Py_ssize_t newsize;
- if (n < self->allocated && n*4 > self->allocated) {
+ if (n < self->allocated && n*4 > self->allocated) {
__Pyx_SET_SIZE(self, n);
- return 0;
- }
- newsize = n + (n / 2) + 1;
- if (newsize <= n) { /* overflow */
- PyErr_NoMemory();
- return -1;
+ return 0;
}
+ newsize = n + (n / 2) + 1;
+ if (newsize <= n) { /* overflow */
+ PyErr_NoMemory();
+ return -1;
+ }
PyMem_Resize(items, char, (size_t)(newsize * self->ob_descr->itemsize));
if (items == NULL) {
PyErr_NoMemory();
return -1;
- }
+ }
self->data.ob_item = (char*) items;
__Pyx_SET_SIZE(self, n);
self->allocated = newsize;
diff --git a/contrib/tools/cython/Cython/Utils.py b/contrib/tools/cython/Cython/Utils.py
index d59d67d78b..aa49e05c1b 100644
--- a/contrib/tools/cython/Cython/Utils.py
+++ b/contrib/tools/cython/Cython/Utils.py
@@ -3,44 +3,44 @@
# anywhere else in particular
#
-from __future__ import absolute_import
-
-try:
- from __builtin__ import basestring
-except ImportError:
- basestring = str
-
-try:
- FileNotFoundError
-except NameError:
- FileNotFoundError = OSError
-
+from __future__ import absolute_import
+
+try:
+ from __builtin__ import basestring
+except ImportError:
+ basestring = str
+
+try:
+ FileNotFoundError
+except NameError:
+ FileNotFoundError = OSError
+
import os
import sys
import re
import io
import codecs
-import shutil
+import shutil
import tempfile
from contextlib import contextmanager
modification_time = os.path.getmtime
-_function_caches = []
-def clear_function_caches():
- for cache in _function_caches:
- cache.clear()
+_function_caches = []
+def clear_function_caches():
+ for cache in _function_caches:
+ cache.clear()
def cached_function(f):
cache = {}
- _function_caches.append(cache)
+ _function_caches.append(cache)
uncomputed = object()
def wrapper(*args):
res = cache.get(args, uncomputed)
if res is uncomputed:
res = cache[args] = f(*args)
return res
- wrapper.uncached = f
+ wrapper.uncached = f
return wrapper
def cached_method(f):
@@ -96,34 +96,34 @@ def file_newer_than(path, time):
ftime = modification_time(path)
return ftime > time
-
-def safe_makedirs(path):
- try:
- os.makedirs(path)
- except OSError:
- if not os.path.isdir(path):
- raise
-
-
-def copy_file_to_dir_if_newer(sourcefile, destdir):
- """
- Copy file sourcefile to directory destdir (creating it if needed),
- preserving metadata. If the destination file exists and is not
- older than the source file, the copying is skipped.
- """
- destfile = os.path.join(destdir, os.path.basename(sourcefile))
- try:
- desttime = modification_time(destfile)
- except OSError:
- # New file does not exist, destdir may or may not exist
- safe_makedirs(destdir)
- else:
- # New file already exists
- if not file_newer_than(sourcefile, desttime):
- return
- shutil.copy2(sourcefile, destfile)
-
-
+
+def safe_makedirs(path):
+ try:
+ os.makedirs(path)
+ except OSError:
+ if not os.path.isdir(path):
+ raise
+
+
+def copy_file_to_dir_if_newer(sourcefile, destdir):
+ """
+ Copy file sourcefile to directory destdir (creating it if needed),
+ preserving metadata. If the destination file exists and is not
+ older than the source file, the copying is skipped.
+ """
+ destfile = os.path.join(destdir, os.path.basename(sourcefile))
+ try:
+ desttime = modification_time(destfile)
+ except OSError:
+ # New file does not exist, destdir may or may not exist
+ safe_makedirs(destdir)
+ else:
+ # New file already exists
+ if not file_newer_than(sourcefile, desttime):
+ return
+ shutil.copy2(sourcefile, destfile)
+
+
@cached_function
def find_root_package_dir(file_path):
dir = os.path.dirname(file_path)
@@ -179,40 +179,40 @@ def path_exists(path):
# file name encodings
def decode_filename(filename):
- if isinstance(filename, bytes):
- try:
- filename_encoding = sys.getfilesystemencoding()
- if filename_encoding is None:
- filename_encoding = sys.getdefaultencoding()
- filename = filename.decode(filename_encoding)
- except UnicodeDecodeError:
- pass
+ if isinstance(filename, bytes):
+ try:
+ filename_encoding = sys.getfilesystemencoding()
+ if filename_encoding is None:
+ filename_encoding = sys.getdefaultencoding()
+ filename = filename.decode(filename_encoding)
+ except UnicodeDecodeError:
+ pass
return filename
# support for source file encoding detection
-_match_file_encoding = re.compile(br"(\w*coding)[:=]\s*([-\w.]+)").search
+_match_file_encoding = re.compile(br"(\w*coding)[:=]\s*([-\w.]+)").search
def detect_opened_file_encoding(f):
# PEPs 263 and 3120
- # Most of the time the first two lines fall in the first couple of hundred chars,
+ # Most of the time the first two lines fall in the first couple of hundred chars,
# and this bulk read/split is much faster.
- lines = ()
- start = b''
- while len(lines) < 3:
- data = f.read(500)
- start += data
- lines = start.split(b"\n")
- if not data:
- break
- m = _match_file_encoding(lines[0])
- if m and m.group(1) != b'c_string_encoding':
- return m.group(2).decode('iso8859-1')
- elif len(lines) > 1:
- m = _match_file_encoding(lines[1])
+ lines = ()
+ start = b''
+ while len(lines) < 3:
+ data = f.read(500)
+ start += data
+ lines = start.split(b"\n")
+ if not data:
+ break
+ m = _match_file_encoding(lines[0])
+ if m and m.group(1) != b'c_string_encoding':
+ return m.group(2).decode('iso8859-1')
+ elif len(lines) > 1:
+ m = _match_file_encoding(lines[1])
if m:
- return m.group(2).decode('iso8859-1')
+ return m.group(2).decode('iso8859-1')
return "UTF-8"
@@ -226,40 +226,40 @@ def skip_bom(f):
f.seek(0)
-def open_source_file(source_filename, encoding=None, error_handling=None):
- stream = None
- try:
- if encoding is None:
- # Most of the time the encoding is not specified, so try hard to open the file only once.
- f = io.open(source_filename, 'rb')
- encoding = detect_opened_file_encoding(f)
+def open_source_file(source_filename, encoding=None, error_handling=None):
+ stream = None
+ try:
+ if encoding is None:
+ # Most of the time the encoding is not specified, so try hard to open the file only once.
+ f = io.open(source_filename, 'rb')
+ encoding = detect_opened_file_encoding(f)
f.seek(0)
- stream = io.TextIOWrapper(f, encoding=encoding, errors=error_handling)
+ stream = io.TextIOWrapper(f, encoding=encoding, errors=error_handling)
else:
- stream = io.open(source_filename, encoding=encoding, errors=error_handling)
+ stream = io.open(source_filename, encoding=encoding, errors=error_handling)
- except OSError:
- if os.path.exists(source_filename):
- raise # File is there, but something went wrong reading from it.
- # Allow source files to be in zip files etc.
+ except OSError:
+ if os.path.exists(source_filename):
+ raise # File is there, but something went wrong reading from it.
+ # Allow source files to be in zip files etc.
try:
loader = __loader__
if source_filename.startswith(loader.archive):
- stream = open_source_from_loader(
+ stream = open_source_from_loader(
loader, source_filename,
- encoding, error_handling)
+ encoding, error_handling)
except (NameError, AttributeError):
pass
- if stream is None:
- raise FileNotFoundError(source_filename)
+ if stream is None:
+ raise FileNotFoundError(source_filename)
skip_bom(stream)
return stream
def open_source_from_loader(loader,
source_filename,
- encoding=None, error_handling=None):
+ encoding=None, error_handling=None):
nrmpath = os.path.normpath(source_filename)
arcname = nrmpath[len(loader.archive)+1:]
data = loader.get_data(arcname)
@@ -270,22 +270,22 @@ def open_source_from_loader(loader,
def str_to_number(value):
# note: this expects a string as input that was accepted by the
- # parser already, with an optional "-" sign in front
- is_neg = False
- if value[:1] == '-':
- is_neg = True
- value = value[1:]
+ # parser already, with an optional "-" sign in front
+ is_neg = False
+ if value[:1] == '-':
+ is_neg = True
+ value = value[1:]
if len(value) < 2:
value = int(value, 0)
elif value[0] == '0':
- literal_type = value[1] # 0'o' - 0'b' - 0'x'
- if literal_type in 'xX':
+ literal_type = value[1] # 0'o' - 0'b' - 0'x'
+ if literal_type in 'xX':
# hex notation ('0x1AF')
value = int(value[2:], 16)
- elif literal_type in 'oO':
+ elif literal_type in 'oO':
# Py3 octal notation ('0o136')
value = int(value[2:], 8)
- elif literal_type in 'bB':
+ elif literal_type in 'bB':
# Py3 binary notation ('0b101')
value = int(value[2:], 2)
else:
@@ -293,7 +293,7 @@ def str_to_number(value):
value = int(value, 8)
else:
value = int(value, 0)
- return -value if is_neg else value
+ return -value if is_neg else value
def long_literal(value):
@@ -304,8 +304,8 @@ def long_literal(value):
@cached_function
def get_cython_cache_dir():
- r"""
- Return the base directory containing Cython's caches.
+ r"""
+ Return the base directory containing Cython's caches.
Priority:
@@ -358,9 +358,9 @@ def captured_fd(stream=2, encoding=None):
os.close(orig_stream)
-def print_bytes(s, header_text=None, end=b'\n', file=sys.stdout, flush=True):
- if header_text:
- file.write(header_text) # note: text! => file.write() instead of out.write()
+def print_bytes(s, header_text=None, end=b'\n', file=sys.stdout, flush=True):
+ if header_text:
+ file.write(header_text) # note: text! => file.write() instead of out.write()
file.flush()
try:
out = file.buffer # Py3
@@ -384,7 +384,7 @@ class LazyStr:
def __radd__(self, left):
return left + self.callback()
-
+
class OrderedSet(object):
def __init__(self, elements=()):
self._list = []
@@ -401,49 +401,49 @@ class OrderedSet(object):
self._set.add(e)
-# Class decorator that adds a metaclass and recreates the class with it.
-# Copied from 'six'.
-def add_metaclass(metaclass):
- """Class decorator for creating a class with a metaclass."""
- def wrapper(cls):
- orig_vars = cls.__dict__.copy()
- slots = orig_vars.get('__slots__')
- if slots is not None:
- if isinstance(slots, str):
- slots = [slots]
- for slots_var in slots:
- orig_vars.pop(slots_var)
- orig_vars.pop('__dict__', None)
- orig_vars.pop('__weakref__', None)
- return metaclass(cls.__name__, cls.__bases__, orig_vars)
- return wrapper
-
-
-def raise_error_if_module_name_forbidden(full_module_name):
- #it is bad idea to call the pyx-file cython.pyx, so fail early
- if full_module_name == 'cython' or full_module_name.startswith('cython.'):
- raise ValueError('cython is a special module, cannot be used as a module name')
-
-
-def build_hex_version(version_string):
- """
+# Class decorator that adds a metaclass and recreates the class with it.
+# Copied from 'six'.
+def add_metaclass(metaclass):
+ """Class decorator for creating a class with a metaclass."""
+ def wrapper(cls):
+ orig_vars = cls.__dict__.copy()
+ slots = orig_vars.get('__slots__')
+ if slots is not None:
+ if isinstance(slots, str):
+ slots = [slots]
+ for slots_var in slots:
+ orig_vars.pop(slots_var)
+ orig_vars.pop('__dict__', None)
+ orig_vars.pop('__weakref__', None)
+ return metaclass(cls.__name__, cls.__bases__, orig_vars)
+ return wrapper
+
+
+def raise_error_if_module_name_forbidden(full_module_name):
+ #it is bad idea to call the pyx-file cython.pyx, so fail early
+ if full_module_name == 'cython' or full_module_name.startswith('cython.'):
+ raise ValueError('cython is a special module, cannot be used as a module name')
+
+
+def build_hex_version(version_string):
+ """
Parse and translate '4.3a1' into the readable hex representation '0x040300A1' (like PY_VERSION_HEX).
- """
- # First, parse '4.12a1' into [4, 12, 0, 0xA01].
- digits = []
- release_status = 0xF0
- for digit in re.split('([.abrc]+)', version_string):
- if digit in ('a', 'b', 'rc'):
- release_status = {'a': 0xA0, 'b': 0xB0, 'rc': 0xC0}[digit]
- digits = (digits + [0, 0])[:3] # 1.2a1 -> 1.2.0a1
- elif digit != '.':
- digits.append(int(digit))
- digits = (digits + [0] * 3)[:4]
- digits[3] += release_status
-
- # Then, build a single hex value, two hex digits per version part.
- hexversion = 0
- for digit in digits:
- hexversion = (hexversion << 8) + digit
-
- return '0x%08X' % hexversion
+ """
+ # First, parse '4.12a1' into [4, 12, 0, 0xA01].
+ digits = []
+ release_status = 0xF0
+ for digit in re.split('([.abrc]+)', version_string):
+ if digit in ('a', 'b', 'rc'):
+ release_status = {'a': 0xA0, 'b': 0xB0, 'rc': 0xC0}[digit]
+ digits = (digits + [0, 0])[:3] # 1.2a1 -> 1.2.0a1
+ elif digit != '.':
+ digits.append(int(digit))
+ digits = (digits + [0] * 3)[:4]
+ digits[3] += release_status
+
+ # Then, build a single hex value, two hex digits per version part.
+ hexversion = 0
+ for digit in digits:
+ hexversion = (hexversion << 8) + digit
+
+ return '0x%08X' % hexversion
diff --git a/contrib/tools/cython/Cython/__init__.py b/contrib/tools/cython/Cython/__init__.py
index 549246b8a3..98fc8d1a9a 100644
--- a/contrib/tools/cython/Cython/__init__.py
+++ b/contrib/tools/cython/Cython/__init__.py
@@ -1,12 +1,12 @@
-from __future__ import absolute_import
-
-from .Shadow import __version__
+from __future__ import absolute_import
+from .Shadow import __version__
+
# Void cython.* directives (for case insensitive operating systems).
-from .Shadow import *
+from .Shadow import *
def load_ipython_extension(ip):
"""Load the extension in IPython."""
- from .Build.IpythonMagic import CythonMagics # pylint: disable=cyclic-import
+ from .Build.IpythonMagic import CythonMagics # pylint: disable=cyclic-import
ip.register_magics(CythonMagics)