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,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,280 @@
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
16
+ #import Cython.Distutils.extension
17
+ import Cython.Distutils.old_build_ext as build_ext
18
+ from Cython.Debugger import Cygdb as cygdb
19
+ from ...TestUtils import TimedTest
20
+
21
+ root = os.path.dirname(os.path.abspath(__file__))
22
+ codefile = os.path.join(root, 'codefile')
23
+ cfuncs_file = os.path.join(root, 'cfuncs.c')
24
+
25
+ with open(codefile) as f:
26
+ source_to_lineno = {line.strip(): i for i, line in enumerate(f, 1)}
27
+
28
+
29
+ have_gdb = None
30
+ def test_gdb():
31
+ global have_gdb
32
+ if have_gdb is not None:
33
+ return have_gdb
34
+
35
+ have_gdb = False
36
+ try:
37
+ p = subprocess.Popen(['gdb', '-nx', '--version'], stdout=subprocess.PIPE)
38
+ except OSError:
39
+ # gdb not found
40
+ gdb_version = None
41
+ else:
42
+ stdout, _ = p.communicate()
43
+ # Based on Lib/test/test_gdb.py
44
+ regex = r"GNU gdb [^\d]*(\d+)\.(\d+)"
45
+ gdb_version = re.match(regex, stdout.decode('ascii', 'ignore'))
46
+
47
+ if gdb_version:
48
+ gdb_version_number = list(map(int, gdb_version.groups()))
49
+ if gdb_version_number >= [7, 2]:
50
+ have_gdb = True
51
+ with tempfile.NamedTemporaryFile(mode='w+') as python_version_script:
52
+ python_version_script.write(
53
+ 'python import sys; print("%s %s" % sys.version_info[:2])')
54
+ python_version_script.flush()
55
+ p = subprocess.Popen(['gdb', '-batch', '-x', python_version_script.name],
56
+ stdout=subprocess.PIPE)
57
+ stdout, _ = p.communicate()
58
+ try:
59
+ internal_python_version = list(map(int, stdout.decode('ascii', 'ignore').split()))
60
+ if internal_python_version < [2, 7]:
61
+ have_gdb = False
62
+ except ValueError:
63
+ have_gdb = False
64
+
65
+ if not have_gdb:
66
+ warnings.warn('Skipping gdb tests, need gdb >= 7.2 with Python >= 2.7')
67
+
68
+ return have_gdb
69
+
70
+
71
+ class DebuggerTestCase(TimedTest):
72
+
73
+ def setUp(self):
74
+ """
75
+ Run gdb and have cygdb import the debug information from the code
76
+ defined in TestParseTreeTransforms's setUp method
77
+ """
78
+ if not test_gdb():
79
+ return
80
+
81
+ self.tempdir = tempfile.mkdtemp()
82
+ self.destfile = os.path.join(self.tempdir, 'codefile.pyx')
83
+ self.debug_dest = os.path.join(self.tempdir,
84
+ 'cython_debug',
85
+ 'cython_debug_info_codefile')
86
+ self.cfuncs_destfile = os.path.join(self.tempdir, 'cfuncs')
87
+
88
+ self.cwd = os.getcwd()
89
+ try:
90
+ os.chdir(self.tempdir)
91
+
92
+ shutil.copy(codefile, self.destfile)
93
+ shutil.copy(cfuncs_file, self.cfuncs_destfile + '.c')
94
+ shutil.copy(cfuncs_file.replace('.c', '.h'),
95
+ self.cfuncs_destfile + '.h')
96
+
97
+ compiler = ccompiler.new_compiler()
98
+ compiler.compile(['cfuncs.c'], debug=True, extra_postargs=['-fPIC'])
99
+
100
+ opts = dict(
101
+ test_directory=self.tempdir,
102
+ module='codefile',
103
+ module_path=self.destfile,
104
+ )
105
+
106
+ optimization_disabler = build_ext.Optimization()
107
+
108
+ cython_compile_testcase = runtests.CythonCompileTestCase(
109
+ workdir=self.tempdir,
110
+ # we clean up everything (not only compiled files)
111
+ cleanup_workdir=False,
112
+ tags=runtests.parse_tags(codefile),
113
+ **opts
114
+ )
115
+
116
+
117
+ new_stderr = open(os.devnull, 'w')
118
+
119
+ stderr = sys.stderr
120
+ sys.stderr = new_stderr
121
+
122
+ optimization_disabler.disable_optimization()
123
+ try:
124
+ cython_compile_testcase.run_cython(
125
+ targetdir=self.tempdir,
126
+ incdir=None,
127
+ annotate=False,
128
+ extra_compile_options={
129
+ 'gdb_debug':True,
130
+ 'output_dir':self.tempdir,
131
+ },
132
+ **opts
133
+ )
134
+
135
+ cython_compile_testcase.run_distutils(
136
+ test_directory=opts['test_directory'],
137
+ module=opts['module'],
138
+ workdir=opts['test_directory'],
139
+ incdir=None,
140
+ extra_extension_args={'extra_objects':['cfuncs.o']},
141
+ )
142
+ finally:
143
+ optimization_disabler.restore_state()
144
+ sys.stderr = stderr
145
+ new_stderr.close()
146
+
147
+ # ext = Cython.Distutils.extension.Extension(
148
+ # 'codefile',
149
+ # ['codefile.pyx'],
150
+ # cython_gdb=True,
151
+ # extra_objects=['cfuncs.o'])
152
+ #
153
+ # distutils.core.setup(
154
+ # script_args=['build_ext', '--inplace'],
155
+ # ext_modules=[ext],
156
+ # cmdclass=dict(build_ext=Cython.Distutils.build_ext)
157
+ # )
158
+
159
+ except:
160
+ os.chdir(self.cwd)
161
+ raise
162
+
163
+ super().setUp()
164
+
165
+ def tearDown(self):
166
+ super().tearDown()
167
+ if not test_gdb():
168
+ return
169
+ os.chdir(self.cwd)
170
+ shutil.rmtree(self.tempdir)
171
+
172
+
173
+ class GdbDebuggerTestCase(DebuggerTestCase):
174
+
175
+ def setUp(self):
176
+ if not test_gdb():
177
+ return
178
+
179
+ super().setUp()
180
+
181
+ prefix_code = textwrap.dedent('''\
182
+ python
183
+
184
+ import os
185
+ import sys
186
+ import traceback
187
+
188
+ def excepthook(type, value, tb):
189
+ traceback.print_exception(type, value, tb)
190
+ sys.stderr.flush()
191
+ sys.stdout.flush()
192
+ os._exit(1)
193
+
194
+ sys.excepthook = excepthook
195
+
196
+ # Have tracebacks end up on sys.stderr (gdb replaces sys.stderr
197
+ # with an object that calls gdb.write())
198
+ sys.stderr = sys.__stderr__
199
+
200
+ end
201
+ ''')
202
+
203
+ code = textwrap.dedent('''\
204
+ python
205
+
206
+ from Cython.Debugger.Tests import test_libcython_in_gdb
207
+ test_libcython_in_gdb.main(version=%r)
208
+
209
+ end
210
+ ''' % (sys.version_info[:2],))
211
+
212
+ self.gdb_command_file = cygdb.make_command_file(self.tempdir,
213
+ prefix_code)
214
+
215
+ with open(self.gdb_command_file, 'a') as f:
216
+ f.write(code)
217
+
218
+ args = ['gdb', '-batch', '-x', self.gdb_command_file, '-n', '--args',
219
+ sys.executable, '-c', 'import codefile']
220
+
221
+ paths = []
222
+ path = os.environ.get('PYTHONPATH')
223
+ if path:
224
+ paths.append(path)
225
+ paths.append(os.path.dirname(os.path.dirname(
226
+ os.path.abspath(Cython.__file__))))
227
+ env = dict(os.environ, PYTHONPATH=os.pathsep.join(paths))
228
+
229
+ self.p = subprocess.Popen(
230
+ args,
231
+ stdout=subprocess.PIPE,
232
+ stderr=subprocess.PIPE,
233
+ env=env)
234
+
235
+ def tearDown(self):
236
+ if not test_gdb():
237
+ return
238
+
239
+ try:
240
+ super().tearDown()
241
+ if self.p:
242
+ try: self.p.stdout.close()
243
+ except: pass
244
+ try: self.p.stderr.close()
245
+ except: pass
246
+ self.p.wait()
247
+ finally:
248
+ os.remove(self.gdb_command_file)
249
+
250
+
251
+ class TestAll(GdbDebuggerTestCase):
252
+
253
+ def test_all(self):
254
+ if not test_gdb():
255
+ return
256
+
257
+ out, err = self.p.communicate()
258
+ out = out.decode('UTF-8')
259
+ err = err.decode('UTF-8')
260
+
261
+ exit_status = self.p.returncode
262
+
263
+ if exit_status == 1:
264
+ sys.stderr.write(out)
265
+ sys.stderr.write(err)
266
+ elif exit_status >= 2:
267
+ border = '*' * 30
268
+ start = '%s v INSIDE GDB v %s' % (border, border)
269
+ stderr = '%s v STDERR v %s' % (border, border)
270
+ end = '%s ^ INSIDE GDB ^ %s' % (border, border)
271
+ errmsg = '\n%s\n%s%s\n%s%s' % (start, out, stderr, err, end)
272
+
273
+ sys.stderr.write(errmsg)
274
+
275
+ # FIXME: re-enable this to make the test fail on internal failures
276
+ #self.assertEqual(exit_status, 0)
277
+
278
+
279
+ if __name__ == '__main__':
280
+ 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()