Cython 3.3.0__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 (339) 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 +1281 -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 +165 -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 +825 -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 +679 -0
  23. Cython/Compiler/Builtin.py +1102 -0
  24. Cython/Compiler/CmdLine.py +373 -0
  25. Cython/Compiler/Code.cp315-win_amd64.pyd +0 -0
  26. Cython/Compiler/Code.pxd +154 -0
  27. Cython/Compiler/Code.py +3760 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +208 -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 +16273 -0
  34. Cython/Compiler/FlowControl.cp315-win_amd64.pyd +0 -0
  35. Cython/Compiler/FlowControl.pxd +112 -0
  36. Cython/Compiler/FlowControl.py +1573 -0
  37. Cython/Compiler/FusedNode.cp315-win_amd64.pyd +0 -0
  38. Cython/Compiler/FusedNode.py +978 -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 +2200 -0
  46. Cython/Compiler/MemoryView.py +930 -0
  47. Cython/Compiler/ModuleNode.py +4548 -0
  48. Cython/Compiler/Naming.py +370 -0
  49. Cython/Compiler/Nodes.py +11304 -0
  50. Cython/Compiler/Optimize.py +5564 -0
  51. Cython/Compiler/Options.py +840 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +80 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4808 -0
  54. Cython/Compiler/Parsing.cp315-win_amd64.pyd +0 -0
  55. Cython/Compiler/Parsing.pxd +9 -0
  56. Cython/Compiler/Parsing.py +4809 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +6588 -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.cp315-win_amd64.pyd +0 -0
  64. Cython/Compiler/StringEncoding.py +354 -0
  65. Cython/Compiler/Symtab.py +3121 -0
  66. Cython/Compiler/Tests/TestBuffer.py +105 -0
  67. Cython/Compiler/Tests/TestBuiltin.py +196 -0
  68. Cython/Compiler/Tests/TestCmdLine.py +652 -0
  69. Cython/Compiler/Tests/TestCode.py +145 -0
  70. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  71. Cython/Compiler/Tests/TestGrammar.py +202 -0
  72. Cython/Compiler/Tests/TestMemView.py +71 -0
  73. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  74. Cython/Compiler/Tests/TestScanning.py +132 -0
  75. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  76. Cython/Compiler/Tests/TestStringEncoding.py +20 -0
  77. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  78. Cython/Compiler/Tests/TestTreePath.py +103 -0
  79. Cython/Compiler/Tests/TestTypes.py +119 -0
  80. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  81. Cython/Compiler/Tests/TestVisitor.py +119 -0
  82. Cython/Compiler/Tests/Utils.py +36 -0
  83. Cython/Compiler/Tests/__init__.py +1 -0
  84. Cython/Compiler/TreeFragment.py +279 -0
  85. Cython/Compiler/TreePath.py +303 -0
  86. Cython/Compiler/TypeInference.py +611 -0
  87. Cython/Compiler/TypeSlots.py +1329 -0
  88. Cython/Compiler/UFuncs.py +317 -0
  89. Cython/Compiler/UtilNodes.py +389 -0
  90. Cython/Compiler/UtilityCode.py +354 -0
  91. Cython/Compiler/Version.py +8 -0
  92. Cython/Compiler/Visitor.cp315-win_amd64.pyd +0 -0
  93. Cython/Compiler/Visitor.pxd +52 -0
  94. Cython/Compiler/Visitor.py +914 -0
  95. Cython/Compiler/__init__.py +1 -0
  96. Cython/Coverage.py +448 -0
  97. Cython/Debugger/Cygdb.py +214 -0
  98. Cython/Debugger/DebugWriter.py +82 -0
  99. Cython/Debugger/Tests/TestLibCython.py +280 -0
  100. Cython/Debugger/Tests/__init__.py +1 -0
  101. Cython/Debugger/Tests/cfuncs.c +8 -0
  102. Cython/Debugger/Tests/codefile +49 -0
  103. Cython/Debugger/Tests/test_libcython_in_gdb.py +580 -0
  104. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  105. Cython/Debugger/__init__.py +1 -0
  106. Cython/Debugger/libcython.py +1548 -0
  107. Cython/Debugger/libpython.py +2821 -0
  108. Cython/Debugging.py +20 -0
  109. Cython/Distutils/__init__.py +2 -0
  110. Cython/Distutils/build_ext.py +143 -0
  111. Cython/Distutils/extension.py +96 -0
  112. Cython/Distutils/old_build_ext.py +351 -0
  113. Cython/Includes/cpython/__init__.pxd +173 -0
  114. Cython/Includes/cpython/array.pxd +152 -0
  115. Cython/Includes/cpython/bool.pxd +37 -0
  116. Cython/Includes/cpython/buffer.pxd +112 -0
  117. Cython/Includes/cpython/bytearray.pxd +33 -0
  118. Cython/Includes/cpython/bytes.pxd +200 -0
  119. Cython/Includes/cpython/cellobject.pxd +35 -0
  120. Cython/Includes/cpython/ceval.pxd +8 -0
  121. Cython/Includes/cpython/codecs.pxd +121 -0
  122. Cython/Includes/cpython/complex.pxd +60 -0
  123. Cython/Includes/cpython/contextvars.pxd +145 -0
  124. Cython/Includes/cpython/conversion.pxd +36 -0
  125. Cython/Includes/cpython/datetime.pxd +395 -0
  126. Cython/Includes/cpython/descr.pxd +26 -0
  127. Cython/Includes/cpython/dict.pxd +268 -0
  128. Cython/Includes/cpython/exc.pxd +263 -0
  129. Cython/Includes/cpython/fileobject.pxd +57 -0
  130. Cython/Includes/cpython/float.pxd +56 -0
  131. Cython/Includes/cpython/frozendict.pxd +37 -0
  132. Cython/Includes/cpython/function.pxd +65 -0
  133. Cython/Includes/cpython/genobject.pxd +25 -0
  134. Cython/Includes/cpython/getargs.pxd +12 -0
  135. Cython/Includes/cpython/instance.pxd +25 -0
  136. Cython/Includes/cpython/iterator.pxd +36 -0
  137. Cython/Includes/cpython/iterobject.pxd +24 -0
  138. Cython/Includes/cpython/list.pxd +144 -0
  139. Cython/Includes/cpython/long.pxd +180 -0
  140. Cython/Includes/cpython/longintrepr.pxd +14 -0
  141. Cython/Includes/cpython/mapping.pxd +63 -0
  142. Cython/Includes/cpython/marshal.pxd +66 -0
  143. Cython/Includes/cpython/mem.pxd +120 -0
  144. Cython/Includes/cpython/memoryview.pxd +50 -0
  145. Cython/Includes/cpython/method.pxd +49 -0
  146. Cython/Includes/cpython/module.pxd +208 -0
  147. Cython/Includes/cpython/number.pxd +258 -0
  148. Cython/Includes/cpython/object.pxd +430 -0
  149. Cython/Includes/cpython/pycapsule.pxd +143 -0
  150. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  151. Cython/Includes/cpython/pyport.pxd +8 -0
  152. Cython/Includes/cpython/pystate.pxd +95 -0
  153. Cython/Includes/cpython/pythread.pxd +53 -0
  154. Cython/Includes/cpython/ref.pxd +141 -0
  155. Cython/Includes/cpython/sentinel.pxd +17 -0
  156. Cython/Includes/cpython/sequence.pxd +134 -0
  157. Cython/Includes/cpython/set.pxd +119 -0
  158. Cython/Includes/cpython/slice.pxd +70 -0
  159. Cython/Includes/cpython/time.pxd +129 -0
  160. Cython/Includes/cpython/tuple.pxd +72 -0
  161. Cython/Includes/cpython/type.pxd +146 -0
  162. Cython/Includes/cpython/unicode.pxd +639 -0
  163. Cython/Includes/cpython/version.pxd +32 -0
  164. Cython/Includes/cpython/weakref.pxd +78 -0
  165. Cython/Includes/libc/__init__.pxd +1 -0
  166. Cython/Includes/libc/complex.pxd +35 -0
  167. Cython/Includes/libc/errno.pxd +127 -0
  168. Cython/Includes/libc/float.pxd +43 -0
  169. Cython/Includes/libc/limits.pxd +28 -0
  170. Cython/Includes/libc/locale.pxd +46 -0
  171. Cython/Includes/libc/math.pxd +209 -0
  172. Cython/Includes/libc/setjmp.pxd +10 -0
  173. Cython/Includes/libc/signal.pxd +64 -0
  174. Cython/Includes/libc/stddef.pxd +9 -0
  175. Cython/Includes/libc/stdint.pxd +105 -0
  176. Cython/Includes/libc/stdio.pxd +80 -0
  177. Cython/Includes/libc/stdlib.pxd +72 -0
  178. Cython/Includes/libc/string.pxd +50 -0
  179. Cython/Includes/libc/threads.pxd +234 -0
  180. Cython/Includes/libc/time.pxd +52 -0
  181. Cython/Includes/libcpp/__init__.pxd +4 -0
  182. Cython/Includes/libcpp/algorithm.pxd +320 -0
  183. Cython/Includes/libcpp/any.pxd +16 -0
  184. Cython/Includes/libcpp/atomic.pxd +59 -0
  185. Cython/Includes/libcpp/barrier.pxd +22 -0
  186. Cython/Includes/libcpp/bit.pxd +29 -0
  187. Cython/Includes/libcpp/cast.pxd +12 -0
  188. Cython/Includes/libcpp/cmath.pxd +518 -0
  189. Cython/Includes/libcpp/complex.pxd +106 -0
  190. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  191. Cython/Includes/libcpp/deque.pxd +165 -0
  192. Cython/Includes/libcpp/exception.pxd +216 -0
  193. Cython/Includes/libcpp/execution.pxd +15 -0
  194. Cython/Includes/libcpp/forward_list.pxd +63 -0
  195. Cython/Includes/libcpp/functional.pxd +26 -0
  196. Cython/Includes/libcpp/future.pxd +103 -0
  197. Cython/Includes/libcpp/iterator.pxd +34 -0
  198. Cython/Includes/libcpp/latch.pxd +17 -0
  199. Cython/Includes/libcpp/limits.pxd +61 -0
  200. Cython/Includes/libcpp/list.pxd +117 -0
  201. Cython/Includes/libcpp/map.pxd +252 -0
  202. Cython/Includes/libcpp/memory.pxd +115 -0
  203. Cython/Includes/libcpp/mutex.pxd +387 -0
  204. Cython/Includes/libcpp/numbers.pxd +15 -0
  205. Cython/Includes/libcpp/numeric.pxd +131 -0
  206. Cython/Includes/libcpp/optional.pxd +34 -0
  207. Cython/Includes/libcpp/pair.pxd +1 -0
  208. Cython/Includes/libcpp/queue.pxd +25 -0
  209. Cython/Includes/libcpp/random.pxd +166 -0
  210. Cython/Includes/libcpp/semaphore.pxd +43 -0
  211. Cython/Includes/libcpp/set.pxd +228 -0
  212. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  213. Cython/Includes/libcpp/span.pxd +87 -0
  214. Cython/Includes/libcpp/stack.pxd +11 -0
  215. Cython/Includes/libcpp/stop_token.pxd +117 -0
  216. Cython/Includes/libcpp/string.pxd +355 -0
  217. Cython/Includes/libcpp/string_view.pxd +183 -0
  218. Cython/Includes/libcpp/typeindex.pxd +15 -0
  219. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  220. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  221. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  222. Cython/Includes/libcpp/utility.pxd +30 -0
  223. Cython/Includes/libcpp/vector.pxd +186 -0
  224. Cython/Includes/numpy/math.pxd +150 -0
  225. Cython/Includes/openmp.pxd +50 -0
  226. Cython/Includes/posix/__init__.pxd +1 -0
  227. Cython/Includes/posix/dlfcn.pxd +14 -0
  228. Cython/Includes/posix/fcntl.pxd +86 -0
  229. Cython/Includes/posix/ioctl.pxd +4 -0
  230. Cython/Includes/posix/mman.pxd +101 -0
  231. Cython/Includes/posix/resource.pxd +57 -0
  232. Cython/Includes/posix/select.pxd +21 -0
  233. Cython/Includes/posix/signal.pxd +73 -0
  234. Cython/Includes/posix/stat.pxd +98 -0
  235. Cython/Includes/posix/stdio.pxd +37 -0
  236. Cython/Includes/posix/stdlib.pxd +29 -0
  237. Cython/Includes/posix/strings.pxd +9 -0
  238. Cython/Includes/posix/time.pxd +71 -0
  239. Cython/Includes/posix/types.pxd +30 -0
  240. Cython/Includes/posix/uio.pxd +26 -0
  241. Cython/Includes/posix/unistd.pxd +271 -0
  242. Cython/Includes/posix/wait.pxd +38 -0
  243. Cython/LZSS.cp315-win_amd64.pyd +0 -0
  244. Cython/LZSS.py +184 -0
  245. Cython/Plex/Actions.cp315-win_amd64.pyd +0 -0
  246. Cython/Plex/Actions.pxd +24 -0
  247. Cython/Plex/Actions.py +119 -0
  248. Cython/Plex/DFA.cp315-win_amd64.pyd +0 -0
  249. Cython/Plex/DFA.pxd +14 -0
  250. Cython/Plex/DFA.py +164 -0
  251. Cython/Plex/Errors.py +48 -0
  252. Cython/Plex/Lexicons.py +178 -0
  253. Cython/Plex/Machines.cp315-win_amd64.pyd +0 -0
  254. Cython/Plex/Machines.pxd +36 -0
  255. Cython/Plex/Machines.py +238 -0
  256. Cython/Plex/Regexps.py +535 -0
  257. Cython/Plex/Scanners.cp315-win_amd64.pyd +0 -0
  258. Cython/Plex/Scanners.pxd +45 -0
  259. Cython/Plex/Scanners.py +328 -0
  260. Cython/Plex/Transitions.cp315-win_amd64.pyd +0 -0
  261. Cython/Plex/Transitions.pxd +14 -0
  262. Cython/Plex/Transitions.py +239 -0
  263. Cython/Plex/__init__.py +34 -0
  264. Cython/Runtime/__init__.py +1 -0
  265. Cython/Runtime/refnanny.cp315-win_amd64.pyd +0 -0
  266. Cython/Runtime/refnanny.pyx +237 -0
  267. Cython/Shadow.py +1174 -0
  268. Cython/StringIOTree.cp315-win_amd64.pyd +0 -0
  269. Cython/StringIOTree.py +169 -0
  270. Cython/Tempita/__init__.py +4 -0
  271. Cython/Tempita/_looper.py +154 -0
  272. Cython/Tempita/_tempita.cp315-win_amd64.pyd +0 -0
  273. Cython/Tempita/_tempita.py +1087 -0
  274. Cython/TestUtils.py +472 -0
  275. Cython/Tests/TestCodeWriter.py +128 -0
  276. Cython/Tests/TestCythonUtils.py +202 -0
  277. Cython/Tests/TestJediTyper.py +223 -0
  278. Cython/Tests/TestShadow.py +125 -0
  279. Cython/Tests/TestStringIOTree.py +68 -0
  280. Cython/Tests/TestTestUtils.py +89 -0
  281. Cython/Tests/__init__.py +1 -0
  282. Cython/Tests/xmlrunner.py +390 -0
  283. Cython/Utility/AsyncGen.c +1152 -0
  284. Cython/Utility/Buffer.c +866 -0
  285. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  286. Cython/Utility/Builtins.c +1068 -0
  287. Cython/Utility/CConvert.pyx +153 -0
  288. Cython/Utility/CMath.c +104 -0
  289. Cython/Utility/CommonStructures.c +244 -0
  290. Cython/Utility/Complex.c +378 -0
  291. Cython/Utility/Coroutine.c +2344 -0
  292. Cython/Utility/CpdefEnums.pyx +119 -0
  293. Cython/Utility/CppConvert.pyx +282 -0
  294. Cython/Utility/CppSupport.cpp +151 -0
  295. Cython/Utility/CythonFunction.c +2185 -0
  296. Cython/Utility/Dataclasses.c +101 -0
  297. Cython/Utility/Embed.c +129 -0
  298. Cython/Utility/Exceptions.c +1331 -0
  299. Cython/Utility/Exceptions_Cy.pyx +109 -0
  300. Cython/Utility/ExtensionTypes.c +1199 -0
  301. Cython/Utility/FunctionArguments.c +1052 -0
  302. Cython/Utility/FusedFunction.pyx +44 -0
  303. Cython/Utility/ImportExport.c +972 -0
  304. Cython/Utility/MatchCase.c +981 -0
  305. Cython/Utility/MatchCase_Cy.pyx +12 -0
  306. Cython/Utility/MemoryView.pxd +108 -0
  307. Cython/Utility/MemoryView.pyx +1499 -0
  308. Cython/Utility/MemoryView_C.c +1056 -0
  309. Cython/Utility/ModuleSetupCode.c +3319 -0
  310. Cython/Utility/NumpyImportArray.c +46 -0
  311. Cython/Utility/ObjectHandling.c +3404 -0
  312. Cython/Utility/Optimize.c +2564 -0
  313. Cython/Utility/Overflow.c +378 -0
  314. Cython/Utility/Profile.c +736 -0
  315. Cython/Utility/StringTools.c +1534 -0
  316. Cython/Utility/Synchronization.c +438 -0
  317. Cython/Utility/TString.c +369 -0
  318. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  319. Cython/Utility/TestCythonScope.pyx +75 -0
  320. Cython/Utility/TestUtilityLoader.c +12 -0
  321. Cython/Utility/TypeConversion.c +1588 -0
  322. Cython/Utility/UFuncs.pyx +50 -0
  323. Cython/Utility/UFuncs_C.c +89 -0
  324. Cython/Utility/__init__.py +28 -0
  325. Cython/Utility/arrayarray.h +172 -0
  326. Cython/Utils.cp315-win_amd64.pyd +0 -0
  327. Cython/Utils.py +680 -0
  328. Cython/__init__.py +12 -0
  329. Cython/_shared.cp315-win_amd64.pyd +0 -0
  330. Cython/py.typed +0 -0
  331. cython-3.3.0.dist-info/METADATA +555 -0
  332. cython-3.3.0.dist-info/RECORD +339 -0
  333. cython-3.3.0.dist-info/WHEEL +5 -0
  334. cython-3.3.0.dist-info/entry_points.txt +4 -0
  335. cython-3.3.0.dist-info/top_level.txt +3 -0
  336. cython.py +29 -0
  337. pyximport/__init__.py +4 -0
  338. pyximport/pyxbuild.py +160 -0
  339. pyximport/pyximport.py +482 -0
