Cython 3.2.0__cp39-abi3-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. Cython/Build/BuildExecutable.py +169 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +350 -0
  4. Cython/Build/Dependencies.py +1314 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +463 -0
  7. Cython/Build/IpythonMagic.py +560 -0
  8. Cython/Build/SharedModule.py +94 -0
  9. Cython/Build/Tests/TestCyCache.py +194 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +287 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +11 -0
  18. Cython/CodeWriter.py +815 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +328 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +984 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.pxd +149 -0
  26. Cython/Compiler/Code.py +3746 -0
  27. Cython/Compiler/Code.pyd +0 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +191 -0
  30. Cython/Compiler/Dataclass.py +864 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +297 -0
  33. Cython/Compiler/ExprNodes.py +15562 -0
  34. Cython/Compiler/FlowControl.pxd +97 -0
  35. Cython/Compiler/FlowControl.py +1451 -0
  36. Cython/Compiler/FlowControl.pyd +0 -0
  37. Cython/Compiler/FusedNode.py +971 -0
  38. Cython/Compiler/FusedNode.pyd +0 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +421 -0
  42. Cython/Compiler/LineTable.py +114 -0
  43. Cython/Compiler/LineTable.pyd +0 -0
  44. Cython/Compiler/Main.py +857 -0
  45. Cython/Compiler/MatchCaseNodes.py +259 -0
  46. Cython/Compiler/MemoryView.py +905 -0
  47. Cython/Compiler/ModuleNode.py +4235 -0
  48. Cython/Compiler/Naming.py +363 -0
  49. Cython/Compiler/Nodes.py +10831 -0
  50. Cython/Compiler/Optimize.py +5288 -0
  51. Cython/Compiler/Options.py +843 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +78 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4638 -0
  54. Cython/Compiler/Parsing.pxd +9 -0
  55. Cython/Compiler/Parsing.py +4775 -0
  56. Cython/Compiler/Parsing.pyd +0 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +5870 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.pxd +48 -0
  61. Cython/Compiler/Scanning.py +701 -0
  62. Cython/Compiler/Scanning.pyd +0 -0
  63. Cython/Compiler/StringEncoding.py +298 -0
  64. Cython/Compiler/Symtab.py +3073 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +72 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +586 -0
  68. Cython/Compiler/Tests/TestCode.py +144 -0
  69. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  70. Cython/Compiler/Tests/TestGrammar.py +202 -0
  71. Cython/Compiler/Tests/TestMemView.py +71 -0
  72. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  73. Cython/Compiler/Tests/TestScanning.py +134 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +21 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +75 -0
  79. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  80. Cython/Compiler/Tests/TestVisitor.py +61 -0
  81. Cython/Compiler/Tests/Utils.py +36 -0
  82. Cython/Compiler/Tests/__init__.py +1 -0
  83. Cython/Compiler/TreeFragment.py +278 -0
  84. Cython/Compiler/TreePath.py +303 -0
  85. Cython/Compiler/TypeInference.py +591 -0
  86. Cython/Compiler/TypeSlots.py +1174 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +389 -0
  89. Cython/Compiler/UtilityCode.py +344 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.pxd +53 -0
  92. Cython/Compiler/Visitor.py +861 -0
  93. Cython/Compiler/Visitor.pyd +0 -0
  94. Cython/Compiler/__init__.py +1 -0
  95. Cython/Coverage.py +448 -0
  96. Cython/Debugger/Cygdb.py +177 -0
  97. Cython/Debugger/DebugWriter.py +82 -0
  98. Cython/Debugger/Tests/TestLibCython.py +275 -0
  99. Cython/Debugger/Tests/__init__.py +1 -0
  100. Cython/Debugger/Tests/cfuncs.c +8 -0
  101. Cython/Debugger/Tests/codefile +49 -0
  102. Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
  103. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  104. Cython/Debugger/__init__.py +1 -0
  105. Cython/Debugger/libcython.py +1548 -0
  106. Cython/Debugger/libpython.py +2821 -0
  107. Cython/Debugging.py +20 -0
  108. Cython/Distutils/__init__.py +2 -0
  109. Cython/Distutils/build_ext.py +139 -0
  110. Cython/Distutils/extension.py +96 -0
  111. Cython/Distutils/old_build_ext.py +351 -0
  112. Cython/Includes/cpython/__init__.pxd +173 -0
  113. Cython/Includes/cpython/array.pxd +178 -0
  114. Cython/Includes/cpython/bool.pxd +37 -0
  115. Cython/Includes/cpython/buffer.pxd +112 -0
  116. Cython/Includes/cpython/bytearray.pxd +33 -0
  117. Cython/Includes/cpython/bytes.pxd +200 -0
  118. Cython/Includes/cpython/cellobject.pxd +35 -0
  119. Cython/Includes/cpython/ceval.pxd +8 -0
  120. Cython/Includes/cpython/codecs.pxd +121 -0
  121. Cython/Includes/cpython/complex.pxd +60 -0
  122. Cython/Includes/cpython/contextvars.pxd +145 -0
  123. Cython/Includes/cpython/conversion.pxd +36 -0
  124. Cython/Includes/cpython/datetime.pxd +395 -0
  125. Cython/Includes/cpython/descr.pxd +26 -0
  126. Cython/Includes/cpython/dict.pxd +187 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +47 -0
  130. Cython/Includes/cpython/function.pxd +65 -0
  131. Cython/Includes/cpython/genobject.pxd +25 -0
  132. Cython/Includes/cpython/getargs.pxd +12 -0
  133. Cython/Includes/cpython/instance.pxd +25 -0
  134. Cython/Includes/cpython/iterator.pxd +36 -0
  135. Cython/Includes/cpython/iterobject.pxd +24 -0
  136. Cython/Includes/cpython/list.pxd +92 -0
  137. Cython/Includes/cpython/long.pxd +149 -0
  138. Cython/Includes/cpython/longintrepr.pxd +14 -0
  139. Cython/Includes/cpython/mapping.pxd +63 -0
  140. Cython/Includes/cpython/marshal.pxd +66 -0
  141. Cython/Includes/cpython/mem.pxd +120 -0
  142. Cython/Includes/cpython/memoryview.pxd +50 -0
  143. Cython/Includes/cpython/method.pxd +49 -0
  144. Cython/Includes/cpython/module.pxd +208 -0
  145. Cython/Includes/cpython/number.pxd +258 -0
  146. Cython/Includes/cpython/object.pxd +433 -0
  147. Cython/Includes/cpython/pycapsule.pxd +143 -0
  148. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  149. Cython/Includes/cpython/pyport.pxd +8 -0
  150. Cython/Includes/cpython/pystate.pxd +95 -0
  151. Cython/Includes/cpython/pythread.pxd +53 -0
  152. Cython/Includes/cpython/ref.pxd +141 -0
  153. Cython/Includes/cpython/sequence.pxd +134 -0
  154. Cython/Includes/cpython/set.pxd +119 -0
  155. Cython/Includes/cpython/slice.pxd +70 -0
  156. Cython/Includes/cpython/time.pxd +129 -0
  157. Cython/Includes/cpython/tuple.pxd +72 -0
  158. Cython/Includes/cpython/type.pxd +53 -0
  159. Cython/Includes/cpython/unicode.pxd +639 -0
  160. Cython/Includes/cpython/version.pxd +32 -0
  161. Cython/Includes/cpython/weakref.pxd +78 -0
  162. Cython/Includes/libc/__init__.pxd +1 -0
  163. Cython/Includes/libc/complex.pxd +35 -0
  164. Cython/Includes/libc/errno.pxd +127 -0
  165. Cython/Includes/libc/float.pxd +43 -0
  166. Cython/Includes/libc/limits.pxd +28 -0
  167. Cython/Includes/libc/locale.pxd +46 -0
  168. Cython/Includes/libc/math.pxd +209 -0
  169. Cython/Includes/libc/setjmp.pxd +10 -0
  170. Cython/Includes/libc/signal.pxd +64 -0
  171. Cython/Includes/libc/stddef.pxd +9 -0
  172. Cython/Includes/libc/stdint.pxd +105 -0
  173. Cython/Includes/libc/stdio.pxd +80 -0
  174. Cython/Includes/libc/stdlib.pxd +72 -0
  175. Cython/Includes/libc/string.pxd +50 -0
  176. Cython/Includes/libc/threads.pxd +234 -0
  177. Cython/Includes/libc/time.pxd +52 -0
  178. Cython/Includes/libcpp/__init__.pxd +4 -0
  179. Cython/Includes/libcpp/algorithm.pxd +320 -0
  180. Cython/Includes/libcpp/any.pxd +16 -0
  181. Cython/Includes/libcpp/atomic.pxd +59 -0
  182. Cython/Includes/libcpp/barrier.pxd +22 -0
  183. Cython/Includes/libcpp/bit.pxd +29 -0
  184. Cython/Includes/libcpp/cast.pxd +12 -0
  185. Cython/Includes/libcpp/cmath.pxd +518 -0
  186. Cython/Includes/libcpp/complex.pxd +106 -0
  187. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  188. Cython/Includes/libcpp/deque.pxd +165 -0
  189. Cython/Includes/libcpp/exception.pxd +86 -0
  190. Cython/Includes/libcpp/execution.pxd +15 -0
  191. Cython/Includes/libcpp/forward_list.pxd +63 -0
  192. Cython/Includes/libcpp/functional.pxd +26 -0
  193. Cython/Includes/libcpp/future.pxd +103 -0
  194. Cython/Includes/libcpp/iterator.pxd +34 -0
  195. Cython/Includes/libcpp/latch.pxd +17 -0
  196. Cython/Includes/libcpp/limits.pxd +61 -0
  197. Cython/Includes/libcpp/list.pxd +117 -0
  198. Cython/Includes/libcpp/map.pxd +252 -0
  199. Cython/Includes/libcpp/memory.pxd +115 -0
  200. Cython/Includes/libcpp/mutex.pxd +387 -0
  201. Cython/Includes/libcpp/numbers.pxd +15 -0
  202. Cython/Includes/libcpp/numeric.pxd +131 -0
  203. Cython/Includes/libcpp/optional.pxd +34 -0
  204. Cython/Includes/libcpp/pair.pxd +1 -0
  205. Cython/Includes/libcpp/queue.pxd +25 -0
  206. Cython/Includes/libcpp/random.pxd +166 -0
  207. Cython/Includes/libcpp/semaphore.pxd +43 -0
  208. Cython/Includes/libcpp/set.pxd +228 -0
  209. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  210. Cython/Includes/libcpp/span.pxd +87 -0
  211. Cython/Includes/libcpp/stack.pxd +11 -0
  212. Cython/Includes/libcpp/stop_token.pxd +117 -0
  213. Cython/Includes/libcpp/string.pxd +355 -0
  214. Cython/Includes/libcpp/string_view.pxd +183 -0
  215. Cython/Includes/libcpp/typeindex.pxd +15 -0
  216. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  217. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  218. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  219. Cython/Includes/libcpp/utility.pxd +30 -0
  220. Cython/Includes/libcpp/vector.pxd +186 -0
  221. Cython/Includes/numpy/math.pxd +150 -0
  222. Cython/Includes/openmp.pxd +50 -0
  223. Cython/Includes/posix/__init__.pxd +1 -0
  224. Cython/Includes/posix/dlfcn.pxd +14 -0
  225. Cython/Includes/posix/fcntl.pxd +86 -0
  226. Cython/Includes/posix/ioctl.pxd +4 -0
  227. Cython/Includes/posix/mman.pxd +101 -0
  228. Cython/Includes/posix/resource.pxd +57 -0
  229. Cython/Includes/posix/select.pxd +21 -0
  230. Cython/Includes/posix/signal.pxd +73 -0
  231. Cython/Includes/posix/stat.pxd +98 -0
  232. Cython/Includes/posix/stdio.pxd +37 -0
  233. Cython/Includes/posix/stdlib.pxd +29 -0
  234. Cython/Includes/posix/strings.pxd +9 -0
  235. Cython/Includes/posix/time.pxd +71 -0
  236. Cython/Includes/posix/types.pxd +30 -0
  237. Cython/Includes/posix/uio.pxd +26 -0
  238. Cython/Includes/posix/unistd.pxd +271 -0
  239. Cython/Includes/posix/wait.pxd +38 -0
  240. Cython/Plex/Actions.pxd +24 -0
  241. Cython/Plex/Actions.py +119 -0
  242. Cython/Plex/Actions.pyd +0 -0
  243. Cython/Plex/DFA.pxd +14 -0
  244. Cython/Plex/DFA.py +164 -0
  245. Cython/Plex/DFA.pyd +0 -0
  246. Cython/Plex/Errors.py +48 -0
  247. Cython/Plex/Lexicons.py +178 -0
  248. Cython/Plex/Machines.pxd +36 -0
  249. Cython/Plex/Machines.py +238 -0
  250. Cython/Plex/Machines.pyd +0 -0
  251. Cython/Plex/Regexps.py +535 -0
  252. Cython/Plex/Scanners.pxd +45 -0
  253. Cython/Plex/Scanners.py +328 -0
  254. Cython/Plex/Scanners.pyd +0 -0
  255. Cython/Plex/Transitions.pxd +14 -0
  256. Cython/Plex/Transitions.py +239 -0
  257. Cython/Plex/Transitions.pyd +0 -0
  258. Cython/Plex/__init__.py +34 -0
  259. Cython/Runtime/__init__.py +1 -0
  260. Cython/Runtime/refnanny.pyd +0 -0
  261. Cython/Runtime/refnanny.pyx +237 -0
  262. Cython/Shadow.py +690 -0
  263. Cython/Shadow.pyi +521 -0
  264. Cython/StringIOTree.py +170 -0
  265. Cython/StringIOTree.pyd +0 -0
  266. Cython/Tempita/__init__.py +4 -0
  267. Cython/Tempita/_looper.py +154 -0
  268. Cython/Tempita/_tempita.py +1091 -0
  269. Cython/Tempita/_tempita.pyd +0 -0
  270. Cython/TestUtils.py +422 -0
  271. Cython/Tests/TestCodeWriter.py +128 -0
  272. Cython/Tests/TestCythonUtils.py +202 -0
  273. Cython/Tests/TestJediTyper.py +223 -0
  274. Cython/Tests/TestShadow.py +114 -0
  275. Cython/Tests/TestStringIOTree.py +67 -0
  276. Cython/Tests/TestTestUtils.py +90 -0
  277. Cython/Tests/__init__.py +1 -0
  278. Cython/Tests/xmlrunner.py +390 -0
  279. Cython/Utility/AsyncGen.c +1031 -0
  280. Cython/Utility/Buffer.c +865 -0
  281. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  282. Cython/Utility/Builtins.c +810 -0
  283. Cython/Utility/CConvert.pyx +134 -0
  284. Cython/Utility/CMath.c +104 -0
  285. Cython/Utility/CommonStructures.c +226 -0
  286. Cython/Utility/Complex.c +378 -0
  287. Cython/Utility/Coroutine.c +2300 -0
  288. Cython/Utility/CpdefEnums.pyx +103 -0
  289. Cython/Utility/CppConvert.pyx +282 -0
  290. Cython/Utility/CppSupport.cpp +151 -0
  291. Cython/Utility/CythonFunction.c +1832 -0
  292. Cython/Utility/Dataclasses.c +101 -0
  293. Cython/Utility/Embed.c +121 -0
  294. Cython/Utility/Exceptions.c +1016 -0
  295. Cython/Utility/ExtensionTypes.c +996 -0
  296. Cython/Utility/FunctionArguments.c +1043 -0
  297. Cython/Utility/FusedFunction.pyx +44 -0
  298. Cython/Utility/ImportExport.c +907 -0
  299. Cython/Utility/MemoryView.pxd +188 -0
  300. Cython/Utility/MemoryView.pyx +1482 -0
  301. Cython/Utility/MemoryView_C.c +927 -0
  302. Cython/Utility/ModuleSetupCode.c +3203 -0
  303. Cython/Utility/NumpyImportArray.c +46 -0
  304. Cython/Utility/ObjectHandling.c +3273 -0
  305. Cython/Utility/Optimize.c +1603 -0
  306. Cython/Utility/Overflow.c +384 -0
  307. Cython/Utility/Printing.c +86 -0
  308. Cython/Utility/Profile.c +732 -0
  309. Cython/Utility/StringTools.c +1379 -0
  310. Cython/Utility/Synchronization.c +399 -0
  311. Cython/Utility/TString.c +356 -0
  312. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  313. Cython/Utility/TestCythonScope.pyx +75 -0
  314. Cython/Utility/TestUtilityLoader.c +12 -0
  315. Cython/Utility/TypeConversion.c +1385 -0
  316. Cython/Utility/UFuncs.pyx +50 -0
  317. Cython/Utility/UFuncs_C.c +89 -0
  318. Cython/Utility/__init__.py +28 -0
  319. Cython/Utility/arrayarray.h +167 -0
  320. Cython/Utils.py +687 -0
  321. Cython/Utils.pyd +0 -0
  322. Cython/__init__.py +10 -0
  323. Cython/__init__.pyi +7 -0
  324. Cython/py.typed +0 -0
  325. cython-3.2.0.dist-info/METADATA +85 -0
  326. cython-3.2.0.dist-info/RECORD +333 -0
  327. cython-3.2.0.dist-info/WHEEL +5 -0
  328. cython-3.2.0.dist-info/entry_points.txt +4 -0
  329. cython-3.2.0.dist-info/top_level.txt +3 -0
  330. cython.py +29 -0
  331. pyximport/__init__.py +4 -0
  332. pyximport/pyxbuild.py +160 -0
  333. pyximport/pyximport.py +482 -0
