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,165 @@
1
+ import os
2
+
3
+ from Cython.Compiler import (
4
+ MemoryView, Code, Options, Pipeline, Errors, Main, Symtab
5
+ )
6
+ from Cython.Compiler.StringEncoding import EncodedString
7
+ from Cython.Compiler.Scanning import SharedUtilitySourceDescriptor
8
+ from Cython.Compiler.Errors import warning
9
+
10
+
11
+ def list_of_features(included=None, excluded=None, _list_of_features=[]):
12
+ if _list_of_features:
13
+ feature_names = _list_of_features[:]
14
+ else:
15
+ feature_names = sorted({feature_name for feature_name, _, _ in _iter_exports()})
16
+ _list_of_features[:] = feature_names
17
+
18
+ return _select_features(feature_names, included, excluded)
19
+
20
+
21
+ def _select_features(all_names, included, excluded):
22
+ names = all_names
23
+ if included:
24
+ included = set(included)
25
+ unknown = included.difference(all_names)
26
+ if unknown:
27
+ warning(None, f"Unknown shared module features selected: {', '.join(sorted(unknown))}")
28
+
29
+ names = [name for name in names if name in included]
30
+
31
+ if excluded:
32
+ excluded = set(excluded)
33
+ unknown = excluded.difference(all_names)
34
+ if unknown:
35
+ warning(None, f"Unknown shared module features excluded: {', '.join(sorted(unknown))}")
36
+ unused = excluded.difference(names)
37
+ if unused:
38
+ warning(None, f"Shared module features excluded that was not included: {', '.join(sorted(unused))}")
39
+
40
+ names = [name for name in names if name not in excluded]
41
+
42
+ return names
43
+
44
+
45
+ def _iter_exports(selected_features=None):
46
+ UtilityCode = Code.UtilityCode
47
+ match_special = UtilityCode.get_special_comment_matcher('/')
48
+
49
+ for c_utility_file in os.listdir(Code.get_utility_dir()):
50
+ if not c_utility_file.endswith('.c'):
51
+ continue
52
+
53
+ file_base_name = os.path.splitext(os.path.basename(c_utility_file))[0]
54
+ current_feature_name = file_base_name.partition('_')[0]
55
+
56
+ current_section = None
57
+ for line in Code.read_utilities_hook(c_utility_file):
58
+ if '//' not in line or not line.startswith('//'):
59
+ continue
60
+ match = match_special(line)
61
+ if match is None:
62
+ continue
63
+
64
+ name = match.group('name')
65
+ if name:
66
+ if current_section:
67
+ if selected_features is None or current_section[0] in selected_features:
68
+ yield current_section
69
+ current_section = None
70
+
71
+ section_title = UtilityCode.match_section_title(name) if '.export' in name else None
72
+ if section_title:
73
+ name, section_type = section_title.groups()
74
+ if section_type == 'export':
75
+ current_section = [current_feature_name, name, c_utility_file]
76
+
77
+ elif (tag := match.group('tag')) and tag.startswith('feature') and current_section:
78
+ explicit_feature_name = tag.split(':', 1)[-1].strip()
79
+ assert current_section[0] == current_feature_name, (
80
+ "Conflicting feature names given to the same utility code section: "
81
+ f"{current_section[0]!r} and {explicit_feature_name!r}")
82
+ current_section[0] = explicit_feature_name
83
+
84
+ if current_section:
85
+ if selected_features is None or current_section[0] in selected_features:
86
+ yield current_section
87
+
88
+
89
+ def create_shared_library_pipeline(context, scope, options, result, selected_features=None):
90
+
91
+ parse = Pipeline.parse_stage_factory(context)
92
+
93
+ def generate_tree_factory(context):
94
+ def generate_tree(compsrc):
95
+ tree = parse(compsrc)
96
+
97
+ if selected_features is None or 'MemoryView' in selected_features:
98
+ tree.scope.use_utility_code(
99
+ MemoryView.get_view_utility_code(options.shared_utility_qualified_name))
100
+
101
+ tree.scope.use_utility_code(MemoryView._get_memviewslice_declare_code())
102
+ tree.scope.use_utility_code(MemoryView._get_typeinfo_to_format_code())
103
+
104
+ context.include_directories.append(Code.get_utility_dir())
105
+ return tree
106
+
107
+ return generate_tree
108
+
109
+ def generate_c_utilities(module_node):
110
+ UtilityCode = Code.UtilityCode
111
+ for _, name, c_utility_file in _iter_exports(selected_features):
112
+ module_node.scope.use_utility_code(UtilityCode.load_cached(name, c_utility_file))
113
+ return module_node
114
+
115
+ orig_cimport_from_pyx = Options.cimport_from_pyx
116
+
117
+ def set_cimport_from_pyx(cimport_from_pyx):
118
+ def inner(node):
119
+ Options.cimport_from_pyx = cimport_from_pyx
120
+ return node
121
+ return inner
122
+
123
+ return [
124
+ # "cimport_from_pyx=True" to force generating __Pyx_ExportFunction
125
+ set_cimport_from_pyx(True),
126
+ generate_tree_factory(context),
127
+ *Pipeline.create_pipeline(context, 'pyx', exclude_classes=()),
128
+ generate_c_utilities,
129
+ Pipeline.inject_pxd_code_stage_factory(context),
130
+ Pipeline.inject_utility_code_stage_factory(context, internalise_c_class_entries=False),
131
+ Pipeline.inject_utility_pxd_code_stage_factory(context),
132
+ Pipeline.abort_on_errors,
133
+ Pipeline.generate_pyx_code_stage_factory(options, result),
134
+ set_cimport_from_pyx(orig_cimport_from_pyx),
135
+ ]
136
+
137
+
138
+ def generate_shared_module(options):
139
+ Errors.reset()
140
+
141
+ dest_c_file = options.shared_c_file_path
142
+ pyx_file = os.path.splitext(dest_c_file)[0] + '.pyx'
143
+ module_name = os.path.splitext(os.path.basename(dest_c_file))[0]
144
+
145
+ selected_features = None
146
+ if options.shared_utility_features_enabled or options.shared_utility_features_disabled:
147
+ selected_features = list_of_features(
148
+ options.shared_utility_features_enabled,
149
+ options.shared_utility_features_disabled,
150
+ )
151
+
152
+ context = Main.Context.from_options(options)
153
+ scope = Symtab.ModuleScope('MemoryView', parent_module = None, context = context, is_package=False)
154
+
155
+ source_desc = SharedUtilitySourceDescriptor(pyx_file)
156
+ comp_src = Main.CompilationSource(source_desc, EncodedString(module_name), os.getcwd())
157
+ result = Main.create_default_resultobj(comp_src, options)
158
+
159
+ pipeline = create_shared_library_pipeline(
160
+ context, scope, options, result,
161
+ selected_features=selected_features,
162
+ )
163
+ err, enddata = Pipeline.run_pipeline(pipeline, comp_src)
164
+
165
+ return err, enddata
@@ -0,0 +1,195 @@
1
+ import difflib
2
+ import glob
3
+ import gzip
4
+ import os
5
+ import sys
6
+ import tempfile
7
+ import unittest
8
+
9
+ import Cython.Build.Dependencies
10
+ import Cython.Compiler.Main
11
+ import Cython.Utils
12
+ from Cython.TestUtils import CythonTest
13
+
14
+
15
+ class TestCyCache(CythonTest):
16
+
17
+ def setUp(self):
18
+ CythonTest.setUp(self)
19
+ self.temp_dir = tempfile.mkdtemp(
20
+ prefix='cycache-test',
21
+ dir='TEST_TMP' if os.path.isdir('TEST_TMP') else None)
22
+ self.src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
23
+ self.cache_dir = tempfile.mkdtemp(prefix='cache', dir=self.temp_dir)
24
+
25
+ def cache_files(self, file_glob):
26
+ return glob.glob(os.path.join(self.cache_dir, file_glob))
27
+
28
+ def fresh_cythonize(self, *args, **kwargs):
29
+ Cython.Utils.clear_function_caches()
30
+ Cython.Build.Dependencies._dep_tree = None # discard method caches
31
+ Cython.Build.Dependencies.cythonize(*args, **kwargs)
32
+
33
+ def fresh_compile(self, *args, **kwargs):
34
+ Cython.Utils.clear_function_caches()
35
+ Cython.Compiler.Main.compile(*args, **kwargs)
36
+
37
+
38
+ def _test_cycache_switch(self, compilation_method):
39
+ content1 = 'value = 1\n'
40
+ content2 = 'value = 2\n'
41
+ a_pyx = os.path.join(self.src_dir, 'a.pyx')
42
+ a_c = a_pyx[:-4] + '.c'
43
+
44
+ with open(a_pyx, 'w') as f:
45
+ f.write(content1)
46
+
47
+ compilation_method(a_pyx, cache=self.cache_dir)
48
+ compilation_method(a_pyx, cache=self.cache_dir)
49
+
50
+ self.assertEqual(1, len(self.cache_files('a.c*')))
51
+ with open(a_c) as f:
52
+ a_contents1 = f.read()
53
+ os.unlink(a_c)
54
+
55
+ with open(a_pyx, 'w') as f:
56
+ f.write(content2)
57
+
58
+ compilation_method(a_pyx, cache=self.cache_dir)
59
+
60
+ with open(a_c) as f:
61
+ a_contents2 = f.read()
62
+ os.unlink(a_c)
63
+
64
+ self.assertNotEqual(a_contents1, a_contents2, 'C file not changed!')
65
+ self.assertEqual(2, len(self.cache_files('a.c*')))
66
+
67
+ with open(a_pyx, 'w') as f:
68
+ f.write(content1)
69
+
70
+ compilation_method(a_pyx, cache=self.cache_dir)
71
+
72
+ self.assertEqual(2, len(self.cache_files('a.c*')))
73
+ with open(a_c) as f:
74
+ a_contents = f.read()
75
+ self.assertEqual(
76
+ a_contents, a_contents1,
77
+ msg='\n'.join(list(difflib.unified_diff(
78
+ a_contents.split('\n'), a_contents1.split('\n')))[:10]))
79
+
80
+ def test_cycache_switch_cythonize(self):
81
+ self._test_cycache_switch(self.fresh_cythonize)
82
+
83
+ def test_cycache_switch_compile(self):
84
+ self._test_cycache_switch(self.fresh_compile)
85
+
86
+ def _test_cycache_uses_cache(self, compilation_method):
87
+ a_pyx = os.path.join(self.src_dir, 'a.pyx')
88
+ a_c = a_pyx[:-4] + '.c'
89
+ with open(a_pyx, 'w') as f:
90
+ f.write('pass')
91
+
92
+ compilation_method(a_pyx, cache=self.cache_dir)
93
+
94
+ a_cache = os.path.join(self.cache_dir, os.listdir(self.cache_dir)[0])
95
+ with gzip.GzipFile(a_cache, 'wb') as gzipfile:
96
+ gzipfile.write(b'fake stuff')
97
+ os.unlink(a_c)
98
+
99
+ compilation_method(a_pyx, cache=self.cache_dir)
100
+
101
+ with open(a_c) as f:
102
+ a_contents = f.read()
103
+ self.assertEqual(a_contents, 'fake stuff',
104
+ 'Unexpected contents: %s...' % a_contents[:100])
105
+
106
+
107
+ def test_cycache_uses_cache_cythonize(self):
108
+ self._test_cycache_uses_cache(self.fresh_cythonize)
109
+
110
+ def test_cycache_uses_cache_compile(self):
111
+ self._test_cycache_uses_cache(self.fresh_compile)
112
+
113
+ def _test_cycache_annotation(self, compilation_method):
114
+ a_pyx = os.path.join(self.src_dir, 'a.pyx')
115
+ a_c = a_pyx[:-4] + '.c'
116
+ a_html = a_pyx[:-4] + '.html'
117
+ with open(a_pyx, 'w') as f:
118
+ f.write('pass')
119
+
120
+ compilation_method(a_pyx, cache=self.cache_dir, annotate='default')
121
+ self.assertTrue(os.path.exists(a_html), a_html)
122
+ os.unlink(a_html)
123
+ os.unlink(a_c)
124
+ compilation_method(a_pyx, cache=self.cache_dir, annotate='default')
125
+ self.assertTrue(os.path.exists(a_html), a_html)
126
+
127
+ def test_cycache_annotation_cythonize(self):
128
+ self._test_cycache_annotation(self.fresh_cythonize)
129
+
130
+ def test_cycache_annotation_compile(self):
131
+ self._test_cycache_annotation(self.fresh_compile)
132
+
133
+ def _test_multi_file_output(self, compilation_method):
134
+ a_pyx = os.path.join(self.src_dir, 'a.pyx')
135
+ a_c = a_pyx[:-4] + '.c'
136
+ a_h = a_pyx[:-4] + '.h'
137
+ a_api_h = a_pyx[:-4] + '_api.h'
138
+ with open(a_pyx, 'w') as f:
139
+ f.write('cdef public api int foo(int x): return x\n')
140
+
141
+ compilation_method(a_pyx, cache=self.cache_dir)
142
+
143
+ expected = [a_c, a_h, a_api_h]
144
+ for output in expected:
145
+ self.assertTrue(os.path.exists(output), output)
146
+ os.unlink(output)
147
+
148
+ compilation_method(a_pyx, cache=self.cache_dir)
149
+
150
+ for output in expected:
151
+ self.assertTrue(os.path.exists(output), output)
152
+ self.assertTrue(os.path.isfile(output), output)
153
+
154
+ def test_multi_file_output_cythonize(self):
155
+ self._test_multi_file_output(self.fresh_cythonize)
156
+
157
+ def test_multi_file_output_compile(self):
158
+ self._test_multi_file_output(self.fresh_compile)
159
+
160
+ def _test_options_invalidation(self, compilation_method):
161
+ hash_pyx = os.path.join(self.src_dir, 'options.pyx')
162
+ hash_c = hash_pyx[:-len('.pyx')] + '.c'
163
+ hash_cpp = hash_pyx[:-len('.pyx')] + '.cpp'
164
+
165
+ with open(hash_pyx, 'w') as f:
166
+ f.write('pass')
167
+ compilation_method(hash_pyx, cache=self.cache_dir, cplus=False)
168
+ self.assertEqual(1, len(self.cache_files('options.c*')))
169
+
170
+ os.unlink(hash_c)
171
+
172
+ compilation_method(hash_pyx, cache=self.cache_dir, cplus=True)
173
+
174
+ self.assertEqual(2, len(self.cache_files('options.c*')))
175
+
176
+ try:
177
+ os.unlink(hash_c)
178
+ except FileNotFoundError:
179
+ # fresh_cythonize() produces .c file, fresh_compile produces .cpp file
180
+ os.unlink(hash_cpp)
181
+
182
+ compilation_method(hash_pyx, cache=self.cache_dir, cplus=False, show_version=False)
183
+
184
+ self.assertEqual(2, len(self.cache_files('options.c*')))
185
+
186
+ os.unlink(hash_c)
187
+
188
+ compilation_method(hash_pyx, cache=self.cache_dir, cplus=False, show_version=True)
189
+
190
+ self.assertEqual(2, len(self.cache_files('options.c*')))
191
+ def test_options_invalidation_cythonize(self):
192
+ self._test_options_invalidation(self.fresh_cythonize)
193
+
194
+ def test_options_invalidation_compile(self):
195
+ self._test_options_invalidation(self.fresh_compile)