Cython 3.3.0a1__cp315-cp315-win_amd64.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 (335) hide show
  1. Cython/Build/BuildExecutable.py +156 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +349 -0
  4. Cython/Build/Dependencies.py +1276 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +467 -0
  7. Cython/Build/IpythonMagic.py +559 -0
  8. Cython/Build/SharedModule.py +84 -0
  9. Cython/Build/Tests/TestCyCache.py +195 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +480 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +303 -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 +997 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.cp315-win_amd64.pyd +0 -0
  26. Cython/Compiler/Code.pxd +152 -0
  27. Cython/Compiler/Code.py +3907 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +194 -0
  30. Cython/Compiler/Dataclass.py +890 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +310 -0
  33. Cython/Compiler/ExprNodes.py +15983 -0
  34. Cython/Compiler/FlowControl.cp315-win_amd64.pyd +0 -0
  35. Cython/Compiler/FlowControl.pxd +99 -0
  36. Cython/Compiler/FlowControl.py +1571 -0
  37. Cython/Compiler/FusedNode.cp315-win_amd64.pyd +0 -0
  38. Cython/Compiler/FusedNode.py +976 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +422 -0
  42. Cython/Compiler/LineTable.cp315-win_amd64.pyd +0 -0
  43. Cython/Compiler/LineTable.py +114 -0
  44. Cython/Compiler/Main.py +856 -0
  45. Cython/Compiler/MatchCaseNodes.py +2197 -0
  46. Cython/Compiler/MemoryView.py +930 -0
  47. Cython/Compiler/ModuleNode.py +4517 -0
  48. Cython/Compiler/Naming.py +367 -0
  49. Cython/Compiler/Nodes.py +10941 -0
  50. Cython/Compiler/Optimize.py +5455 -0
  51. Cython/Compiler/Options.py +838 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +79 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4744 -0
  54. Cython/Compiler/Parsing.cp315-win_amd64.pyd +0 -0
  55. Cython/Compiler/Parsing.pxd +9 -0
  56. Cython/Compiler/Parsing.py +4792 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +6111 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.cp315-win_amd64.pyd +0 -0
  61. Cython/Compiler/Scanning.pxd +70 -0
  62. Cython/Compiler/Scanning.py +720 -0
  63. Cython/Compiler/StringEncoding.py +297 -0
  64. Cython/Compiler/Symtab.py +3092 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +117 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +587 -0
  68. Cython/Compiler/Tests/TestCode.py +145 -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 +132 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +20 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +118 -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 +611 -0
  86. Cython/Compiler/TypeSlots.py +1329 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +413 -0
  89. Cython/Compiler/UtilityCode.py +348 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.cp315-win_amd64.pyd +0 -0
  92. Cython/Compiler/Visitor.pxd +53 -0
  93. Cython/Compiler/Visitor.py +864 -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 +280 -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 +580 -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 +152 -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 +268 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +56 -0
  130. Cython/Includes/cpython/frozendict.pxd +37 -0
  131. Cython/Includes/cpython/function.pxd +65 -0
  132. Cython/Includes/cpython/genobject.pxd +25 -0
  133. Cython/Includes/cpython/getargs.pxd +12 -0
  134. Cython/Includes/cpython/instance.pxd +25 -0
  135. Cython/Includes/cpython/iterator.pxd +36 -0
  136. Cython/Includes/cpython/iterobject.pxd +24 -0
  137. Cython/Includes/cpython/list.pxd +144 -0
  138. Cython/Includes/cpython/long.pxd +180 -0
  139. Cython/Includes/cpython/longintrepr.pxd +14 -0
  140. Cython/Includes/cpython/mapping.pxd +63 -0
  141. Cython/Includes/cpython/marshal.pxd +66 -0
  142. Cython/Includes/cpython/mem.pxd +120 -0
  143. Cython/Includes/cpython/memoryview.pxd +50 -0
  144. Cython/Includes/cpython/method.pxd +49 -0
  145. Cython/Includes/cpython/module.pxd +208 -0
  146. Cython/Includes/cpython/number.pxd +258 -0
  147. Cython/Includes/cpython/object.pxd +430 -0
  148. Cython/Includes/cpython/pycapsule.pxd +143 -0
  149. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  150. Cython/Includes/cpython/pyport.pxd +8 -0
  151. Cython/Includes/cpython/pystate.pxd +95 -0
  152. Cython/Includes/cpython/pythread.pxd +53 -0
  153. Cython/Includes/cpython/ref.pxd +141 -0
  154. Cython/Includes/cpython/sentinel.pxd +17 -0
  155. Cython/Includes/cpython/sequence.pxd +134 -0
  156. Cython/Includes/cpython/set.pxd +119 -0
  157. Cython/Includes/cpython/slice.pxd +70 -0
  158. Cython/Includes/cpython/time.pxd +129 -0
  159. Cython/Includes/cpython/tuple.pxd +72 -0
  160. Cython/Includes/cpython/type.pxd +146 -0
  161. Cython/Includes/cpython/unicode.pxd +639 -0
  162. Cython/Includes/cpython/version.pxd +32 -0
  163. Cython/Includes/cpython/weakref.pxd +78 -0
  164. Cython/Includes/libc/__init__.pxd +1 -0
  165. Cython/Includes/libc/complex.pxd +35 -0
  166. Cython/Includes/libc/errno.pxd +127 -0
  167. Cython/Includes/libc/float.pxd +43 -0
  168. Cython/Includes/libc/limits.pxd +28 -0
  169. Cython/Includes/libc/locale.pxd +46 -0
  170. Cython/Includes/libc/math.pxd +209 -0
  171. Cython/Includes/libc/setjmp.pxd +10 -0
  172. Cython/Includes/libc/signal.pxd +64 -0
  173. Cython/Includes/libc/stddef.pxd +9 -0
  174. Cython/Includes/libc/stdint.pxd +105 -0
  175. Cython/Includes/libc/stdio.pxd +80 -0
  176. Cython/Includes/libc/stdlib.pxd +72 -0
  177. Cython/Includes/libc/string.pxd +50 -0
  178. Cython/Includes/libc/threads.pxd +234 -0
  179. Cython/Includes/libc/time.pxd +52 -0
  180. Cython/Includes/libcpp/__init__.pxd +4 -0
  181. Cython/Includes/libcpp/algorithm.pxd +320 -0
  182. Cython/Includes/libcpp/any.pxd +16 -0
  183. Cython/Includes/libcpp/atomic.pxd +59 -0
  184. Cython/Includes/libcpp/barrier.pxd +22 -0
  185. Cython/Includes/libcpp/bit.pxd +29 -0
  186. Cython/Includes/libcpp/cast.pxd +12 -0
  187. Cython/Includes/libcpp/cmath.pxd +518 -0
  188. Cython/Includes/libcpp/complex.pxd +106 -0
  189. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  190. Cython/Includes/libcpp/deque.pxd +165 -0
  191. Cython/Includes/libcpp/exception.pxd +216 -0
  192. Cython/Includes/libcpp/execution.pxd +15 -0
  193. Cython/Includes/libcpp/forward_list.pxd +63 -0
  194. Cython/Includes/libcpp/functional.pxd +26 -0
  195. Cython/Includes/libcpp/future.pxd +103 -0
  196. Cython/Includes/libcpp/iterator.pxd +34 -0
  197. Cython/Includes/libcpp/latch.pxd +17 -0
  198. Cython/Includes/libcpp/limits.pxd +61 -0
  199. Cython/Includes/libcpp/list.pxd +117 -0
  200. Cython/Includes/libcpp/map.pxd +252 -0
  201. Cython/Includes/libcpp/memory.pxd +115 -0
  202. Cython/Includes/libcpp/mutex.pxd +387 -0
  203. Cython/Includes/libcpp/numbers.pxd +15 -0
  204. Cython/Includes/libcpp/numeric.pxd +131 -0
  205. Cython/Includes/libcpp/optional.pxd +34 -0
  206. Cython/Includes/libcpp/pair.pxd +1 -0
  207. Cython/Includes/libcpp/queue.pxd +25 -0
  208. Cython/Includes/libcpp/random.pxd +166 -0
  209. Cython/Includes/libcpp/semaphore.pxd +43 -0
  210. Cython/Includes/libcpp/set.pxd +228 -0
  211. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  212. Cython/Includes/libcpp/span.pxd +87 -0
  213. Cython/Includes/libcpp/stack.pxd +11 -0
  214. Cython/Includes/libcpp/stop_token.pxd +117 -0
  215. Cython/Includes/libcpp/string.pxd +355 -0
  216. Cython/Includes/libcpp/string_view.pxd +183 -0
  217. Cython/Includes/libcpp/typeindex.pxd +15 -0
  218. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  219. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  220. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  221. Cython/Includes/libcpp/utility.pxd +30 -0
  222. Cython/Includes/libcpp/vector.pxd +186 -0
  223. Cython/Includes/numpy/math.pxd +150 -0
  224. Cython/Includes/openmp.pxd +50 -0
  225. Cython/Includes/posix/__init__.pxd +1 -0
  226. Cython/Includes/posix/dlfcn.pxd +14 -0
  227. Cython/Includes/posix/fcntl.pxd +86 -0
  228. Cython/Includes/posix/ioctl.pxd +4 -0
  229. Cython/Includes/posix/mman.pxd +101 -0
  230. Cython/Includes/posix/resource.pxd +57 -0
  231. Cython/Includes/posix/select.pxd +21 -0
  232. Cython/Includes/posix/signal.pxd +73 -0
  233. Cython/Includes/posix/stat.pxd +98 -0
  234. Cython/Includes/posix/stdio.pxd +37 -0
  235. Cython/Includes/posix/stdlib.pxd +29 -0
  236. Cython/Includes/posix/strings.pxd +9 -0
  237. Cython/Includes/posix/time.pxd +71 -0
  238. Cython/Includes/posix/types.pxd +30 -0
  239. Cython/Includes/posix/uio.pxd +26 -0
  240. Cython/Includes/posix/unistd.pxd +271 -0
  241. Cython/Includes/posix/wait.pxd +38 -0
  242. Cython/LZSS.py +170 -0
  243. Cython/Plex/Actions.cp315-win_amd64.pyd +0 -0
  244. Cython/Plex/Actions.pxd +24 -0
  245. Cython/Plex/Actions.py +119 -0
  246. Cython/Plex/DFA.cp315-win_amd64.pyd +0 -0
  247. Cython/Plex/DFA.pxd +14 -0
  248. Cython/Plex/DFA.py +164 -0
  249. Cython/Plex/Errors.py +48 -0
  250. Cython/Plex/Lexicons.py +178 -0
  251. Cython/Plex/Machines.cp315-win_amd64.pyd +0 -0
  252. Cython/Plex/Machines.pxd +36 -0
  253. Cython/Plex/Machines.py +238 -0
  254. Cython/Plex/Regexps.py +535 -0
  255. Cython/Plex/Scanners.cp315-win_amd64.pyd +0 -0
  256. Cython/Plex/Scanners.pxd +45 -0
  257. Cython/Plex/Scanners.py +328 -0
  258. Cython/Plex/Transitions.cp315-win_amd64.pyd +0 -0
  259. Cython/Plex/Transitions.pxd +14 -0
  260. Cython/Plex/Transitions.py +239 -0
  261. Cython/Plex/__init__.py +34 -0
  262. Cython/Runtime/__init__.py +1 -0
  263. Cython/Runtime/refnanny.cp315-win_amd64.pyd +0 -0
  264. Cython/Runtime/refnanny.pyx +237 -0
  265. Cython/Shadow.py +1167 -0
  266. Cython/StringIOTree.cp315-win_amd64.pyd +0 -0
  267. Cython/StringIOTree.py +169 -0
  268. Cython/Tempita/__init__.py +4 -0
  269. Cython/Tempita/_looper.py +154 -0
  270. Cython/Tempita/_tempita.cp315-win_amd64.pyd +0 -0
  271. Cython/Tempita/_tempita.py +1087 -0
  272. Cython/TestUtils.py +464 -0
  273. Cython/Tests/TestCodeWriter.py +128 -0
  274. Cython/Tests/TestCythonUtils.py +202 -0
  275. Cython/Tests/TestJediTyper.py +223 -0
  276. Cython/Tests/TestShadow.py +110 -0
  277. Cython/Tests/TestStringIOTree.py +68 -0
  278. Cython/Tests/TestTestUtils.py +89 -0
  279. Cython/Tests/__init__.py +1 -0
  280. Cython/Tests/xmlrunner.py +390 -0
  281. Cython/Utility/AsyncGen.c +1073 -0
  282. Cython/Utility/Buffer.c +866 -0
  283. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  284. Cython/Utility/Builtins.c +933 -0
  285. Cython/Utility/CConvert.pyx +149 -0
  286. Cython/Utility/CMath.c +104 -0
  287. Cython/Utility/CommonStructures.c +244 -0
  288. Cython/Utility/Complex.c +378 -0
  289. Cython/Utility/Coroutine.c +2337 -0
  290. Cython/Utility/CpdefEnums.pyx +107 -0
  291. Cython/Utility/CppConvert.pyx +282 -0
  292. Cython/Utility/CppSupport.cpp +151 -0
  293. Cython/Utility/CythonFunction.c +2072 -0
  294. Cython/Utility/Dataclasses.c +101 -0
  295. Cython/Utility/Embed.c +129 -0
  296. Cython/Utility/Exceptions.c +1038 -0
  297. Cython/Utility/ExtensionTypes.c +1158 -0
  298. Cython/Utility/FunctionArguments.c +1045 -0
  299. Cython/Utility/FusedFunction.pyx +44 -0
  300. Cython/Utility/ImportExport.c +930 -0
  301. Cython/Utility/MatchCase.c +979 -0
  302. Cython/Utility/MatchCase_Cy.pyx +12 -0
  303. Cython/Utility/MemoryView.pxd +108 -0
  304. Cython/Utility/MemoryView.pyx +1499 -0
  305. Cython/Utility/MemoryView_C.c +1056 -0
  306. Cython/Utility/ModuleSetupCode.c +3352 -0
  307. Cython/Utility/NumpyImportArray.c +46 -0
  308. Cython/Utility/ObjectHandling.c +3372 -0
  309. Cython/Utility/Optimize.c +2563 -0
  310. Cython/Utility/Overflow.c +378 -0
  311. Cython/Utility/Profile.c +736 -0
  312. Cython/Utility/StringTools.c +1414 -0
  313. Cython/Utility/Synchronization.c +438 -0
  314. Cython/Utility/TString.c +369 -0
  315. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  316. Cython/Utility/TestCythonScope.pyx +75 -0
  317. Cython/Utility/TestUtilityLoader.c +12 -0
  318. Cython/Utility/TypeConversion.c +1556 -0
  319. Cython/Utility/UFuncs.pyx +50 -0
  320. Cython/Utility/UFuncs_C.c +89 -0
  321. Cython/Utility/__init__.py +28 -0
  322. Cython/Utility/arrayarray.h +172 -0
  323. Cython/Utils.cp315-win_amd64.pyd +0 -0
  324. Cython/Utils.py +677 -0
  325. Cython/__init__.py +12 -0
  326. Cython/py.typed +0 -0
  327. cython-3.3.0a1.dist-info/METADATA +394 -0
  328. cython-3.3.0a1.dist-info/RECORD +335 -0
  329. cython-3.3.0a1.dist-info/WHEEL +5 -0
  330. cython-3.3.0a1.dist-info/entry_points.txt +4 -0
  331. cython-3.3.0a1.dist-info/top_level.txt +3 -0
  332. cython.py +29 -0
  333. pyximport/__init__.py +4 -0
  334. pyximport/pyxbuild.py +160 -0
  335. pyximport/pyximport.py +482 -0