@@ -0,0 +1,82 @@
1
+ import os
2
+ import sys
3
+ import errno
4
+
5
+ try:
6
+ from lxml import etree
7
+ have_lxml = True
8
+ except ImportError:
9
+ have_lxml = False
10
+ from xml.etree import ElementTree as etree
11
+
12
+ from ..Compiler import Errors
13
+ from ..Compiler.StringEncoding import EncodedString
14
+
15
+
16
+ def is_valid_tag(name):
17
+ """
18
+ Names like '.0' are used internally for arguments
19
+ to functions creating generator expressions,
20
+ however they are not identifiers.
21
+
22
+ See https://github.com/cython/cython/issues/5552
23
+ """
24
+ if isinstance(name, EncodedString):
25
+ if name.startswith(".") and name[1:].isdecimal():
26
+ return False
27
+ return True
28
+
29
+
30
+ class CythonDebugWriter:
31
+ """
32
+ Class to output debugging information for cygdb
33
+
34
+ It writes debug information to cython_debug/cython_debug_info_<modulename>
35
+ in the build directory.
36
+ """
37
+
38
+ def __init__(self, output_dir):
39
+ if etree is None:
40
+ raise Errors.NoElementTreeInstalledException()
41
+
42
+ self.output_dir = os.path.join(output_dir or os.curdir, 'cython_debug')
43
+ self.tb = etree.TreeBuilder()
44
+ # set by Cython.Compiler.ParseTreeTransforms.DebugTransform
45
+ self.module_name = None
46
+ self.start('cython_debug', attrs=dict(version='1.0'))
47
+
48
+ def start(self, name, attrs=None):
49
+ if is_valid_tag(name):
50
+ self.tb.start(name, attrs or {})
51
+
52
+ def end(self, name):
53
+ if is_valid_tag(name):
54
+ self.tb.end(name)
55
+
56
+ def add_entry(self, name, **attrs):
57
+ if is_valid_tag(name):
58
+ self.tb.start(name, attrs)
59
+ self.tb.end(name)
60
+
61
+ def serialize(self):
62
+ self.tb.end('Module')
63
+ self.tb.end('cython_debug')
64
+ xml_root_element = self.tb.close()
65
+
66
+ try:
67
+ os.makedirs(self.output_dir)
68
+ except OSError as e:
69
+ if e.errno != errno.EEXIST:
70
+ raise
71
+
72
+ et = etree.ElementTree(xml_root_element)
73
+ kw = {}
74
+ if have_lxml:
75
+ kw['pretty_print'] = True
76
+
77
+ fn = "cython_debug_info_" + self.module_name
78
+ et.write(os.path.join(self.output_dir, fn), encoding="UTF-8", **kw)
79
+
80
+ interpreter_path = os.path.join(self.output_dir, 'interpreter')
81
+ with open(interpreter_path, 'w') as f:
82
+ f.write(sys.executable)
@@ -0,0 +1,275 @@
1
+ import os
2
+ import re
3
+ import sys
4
+ import shutil
5
+ import warnings
6
+ import textwrap
7
+ import unittest
8
+ import tempfile
9
+ import subprocess
10
+ #import distutils.core
11
+ #from distutils import sysconfig
12
+ from distutils import ccompiler
13
+
14
+ import runtests
15
+ import Cython.Distutils.extension
16
+ import Cython.Distutils.old_build_ext as build_ext
17
+ from Cython.Debugger import Cygdb as cygdb
18
+
19
+ root = os.path.dirname(os.path.abspath(__file__))
20
+ codefile = os.path.join(root, 'codefile')
21
+ cfuncs_file = os.path.join(root, 'cfuncs.c')
22
+
23
+ with open(codefile) as f:
24
+ source_to_lineno = {line.strip(): i for i, line in enumerate(f, 1)}
25
+
26
+
27
+ have_gdb = None
28
+ def test_gdb():
29
+ global have_gdb
30
+ if have_gdb is not None:
31
+ return have_gdb
32
+
33
+ have_gdb = False
34
+ try:
35
+ p = subprocess.Popen(['gdb', '-nx', '--version'], stdout=subprocess.PIPE)
36
+ except OSError:
37
+ # gdb not found
38
+ gdb_version = None
39
+ else:
40
+ stdout, _ = p.communicate()
41
+ # Based on Lib/test/test_gdb.py
42
+ regex = r"GNU gdb [^\d]*(\d+)\.(\d+)"
43
+ gdb_version = re.match(regex, stdout.decode('ascii', 'ignore'))
44
+
45
+ if gdb_version:
46
+ gdb_version_number = list(map(int, gdb_version.groups()))
47
+ if gdb_version_number >= [7, 2]:
48
+ have_gdb = True
49
+ with tempfile.NamedTemporaryFile(mode='w+') as python_version_script:
50
+ python_version_script.write(
51
+ 'python import sys; print("%s %s" % sys.version_info[:2])')
52
+ python_version_script.flush()
53
+ p = subprocess.Popen(['gdb', '-batch', '-x', python_version_script.name],
54
+ stdout=subprocess.PIPE)
55
+ stdout, _ = p.communicate()
56
+ try:
57
+ internal_python_version = list(map(int, stdout.decode('ascii', 'ignore').split()))
58
+ if internal_python_version < [2, 7]:
59
+ have_gdb = False
60
+ except ValueError:
61
+ have_gdb = False
62
+
63
+ if not have_gdb:
64
+ warnings.warn('Skipping gdb tests, need gdb >= 7.2 with Python >= 2.7')
65
+
66
+ return have_gdb
67
+
68
+
69
+ class DebuggerTestCase(unittest.TestCase):
70
+
71
+ def setUp(self):
72
+ """
73
+ Run gdb and have cygdb import the debug information from the code
74
+ defined in TestParseTreeTransforms's setUp method
75
+ """
76
+ if not test_gdb():
77
+ return
78
+
79
+ self.tempdir = tempfile.mkdtemp()
80
+ self.destfile = os.path.join(self.tempdir, 'codefile.pyx')
81
+ self.debug_dest = os.path.join(self.tempdir,
82
+ 'cython_debug',
83
+ 'cython_debug_info_codefile')
84
+ self.cfuncs_destfile = os.path.join(self.tempdir, 'cfuncs')
85
+
86
+ self.cwd = os.getcwd()
87
+ try:
88
+ os.chdir(self.tempdir)
89
+
90
+ shutil.copy(codefile, self.destfile)
91
+ shutil.copy(cfuncs_file, self.cfuncs_destfile + '.c')
92
+ shutil.copy(cfuncs_file.replace('.c', '.h'),
93
+ self.cfuncs_destfile + '.h')
94
+
95
+ compiler = ccompiler.new_compiler()
96
+ compiler.compile(['cfuncs.c'], debug=True, extra_postargs=['-fPIC'])
97
+
98
+ opts = dict(
99
+ test_directory=self.tempdir,
100
+ module='codefile',
101
+ module_path=self.destfile,
102
+ )
103
+
104
+ optimization_disabler = build_ext.Optimization()
105
+
106
+ cython_compile_testcase = runtests.CythonCompileTestCase(
107
+ workdir=self.tempdir,
108
+ # we clean up everything (not only compiled files)
109
+ cleanup_workdir=False,
110
+ tags=runtests.parse_tags(codefile),
111
+ **opts
112
+ )
113
+
114
+
115
+ new_stderr = open(os.devnull, 'w')
116
+
117
+ stderr = sys.stderr
118
+ sys.stderr = new_stderr
119
+
120
+ optimization_disabler.disable_optimization()
121
+ try:
122
+ cython_compile_testcase.run_cython(
123
+ targetdir=self.tempdir,
124
+ incdir=None,
125
+ annotate=False,
126
+ extra_compile_options={
127
+ 'gdb_debug':True,
128
+ 'output_dir':self.tempdir,
129
+ },
130
+ **opts
131
+ )
132
+
133
+ cython_compile_testcase.run_distutils(
134
+ test_directory=opts['test_directory'],
135
+ module=opts['module'],
136
+ workdir=opts['test_directory'],
137
+ incdir=None,
138
+ extra_extension_args={'extra_objects':['cfuncs.o']},
139
+ )
140
+ finally:
141
+ optimization_disabler.restore_state()
142
+ sys.stderr = stderr
143
+ new_stderr.close()
144
+
145
+ # ext = Cython.Distutils.extension.Extension(
146
+ # 'codefile',
147
+ # ['codefile.pyx'],
148
+ # cython_gdb=True,
149
+ # extra_objects=['cfuncs.o'])
150
+ #
151
+ # distutils.core.setup(
152
+ # script_args=['build_ext', '--inplace'],
153
+ # ext_modules=[ext],
154
+ # cmdclass=dict(build_ext=Cython.Distutils.build_ext)
155
+ # )
156
+
157
+ except:
158
+ os.chdir(self.cwd)
159
+ raise
160
+
161
+ def tearDown(self):
162
+ if not test_gdb():
163
+ return
164
+ os.chdir(self.cwd)
165
+ shutil.rmtree(self.tempdir)
166
+
167
+
168
+ class GdbDebuggerTestCase(DebuggerTestCase):
169
+
170
+ def setUp(self):
171
+ if not test_gdb():
172
+ return
173
+
174
+ super().setUp()
175
+
176
+ prefix_code = textwrap.dedent('''\
177
+ python
178
+
179
+ import os
180
+ import sys
181
+ import traceback
182
+
183
+ def excepthook(type, value, tb):
184
+ traceback.print_exception(type, value, tb)
185
+ sys.stderr.flush()
186
+ sys.stdout.flush()
187
+ os._exit(1)
188
+
189
+ sys.excepthook = excepthook
190
+
191
+ # Have tracebacks end up on sys.stderr (gdb replaces sys.stderr
192
+ # with an object that calls gdb.write())
193
+ sys.stderr = sys.__stderr__
194
+
195
+ end
196
+ ''')
197
+
198
+ code = textwrap.dedent('''\
199
+ python
200
+
201
+ from Cython.Debugger.Tests import test_libcython_in_gdb
202
+ test_libcython_in_gdb.main(version=%r)
203
+
204
+ end
205
+ ''' % (sys.version_info[:2],))
206
+
207
+ self.gdb_command_file = cygdb.make_command_file(self.tempdir,
208
+ prefix_code)
209
+
210
+ with open(self.gdb_command_file, 'a') as f:
211
+ f.write(code)
212
+
213
+ args = ['gdb', '-batch', '-x', self.gdb_command_file, '-n', '--args',
214
+ sys.executable, '-c', 'import codefile']
215
+
216
+ paths = []
217
+ path = os.environ.get('PYTHONPATH')
218
+ if path:
219
+ paths.append(path)
220
+ paths.append(os.path.dirname(os.path.dirname(
221
+ os.path.abspath(Cython.__file__))))
222
+ env = dict(os.environ, PYTHONPATH=os.pathsep.join(paths))
223
+
224
+ self.p = subprocess.Popen(
225
+ args,
226
+ stdout=subprocess.PIPE,
227
+ stderr=subprocess.PIPE,
228
+ env=env)
229
+
230
+ def tearDown(self):
231
+ if not test_gdb():
232
+ return
233
+
234
+ try:
235
+ super().tearDown()
236
+ if self.p:
237
+ try: self.p.stdout.close()
238
+ except: pass
239
+ try: self.p.stderr.close()
240
+ except: pass
241
+ self.p.wait()
242
+ finally:
243
+ os.remove(self.gdb_command_file)
244
+
245
+
246
+ class TestAll(GdbDebuggerTestCase):
247
+
248
+ def test_all(self):
249
+ if not test_gdb():
250
+ return
251
+
252
+ out, err = self.p.communicate()
253
+ out = out.decode('UTF-8')
254
+ err = err.decode('UTF-8')
255
+
256
+ exit_status = self.p.returncode
257
+
258
+ if exit_status == 1:
259
+ sys.stderr.write(out)
260
+ sys.stderr.write(err)
261
+ elif exit_status >= 2:
262
+ border = '*' * 30
263
+ start = '%s v INSIDE GDB v %s' % (border, border)
264
+ stderr = '%s v STDERR v %s' % (border, border)
265
+ end = '%s ^ INSIDE GDB ^ %s' % (border, border)
266
+ errmsg = '\n%s\n%s%s\n%s%s' % (start, out, stderr, err, end)
267
+
268
+ sys.stderr.write(errmsg)
269
+
270
+ # FIXME: re-enable this to make the test fail on internal failures
271
+ #self.assertEqual(exit_status, 0)
272
+
273
+
274
+ if __name__ == '__main__':
275
+ unittest.main()
@@ -0,0 +1 @@
1
+ # empty file
@@ -0,0 +1,8 @@
1
+ void
2
+ some_c_function(void)
3
+ {
4
+ int a, b, c;
5
+
6
+ a = 1;
7
+ b = 2;
8
+ }
@@ -0,0 +1,49 @@
1
+ cdef extern from "stdio.h":
2
+ int puts(char *s)
3
+
4
+ cdef extern from "cfuncs.h":
5
+ void some_c_function()
6
+
7
+ import os
8
+
9
+ cdef int c_var = 12
10
+ python_var = 13
11
+
12
+ def spam(a=0):
13
+ cdef:
14
+ int b, c
15
+
16
+ b = c = d = 0
17
+
18
+ b = 1
19
+ c = 2
20
+ int(10)
21
+ puts("spam")
22
+ os.path.join("foo", "bar")
23
+ some_c_function()
24
+
25
+ cpdef eggs():
26
+ pass
27
+
28
+ cdef ham():
29
+ pass
30
+
31
+ cdef class SomeClass(object):
32
+ def spam(self):
33
+ pass
34
+
35
+ def outer():
36
+ cdef object a = "an object"
37
+ def inner():
38
+ b = 2
39
+ # access closed over variables
40
+ print(a, b)
41
+ return inner
42
+
43
+ outer()()
44
+
45
+ spam()
46
+ print("bye!")
47
+
48
+ def use_ham():
49
+ ham()