@@ -0,0 +1,354 @@
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
+ if outer_module_scope is not None:
102
+ # Inherit some global directives from the module scope.
103
+ compiler_directives = self.filter_inherited_directives(
104
+ outer_module_scope.global_scope().directives, compiler_directives)
105
+ self.compiler_directives = compiler_directives
106
+ self.context_types = context_types
107
+
108
+ def __eq__(self, other):
109
+ if isinstance(other, CythonUtilityCode):
110
+ return self._equality_params() == other._equality_params()
111
+ else:
112
+ return False
113
+
114
+ def _equality_params(self):
115
+ outer_scope = self.outer_module_scope
116
+ while isinstance(outer_scope, NonManglingModuleScope):
117
+ outer_scope = outer_scope.outer_scope
118
+ return (self.impl, outer_scope)
119
+
120
+ def __hash__(self):
121
+ return hash(self.impl)
122
+
123
+ def get_tree(self, entries_only=False, cython_scope=None):
124
+ from .AnalysedTreeTransforms import AutoTestDictTransform
125
+ # The AutoTestDictTransform creates the statement "__test__ = {}",
126
+ # which when copied into the main ModuleNode overwrites
127
+ # any __test__ in user code; not desired
128
+ excludes = [AutoTestDictTransform]
129
+
130
+ from . import Pipeline, ParseTreeTransforms
131
+ context = CythonUtilityCodeContext(
132
+ self.name, compiler_directives=self.compiler_directives,
133
+ cpp=cython_scope.is_cpp() if cython_scope else False,
134
+ options=cython_scope.context.options if cython_scope else None)
135
+ context.prefix = self.prefix
136
+ context.cython_scope = cython_scope
137
+ #context = StringParseContext(self.name)
138
+ tree = parse_from_strings(
139
+ self.name, self.impl, context=context, allow_struct_enum_decorator=True,
140
+ in_utility_code=True)
141
+ pipeline = Pipeline.create_pipeline(context, 'pyx', exclude_classes=excludes)
142
+
143
+ if entries_only:
144
+ p = []
145
+ for t in pipeline:
146
+ p.append(t)
147
+ if isinstance(t, ParseTreeTransforms.AnalyseDeclarationsTransform):
148
+ break
149
+
150
+ pipeline = p
151
+
152
+ transform = ParseTreeTransforms.CnameDirectivesTransform(context)
153
+ # InterpretCompilerDirectives already does a cdef declarator check
154
+ #before = ParseTreeTransforms.DecoratorTransform
155
+ before = ParseTreeTransforms.InterpretCompilerDirectives
156
+ pipeline = Pipeline.insert_into_pipeline(pipeline, transform,
157
+ before=before)
158
+
159
+ def merge_scope(scope):
160
+ def merge_scope_transform(module_node):
161
+ module_node.scope.merge_in(scope)
162
+ return module_node
163
+ return merge_scope_transform
164
+
165
+ if self.from_scope:
166
+ pipeline = Pipeline.insert_into_pipeline(
167
+ pipeline, merge_scope(self.from_scope),
168
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
169
+
170
+ for dep in self.requires:
171
+ if isinstance(dep, CythonUtilityCode) and hasattr(dep, 'tree') and not cython_scope:
172
+ pipeline = Pipeline.insert_into_pipeline(
173
+ pipeline, merge_scope(dep.tree.scope),
174
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
175
+
176
+ if self.outer_module_scope:
177
+ # inject outer module between utility code module and builtin module
178
+ def scope_transform(module_node):
179
+ module_node.scope.outer_scope = self.outer_module_scope
180
+ return module_node
181
+
182
+ pipeline = Pipeline.insert_into_pipeline(
183
+ pipeline, scope_transform,
184
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
185
+
186
+ if self.context_types:
187
+ # inject types into module scope
188
+ def scope_transform(module_node):
189
+ dummy_entry = object()
190
+ for name, type in self.context_types.items():
191
+ # Restore the old type entry after declaring the type.
192
+ # We need to access types in the scope, but this shouldn't alter the entry
193
+ # that is visible from everywhere else
194
+ old_type_entry = getattr(type, "entry", dummy_entry)
195
+ entry = module_node.scope.declare_type(name, type, None, visibility='extern')
196
+ if old_type_entry is not dummy_entry:
197
+ type.entry = old_type_entry
198
+ entry.in_cinclude = True
199
+ return module_node
200
+
201
+ pipeline = Pipeline.insert_into_pipeline(
202
+ pipeline, scope_transform,
203
+ before=ParseTreeTransforms.AnalyseDeclarationsTransform)
204
+
205
+ (err, tree) = Pipeline.run_pipeline(pipeline, tree, printtree=False)
206
+ assert not err, err
207
+ self.tree = tree
208
+ return tree
209
+
210
+ def put_code(self, globalstate, used_by=None):
211
+ pass
212
+
213
+ @classmethod
214
+ def load(cls, util_code_name, from_file, **kwargs):
215
+ if re.search("[.]c(pp)?::", util_code_name):
216
+ # We're trying to load a C/C++ utility code.
217
+ # For now, just handle the simple case with no tempita
218
+ return Code.UtilityCode.load_cached(util_code_name, from_file)
219
+ return super().load(util_code_name, from_file, **kwargs)
220
+
221
+ @classmethod
222
+ def load_as_string(cls, util_code_name, from_file=None, **kwargs):
223
+ """
224
+ Load a utility code as a string. Returns (proto, implementation)
225
+ """
226
+ util = cls.load(util_code_name, from_file, **kwargs)
227
+ return util.proto, util.impl # keep line numbers => no lstrip()
228
+
229
+ def declare_in_scope(self, dest_scope, used=False, cython_scope=None,
230
+ allowlist=None):
231
+ """
232
+ Declare all entries from the utility code in dest_scope. Code will only
233
+ be included for used entries. If module_name is given, declare the
234
+ type entries with that name.
235
+ """
236
+ tree = self.get_tree(entries_only=True, cython_scope=cython_scope)
237
+
238
+ entries = tree.scope.entries
239
+ entries.pop('__name__')
240
+ entries.pop('__file__')
241
+ entries.pop('__builtins__')
242
+ entries.pop('__doc__')
243
+
244
+ for entry in entries.values():
245
+ entry.utility_code_definition = self
246
+ entry.used = used
247
+
248
+ original_scope = tree.scope
249
+ dest_scope.merge_in(original_scope, merge_unused=True, allowlist=allowlist)
250
+ tree.scope = dest_scope
251
+
252
+ for dep in self.requires:
253
+ if dep.is_cython_utility:
254
+ dep.declare_in_scope(dest_scope, cython_scope=cython_scope)
255
+
256
+ return original_scope
257
+
258
+ @staticmethod
259
+ def filter_inherited_directives(current_directives, overrides=None):
260
+ """
261
+ Cython utility code should usually only pick up a few directives from the
262
+ environment (those that intentionally control its function) and ignore most
263
+ other compiler directives. This function provides a sensible default list
264
+ of directives to copy.
265
+ """
266
+ from .Options import _directive_defaults
267
+ utility_code_directives = dict(_directive_defaults)
268
+ inherited_directive_names = (
269
+ 'binding', 'always_allow_keywords', 'allow_none_for_extension_args',
270
+ 'auto_pickle', 'ccomplex',
271
+ 'c_string_type', 'c_string_encoding',
272
+ 'optimize.inline_defnode_calls', 'optimize.unpack_method_calls',
273
+ 'optimize.unpack_method_calls_in_pyinit', 'optimize.use_switch')
274
+ for name in inherited_directive_names:
275
+ if name in current_directives:
276
+ utility_code_directives[name] = current_directives[name]
277
+ if overrides:
278
+ utility_code_directives.update(overrides)
279
+ return utility_code_directives
280
+
281
+
282
+ class TemplatedFileSourceDescriptor(FileSourceDescriptor):
283
+
284
+ def __init__(self, filename, path_description, context):
285
+ super().__init__(filename, path_description)
286
+ self._context = context
287
+
288
+ def get_file_object(self, encoding=None, error_handling=None):
289
+ with super().get_file_object(encoding, error_handling) as f:
290
+ data = f.read()
291
+ ret = Code.sub_tempita(data, self._context, self.filename)
292
+ # We need stream to have .encoding attribute set
293
+ stream = io.TextIOWrapper(io.BytesIO(ret.encode(f.encoding)), encoding=f.encoding, errors=error_handling)
294
+ return stream
295
+
296
+
297
+ class CythonSharedUtilityCode(Code.AbstractUtilityCode):
298
+ def __init__(self, pxd_name, shared_utility_qualified_name, template_context, requires):
299
+ self._pxd_name = pxd_name
300
+ self._shared_utility_qualified_name = shared_utility_qualified_name
301
+ self.template_context = template_context
302
+ self.requires = requires
303
+ self._shared_library_scope = None
304
+
305
+ def find_module(self, context):
306
+ scope = context
307
+ for name, is_package in scope._split_qualified_name(self._shared_utility_qualified_name, relative_import=False):
308
+ scope = scope.find_submodule(name, as_package=is_package)
309
+
310
+ pxd_pathname = os.path.join(
311
+ os.path.split(Cython.__file__)[0],
312
+ 'Utility',
313
+ self._pxd_name
314
+ )
315
+ try:
316
+ rel_path = self._shared_utility_qualified_name.replace('.', os.sep) + os.path.splitext(pxd_pathname)[1]
317
+ source_desc = TemplatedFileSourceDescriptor(pxd_pathname, rel_path, self.template_context)
318
+ source_desc.in_utility_code = True
319
+ err, result = context.process_pxd(source_desc, scope, self._shared_utility_qualified_name)
320
+ (pxd_codenodes, pxd_scope) = result
321
+ context.utility_pxds[self._pxd_name] = (pxd_codenodes, pxd_scope)
322
+ scope.pxd_file_loaded = True
323
+ if err:
324
+ raise err
325
+ except CompileError:
326
+ pass
327
+ return scope
328
+
329
+ def declare_in_scope(self, dest_scope, used=False, cython_scope=None,
330
+ allowlist=None):
331
+ if self._pxd_name not in cython_scope.context.utility_pxds:
332
+ self._shared_library_scope = self.find_module(cython_scope.context)
333
+ for dep in self.requires:
334
+ if dep.is_cython_utility:
335
+ dep.declare_in_scope(dest_scope, cython_scope=cython_scope)
336
+ for e in self._shared_library_scope.c_class_entries:
337
+ dest_scope.add_imported_entry(e.name, e, e.pos)
338
+ for e in self._shared_library_scope.var_entries:
339
+ dest_scope.add_imported_entry(e.name, e, e.pos)
340
+ return dest_scope
341
+
342
+ def get_shared_library_scope(self, cython_scope):
343
+ if self._pxd_name not in cython_scope.context.utility_pxds:
344
+ self._shared_library_scope = self.find_module(cython_scope.context)
345
+ return self._shared_library_scope
346
+
347
+
348
+ def declare_declarations_in_scope(declaration_string, env, private_type=True,
349
+ *args, **kwargs):
350
+ """
351
+ Declare some declarations given as Cython code in declaration_string
352
+ in scope env.
353
+ """
354
+ 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,52 @@
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
+ cpdef visitchild(self, parent, str attr, idx=*)
19
+
20
+ cdef class CythonTransform(VisitorTransform):
21
+ cdef public context
22
+ cdef public current_directives
23
+
24
+ cdef class ScopeTrackingTransform(CythonTransform):
25
+ cdef public str scope_type
26
+ cdef public scope_node
27
+ cdef _visit_scope(self, node, scope_type: str)
28
+
29
+ cdef class EnvTransform(CythonTransform):
30
+ cdef public list env_stack
31
+
32
+ cdef class MethodDispatcherTransform(EnvTransform):
33
+ @cython.final
34
+ cdef _visit_binop_node(self, node)
35
+ @cython.final
36
+ cdef _find_handler(self, match_name, bint has_kwargs)
37
+ @cython.final
38
+ cdef _delegate_to_assigned_value(self, node, function, arg_list, kwargs)
39
+ @cython.final
40
+ cdef _dispatch_to_handler(self, node, function, arg_list, kwargs)
41
+ @cython.final
42
+ cdef _dispatch_to_method_handler(self, attr_name, self_arg,
43
+ is_unbound_method, type_name,
44
+ node, function, arg_list, kwargs)
45
+
46
+ cdef class RecursiveNodeReplacer(VisitorTransform):
47
+ cdef public orig_node
48
+ cdef public new_node
49
+
50
+ cdef class NodeFinder(TreeVisitor):
51
+ cdef node
52
+ cdef public bint found