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,105 @@
1
+ from Cython.TestUtils import CythonTest
2
+ import Cython.Compiler.Errors as Errors
3
+ from Cython.Compiler.Nodes import *
4
+ from Cython.Compiler.ParseTreeTransforms import *
5
+ from Cython.Compiler.Buffer import *
6
+
7
+
8
+ class TestBufferParsing(CythonTest):
9
+ # First, we only test the raw parser, i.e.
10
+ # the number and contents of arguments are NOT checked.
11
+ # However "dtype"/the first positional argument is special-cased
12
+ # to parse a type argument rather than an expression
13
+
14
+ def parse(self, s):
15
+ return self.should_not_fail(lambda: self.fragment(s)).root
16
+
17
+ def not_parseable(self, expected_error, s):
18
+ e = self.should_fail(lambda: self.fragment(s), Errors.CompileError)
19
+ self.assertEqual(expected_error, e.message_only)
20
+
21
+ def test_basic(self):
22
+ t = self.parse("cdef object[float, 4, ndim=2, foo=foo] x")
23
+ bufnode = t.stats[0].base_type
24
+ self.assertTrue(isinstance(bufnode, TemplatedTypeNode))
25
+ self.assertEqual(2, len(bufnode.positional_args))
26
+ # print bufnode.dump()
27
+ # should put more here...
28
+
29
+ def test_type_pos(self):
30
+ self.parse("cdef object[short unsigned int, 3] x")
31
+
32
+ def test_type_keyword(self):
33
+ self.parse("cdef object[foo=foo, dtype=short unsigned int] x")
34
+
35
+ def test_pos_after_key(self):
36
+ self.not_parseable("Non-keyword arg following keyword arg",
37
+ "cdef object[foo=1, 2] x")
38
+
39
+
40
+ # See also tests/error/e_bufaccess.pyx and tets/run/bufaccess.pyx
41
+ # THESE TESTS ARE NOW DISABLED, the code they test was pretty much
42
+ # refactored away
43
+ class TestBufferOptions(CythonTest):
44
+ # Tests the full parsing of the options within the brackets
45
+
46
+ def nonfatal_error(self, error):
47
+ # We're passing self as context to transform to trap this
48
+ self.error = error
49
+ self.assertTrue(self.expect_error)
50
+
51
+ def parse_opts(self, opts, expect_error=False):
52
+ assert opts != ""
53
+ s = "def f():\n cdef object[%s] x" % opts
54
+ self.expect_error = expect_error
55
+ root = self.fragment(s, pipeline=[NormalizeTree(self), PostParse(self)]).root
56
+ if not expect_error:
57
+ vardef = root.stats[0].body.stats[0]
58
+ assert isinstance(vardef, CVarDefNode) # use normal assert as this is to validate the test code
59
+ buftype = vardef.base_type
60
+ self.assertTrue(isinstance(buftype, TemplatedTypeNode))
61
+ self.assertTrue(isinstance(buftype.base_type_node, CSimpleBaseTypeNode))
62
+ self.assertEqual("object", buftype.base_type_node.name)
63
+ return buftype
64
+ else:
65
+ self.assertTrue(len(root.stats[0].body.stats) == 0)
66
+
67
+ def non_parse(self, expected_err, opts):
68
+ self.parse_opts(opts, expect_error=True)
69
+ # e = self.should_fail(lambda: self.parse_opts(opts))
70
+ self.assertEqual(expected_err, self.error.message_only)
71
+
72
+ def __test_basic(self):
73
+ buf = self.parse_opts("unsigned short int, 3")
74
+ self.assertTrue(isinstance(buf.dtype_node, CSimpleBaseTypeNode))
75
+ self.assertTrue(buf.dtype_node.signed == 0 and buf.dtype_node.longness == -1)
76
+ self.assertEqual(3, buf.ndim)
77
+
78
+ def __test_dict(self):
79
+ buf = self.parse_opts("ndim=3, dtype=unsigned short int")
80
+ self.assertTrue(isinstance(buf.dtype_node, CSimpleBaseTypeNode))
81
+ self.assertTrue(buf.dtype_node.signed == 0 and buf.dtype_node.longness == -1)
82
+ self.assertEqual(3, buf.ndim)
83
+
84
+ def __test_ndim(self):
85
+ self.parse_opts("int, 2")
86
+ self.non_parse(ERR_BUF_NDIM, "int, 'a'")
87
+ self.non_parse(ERR_BUF_NDIM, "int, -34")
88
+
89
+ def __test_use_DEF(self):
90
+ t = self.fragment("""
91
+ DEF ndim = 3
92
+ def f():
93
+ cdef object[int, ndim] x
94
+ cdef object[ndim=ndim, dtype=int] y
95
+ """, pipeline=[NormalizeTree(self), PostParse(self)]).root
96
+ stats = t.stats[0].body.stats
97
+ self.assertTrue(stats[0].base_type.ndim == 3)
98
+ self.assertTrue(stats[1].base_type.ndim == 3)
99
+
100
+ # add exotic and impossible combinations as they come along...
101
+
102
+
103
+ if __name__ == '__main__':
104
+ import unittest
105
+ unittest.main()
@@ -0,0 +1,196 @@
1
+ import builtins
2
+ import json
3
+ import subprocess
4
+ import sys
5
+
6
+ from .. import PyrexTypes
7
+ from ..Builtin import (
8
+ inferred_method_return_types, find_return_type_of_builtin_method,
9
+ unsafe_compile_time_methods, is_safe_compile_time_method,
10
+ builtin_scope, builtin_types,
11
+ )
12
+ from ..Symtab import ModuleScope
13
+ from ..PyrexTypes import (
14
+ py_object_type,
15
+ KNOWN_PYTHON_BUILTINS_VERSION, KNOWN_PYTHON_BUILTINS,
16
+ uncachable_builtins,
17
+ KNOWN_EXCEPTION_NAMES, exception_supertypes,
18
+ )
19
+
20
+ from ...TestUtils import TimedTest
21
+
22
+
23
+ class TestBuiltinReturnTypes(TimedTest):
24
+ _min_versions = {
25
+ 'frozendict': (3, 15, 0, 'alpha', 7),
26
+ 'sentinel': (3, 15, 0, 'beta', 1),
27
+ }
28
+ _min_method_versions = {
29
+ 'int.is_integer': (3, 12),
30
+ }
31
+
32
+ def test_find_return_type_of_builtin_method(self):
33
+ # It's enough to test the method existence in a recent Python that likely has them.
34
+ test_module_scope = ModuleScope('test', None, None)
35
+
36
+ for type_name in inferred_method_return_types:
37
+ builtin_type = builtin_scope.lookup(type_name).type
38
+ self._test_return_type_of_builtin_type(builtin_type, test_module_scope)
39
+
40
+ def test_find_return_type_of_builtin_method_specialised(self):
41
+ test_module_scope = ModuleScope('test', None, None)
42
+
43
+ pos = None
44
+ for type_name in inferred_method_return_types:
45
+ builtin_type = builtin_scope.lookup(type_name).type
46
+ if not builtin_type.supports_container_type:
47
+ continue
48
+
49
+ if type_name == 'tuple':
50
+ generic_test_types = [
51
+ # Avoid C tuples by using at least one Python object type.
52
+ [py_object_type],
53
+ [PyrexTypes.c_int_type, py_object_type],
54
+ [py_object_type, PyrexTypes.c_float_type],
55
+ [builtin_type, builtin_type, builtin_type, builtin_type],
56
+ ]
57
+ elif type_name in ['dict', 'frozendict']:
58
+ generic_test_types = [
59
+ [PyrexTypes.c_float_type, PyrexTypes.c_int_type],
60
+ [PyrexTypes.c_int_type, py_object_type],
61
+ [py_object_type, py_object_type],
62
+ [builtin_type, builtin_type],
63
+ [py_object_type, builtin_type],
64
+ ]
65
+ else:
66
+ generic_test_types = [
67
+ [PyrexTypes.c_float_type],
68
+ [PyrexTypes.c_int_type],
69
+ [py_object_type],
70
+ [builtin_type],
71
+ ]
72
+
73
+ for subscript_types in generic_test_types:
74
+ builtin_type = builtin_type.specialize_here(pos, test_module_scope, subscript_types)
75
+ self._test_return_type_of_builtin_type(builtin_type, test_module_scope)
76
+
77
+ def _test_return_type_of_builtin_type(self, builtin_type, test_module_scope):
78
+ container_type = builtin_type.get_container_type() or builtin_type
79
+ methods = inferred_method_return_types[container_type.name]
80
+ type_name = container_type.name
81
+
82
+ py_version = sys.version_info
83
+ look_up_methods = py_version >= (3,10)
84
+ pos = py_type = None
85
+
86
+ try:
87
+ py_type = getattr(builtins, type_name if type_name != 'unicode' else 'str')
88
+ except AttributeError:
89
+ if sys.version_info >= self._min_versions.get(type_name, ()):
90
+ raise
91
+ look_up_methods = False
92
+
93
+ current_subscript_types = builtin_type.subscripted_types if builtin_type.supports_container_type else []
94
+
95
+ def parse_subscripted_type(type_string):
96
+ if type_string == 'T':
97
+ return builtin_type
98
+ if type_string == 'I':
99
+ return current_subscript_types[-1] if current_subscript_types else py_object_type
100
+ if type_string == 'K':
101
+ return current_subscript_types[0] if current_subscript_types else py_object_type
102
+ if '[' in type_string:
103
+ origin_type_name, _, subscripted_type_names = type_string[:-1].partition('[')
104
+ subscripted_types = [
105
+ parse_subscripted_type(t)
106
+ for t in subscripted_type_names.split(',')
107
+ ]
108
+ parsed_type = builtin_types[origin_type_name]
109
+ if current_subscript_types:
110
+ return parsed_type.specialize_here(pos, test_module_scope, subscripted_types)
111
+ return parsed_type
112
+
113
+ return builtin_types.get(type_string) or PyrexTypes.parse_basic_ctype(type_string)
114
+
115
+ for method_name, return_type_name in methods.items():
116
+ fq_method_name = f"{type_name}.{method_name}"
117
+ if look_up_methods and py_version >= self._min_method_versions.get(fq_method_name, py_version):
118
+ self.assertTrue(hasattr(py_type, method_name), fq_method_name)
119
+
120
+ actual_return_type = find_return_type_of_builtin_method(
121
+ pos, test_module_scope, builtin_type, method_name)
122
+
123
+ expected_return_type = parse_subscripted_type(return_type_name)
124
+ if actual_return_type.is_builtin_type:
125
+ self.assertEqual(actual_return_type.name, expected_return_type.name)
126
+
127
+ self.assertEqual(actual_return_type.empty_declaration_code(pyrex=True), expected_return_type.empty_declaration_code(pyrex=True))
128
+
129
+
130
+ class TestBuiltinCompatibility(TimedTest):
131
+ def test_python_builtin_compatibility(self):
132
+ expected_builtins = set(KNOWN_PYTHON_BUILTINS)
133
+ if sys.platform != 'win32':
134
+ expected_builtins.discard("WindowsError")
135
+
136
+ # Read builtins from fresh Python process to prevent modifications by test dependencies.
137
+ output = subprocess.run(
138
+ [sys.executable, '-c', 'import builtins, json, sys; sys.stdout.write(json.dumps(dir(builtins)))'],
139
+ capture_output=True,
140
+ encoding='utf8',
141
+ )
142
+ runtime_builtins = frozenset(
143
+ name for name in json.loads(output.stdout)
144
+ if name not in ('__doc__', '__loader__', '__name__', '__package__', '__spec__'))
145
+
146
+ if sys.version_info < KNOWN_PYTHON_BUILTINS_VERSION:
147
+ missing_builtins = expected_builtins - runtime_builtins
148
+ if missing_builtins:
149
+ missing_from_uncachable = missing_builtins - set(uncachable_builtins)
150
+ self.assertSetEqual(missing_from_uncachable, set())
151
+ self.skipTest(f'skipping test, older Python release found. Missing builtins: {", ".join(sorted(missing_builtins))}')
152
+ self.skipTest('skipping test, older Python release found.')
153
+ self.assertSetEqual(runtime_builtins, expected_builtins)
154
+
155
+ def test_unsafe_compile_time_methods(self):
156
+ """Validate the table of builtin methods that are not safe for compile time evaluation
157
+ against the table of known builtin methods (and their types).
158
+ """
159
+ for builtin_type_name, unsafe_methods in unsafe_compile_time_methods.items():
160
+ self.assertIsInstance(unsafe_methods, set)
161
+
162
+ builtin_type = getattr(builtins, builtin_type_name) # All named types must exist as builtin types.
163
+
164
+ known_methods = sorted(
165
+ inferred_method_return_types[builtin_type_name]) # All types are also in "inferred_method_return_types".
166
+
167
+ self.assertFalse(unsafe_methods.difference(known_methods)) # Only known methods are listed.
168
+
169
+ for method_name in known_methods:
170
+ builtin_method = getattr(builtin_type, method_name, None)
171
+ if builtin_method is None:
172
+ self.assertIn(method_name, unsafe_methods) # Non-portable methods are always unsafe.
173
+ continue
174
+
175
+
176
+ class TestExceptions(TimedTest):
177
+ def test_hierarchy_completeness(self):
178
+ self.assertSetEqual(KNOWN_EXCEPTION_NAMES, set(exception_supertypes.keys()))
179
+ self.assertFalse(KNOWN_EXCEPTION_NAMES - set(KNOWN_PYTHON_BUILTINS))
180
+
181
+ def test_parents(self):
182
+ for exc_name, supertype_names in exception_supertypes.items():
183
+ exc_type = getattr(builtins, exc_name, None)
184
+ if exc_type is None:
185
+ # Older Python version?
186
+ self.assertIn(exc_name, uncachable_builtins)
187
+ continue
188
+
189
+ for supertype_name in supertype_names:
190
+ supertype = getattr(builtins, supertype_name, None)
191
+ if supertype is None:
192
+ # Older Python version?
193
+ self.assertIn(supertype_name, uncachable_builtins)
194
+ continue
195
+
196
+ self.assertTrue(issubclass(exc_type, supertype), (exc_type, supertype))