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