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,237 @@
1
+ # cython: language_level=3, auto_pickle=False, freethreading_compatible=True
2
+
3
+ from cpython.ref cimport PyObject, Py_INCREF, Py_CLEAR, Py_XDECREF, Py_XINCREF
4
+ from cpython.exc cimport PyErr_Fetch, PyErr_Restore
5
+ from cpython.pystate cimport PyThreadState_Get
6
+
7
+ cimport cython
8
+
9
+ cdef extern from *:
10
+ """
11
+ #if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
12
+ #define __Pyx_refnanny_mutex PyMutex
13
+ static CYTHON_INLINE void __Pyx_refnanny_lock_acquire(PyMutex *lock) {
14
+ PyMutex_Lock(lock);
15
+ }
16
+
17
+ static CYTHON_INLINE void __Pyx_refnanny_lock_release(PyMutex *lock) {
18
+ PyMutex_Unlock(lock);
19
+ }
20
+ #else
21
+ #define __Pyx_refnanny_mutex void*
22
+ #define __Pyx_refnanny_lock_acquire(lock)
23
+ #define __Pyx_refnanny_lock_release(lock)
24
+ #endif
25
+ """
26
+ ctypedef void *__Pyx_refnanny_mutex
27
+ void __Pyx_refnanny_lock_acquire(__Pyx_refnanny_mutex *lock)
28
+ void __Pyx_refnanny_lock_release(__Pyx_refnanny_mutex *lock)
29
+
30
+ loglevel = 0
31
+ reflog = []
32
+
33
+ cdef int log(int level, action, obj, lineno) except -1:
34
+ if (<int> loglevel) >= level:
35
+ if reflog is None:
36
+ # can happen during finalisation
37
+ return 0
38
+ reflog.append((lineno, action, id(obj)))
39
+ return 0
40
+
41
+ LOG_NONE, LOG_ALL = range(2)
42
+ cdef int _LOG_NONE = LOG_NONE
43
+ cdef int _LOG_ALL = LOG_ALL
44
+
45
+ cdef object NO_REFS = (0, None)
46
+
47
+
48
+ @cython.final
49
+ cdef class Context(object):
50
+ cdef readonly object name, filename
51
+ cdef readonly dict refs
52
+ cdef readonly list errors
53
+ cdef readonly Py_ssize_t start
54
+ cdef __Pyx_refnanny_mutex lock
55
+
56
+ def __cinit__(self, name, line=0, filename=None):
57
+ self.name = name
58
+ self.start = line
59
+ self.filename = filename
60
+ self.refs = {} # id -> (count, [lineno])
61
+ self.errors = []
62
+
63
+ cdef void acquire_lock(self) noexcept:
64
+ __Pyx_refnanny_lock_acquire(&self.lock)
65
+
66
+ cdef void release_lock(self) noexcept:
67
+ __Pyx_refnanny_lock_release(&self.lock)
68
+
69
+ cdef int regref(self, obj, Py_ssize_t lineno, bint is_null) except -1:
70
+ log(_LOG_ALL, u'regref', u"<NULL>" if is_null else obj, lineno)
71
+ if is_null:
72
+ self.errors.append(f"NULL argument on line {lineno}")
73
+ return 0
74
+ id_ = id(obj)
75
+ count, linenumbers = self.refs.get(id_, NO_REFS)
76
+ if linenumbers is None:
77
+ linenumbers = []
78
+ self.refs[id_] = (count + 1, linenumbers)
79
+ linenumbers.append(lineno)
80
+ return 0
81
+
82
+ cdef bint delref(self, obj, Py_ssize_t lineno, bint is_null) except -1:
83
+ # returns whether it is ok to do the decref operation
84
+ log(_LOG_ALL, u'delref', u"<NULL>" if is_null else obj, lineno)
85
+ if is_null:
86
+ self.errors.append(f"NULL argument on line {lineno}")
87
+ return False
88
+ id_ = id(obj)
89
+ count, linenumbers = self.refs.get(id_, NO_REFS)
90
+ if linenumbers is None:
91
+ linenumbers = []
92
+ if count == 0:
93
+ self.errors.append(f"Too many decrefs on line {lineno}, reference acquired on lines {linenumbers!r}")
94
+ return False
95
+ if count == 1:
96
+ del self.refs[id_]
97
+ else:
98
+ self.refs[id_] = (count - 1, linenumbers)
99
+ return True
100
+
101
+ cdef end(self):
102
+ if self.refs:
103
+ msg = u"References leaked:"
104
+ for count, linenos in self.refs.values():
105
+ msg += f"\n ({count}) acquired on lines: {u', '.join([f'{x}' for x in linenos])}"
106
+ self.errors.append(msg)
107
+ return u"\n".join([f'REFNANNY: {error}' for error in self.errors]) if self.errors else None
108
+
109
+
110
+ cdef void report_unraisable(filename, Py_ssize_t lineno, object e=None) noexcept:
111
+ try:
112
+ if e is None:
113
+ import sys
114
+ e = sys.exc_info()[1]
115
+ print(f"refnanny raised an exception from {filename}:{lineno}: {e}")
116
+ finally:
117
+ return # We absolutely cannot exit with an exception
118
+
119
+
120
+ # All Python operations must happen after any existing
121
+ # exception has been fetched, in case we are called from
122
+ # exception-handling code.
123
+
124
+ cdef PyObject* SetupContext(char* funcname, Py_ssize_t lineno, char* filename) except NULL:
125
+ if Context is None:
126
+ # Context may be None during finalize phase.
127
+ # In that case, we don't want to be doing anything fancy
128
+ # like caching and resetting exceptions.
129
+ return NULL
130
+ cdef (PyObject*) type = NULL, value = NULL, tb = NULL, result = NULL
131
+ PyThreadState_Get() # Check that we hold the GIL
132
+ PyErr_Fetch(&type, &value, &tb)
133
+ try:
134
+ ctx = Context.__new__(Context, funcname, lineno, filename)
135
+ Py_INCREF(ctx)
136
+ result = <PyObject*>ctx
137
+ except Exception, e:
138
+ report_unraisable(filename, lineno, e)
139
+ PyErr_Restore(type, value, tb)
140
+ return result
141
+
142
+ cdef void GOTREF(PyObject* _ctx, PyObject* p_obj, Py_ssize_t lineno):
143
+ if _ctx == NULL: return
144
+ cdef (PyObject*) type = NULL, value = NULL, tb = NULL
145
+ cdef Context ctx = <Context> _ctx
146
+ ctx.acquire_lock()
147
+ PyErr_Fetch(&type, &value, &tb)
148
+ try:
149
+ ctx.regref(
150
+ <object>p_obj if p_obj is not NULL else None,
151
+ lineno,
152
+ is_null=p_obj is NULL,
153
+ )
154
+ except:
155
+ report_unraisable(ctx.filename, lineno=ctx.start)
156
+ finally:
157
+ PyErr_Restore(type, value, tb)
158
+ ctx.release_lock()
159
+ return # swallow any exceptions
160
+
161
+ cdef bint GIVEREF_and_report(PyObject* _ctx, PyObject* p_obj, Py_ssize_t lineno):
162
+ if _ctx == NULL: return 1
163
+ cdef (PyObject*) type = NULL, value = NULL, tb = NULL
164
+ cdef bint decref_ok = False
165
+ cdef Context ctx = <Context> _ctx
166
+ ctx.acquire_lock()
167
+ PyErr_Fetch(&type, &value, &tb)
168
+ try:
169
+ decref_ok = ctx.delref(
170
+ <object>p_obj if p_obj is not NULL else None,
171
+ lineno,
172
+ is_null=p_obj is NULL,
173
+ )
174
+ except:
175
+ report_unraisable(ctx.filename, lineno=ctx.start)
176
+ finally:
177
+ PyErr_Restore(type, value, tb)
178
+ ctx.release_lock()
179
+ return decref_ok # swallow any exceptions
180
+
181
+ cdef void GIVEREF(PyObject* ctx, PyObject* p_obj, Py_ssize_t lineno):
182
+ GIVEREF_and_report(ctx, p_obj, lineno)
183
+
184
+ cdef void INCREF(PyObject* ctx, PyObject* obj, Py_ssize_t lineno):
185
+ Py_XINCREF(obj)
186
+ PyThreadState_Get() # Check that we hold the GIL
187
+ GOTREF(ctx, obj, lineno)
188
+
189
+ cdef void DECREF(PyObject* ctx, PyObject* obj, Py_ssize_t lineno):
190
+ if GIVEREF_and_report(ctx, obj, lineno):
191
+ Py_XDECREF(obj)
192
+ PyThreadState_Get() # Check that we hold the GIL
193
+
194
+ cdef void FinishContext(PyObject** ctx):
195
+ if ctx == NULL or ctx[0] == NULL: return
196
+ cdef (PyObject*) type = NULL, value = NULL, tb = NULL
197
+ cdef object errors = None
198
+ cdef Context context
199
+ PyThreadState_Get() # Check that we hold the GIL
200
+ PyErr_Fetch(&type, &value, &tb)
201
+ try:
202
+ context = <Context>ctx[0]
203
+ errors = context.end()
204
+ if errors:
205
+ print(f"{context.filename.decode('latin1')}: {context.name.decode('latin1')}()")
206
+ print(errors)
207
+ context = None
208
+ except:
209
+ report_unraisable(
210
+ context.filename if context is not None else None,
211
+ lineno=context.start if context is not None else 0,
212
+ )
213
+ finally:
214
+ Py_CLEAR(ctx[0])
215
+ PyErr_Restore(type, value, tb)
216
+ return # swallow any exceptions
217
+
218
+ ctypedef struct RefNannyAPIStruct:
219
+ void (*INCREF)(PyObject*, PyObject*, Py_ssize_t)
220
+ void (*DECREF)(PyObject*, PyObject*, Py_ssize_t)
221
+ void (*GOTREF)(PyObject*, PyObject*, Py_ssize_t)
222
+ void (*GIVEREF)(PyObject*, PyObject*, Py_ssize_t)
223
+ PyObject* (*SetupContext)(char*, Py_ssize_t, char*) except NULL
224
+ void (*FinishContext)(PyObject**)
225
+
226
+ cdef RefNannyAPIStruct api
227
+ api.INCREF = INCREF
228
+ api.DECREF = DECREF
229
+ api.GOTREF = GOTREF
230
+ api.GIVEREF = GIVEREF
231
+ api.SetupContext = SetupContext
232
+ api.FinishContext = FinishContext
233
+
234
+ cdef extern from "Python.h":
235
+ object PyLong_FromVoidPtr(void*)
236
+
237
+ RefNannyAPI = PyLong_FromVoidPtr(<void*>&api)