@@ -0,0 +1,348 @@
1
+ import Cython
2
+ from .TreeFragment import parse_from_strings, StringParseContext
3
+ from .Scanning import FileSourceDescriptor
4
+ from .Errors import CompileError
5
+ from . import Symtab
6
+ from . import Naming
7
+ from . import Code
8
+ from . import Options
9
+
10
+ import os.path
11
+ import re
12
+ import io
13
+
14
+
15
+ class NonManglingModuleScope(Symtab.ModuleScope):
16
+ is_internal = True
17
+
18
+ def __init__(self, prefix, *args, **kw):
19
+ self.prefix = prefix
20
+ self.cython_scope = None
21
+ self.cpp = kw.pop('cpp', False)
22
+ Symtab.ModuleScope.__init__(self, *args, **kw)
23
+
24
+ def add_imported_entry(self, name, entry, pos):
25
+ entry.used = True
26
+ return super().add_imported_entry(name, entry, pos)
27
+
28
+ def mangle(self, prefix, name=None):
29
+ if name:
30
+ if prefix in (Naming.typeobj_prefix, Naming.func_prefix, Naming.var_prefix, Naming.pyfunc_prefix):
31
+ # Functions, classes etc. gets a manually defined prefix easily
32
+ # manually callable instead (the one passed to CythonUtilityCode)
33
+ prefix = self.prefix
34
+ return "%s%s" % (prefix, name)
35
+ else:
36
+ return Symtab.ModuleScope.mangle(self, prefix)
37
+
38
+
39
+ class CythonUtilityCodeContext(StringParseContext):
40
+ scope = None
41
+
42
+ def find_module(self, module_name, from_module=None, pos=None, need_pxd=True, absolute_fallback=True, relative_import=False):
43
+ if from_module:
44
+ raise AssertionError("Relative imports not supported in utility code.")
45
+ if module_name != self.module_name:
46
+ if module_name not in self.modules:
47
+ raise AssertionError("Only the cython cimport is supported.")
48
+ else:
49
+ return self.modules[module_name]
50
+
51
+ if self.scope is None:
52
+ self.scope = NonManglingModuleScope(
53
+ self.prefix, module_name, parent_module=None, context=self, cpp=self.cpp)
54
+
55
+ return self.scope
56
+
57
+
58
+ class CythonUtilityCode(Code.UtilityCodeBase):
59
+ """
60
+ Utility code written in the Cython language itself.
61
+
62
+ The @cname decorator can set the cname for a function, method of cdef class.
63
+ Functions decorated with @cname('c_func_name') get the given cname.
64
+
65
+ For cdef classes the rules are as follows:
66
+ obj struct -> <cname>_obj
67
+ obj type ptr -> <cname>_type
68
+ methods -> <class_cname>_<method_cname>
69
+
70
+ For methods the cname decorator is optional, but without the decorator the
71
+ methods will not be prototyped. See Cython.Compiler.CythonScope and
72
+ tests/run/cythonscope.pyx for examples.
73
+ """
74
+
75
+ is_cython_utility = True
76
+
77
+ def __init__(self, impl, name="__pyxutil", prefix="", requires=None,
78
+ file=None, from_scope=None, context=None, compiler_directives=None,
79
+ outer_module_scope=None):
80
+ # 1) We need to delay the parsing/processing, so that all modules can be
81
+ # imported without import loops
82
+ # 2) The same utility code object can be used for multiple source files;
83
+ # while the generated node trees can be altered in the compilation of a
84
+ # single file.
85
+ # Hence, delay any processing until later.
86
+ context_types = {}
87
+ if context is not None:
88
+ from .PyrexTypes import BaseType
89
+ for key, value in context.items():
90
+ if isinstance(value, BaseType):
91
+ context[key] = key
92
+ context_types[key] = value
93
+ impl = Code.sub_tempita(impl, context, file, name)
94
+ self.impl = impl
95
+ self.name = name
96
+ self.file = file
97
+ self.prefix = prefix
98
+ self.requires = requires or []
99
+ self.from_scope = from_scope
100
+ self.outer_module_scope = outer_module_scope
101
+ self.compiler_directives = compiler_directives
102
+ self.context_types = context_types
103
+
104
+ def __eq__(self, other):
105
+ if isinstance(other, CythonUtilityCode):
106
+ return self._equality_params() == other._equality_params()
107
+ else:
108
+ return False
109
+
110
+ def _equality_params(self):
111
+ outer_scope = self.outer_module_scope
112
+ while isinstance(outer_scope, NonManglingModuleScope):
113
+ outer_scope = outer_scope.outer_scope
114
+ return self.impl, outer_scope, self.compiler_directives
115
+
116
+ def __hash__(self):
117
+ return hash(self.impl)
118
+
119
+ def get_tree(self, entries_only=False, cython_scope=None):
120
+ from .AnalysedTreeTransforms import AutoTestDictTransform
121
+ # The AutoTestDictTransform creates the statement "__test__ = {}",
122
+ # which when copied into the main ModuleNode overwrites
123
+ # any __test__ in user code; not desired
124
+ excludes = [AutoTestDictTransform]
125
+
126
+ from . import Pipeline, ParseTreeTransforms
127
+ context = CythonUtilityCodeContext(
128
+ self.name, compiler_directives=self.compiler_directives,
129
+ cpp=cython_scope.is_cpp() if cython_scope else False,
130
+ options=cython_scope.context.options if cython_scope else None)
131
+ context.prefix = self.prefix
132
+ context.cython_scope = cython_scope
133
+ #context = StringParseContext(self.name)
134
+ tree = parse_from_strings(
135
+ self.name, self.impl, context=context, allow_struct_enum_decorator=True,
136
+ in_utility_code=True)
137
+ pipeline = Pipeline.create_pipeline(context, 'pyx', exclude_classes=excludes)
138
+
139
+ if entries_only:
140
+ p = []
141
+ for t in pipeline:
142
+ p.append(t)
143
+ if isinstance(t, ParseTreeTransforms.AnalyseDeclarationsTransform):
144
+ break
145
+
146
+ pipeline = p
147
+
148
+ transform = ParseTreeTransforms.CnameDirectivesTransform(context)
149
+ # InterpretCompilerDirectives already does a cdef declarator check
150
+ #before = ParseTreeTransforms.DecoratorTransform
151
+ before = ParseTreeTransforms.InterpretCompilerDirectives
152
+ pipeline = Pipeline.insert_into_pipeline(pipeline, transform,
153
+ before=before)
154
+
155
+ def merge_scope(scope):
156
+ def merge_scope_transform(module_node):
157
+ module_node.scope.merge_in(scope)
158
+ return module_node
159
+ return merge_scope_transform
160
+
161
+ if self.from_scope:
162
+ pipeline = Pipeline.insert_into_pipeline(
163
+ pipeline, merge_scope(self.from_scope),
164
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
165
+
166
+ for dep in self.requires:
167
+ if isinstance(dep, CythonUtilityCode) and hasattr(dep, 'tree') and not cython_scope:
168
+ pipeline = Pipeline.insert_into_pipeline(
169
+ pipeline, merge_scope(dep.tree.scope),
170
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
171
+
172
+ if self.outer_module_scope:
173
+ # inject outer module between utility code module and builtin module
174
+ def scope_transform(module_node):
175
+ module_node.scope.outer_scope = self.outer_module_scope
176
+ return module_node
177
+
178
+ pipeline = Pipeline.insert_into_pipeline(
179
+ pipeline, scope_transform,
180
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
181
+
182
+ if self.context_types:
183
+ # inject types into module scope
184
+ def scope_transform(module_node):
185
+ dummy_entry = object()
186
+ for name, type in self.context_types.items():
187
+ # Restore the old type entry after declaring the type.
188
+ # We need to access types in the scope, but this shouldn't alter the entry
189
+ # that is visible from everywhere else
190
+ old_type_entry = getattr(type, "entry", dummy_entry)
191
+ entry = module_node.scope.declare_type(name, type, None, visibility='extern')
192
+ if old_type_entry is not dummy_entry:
193
+ type.entry = old_type_entry
194
+ entry.in_cinclude = True
195
+ return module_node
196
+
197
+ pipeline = Pipeline.insert_into_pipeline(
198
+ pipeline, scope_transform,
199
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
200
+
201
+ (err, tree) = Pipeline.run_pipeline(pipeline, tree, printtree=False)
202
+ assert not err, err
203
+ self.tree = tree
204
+ return tree
205
+
206
+ def put_code(self, globalstate, used_by=None):
207
+ pass
208
+
209
+ @classmethod
210
+ def load(cls, util_code_name, from_file, **kwargs):
211
+ if re.search("[.]c(pp)?::", util_code_name):
212
+ # We're trying to load a C/C++ utility code.
213
+ # For now, just handle the simple case with no tempita
214
+ return Code.UtilityCode.load_cached(util_code_name, from_file)
215
+ return super().load(util_code_name, from_file, **kwargs)
216
+
217
+ @classmethod
218
+ def load_as_string(cls, util_code_name, from_file=None, **kwargs):
219
+ """
220
+ Load a utility code as a string. Returns (proto, implementation)
221
+ """
222
+ util = cls.load(util_code_name, from_file, **kwargs)
223
+ return util.proto, util.impl # keep line numbers => no lstrip()
224
+
225
+ def declare_in_scope(self, dest_scope, used=False, cython_scope=None,
226
+ allowlist=None):
227
+ """
228
+ Declare all entries from the utility code in dest_scope. Code will only
229
+ be included for used entries. If module_name is given, declare the
230
+ type entries with that name.
231
+ """
232
+ tree = self.get_tree(entries_only=True, cython_scope=cython_scope)
233
+
234
+ entries = tree.scope.entries
235
+ entries.pop('__name__')
236
+ entries.pop('__file__')
237
+ entries.pop('__builtins__')
238
+ entries.pop('__doc__')
239
+
240
+ for entry in entries.values():
241
+ entry.utility_code_definition = self
242
+ entry.used = used
243
+
244
+ original_scope = tree.scope
245
+ dest_scope.merge_in(original_scope, merge_unused=True, allowlist=allowlist)
246
+ tree.scope = dest_scope
247
+
248
+ for dep in self.requires:
249
+ if dep.is_cython_utility:
250
+ dep.declare_in_scope(dest_scope, cython_scope=cython_scope)
251
+
252
+ return original_scope
253
+
254
+ @staticmethod
255
+ def filter_inherited_directives(current_directives):
256
+ """
257
+ Cython utility code should usually only pick up a few directives from the
258
+ environment (those that intentionally control its function) and ignore most
259
+ other compiler directives. This function provides a sensible default list
260
+ of directives to copy.
261
+ """
262
+ from .Options import _directive_defaults
263
+ utility_code_directives = dict(_directive_defaults)
264
+ inherited_directive_names = (
265
+ 'binding', 'always_allow_keywords', 'allow_none_for_extension_args',
266
+ 'auto_pickle', 'ccomplex',
267
+ 'c_string_type', 'c_string_encoding',
268
+ 'optimize.inline_defnode_calls', 'optimize.unpack_method_calls',
269
+ 'optimize.unpack_method_calls_in_pyinit', 'optimize.use_switch')
270
+ for name in inherited_directive_names:
271
+ if name in current_directives:
272
+ utility_code_directives[name] = current_directives[name]
273
+ return utility_code_directives
274
+
275
+
276
+ class TemplatedFileSourceDescriptor(FileSourceDescriptor):
277
+
278
+ def __init__(self, filename, path_description, context):
279
+ super().__init__(filename, path_description)
280
+ self._context = context
281
+
282
+ def get_file_object(self, encoding=None, error_handling=None):
283
+ with super().get_file_object(encoding, error_handling) as f:
284
+ data = f.read()
285
+ ret = Code.sub_tempita(data, self._context, self.filename)
286
+ # We need stream to have .encoding attribute set
287
+ stream = io.TextIOWrapper(io.BytesIO(ret.encode(f.encoding)), encoding=f.encoding, errors=error_handling)
288
+ return stream
289
+
290
+
291
+ class CythonSharedUtilityCode(Code.AbstractUtilityCode):
292
+ def __init__(self, pxd_name, shared_utility_qualified_name, template_context, requires):
293
+ self._pxd_name = pxd_name
294
+ self._shared_utility_qualified_name = shared_utility_qualified_name
295
+ self.template_context = template_context
296
+ self.requires = requires
297
+ self._shared_library_scope = None
298
+
299
+ def find_module(self, context):
300
+ scope = context
301
+ for name, is_package in scope._split_qualified_name(self._shared_utility_qualified_name, relative_import=False):
302
+ scope = scope.find_submodule(name, as_package=is_package)
303
+
304
+ pxd_pathname = os.path.join(
305
+ os.path.split(Cython.__file__)[0],
306
+ 'Utility',
307
+ self._pxd_name
308
+ )
309
+ try:
310
+ rel_path = self._shared_utility_qualified_name.replace('.', os.sep) + os.path.splitext(pxd_pathname)[1]
311
+ source_desc = TemplatedFileSourceDescriptor(pxd_pathname, rel_path, self.template_context)
312
+ source_desc.in_utility_code = True
313
+ err, result = context.process_pxd(source_desc, scope, self._shared_utility_qualified_name)
314
+ (pxd_codenodes, pxd_scope) = result
315
+ context.utility_pxds[self._pxd_name] = (pxd_codenodes, pxd_scope)
316
+ scope.pxd_file_loaded = True
317
+ if err:
318
+ raise err
319
+ except CompileError:
320
+ pass
321
+ return scope
322
+
323
+ def declare_in_scope(self, dest_scope, used=False, cython_scope=None,
324
+ allowlist=None):
325
+ if self._pxd_name not in cython_scope.context.utility_pxds:
326
+ self._shared_library_scope = self.find_module(cython_scope.context)
327
+ for dep in self.requires:
328
+ if dep.is_cython_utility:
329
+ dep.declare_in_scope(scope, cython_scope=cython_scope)
330
+ for e in self._shared_library_scope.c_class_entries:
331
+ dest_scope.add_imported_entry(e.name, e, e.pos)
332
+ for e in self._shared_library_scope.var_entries:
333
+ dest_scope.add_imported_entry(e.name, e, e.pos)
334
+ return dest_scope
335
+
336
+ def get_shared_library_scope(self, cython_scope):
337
+ if self._pxd_name not in cython_scope.context.utility_pxds:
338
+ self._shared_library_scope = self.find_module(cython_scope.context)
339
+ return self._shared_library_scope
340
+
341
+
342
+ def declare_declarations_in_scope(declaration_string, env, private_type=True,
343
+ *args, **kwargs):
344
+ """
345
+ Declare some declarations given as Cython code in declaration_string
346
+ in scope env.
347
+ """
348
+ CythonUtilityCode(declaration_string, *args, **kwargs).declare_in_scope(env)
@@ -0,0 +1,8 @@
1
+ # for backwards compatibility
2
+
3
+
4
+ from .. import __version__ as version
5
+
6
+ # For 'generated by' header line in C files.
7
+
8
+ watermark = str(version)
@@ -0,0 +1,53 @@
1
+ cimport cython
2
+
3
+ cdef class TreeVisitor:
4
+ cdef public list[tuple] access_path
5
+ cdef dict dispatch_table
6
+
7
+ cpdef visit(self, obj)
8
+ cdef _visit(self, obj)
9
+ cdef find_handler(self, obj)
10
+ cdef _visitchild(self, child, parent, attrname, idx)
11
+ cdef dict _visitchildren(self, parent, attrs, exclude)
12
+ cpdef visitchildren(self, parent, attrs=*, exclude=*)
13
+ cdef _raise_compiler_error(self, child, e)
14
+
15
+ cdef class VisitorTransform(TreeVisitor):
16
+ cdef dict _process_children(self, parent, attrs=*, exclude=*)
17
+ cpdef visitchildren(self, parent, attrs=*, exclude=*)
18
+ cdef list _flatten_list(self, list orig_list)
19
+ cpdef visitchild(self, parent, str attr, idx=*)
20
+
21
+ cdef class CythonTransform(VisitorTransform):
22
+ cdef public context
23
+ cdef public current_directives
24
+
25
+ cdef class ScopeTrackingTransform(CythonTransform):
26
+ cdef public scope_type
27
+ cdef public scope_node
28
+ cdef visit_scope(self, node, scope_type)
29
+
30
+ cdef class EnvTransform(CythonTransform):
31
+ cdef public list env_stack
32
+
33
+ cdef class MethodDispatcherTransform(EnvTransform):
34
+ @cython.final
35
+ cdef _visit_binop_node(self, node)
36
+ @cython.final
37
+ cdef _find_handler(self, match_name, bint has_kwargs)
38
+ @cython.final
39
+ cdef _delegate_to_assigned_value(self, node, function, arg_list, kwargs)
40
+ @cython.final
41
+ cdef _dispatch_to_handler(self, node, function, arg_list, kwargs)
42
+ @cython.final
43
+ cdef _dispatch_to_method_handler(self, attr_name, self_arg,
44
+ is_unbound_method, type_name,
45
+ node, function, arg_list, kwargs)
46
+
47
+ cdef class RecursiveNodeReplacer(VisitorTransform):
48
+ cdef public orig_node
49
+ cdef public new_node
50
+
51
+ cdef class NodeFinder(TreeVisitor):
52
+ cdef node
53
+ cdef public bint found