Cython 3.2.0__cp39-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- Cython/Build/BuildExecutable.py +169 -0
- Cython/Build/Cache.py +199 -0
- Cython/Build/Cythonize.py +350 -0
- Cython/Build/Dependencies.py +1314 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +94 -0
- Cython/Build/Tests/TestCyCache.py +194 -0
- Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
- Cython/Build/Tests/TestDependencies.py +133 -0
- Cython/Build/Tests/TestInline.py +177 -0
- Cython/Build/Tests/TestIpythonMagic.py +287 -0
- Cython/Build/Tests/TestRecythonize.py +212 -0
- Cython/Build/Tests/TestStripLiterals.py +155 -0
- Cython/Build/Tests/__init__.py +1 -0
- Cython/Build/__init__.py +11 -0
- Cython/CodeWriter.py +815 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +328 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +984 -0
- Cython/Compiler/CmdLine.py +263 -0
- Cython/Compiler/Code.pxd +149 -0
- Cython/Compiler/Code.py +3746 -0
- Cython/Compiler/Code.pyd +0 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +191 -0
- Cython/Compiler/Dataclass.py +864 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +297 -0
- Cython/Compiler/ExprNodes.py +15562 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1451 -0
- Cython/Compiler/FlowControl.pyd +0 -0
- Cython/Compiler/FusedNode.py +971 -0
- Cython/Compiler/FusedNode.pyd +0 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +421 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/LineTable.pyd +0 -0
- Cython/Compiler/Main.py +857 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +905 -0
- Cython/Compiler/ModuleNode.py +4235 -0
- Cython/Compiler/Naming.py +363 -0
- Cython/Compiler/Nodes.py +10831 -0
- Cython/Compiler/Optimize.py +5288 -0
- Cython/Compiler/Options.py +843 -0
- Cython/Compiler/ParseTreeTransforms.pxd +78 -0
- Cython/Compiler/ParseTreeTransforms.py +4638 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4775 -0
- Cython/Compiler/Parsing.pyd +0 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5870 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +48 -0
- Cython/Compiler/Scanning.py +701 -0
- Cython/Compiler/Scanning.pyd +0 -0
- Cython/Compiler/StringEncoding.py +298 -0
- Cython/Compiler/Symtab.py +3073 -0
- Cython/Compiler/Tests/TestBuffer.py +105 -0
- Cython/Compiler/Tests/TestBuiltin.py +72 -0
- Cython/Compiler/Tests/TestCmdLine.py +586 -0
- Cython/Compiler/Tests/TestCode.py +144 -0
- Cython/Compiler/Tests/TestFlowControl.py +65 -0
- Cython/Compiler/Tests/TestGrammar.py +202 -0
- Cython/Compiler/Tests/TestMemView.py +71 -0
- Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
- Cython/Compiler/Tests/TestScanning.py +134 -0
- Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
- Cython/Compiler/Tests/TestStringEncoding.py +21 -0
- Cython/Compiler/Tests/TestTreeFragment.py +63 -0
- Cython/Compiler/Tests/TestTreePath.py +103 -0
- Cython/Compiler/Tests/TestTypes.py +75 -0
- Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
- Cython/Compiler/Tests/TestVisitor.py +61 -0
- Cython/Compiler/Tests/Utils.py +36 -0
- Cython/Compiler/Tests/__init__.py +1 -0
- Cython/Compiler/TreeFragment.py +278 -0
- Cython/Compiler/TreePath.py +303 -0
- Cython/Compiler/TypeInference.py +591 -0
- Cython/Compiler/TypeSlots.py +1174 -0
- Cython/Compiler/UFuncs.py +311 -0
- Cython/Compiler/UtilNodes.py +389 -0
- Cython/Compiler/UtilityCode.py +344 -0
- Cython/Compiler/Version.py +8 -0
- Cython/Compiler/Visitor.pxd +53 -0
- Cython/Compiler/Visitor.py +861 -0
- Cython/Compiler/Visitor.pyd +0 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +177 -0
- Cython/Debugger/DebugWriter.py +82 -0
- Cython/Debugger/Tests/TestLibCython.py +275 -0
- Cython/Debugger/Tests/__init__.py +1 -0
- Cython/Debugger/Tests/cfuncs.c +8 -0
- Cython/Debugger/Tests/codefile +49 -0
- Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
- Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
- Cython/Debugger/__init__.py +1 -0
- Cython/Debugger/libcython.py +1548 -0
- Cython/Debugger/libpython.py +2821 -0
- Cython/Debugging.py +20 -0
- Cython/Distutils/__init__.py +2 -0
- Cython/Distutils/build_ext.py +139 -0
- Cython/Distutils/extension.py +96 -0
- Cython/Distutils/old_build_ext.py +351 -0
- Cython/Includes/cpython/__init__.pxd +173 -0
- Cython/Includes/cpython/array.pxd +178 -0
- Cython/Includes/cpython/bool.pxd +37 -0
- Cython/Includes/cpython/buffer.pxd +112 -0
- Cython/Includes/cpython/bytearray.pxd +33 -0
- Cython/Includes/cpython/bytes.pxd +200 -0
- Cython/Includes/cpython/cellobject.pxd +35 -0
- Cython/Includes/cpython/ceval.pxd +8 -0
- Cython/Includes/cpython/codecs.pxd +121 -0
- Cython/Includes/cpython/complex.pxd +60 -0
- Cython/Includes/cpython/contextvars.pxd +145 -0
- Cython/Includes/cpython/conversion.pxd +36 -0
- Cython/Includes/cpython/datetime.pxd +395 -0
- Cython/Includes/cpython/descr.pxd +26 -0
- Cython/Includes/cpython/dict.pxd +187 -0
- Cython/Includes/cpython/exc.pxd +263 -0
- Cython/Includes/cpython/fileobject.pxd +57 -0
- Cython/Includes/cpython/float.pxd +47 -0
- Cython/Includes/cpython/function.pxd +65 -0
- Cython/Includes/cpython/genobject.pxd +25 -0
- Cython/Includes/cpython/getargs.pxd +12 -0
- Cython/Includes/cpython/instance.pxd +25 -0
- Cython/Includes/cpython/iterator.pxd +36 -0
- Cython/Includes/cpython/iterobject.pxd +24 -0
- Cython/Includes/cpython/list.pxd +92 -0
- Cython/Includes/cpython/long.pxd +149 -0
- Cython/Includes/cpython/longintrepr.pxd +14 -0
- Cython/Includes/cpython/mapping.pxd +63 -0
- Cython/Includes/cpython/marshal.pxd +66 -0
- Cython/Includes/cpython/mem.pxd +120 -0
- Cython/Includes/cpython/memoryview.pxd +50 -0
- Cython/Includes/cpython/method.pxd +49 -0
- Cython/Includes/cpython/module.pxd +208 -0
- Cython/Includes/cpython/number.pxd +258 -0
- Cython/Includes/cpython/object.pxd +433 -0
- Cython/Includes/cpython/pycapsule.pxd +143 -0
- Cython/Includes/cpython/pylifecycle.pxd +68 -0
- Cython/Includes/cpython/pyport.pxd +8 -0
- Cython/Includes/cpython/pystate.pxd +95 -0
- Cython/Includes/cpython/pythread.pxd +53 -0
- Cython/Includes/cpython/ref.pxd +141 -0
- Cython/Includes/cpython/sequence.pxd +134 -0
- Cython/Includes/cpython/set.pxd +119 -0
- Cython/Includes/cpython/slice.pxd +70 -0
- Cython/Includes/cpython/time.pxd +129 -0
- Cython/Includes/cpython/tuple.pxd +72 -0
- Cython/Includes/cpython/type.pxd +53 -0
- Cython/Includes/cpython/unicode.pxd +639 -0
- Cython/Includes/cpython/version.pxd +32 -0
- Cython/Includes/cpython/weakref.pxd +78 -0
- Cython/Includes/libc/__init__.pxd +1 -0
- Cython/Includes/libc/complex.pxd +35 -0
- Cython/Includes/libc/errno.pxd +127 -0
- Cython/Includes/libc/float.pxd +43 -0
- Cython/Includes/libc/limits.pxd +28 -0
- Cython/Includes/libc/locale.pxd +46 -0
- Cython/Includes/libc/math.pxd +209 -0
- Cython/Includes/libc/setjmp.pxd +10 -0
- Cython/Includes/libc/signal.pxd +64 -0
- Cython/Includes/libc/stddef.pxd +9 -0
- Cython/Includes/libc/stdint.pxd +105 -0
- Cython/Includes/libc/stdio.pxd +80 -0
- Cython/Includes/libc/stdlib.pxd +72 -0
- Cython/Includes/libc/string.pxd +50 -0
- Cython/Includes/libc/threads.pxd +234 -0
- Cython/Includes/libc/time.pxd +52 -0
- Cython/Includes/libcpp/__init__.pxd +4 -0
- Cython/Includes/libcpp/algorithm.pxd +320 -0
- Cython/Includes/libcpp/any.pxd +16 -0
- Cython/Includes/libcpp/atomic.pxd +59 -0
- Cython/Includes/libcpp/barrier.pxd +22 -0
- Cython/Includes/libcpp/bit.pxd +29 -0
- Cython/Includes/libcpp/cast.pxd +12 -0
- Cython/Includes/libcpp/cmath.pxd +518 -0
- Cython/Includes/libcpp/complex.pxd +106 -0
- Cython/Includes/libcpp/condition_variable.pxd +322 -0
- Cython/Includes/libcpp/deque.pxd +165 -0
- Cython/Includes/libcpp/exception.pxd +86 -0
- Cython/Includes/libcpp/execution.pxd +15 -0
- Cython/Includes/libcpp/forward_list.pxd +63 -0
- Cython/Includes/libcpp/functional.pxd +26 -0
- Cython/Includes/libcpp/future.pxd +103 -0
- Cython/Includes/libcpp/iterator.pxd +34 -0
- Cython/Includes/libcpp/latch.pxd +17 -0
- Cython/Includes/libcpp/limits.pxd +61 -0
- Cython/Includes/libcpp/list.pxd +117 -0
- Cython/Includes/libcpp/map.pxd +252 -0
- Cython/Includes/libcpp/memory.pxd +115 -0
- Cython/Includes/libcpp/mutex.pxd +387 -0
- Cython/Includes/libcpp/numbers.pxd +15 -0
- Cython/Includes/libcpp/numeric.pxd +131 -0
- Cython/Includes/libcpp/optional.pxd +34 -0
- Cython/Includes/libcpp/pair.pxd +1 -0
- Cython/Includes/libcpp/queue.pxd +25 -0
- Cython/Includes/libcpp/random.pxd +166 -0
- Cython/Includes/libcpp/semaphore.pxd +43 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +96 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +117 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +183 -0
- Cython/Includes/libcpp/typeindex.pxd +15 -0
- Cython/Includes/libcpp/typeinfo.pxd +10 -0
- Cython/Includes/libcpp/unordered_map.pxd +193 -0
- Cython/Includes/libcpp/unordered_set.pxd +152 -0
- Cython/Includes/libcpp/utility.pxd +30 -0
- Cython/Includes/libcpp/vector.pxd +186 -0
- Cython/Includes/numpy/math.pxd +150 -0
- Cython/Includes/openmp.pxd +50 -0
- Cython/Includes/posix/__init__.pxd +1 -0
- Cython/Includes/posix/dlfcn.pxd +14 -0
- Cython/Includes/posix/fcntl.pxd +86 -0
- Cython/Includes/posix/ioctl.pxd +4 -0
- Cython/Includes/posix/mman.pxd +101 -0
- Cython/Includes/posix/resource.pxd +57 -0
- Cython/Includes/posix/select.pxd +21 -0
- Cython/Includes/posix/signal.pxd +73 -0
- Cython/Includes/posix/stat.pxd +98 -0
- Cython/Includes/posix/stdio.pxd +37 -0
- Cython/Includes/posix/stdlib.pxd +29 -0
- Cython/Includes/posix/strings.pxd +9 -0
- Cython/Includes/posix/time.pxd +71 -0
- Cython/Includes/posix/types.pxd +30 -0
- Cython/Includes/posix/uio.pxd +26 -0
- Cython/Includes/posix/unistd.pxd +271 -0
- Cython/Includes/posix/wait.pxd +38 -0
- Cython/Plex/Actions.pxd +24 -0
- Cython/Plex/Actions.py +119 -0
- Cython/Plex/Actions.pyd +0 -0
- Cython/Plex/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -0
- Cython/Plex/DFA.pyd +0 -0
- Cython/Plex/Errors.py +48 -0
- Cython/Plex/Lexicons.py +178 -0
- Cython/Plex/Machines.pxd +36 -0
- Cython/Plex/Machines.py +238 -0
- Cython/Plex/Machines.pyd +0 -0
- Cython/Plex/Regexps.py +535 -0
- Cython/Plex/Scanners.pxd +45 -0
- Cython/Plex/Scanners.py +328 -0
- Cython/Plex/Scanners.pyd +0 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/Transitions.pyd +0 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyd +0 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/StringIOTree.pyd +0 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/Tempita/_tempita.pyd +0 -0
- Cython/TestUtils.py +422 -0
- Cython/Tests/TestCodeWriter.py +128 -0
- Cython/Tests/TestCythonUtils.py +202 -0
- Cython/Tests/TestJediTyper.py +223 -0
- Cython/Tests/TestShadow.py +114 -0
- Cython/Tests/TestStringIOTree.py +67 -0
- Cython/Tests/TestTestUtils.py +90 -0
- Cython/Tests/__init__.py +1 -0
- Cython/Tests/xmlrunner.py +390 -0
- Cython/Utility/AsyncGen.c +1031 -0
- Cython/Utility/Buffer.c +865 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +810 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +226 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2300 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +282 -0
- Cython/Utility/CppSupport.cpp +151 -0
- Cython/Utility/CythonFunction.c +1832 -0
- Cython/Utility/Dataclasses.c +101 -0
- Cython/Utility/Embed.c +121 -0
- Cython/Utility/Exceptions.c +1016 -0
- Cython/Utility/ExtensionTypes.c +996 -0
- Cython/Utility/FunctionArguments.c +1043 -0
- Cython/Utility/FusedFunction.pyx +44 -0
- Cython/Utility/ImportExport.c +907 -0
- Cython/Utility/MemoryView.pxd +188 -0
- Cython/Utility/MemoryView.pyx +1482 -0
- Cython/Utility/MemoryView_C.c +927 -0
- Cython/Utility/ModuleSetupCode.c +3203 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3273 -0
- Cython/Utility/Optimize.c +1603 -0
- Cython/Utility/Overflow.c +384 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +732 -0
- Cython/Utility/StringTools.c +1379 -0
- Cython/Utility/Synchronization.c +399 -0
- Cython/Utility/TString.c +356 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1385 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +167 -0
- Cython/Utils.py +687 -0
- Cython/Utils.pyd +0 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.2.0.dist-info/METADATA +85 -0
- cython-3.2.0.dist-info/RECORD +333 -0
- cython-3.2.0.dist-info/WHEEL +5 -0
- cython-3.2.0.dist-info/entry_points.txt +4 -0
- cython-3.2.0.dist-info/top_level.txt +3 -0
- cython.py +29 -0
- pyximport/__init__.py +4 -0
- pyximport/pyxbuild.py +160 -0
- pyximport/pyximport.py +482 -0
|
Binary file
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import itertools
|
|
2
|
+
from time import time
|
|
3
|
+
|
|
4
|
+
from . import Errors
|
|
5
|
+
from . import DebugFlags
|
|
6
|
+
from . import Options
|
|
7
|
+
from .Errors import CompileError, InternalError, AbortError
|
|
8
|
+
from . import Naming
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# Really small pipeline stages
|
|
12
|
+
#
|
|
13
|
+
def dumptree(t):
|
|
14
|
+
# For quick debugging in pipelines
|
|
15
|
+
print(t.dump())
|
|
16
|
+
return t
|
|
17
|
+
|
|
18
|
+
def abort_on_errors(node):
|
|
19
|
+
# Stop the pipeline if there are any errors.
|
|
20
|
+
if Errors.get_errors_count() != 0:
|
|
21
|
+
raise AbortError("pipeline break")
|
|
22
|
+
return node
|
|
23
|
+
|
|
24
|
+
def parse_stage_factory(context):
|
|
25
|
+
def parse(compsrc):
|
|
26
|
+
source_desc = compsrc.source_desc
|
|
27
|
+
full_module_name = compsrc.full_module_name
|
|
28
|
+
initial_pos = (source_desc, 1, 0)
|
|
29
|
+
saved_cimport_from_pyx, Options.cimport_from_pyx = Options.cimport_from_pyx, False
|
|
30
|
+
scope = context.find_module(full_module_name, pos = initial_pos, need_pxd = 0)
|
|
31
|
+
Options.cimport_from_pyx = saved_cimport_from_pyx
|
|
32
|
+
tree = context.parse(source_desc, scope, pxd = 0, full_module_name = full_module_name)
|
|
33
|
+
tree.compilation_source = compsrc
|
|
34
|
+
tree.scope = scope
|
|
35
|
+
tree.is_pxd = False
|
|
36
|
+
return tree
|
|
37
|
+
return parse
|
|
38
|
+
|
|
39
|
+
def parse_pxd_stage_factory(context, scope, module_name):
|
|
40
|
+
def parse(source_desc):
|
|
41
|
+
tree = context.parse(source_desc, scope, pxd=True,
|
|
42
|
+
full_module_name=module_name)
|
|
43
|
+
tree.scope = scope
|
|
44
|
+
tree.is_pxd = True
|
|
45
|
+
return tree
|
|
46
|
+
return parse
|
|
47
|
+
|
|
48
|
+
def generate_pyx_code_stage_factory(options, result):
|
|
49
|
+
def generate_pyx_code_stage(module_node):
|
|
50
|
+
module_node.process_implementation(options, result)
|
|
51
|
+
result.compilation_source = module_node.compilation_source
|
|
52
|
+
return result
|
|
53
|
+
return generate_pyx_code_stage
|
|
54
|
+
|
|
55
|
+
def inject_utility_pxd_code_stage_factory(context):
|
|
56
|
+
|
|
57
|
+
def inject_utility_pxd_code_stage(module_node):
|
|
58
|
+
for statlistnode, scope in context.utility_pxds.values():
|
|
59
|
+
module_node.merge_in(statlistnode, scope, stage="pxd")
|
|
60
|
+
return module_node
|
|
61
|
+
|
|
62
|
+
return inject_utility_pxd_code_stage
|
|
63
|
+
|
|
64
|
+
def inject_pxd_code_stage_factory(context):
|
|
65
|
+
|
|
66
|
+
def inject_pxd_code_stage(module_node):
|
|
67
|
+
for name, (statlistnode, scope) in context.pxds.items():
|
|
68
|
+
module_node.merge_in(statlistnode, scope, stage="pxd")
|
|
69
|
+
return module_node
|
|
70
|
+
return inject_pxd_code_stage
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def use_utility_code_definitions(scope, target, seen=None):
|
|
74
|
+
if seen is None:
|
|
75
|
+
seen = set()
|
|
76
|
+
|
|
77
|
+
for entry in scope.entries.values():
|
|
78
|
+
if entry in seen:
|
|
79
|
+
continue
|
|
80
|
+
|
|
81
|
+
seen.add(entry)
|
|
82
|
+
if entry.used and entry.utility_code_definition:
|
|
83
|
+
target.use_utility_code(entry.utility_code_definition)
|
|
84
|
+
for required_utility in entry.utility_code_definition.requires:
|
|
85
|
+
target.use_utility_code(required_utility)
|
|
86
|
+
elif entry.as_module:
|
|
87
|
+
use_utility_code_definitions(entry.as_module, target, seen)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def sorted_utility_codes_and_deps(utilcodes):
|
|
91
|
+
ranks = {}
|
|
92
|
+
get_rank = ranks.get
|
|
93
|
+
|
|
94
|
+
def calculate_rank(utilcode):
|
|
95
|
+
rank = get_rank(utilcode)
|
|
96
|
+
if rank is None:
|
|
97
|
+
ranks[utilcode] = 0 # prevent infinite recursion on circular dependencies
|
|
98
|
+
original_order = len(ranks)
|
|
99
|
+
rank = ranks[utilcode] = 1 + (
|
|
100
|
+
min([calculate_rank(dep) for dep in utilcode.requires]) if utilcode.requires else -1
|
|
101
|
+
) + original_order * 1e-8
|
|
102
|
+
return rank
|
|
103
|
+
|
|
104
|
+
for utilcode in utilcodes:
|
|
105
|
+
calculate_rank(utilcode)
|
|
106
|
+
|
|
107
|
+
# include all recursively collected dependencies
|
|
108
|
+
return sorted(ranks, key=get_rank)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def normalize_deps(utilcodes):
|
|
112
|
+
deps = {utilcode:utilcode for utilcode in utilcodes}
|
|
113
|
+
for utilcode in utilcodes:
|
|
114
|
+
utilcode.requires = [deps.setdefault(dep, dep) for dep in utilcode.requires or ()]
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def inject_utility_code_stage_factory(context, internalise_c_class_entries=True):
|
|
118
|
+
def inject_utility_code_stage(module_node):
|
|
119
|
+
module_node.prepare_utility_code()
|
|
120
|
+
use_utility_code_definitions(context.cython_scope, module_node.scope)
|
|
121
|
+
|
|
122
|
+
module_scope = module_node.scope
|
|
123
|
+
utility_code_list = module_scope.utility_code_list
|
|
124
|
+
utility_code_list[:] = sorted_utility_codes_and_deps(utility_code_list)
|
|
125
|
+
normalize_deps(utility_code_list)
|
|
126
|
+
|
|
127
|
+
added = set()
|
|
128
|
+
# Note: the list might be extended inside the loop (if some utility code
|
|
129
|
+
# pulls in other utility code, explicitly or implicitly)
|
|
130
|
+
for utilcode in utility_code_list:
|
|
131
|
+
if utilcode in added:
|
|
132
|
+
continue
|
|
133
|
+
added.add(utilcode)
|
|
134
|
+
if utilcode.requires:
|
|
135
|
+
for dep in utilcode.requires:
|
|
136
|
+
if dep not in added:
|
|
137
|
+
utility_code_list.append(dep)
|
|
138
|
+
if tree := utilcode.get_tree(cython_scope=context.cython_scope):
|
|
139
|
+
module_node.merge_in(tree.with_compiler_directives(),
|
|
140
|
+
tree.scope, stage="utility")
|
|
141
|
+
module_node.merge_scope(tree.scope, internalise_c_class_entries=internalise_c_class_entries)
|
|
142
|
+
elif shared_library_scope := utilcode.get_shared_library_scope(cython_scope=context.cython_scope):
|
|
143
|
+
module_scope.cimported_modules.append(shared_library_scope)
|
|
144
|
+
return module_node
|
|
145
|
+
|
|
146
|
+
return inject_utility_code_stage
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
#
|
|
150
|
+
# Pipeline factories
|
|
151
|
+
#
|
|
152
|
+
|
|
153
|
+
def create_pipeline(context, mode, exclude_classes=()):
|
|
154
|
+
assert mode in ('pyx', 'py', 'pxd')
|
|
155
|
+
from .Visitor import PrintTree
|
|
156
|
+
from .ParseTreeTransforms import WithTransform, NormalizeTree, PostParse, PxdPostParse
|
|
157
|
+
from .ParseTreeTransforms import ForwardDeclareTypes, InjectGilHandling, AnalyseDeclarationsTransform
|
|
158
|
+
from .ParseTreeTransforms import AnalyseExpressionsTransform, FindInvalidUseOfFusedTypes
|
|
159
|
+
from .ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform
|
|
160
|
+
from .ParseTreeTransforms import TrackNumpyAttributes, InterpretCompilerDirectives, TransformBuiltinMethods
|
|
161
|
+
from .ParseTreeTransforms import ExpandInplaceOperators, ParallelRangeTransform
|
|
162
|
+
from .ParseTreeTransforms import CalculateQualifiedNamesTransform
|
|
163
|
+
from .TypeInference import MarkParallelAssignments, MarkOverflowingArithmetic
|
|
164
|
+
from .ParseTreeTransforms import AdjustDefByDirectives, AlignFunctionDefinitions, AutoCpdefFunctionDefinitions
|
|
165
|
+
from .ParseTreeTransforms import RemoveUnreachableCode, GilCheck, CoerceCppTemps
|
|
166
|
+
from .FlowControl import ControlFlowAnalysis
|
|
167
|
+
from .AnalysedTreeTransforms import AutoTestDictTransform
|
|
168
|
+
from .AutoDocTransforms import EmbedSignature
|
|
169
|
+
from .Optimize import FlattenInListTransform, SwitchTransform, IterationTransform
|
|
170
|
+
from .Optimize import EarlyReplaceBuiltinCalls, OptimizeBuiltinCalls
|
|
171
|
+
from .Optimize import InlineDefNodeCalls
|
|
172
|
+
from .Optimize import ConstantFolding, FinalOptimizePhase
|
|
173
|
+
from .Optimize import DropRefcountingTransform
|
|
174
|
+
from .Optimize import ConsolidateOverflowCheck
|
|
175
|
+
from .Buffer import IntroduceBufferAuxiliaryVars
|
|
176
|
+
from .ModuleNode import check_c_declarations, check_c_declarations_pxd
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
if mode == 'pxd':
|
|
180
|
+
_check_c_declarations = check_c_declarations_pxd
|
|
181
|
+
_specific_post_parse = PxdPostParse(context)
|
|
182
|
+
else:
|
|
183
|
+
_check_c_declarations = check_c_declarations
|
|
184
|
+
_specific_post_parse = None
|
|
185
|
+
|
|
186
|
+
if mode == 'py':
|
|
187
|
+
_align_function_definitions = AlignFunctionDefinitions(context)
|
|
188
|
+
else:
|
|
189
|
+
_align_function_definitions = None
|
|
190
|
+
|
|
191
|
+
# NOTE: This is the "common" parts of the pipeline, which is also
|
|
192
|
+
# code in pxd files. So it will be run multiple times in a
|
|
193
|
+
# compilation stage.
|
|
194
|
+
stages = [
|
|
195
|
+
NormalizeTree(context),
|
|
196
|
+
PostParse(context),
|
|
197
|
+
_specific_post_parse,
|
|
198
|
+
TrackNumpyAttributes(),
|
|
199
|
+
InterpretCompilerDirectives(context, context.compiler_directives),
|
|
200
|
+
ParallelRangeTransform(context),
|
|
201
|
+
WithTransform(),
|
|
202
|
+
AdjustDefByDirectives(context),
|
|
203
|
+
_align_function_definitions,
|
|
204
|
+
MarkClosureVisitor(context),
|
|
205
|
+
AutoCpdefFunctionDefinitions(context),
|
|
206
|
+
RemoveUnreachableCode(context),
|
|
207
|
+
ConstantFolding(),
|
|
208
|
+
FlattenInListTransform(),
|
|
209
|
+
DecoratorTransform(context),
|
|
210
|
+
ForwardDeclareTypes(context),
|
|
211
|
+
InjectGilHandling(),
|
|
212
|
+
AnalyseDeclarationsTransform(context),
|
|
213
|
+
AutoTestDictTransform(context),
|
|
214
|
+
EmbedSignature(context),
|
|
215
|
+
EarlyReplaceBuiltinCalls(context), ## Necessary?
|
|
216
|
+
TransformBuiltinMethods(context),
|
|
217
|
+
MarkParallelAssignments(context),
|
|
218
|
+
ControlFlowAnalysis(context),
|
|
219
|
+
RemoveUnreachableCode(context),
|
|
220
|
+
# MarkParallelAssignments(context),
|
|
221
|
+
MarkOverflowingArithmetic(context),
|
|
222
|
+
IntroduceBufferAuxiliaryVars(context),
|
|
223
|
+
_check_c_declarations,
|
|
224
|
+
InlineDefNodeCalls(context),
|
|
225
|
+
AnalyseExpressionsTransform(context),
|
|
226
|
+
FindInvalidUseOfFusedTypes(),
|
|
227
|
+
ExpandInplaceOperators(context),
|
|
228
|
+
IterationTransform(context),
|
|
229
|
+
SwitchTransform(context),
|
|
230
|
+
OptimizeBuiltinCalls(context), ## Necessary?
|
|
231
|
+
CreateClosureClasses(context), ## After all lookups and type inference
|
|
232
|
+
CalculateQualifiedNamesTransform(context),
|
|
233
|
+
ConsolidateOverflowCheck(context),
|
|
234
|
+
DropRefcountingTransform(),
|
|
235
|
+
FinalOptimizePhase(context),
|
|
236
|
+
CoerceCppTemps(context),
|
|
237
|
+
GilCheck(),
|
|
238
|
+
]
|
|
239
|
+
if exclude_classes:
|
|
240
|
+
stages = [s for s in stages if s.__class__ not in exclude_classes]
|
|
241
|
+
return stages
|
|
242
|
+
|
|
243
|
+
def create_pyx_pipeline(context, options, result, py=False, exclude_classes=()):
|
|
244
|
+
mode = 'py' if py else 'pyx'
|
|
245
|
+
|
|
246
|
+
test_support = []
|
|
247
|
+
ctest_support = []
|
|
248
|
+
if options.evaluate_tree_assertions:
|
|
249
|
+
from ..TestUtils import TreeAssertVisitor
|
|
250
|
+
test_validator = TreeAssertVisitor()
|
|
251
|
+
test_support.append(test_validator)
|
|
252
|
+
ctest_support.append(test_validator.create_c_file_validator())
|
|
253
|
+
|
|
254
|
+
if options.gdb_debug:
|
|
255
|
+
from ..Debugger import DebugWriter # requires Py2.5+
|
|
256
|
+
from .ParseTreeTransforms import DebugTransform
|
|
257
|
+
context.gdb_debug_outputwriter = DebugWriter.CythonDebugWriter(
|
|
258
|
+
options.output_dir)
|
|
259
|
+
debug_transform = [DebugTransform(context, options, result)]
|
|
260
|
+
else:
|
|
261
|
+
debug_transform = []
|
|
262
|
+
|
|
263
|
+
return list(itertools.chain(
|
|
264
|
+
[parse_stage_factory(context)],
|
|
265
|
+
create_pipeline(context, mode, exclude_classes=exclude_classes),
|
|
266
|
+
test_support,
|
|
267
|
+
[
|
|
268
|
+
inject_pxd_code_stage_factory(context),
|
|
269
|
+
inject_utility_code_stage_factory(context),
|
|
270
|
+
inject_utility_pxd_code_stage_factory(context),
|
|
271
|
+
abort_on_errors,
|
|
272
|
+
],
|
|
273
|
+
debug_transform,
|
|
274
|
+
[generate_pyx_code_stage_factory(options, result)],
|
|
275
|
+
ctest_support,
|
|
276
|
+
))
|
|
277
|
+
|
|
278
|
+
def create_pxd_pipeline(context, scope, module_name):
|
|
279
|
+
from .CodeGeneration import ExtractPxdCode
|
|
280
|
+
|
|
281
|
+
# The pxd pipeline ends up with a CCodeWriter containing the
|
|
282
|
+
# code of the pxd, as well as a pxd scope.
|
|
283
|
+
return [
|
|
284
|
+
parse_pxd_stage_factory(context, scope, module_name)
|
|
285
|
+
] + create_pipeline(context, 'pxd') + [
|
|
286
|
+
ExtractPxdCode()
|
|
287
|
+
]
|
|
288
|
+
|
|
289
|
+
def create_py_pipeline(context, options, result):
|
|
290
|
+
return create_pyx_pipeline(context, options, result, py=True)
|
|
291
|
+
|
|
292
|
+
def create_pyx_as_pxd_pipeline(context, result):
|
|
293
|
+
from .ParseTreeTransforms import AlignFunctionDefinitions, \
|
|
294
|
+
MarkClosureVisitor, WithTransform, AnalyseDeclarationsTransform
|
|
295
|
+
from .Optimize import ConstantFolding, FlattenInListTransform
|
|
296
|
+
from .Nodes import StatListNode
|
|
297
|
+
pipeline = []
|
|
298
|
+
pyx_pipeline = create_pyx_pipeline(context, context.options, result,
|
|
299
|
+
exclude_classes=[
|
|
300
|
+
AlignFunctionDefinitions,
|
|
301
|
+
MarkClosureVisitor,
|
|
302
|
+
ConstantFolding,
|
|
303
|
+
FlattenInListTransform,
|
|
304
|
+
WithTransform
|
|
305
|
+
])
|
|
306
|
+
from .Visitor import VisitorTransform
|
|
307
|
+
class SetInPxdTransform(VisitorTransform):
|
|
308
|
+
# A number of nodes have an "in_pxd" attribute which affects AnalyseDeclarationsTransform
|
|
309
|
+
# (for example controlling pickling generation). Set it, to make sure we don't mix them up with
|
|
310
|
+
# the importing main module.
|
|
311
|
+
# FIXME: This should be done closer to the parsing step.
|
|
312
|
+
def visit_StatNode(self, node):
|
|
313
|
+
if hasattr(node, "in_pxd"):
|
|
314
|
+
node.in_pxd = True
|
|
315
|
+
self.visitchildren(node)
|
|
316
|
+
return node
|
|
317
|
+
|
|
318
|
+
visit_Node = VisitorTransform.recurse_to_children
|
|
319
|
+
|
|
320
|
+
for stage in pyx_pipeline:
|
|
321
|
+
pipeline.append(stage)
|
|
322
|
+
if isinstance(stage, AnalyseDeclarationsTransform):
|
|
323
|
+
pipeline.insert(-1, SetInPxdTransform())
|
|
324
|
+
break # This is the last stage we need.
|
|
325
|
+
def fake_pxd(root):
|
|
326
|
+
for entry in root.scope.entries.values():
|
|
327
|
+
if not entry.in_cinclude:
|
|
328
|
+
entry.defined_in_pxd = 1
|
|
329
|
+
if entry.name == entry.cname and entry.visibility != 'extern':
|
|
330
|
+
# Always mangle non-extern cimported entries.
|
|
331
|
+
entry.cname = entry.scope.mangle(Naming.func_prefix, entry.name)
|
|
332
|
+
return StatListNode(root.pos, stats=[]), root.scope
|
|
333
|
+
pipeline.append(fake_pxd)
|
|
334
|
+
return pipeline
|
|
335
|
+
|
|
336
|
+
def insert_into_pipeline(pipeline, transform, before=None, after=None):
|
|
337
|
+
"""
|
|
338
|
+
Insert a new transform into the pipeline after or before an instance of
|
|
339
|
+
the given class. e.g.
|
|
340
|
+
|
|
341
|
+
pipeline = insert_into_pipeline(pipeline, transform,
|
|
342
|
+
after=AnalyseDeclarationsTransform)
|
|
343
|
+
"""
|
|
344
|
+
assert before or after
|
|
345
|
+
|
|
346
|
+
cls = before or after
|
|
347
|
+
for i, t in enumerate(pipeline):
|
|
348
|
+
if isinstance(t, cls):
|
|
349
|
+
break
|
|
350
|
+
|
|
351
|
+
if after:
|
|
352
|
+
i += 1
|
|
353
|
+
|
|
354
|
+
return pipeline[:i] + [transform] + pipeline[i:]
|
|
355
|
+
|
|
356
|
+
#
|
|
357
|
+
# Running a pipeline
|
|
358
|
+
#
|
|
359
|
+
|
|
360
|
+
try:
|
|
361
|
+
from threading import local as _threadlocal
|
|
362
|
+
except ImportError:
|
|
363
|
+
class _threadlocal: pass
|
|
364
|
+
|
|
365
|
+
threadlocal = _threadlocal()
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def get_timings():
|
|
369
|
+
try:
|
|
370
|
+
return threadlocal.cython_pipeline_timings
|
|
371
|
+
except AttributeError:
|
|
372
|
+
return {}
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
_pipeline_entry_points = {}
|
|
376
|
+
|
|
377
|
+
def _make_debug_phase_runner(phase_name):
|
|
378
|
+
# Create a new wrapper for each step to show the name in profiles.
|
|
379
|
+
try:
|
|
380
|
+
return _pipeline_entry_points[phase_name]
|
|
381
|
+
except KeyError:
|
|
382
|
+
pass
|
|
383
|
+
|
|
384
|
+
def run(phase, data):
|
|
385
|
+
return phase(data)
|
|
386
|
+
|
|
387
|
+
run.__name__ = run.__qualname__ = phase_name
|
|
388
|
+
_pipeline_entry_points[phase_name] = run
|
|
389
|
+
return run
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def run_pipeline(pipeline, source, printtree=True):
|
|
393
|
+
from .Visitor import PrintTree
|
|
394
|
+
try:
|
|
395
|
+
timings = threadlocal.cython_pipeline_timings
|
|
396
|
+
except AttributeError:
|
|
397
|
+
timings = threadlocal.cython_pipeline_timings = {}
|
|
398
|
+
|
|
399
|
+
def run(phase, data):
|
|
400
|
+
return phase(data)
|
|
401
|
+
|
|
402
|
+
error = None
|
|
403
|
+
data = source
|
|
404
|
+
try:
|
|
405
|
+
try:
|
|
406
|
+
for phase in pipeline:
|
|
407
|
+
if phase is None:
|
|
408
|
+
continue
|
|
409
|
+
if not printtree and isinstance(phase, PrintTree):
|
|
410
|
+
continue
|
|
411
|
+
|
|
412
|
+
phase_name = getattr(phase, '__name__', type(phase).__name__)
|
|
413
|
+
if DebugFlags.debug_verbose_pipeline:
|
|
414
|
+
print("Entering pipeline phase %r" % phase)
|
|
415
|
+
run = _make_debug_phase_runner(phase_name)
|
|
416
|
+
|
|
417
|
+
t = time()
|
|
418
|
+
data = run(phase, data)
|
|
419
|
+
t = time() - t
|
|
420
|
+
|
|
421
|
+
try:
|
|
422
|
+
old_t, count = timings[phase_name]
|
|
423
|
+
except KeyError:
|
|
424
|
+
old_t, count = 0, 0
|
|
425
|
+
timings[phase_name] = (old_t + int(t * 1000000), count + 1)
|
|
426
|
+
if DebugFlags.debug_verbose_pipeline:
|
|
427
|
+
print(" %.3f seconds" % t)
|
|
428
|
+
except CompileError as err:
|
|
429
|
+
# err is set
|
|
430
|
+
Errors.report_error(err, use_stack=False)
|
|
431
|
+
error = err
|
|
432
|
+
except InternalError as err:
|
|
433
|
+
# Only raise if there was not an earlier error
|
|
434
|
+
if Errors.get_errors_count() == 0:
|
|
435
|
+
raise
|
|
436
|
+
error = err
|
|
437
|
+
except AbortError as err:
|
|
438
|
+
error = err
|
|
439
|
+
return (error, data)
|