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.
Files changed (333) hide show
  1. Cython/Build/BuildExecutable.py +169 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +350 -0
  4. Cython/Build/Dependencies.py +1314 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +463 -0
  7. Cython/Build/IpythonMagic.py +560 -0
  8. Cython/Build/SharedModule.py +94 -0
  9. Cython/Build/Tests/TestCyCache.py +194 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +287 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +11 -0
  18. Cython/CodeWriter.py +815 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +328 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +984 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.pxd +149 -0
  26. Cython/Compiler/Code.py +3746 -0
  27. Cython/Compiler/Code.pyd +0 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +191 -0
  30. Cython/Compiler/Dataclass.py +864 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +297 -0
  33. Cython/Compiler/ExprNodes.py +15562 -0
  34. Cython/Compiler/FlowControl.pxd +97 -0
  35. Cython/Compiler/FlowControl.py +1451 -0
  36. Cython/Compiler/FlowControl.pyd +0 -0
  37. Cython/Compiler/FusedNode.py +971 -0
  38. Cython/Compiler/FusedNode.pyd +0 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +421 -0
  42. Cython/Compiler/LineTable.py +114 -0
  43. Cython/Compiler/LineTable.pyd +0 -0
  44. Cython/Compiler/Main.py +857 -0
  45. Cython/Compiler/MatchCaseNodes.py +259 -0
  46. Cython/Compiler/MemoryView.py +905 -0
  47. Cython/Compiler/ModuleNode.py +4235 -0
  48. Cython/Compiler/Naming.py +363 -0
  49. Cython/Compiler/Nodes.py +10831 -0
  50. Cython/Compiler/Optimize.py +5288 -0
  51. Cython/Compiler/Options.py +843 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +78 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4638 -0
  54. Cython/Compiler/Parsing.pxd +9 -0
  55. Cython/Compiler/Parsing.py +4775 -0
  56. Cython/Compiler/Parsing.pyd +0 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +5870 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.pxd +48 -0
  61. Cython/Compiler/Scanning.py +701 -0
  62. Cython/Compiler/Scanning.pyd +0 -0
  63. Cython/Compiler/StringEncoding.py +298 -0
  64. Cython/Compiler/Symtab.py +3073 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +72 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +586 -0
  68. Cython/Compiler/Tests/TestCode.py +144 -0
  69. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  70. Cython/Compiler/Tests/TestGrammar.py +202 -0
  71. Cython/Compiler/Tests/TestMemView.py +71 -0
  72. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  73. Cython/Compiler/Tests/TestScanning.py +134 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +21 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +75 -0
  79. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  80. Cython/Compiler/Tests/TestVisitor.py +61 -0
  81. Cython/Compiler/Tests/Utils.py +36 -0
  82. Cython/Compiler/Tests/__init__.py +1 -0
  83. Cython/Compiler/TreeFragment.py +278 -0
  84. Cython/Compiler/TreePath.py +303 -0
  85. Cython/Compiler/TypeInference.py +591 -0
  86. Cython/Compiler/TypeSlots.py +1174 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +389 -0
  89. Cython/Compiler/UtilityCode.py +344 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.pxd +53 -0
  92. Cython/Compiler/Visitor.py +861 -0
  93. Cython/Compiler/Visitor.pyd +0 -0
  94. Cython/Compiler/__init__.py +1 -0
  95. Cython/Coverage.py +448 -0
  96. Cython/Debugger/Cygdb.py +177 -0
  97. Cython/Debugger/DebugWriter.py +82 -0
  98. Cython/Debugger/Tests/TestLibCython.py +275 -0
  99. Cython/Debugger/Tests/__init__.py +1 -0
  100. Cython/Debugger/Tests/cfuncs.c +8 -0
  101. Cython/Debugger/Tests/codefile +49 -0
  102. Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
  103. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  104. Cython/Debugger/__init__.py +1 -0
  105. Cython/Debugger/libcython.py +1548 -0
  106. Cython/Debugger/libpython.py +2821 -0
  107. Cython/Debugging.py +20 -0
  108. Cython/Distutils/__init__.py +2 -0
  109. Cython/Distutils/build_ext.py +139 -0
  110. Cython/Distutils/extension.py +96 -0
  111. Cython/Distutils/old_build_ext.py +351 -0
  112. Cython/Includes/cpython/__init__.pxd +173 -0
  113. Cython/Includes/cpython/array.pxd +178 -0
  114. Cython/Includes/cpython/bool.pxd +37 -0
  115. Cython/Includes/cpython/buffer.pxd +112 -0
  116. Cython/Includes/cpython/bytearray.pxd +33 -0
  117. Cython/Includes/cpython/bytes.pxd +200 -0
  118. Cython/Includes/cpython/cellobject.pxd +35 -0
  119. Cython/Includes/cpython/ceval.pxd +8 -0
  120. Cython/Includes/cpython/codecs.pxd +121 -0
  121. Cython/Includes/cpython/complex.pxd +60 -0
  122. Cython/Includes/cpython/contextvars.pxd +145 -0
  123. Cython/Includes/cpython/conversion.pxd +36 -0
  124. Cython/Includes/cpython/datetime.pxd +395 -0
  125. Cython/Includes/cpython/descr.pxd +26 -0
  126. Cython/Includes/cpython/dict.pxd +187 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +47 -0
  130. Cython/Includes/cpython/function.pxd +65 -0
  131. Cython/Includes/cpython/genobject.pxd +25 -0
  132. Cython/Includes/cpython/getargs.pxd +12 -0
  133. Cython/Includes/cpython/instance.pxd +25 -0
  134. Cython/Includes/cpython/iterator.pxd +36 -0
  135. Cython/Includes/cpython/iterobject.pxd +24 -0
  136. Cython/Includes/cpython/list.pxd +92 -0
  137. Cython/Includes/cpython/long.pxd +149 -0
  138. Cython/Includes/cpython/longintrepr.pxd +14 -0
  139. Cython/Includes/cpython/mapping.pxd +63 -0
  140. Cython/Includes/cpython/marshal.pxd +66 -0
  141. Cython/Includes/cpython/mem.pxd +120 -0
  142. Cython/Includes/cpython/memoryview.pxd +50 -0
  143. Cython/Includes/cpython/method.pxd +49 -0
  144. Cython/Includes/cpython/module.pxd +208 -0
  145. Cython/Includes/cpython/number.pxd +258 -0
  146. Cython/Includes/cpython/object.pxd +433 -0
  147. Cython/Includes/cpython/pycapsule.pxd +143 -0
  148. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  149. Cython/Includes/cpython/pyport.pxd +8 -0
  150. Cython/Includes/cpython/pystate.pxd +95 -0
  151. Cython/Includes/cpython/pythread.pxd +53 -0
  152. Cython/Includes/cpython/ref.pxd +141 -0
  153. Cython/Includes/cpython/sequence.pxd +134 -0
  154. Cython/Includes/cpython/set.pxd +119 -0
  155. Cython/Includes/cpython/slice.pxd +70 -0
  156. Cython/Includes/cpython/time.pxd +129 -0
  157. Cython/Includes/cpython/tuple.pxd +72 -0
  158. Cython/Includes/cpython/type.pxd +53 -0
  159. Cython/Includes/cpython/unicode.pxd +639 -0
  160. Cython/Includes/cpython/version.pxd +32 -0
  161. Cython/Includes/cpython/weakref.pxd +78 -0
  162. Cython/Includes/libc/__init__.pxd +1 -0
  163. Cython/Includes/libc/complex.pxd +35 -0
  164. Cython/Includes/libc/errno.pxd +127 -0
  165. Cython/Includes/libc/float.pxd +43 -0
  166. Cython/Includes/libc/limits.pxd +28 -0
  167. Cython/Includes/libc/locale.pxd +46 -0
  168. Cython/Includes/libc/math.pxd +209 -0
  169. Cython/Includes/libc/setjmp.pxd +10 -0
  170. Cython/Includes/libc/signal.pxd +64 -0
  171. Cython/Includes/libc/stddef.pxd +9 -0
  172. Cython/Includes/libc/stdint.pxd +105 -0
  173. Cython/Includes/libc/stdio.pxd +80 -0
  174. Cython/Includes/libc/stdlib.pxd +72 -0
  175. Cython/Includes/libc/string.pxd +50 -0
  176. Cython/Includes/libc/threads.pxd +234 -0
  177. Cython/Includes/libc/time.pxd +52 -0
  178. Cython/Includes/libcpp/__init__.pxd +4 -0
  179. Cython/Includes/libcpp/algorithm.pxd +320 -0
  180. Cython/Includes/libcpp/any.pxd +16 -0
  181. Cython/Includes/libcpp/atomic.pxd +59 -0
  182. Cython/Includes/libcpp/barrier.pxd +22 -0
  183. Cython/Includes/libcpp/bit.pxd +29 -0
  184. Cython/Includes/libcpp/cast.pxd +12 -0
  185. Cython/Includes/libcpp/cmath.pxd +518 -0
  186. Cython/Includes/libcpp/complex.pxd +106 -0
  187. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  188. Cython/Includes/libcpp/deque.pxd +165 -0
  189. Cython/Includes/libcpp/exception.pxd +86 -0
  190. Cython/Includes/libcpp/execution.pxd +15 -0
  191. Cython/Includes/libcpp/forward_list.pxd +63 -0
  192. Cython/Includes/libcpp/functional.pxd +26 -0
  193. Cython/Includes/libcpp/future.pxd +103 -0
  194. Cython/Includes/libcpp/iterator.pxd +34 -0
  195. Cython/Includes/libcpp/latch.pxd +17 -0
  196. Cython/Includes/libcpp/limits.pxd +61 -0
  197. Cython/Includes/libcpp/list.pxd +117 -0
  198. Cython/Includes/libcpp/map.pxd +252 -0
  199. Cython/Includes/libcpp/memory.pxd +115 -0
  200. Cython/Includes/libcpp/mutex.pxd +387 -0
  201. Cython/Includes/libcpp/numbers.pxd +15 -0
  202. Cython/Includes/libcpp/numeric.pxd +131 -0
  203. Cython/Includes/libcpp/optional.pxd +34 -0
  204. Cython/Includes/libcpp/pair.pxd +1 -0
  205. Cython/Includes/libcpp/queue.pxd +25 -0
  206. Cython/Includes/libcpp/random.pxd +166 -0
  207. Cython/Includes/libcpp/semaphore.pxd +43 -0
  208. Cython/Includes/libcpp/set.pxd +228 -0
  209. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  210. Cython/Includes/libcpp/span.pxd +87 -0
  211. Cython/Includes/libcpp/stack.pxd +11 -0
  212. Cython/Includes/libcpp/stop_token.pxd +117 -0
  213. Cython/Includes/libcpp/string.pxd +355 -0
  214. Cython/Includes/libcpp/string_view.pxd +183 -0
  215. Cython/Includes/libcpp/typeindex.pxd +15 -0
  216. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  217. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  218. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  219. Cython/Includes/libcpp/utility.pxd +30 -0
  220. Cython/Includes/libcpp/vector.pxd +186 -0
  221. Cython/Includes/numpy/math.pxd +150 -0
  222. Cython/Includes/openmp.pxd +50 -0
  223. Cython/Includes/posix/__init__.pxd +1 -0
  224. Cython/Includes/posix/dlfcn.pxd +14 -0
  225. Cython/Includes/posix/fcntl.pxd +86 -0
  226. Cython/Includes/posix/ioctl.pxd +4 -0
  227. Cython/Includes/posix/mman.pxd +101 -0
  228. Cython/Includes/posix/resource.pxd +57 -0
  229. Cython/Includes/posix/select.pxd +21 -0
  230. Cython/Includes/posix/signal.pxd +73 -0
  231. Cython/Includes/posix/stat.pxd +98 -0
  232. Cython/Includes/posix/stdio.pxd +37 -0
  233. Cython/Includes/posix/stdlib.pxd +29 -0
  234. Cython/Includes/posix/strings.pxd +9 -0
  235. Cython/Includes/posix/time.pxd +71 -0
  236. Cython/Includes/posix/types.pxd +30 -0
  237. Cython/Includes/posix/uio.pxd +26 -0
  238. Cython/Includes/posix/unistd.pxd +271 -0
  239. Cython/Includes/posix/wait.pxd +38 -0
  240. Cython/Plex/Actions.pxd +24 -0
  241. Cython/Plex/Actions.py +119 -0
  242. Cython/Plex/Actions.pyd +0 -0
  243. Cython/Plex/DFA.pxd +14 -0
  244. Cython/Plex/DFA.py +164 -0
  245. Cython/Plex/DFA.pyd +0 -0
  246. Cython/Plex/Errors.py +48 -0
  247. Cython/Plex/Lexicons.py +178 -0
  248. Cython/Plex/Machines.pxd +36 -0
  249. Cython/Plex/Machines.py +238 -0
  250. Cython/Plex/Machines.pyd +0 -0
  251. Cython/Plex/Regexps.py +535 -0
  252. Cython/Plex/Scanners.pxd +45 -0
  253. Cython/Plex/Scanners.py +328 -0
  254. Cython/Plex/Scanners.pyd +0 -0
  255. Cython/Plex/Transitions.pxd +14 -0
  256. Cython/Plex/Transitions.py +239 -0
  257. Cython/Plex/Transitions.pyd +0 -0
  258. Cython/Plex/__init__.py +34 -0
  259. Cython/Runtime/__init__.py +1 -0
  260. Cython/Runtime/refnanny.pyd +0 -0
  261. Cython/Runtime/refnanny.pyx +237 -0
  262. Cython/Shadow.py +690 -0
  263. Cython/Shadow.pyi +521 -0
  264. Cython/StringIOTree.py +170 -0
  265. Cython/StringIOTree.pyd +0 -0
  266. Cython/Tempita/__init__.py +4 -0
  267. Cython/Tempita/_looper.py +154 -0
  268. Cython/Tempita/_tempita.py +1091 -0
  269. Cython/Tempita/_tempita.pyd +0 -0
  270. Cython/TestUtils.py +422 -0
  271. Cython/Tests/TestCodeWriter.py +128 -0
  272. Cython/Tests/TestCythonUtils.py +202 -0
  273. Cython/Tests/TestJediTyper.py +223 -0
  274. Cython/Tests/TestShadow.py +114 -0
  275. Cython/Tests/TestStringIOTree.py +67 -0
  276. Cython/Tests/TestTestUtils.py +90 -0
  277. Cython/Tests/__init__.py +1 -0
  278. Cython/Tests/xmlrunner.py +390 -0
  279. Cython/Utility/AsyncGen.c +1031 -0
  280. Cython/Utility/Buffer.c +865 -0
  281. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  282. Cython/Utility/Builtins.c +810 -0
  283. Cython/Utility/CConvert.pyx +134 -0
  284. Cython/Utility/CMath.c +104 -0
  285. Cython/Utility/CommonStructures.c +226 -0
  286. Cython/Utility/Complex.c +378 -0
  287. Cython/Utility/Coroutine.c +2300 -0
  288. Cython/Utility/CpdefEnums.pyx +103 -0
  289. Cython/Utility/CppConvert.pyx +282 -0
  290. Cython/Utility/CppSupport.cpp +151 -0
  291. Cython/Utility/CythonFunction.c +1832 -0
  292. Cython/Utility/Dataclasses.c +101 -0
  293. Cython/Utility/Embed.c +121 -0
  294. Cython/Utility/Exceptions.c +1016 -0
  295. Cython/Utility/ExtensionTypes.c +996 -0
  296. Cython/Utility/FunctionArguments.c +1043 -0
  297. Cython/Utility/FusedFunction.pyx +44 -0
  298. Cython/Utility/ImportExport.c +907 -0
  299. Cython/Utility/MemoryView.pxd +188 -0
  300. Cython/Utility/MemoryView.pyx +1482 -0
  301. Cython/Utility/MemoryView_C.c +927 -0
  302. Cython/Utility/ModuleSetupCode.c +3203 -0
  303. Cython/Utility/NumpyImportArray.c +46 -0
  304. Cython/Utility/ObjectHandling.c +3273 -0
  305. Cython/Utility/Optimize.c +1603 -0
  306. Cython/Utility/Overflow.c +384 -0
  307. Cython/Utility/Printing.c +86 -0
  308. Cython/Utility/Profile.c +732 -0
  309. Cython/Utility/StringTools.c +1379 -0
  310. Cython/Utility/Synchronization.c +399 -0
  311. Cython/Utility/TString.c +356 -0
  312. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  313. Cython/Utility/TestCythonScope.pyx +75 -0
  314. Cython/Utility/TestUtilityLoader.c +12 -0
  315. Cython/Utility/TypeConversion.c +1385 -0
  316. Cython/Utility/UFuncs.pyx +50 -0
  317. Cython/Utility/UFuncs_C.c +89 -0
  318. Cython/Utility/__init__.py +28 -0
  319. Cython/Utility/arrayarray.h +167 -0
  320. Cython/Utils.py +687 -0
  321. Cython/Utils.pyd +0 -0
  322. Cython/__init__.py +10 -0
  323. Cython/__init__.pyi +7 -0
  324. Cython/py.typed +0 -0
  325. cython-3.2.0.dist-info/METADATA +85 -0
  326. cython-3.2.0.dist-info/RECORD +333 -0
  327. cython-3.2.0.dist-info/WHEEL +5 -0
  328. cython-3.2.0.dist-info/entry_points.txt +4 -0
  329. cython-3.2.0.dist-info/top_level.txt +3 -0
  330. cython.py +29 -0
  331. pyximport/__init__.py +4 -0
  332. pyximport/pyxbuild.py +160 -0
  333. 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)