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.
- Cython/Build/BuildExecutable.py +169 -0
- Cython/Build/Cache.py +199 -0
- Cython/Build/Cythonize.py +350 -0
- Cython/Build/Dependencies.py +1314 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +94 -0
- Cython/Build/Tests/TestCyCache.py +194 -0
- Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
- Cython/Build/Tests/TestDependencies.py +133 -0
- Cython/Build/Tests/TestInline.py +177 -0
- Cython/Build/Tests/TestIpythonMagic.py +287 -0
- Cython/Build/Tests/TestRecythonize.py +212 -0
- Cython/Build/Tests/TestStripLiterals.py +155 -0
- Cython/Build/Tests/__init__.py +1 -0
- Cython/Build/__init__.py +11 -0
- Cython/CodeWriter.py +815 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +328 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +984 -0
- Cython/Compiler/CmdLine.py +263 -0
- Cython/Compiler/Code.pxd +149 -0
- Cython/Compiler/Code.py +3746 -0
- Cython/Compiler/Code.pyd +0 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +191 -0
- Cython/Compiler/Dataclass.py +864 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +297 -0
- Cython/Compiler/ExprNodes.py +15562 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1451 -0
- Cython/Compiler/FlowControl.pyd +0 -0
- Cython/Compiler/FusedNode.py +971 -0
- Cython/Compiler/FusedNode.pyd +0 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +421 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/LineTable.pyd +0 -0
- Cython/Compiler/Main.py +857 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +905 -0
- Cython/Compiler/ModuleNode.py +4235 -0
- Cython/Compiler/Naming.py +363 -0
- Cython/Compiler/Nodes.py +10831 -0
- Cython/Compiler/Optimize.py +5288 -0
- Cython/Compiler/Options.py +843 -0
- Cython/Compiler/ParseTreeTransforms.pxd +78 -0
- Cython/Compiler/ParseTreeTransforms.py +4638 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4775 -0
- Cython/Compiler/Parsing.pyd +0 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5870 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +48 -0
- Cython/Compiler/Scanning.py +701 -0
- Cython/Compiler/Scanning.pyd +0 -0
- Cython/Compiler/StringEncoding.py +298 -0
- Cython/Compiler/Symtab.py +3073 -0
- Cython/Compiler/Tests/TestBuffer.py +105 -0
- Cython/Compiler/Tests/TestBuiltin.py +72 -0
- Cython/Compiler/Tests/TestCmdLine.py +586 -0
- Cython/Compiler/Tests/TestCode.py +144 -0
- Cython/Compiler/Tests/TestFlowControl.py +65 -0
- Cython/Compiler/Tests/TestGrammar.py +202 -0
- Cython/Compiler/Tests/TestMemView.py +71 -0
- Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
- Cython/Compiler/Tests/TestScanning.py +134 -0
- Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
- Cython/Compiler/Tests/TestStringEncoding.py +21 -0
- Cython/Compiler/Tests/TestTreeFragment.py +63 -0
- Cython/Compiler/Tests/TestTreePath.py +103 -0
- Cython/Compiler/Tests/TestTypes.py +75 -0
- Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
- Cython/Compiler/Tests/TestVisitor.py +61 -0
- Cython/Compiler/Tests/Utils.py +36 -0
- Cython/Compiler/Tests/__init__.py +1 -0
- Cython/Compiler/TreeFragment.py +278 -0
- Cython/Compiler/TreePath.py +303 -0
- Cython/Compiler/TypeInference.py +591 -0
- Cython/Compiler/TypeSlots.py +1174 -0
- Cython/Compiler/UFuncs.py +311 -0
- Cython/Compiler/UtilNodes.py +389 -0
- Cython/Compiler/UtilityCode.py +344 -0
- Cython/Compiler/Version.py +8 -0
- Cython/Compiler/Visitor.pxd +53 -0
- Cython/Compiler/Visitor.py +861 -0
- Cython/Compiler/Visitor.pyd +0 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +177 -0
- Cython/Debugger/DebugWriter.py +82 -0
- Cython/Debugger/Tests/TestLibCython.py +275 -0
- Cython/Debugger/Tests/__init__.py +1 -0
- Cython/Debugger/Tests/cfuncs.c +8 -0
- Cython/Debugger/Tests/codefile +49 -0
- Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
- Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
- Cython/Debugger/__init__.py +1 -0
- Cython/Debugger/libcython.py +1548 -0
- Cython/Debugger/libpython.py +2821 -0
- Cython/Debugging.py +20 -0
- Cython/Distutils/__init__.py +2 -0
- Cython/Distutils/build_ext.py +139 -0
- Cython/Distutils/extension.py +96 -0
- Cython/Distutils/old_build_ext.py +351 -0
- Cython/Includes/cpython/__init__.pxd +173 -0
- Cython/Includes/cpython/array.pxd +178 -0
- Cython/Includes/cpython/bool.pxd +37 -0
- Cython/Includes/cpython/buffer.pxd +112 -0
- Cython/Includes/cpython/bytearray.pxd +33 -0
- Cython/Includes/cpython/bytes.pxd +200 -0
- Cython/Includes/cpython/cellobject.pxd +35 -0
- Cython/Includes/cpython/ceval.pxd +8 -0
- Cython/Includes/cpython/codecs.pxd +121 -0
- Cython/Includes/cpython/complex.pxd +60 -0
- Cython/Includes/cpython/contextvars.pxd +145 -0
- Cython/Includes/cpython/conversion.pxd +36 -0
- Cython/Includes/cpython/datetime.pxd +395 -0
- Cython/Includes/cpython/descr.pxd +26 -0
- Cython/Includes/cpython/dict.pxd +187 -0
- Cython/Includes/cpython/exc.pxd +263 -0
- Cython/Includes/cpython/fileobject.pxd +57 -0
- Cython/Includes/cpython/float.pxd +47 -0
- Cython/Includes/cpython/function.pxd +65 -0
- Cython/Includes/cpython/genobject.pxd +25 -0
- Cython/Includes/cpython/getargs.pxd +12 -0
- Cython/Includes/cpython/instance.pxd +25 -0
- Cython/Includes/cpython/iterator.pxd +36 -0
- Cython/Includes/cpython/iterobject.pxd +24 -0
- Cython/Includes/cpython/list.pxd +92 -0
- Cython/Includes/cpython/long.pxd +149 -0
- Cython/Includes/cpython/longintrepr.pxd +14 -0
- Cython/Includes/cpython/mapping.pxd +63 -0
- Cython/Includes/cpython/marshal.pxd +66 -0
- Cython/Includes/cpython/mem.pxd +120 -0
- Cython/Includes/cpython/memoryview.pxd +50 -0
- Cython/Includes/cpython/method.pxd +49 -0
- Cython/Includes/cpython/module.pxd +208 -0
- Cython/Includes/cpython/number.pxd +258 -0
- Cython/Includes/cpython/object.pxd +433 -0
- Cython/Includes/cpython/pycapsule.pxd +143 -0
- Cython/Includes/cpython/pylifecycle.pxd +68 -0
- Cython/Includes/cpython/pyport.pxd +8 -0
- Cython/Includes/cpython/pystate.pxd +95 -0
- Cython/Includes/cpython/pythread.pxd +53 -0
- Cython/Includes/cpython/ref.pxd +141 -0
- Cython/Includes/cpython/sequence.pxd +134 -0
- Cython/Includes/cpython/set.pxd +119 -0
- Cython/Includes/cpython/slice.pxd +70 -0
- Cython/Includes/cpython/time.pxd +129 -0
- Cython/Includes/cpython/tuple.pxd +72 -0
- Cython/Includes/cpython/type.pxd +53 -0
- Cython/Includes/cpython/unicode.pxd +639 -0
- Cython/Includes/cpython/version.pxd +32 -0
- Cython/Includes/cpython/weakref.pxd +78 -0
- Cython/Includes/libc/__init__.pxd +1 -0
- Cython/Includes/libc/complex.pxd +35 -0
- Cython/Includes/libc/errno.pxd +127 -0
- Cython/Includes/libc/float.pxd +43 -0
- Cython/Includes/libc/limits.pxd +28 -0
- Cython/Includes/libc/locale.pxd +46 -0
- Cython/Includes/libc/math.pxd +209 -0
- Cython/Includes/libc/setjmp.pxd +10 -0
- Cython/Includes/libc/signal.pxd +64 -0
- Cython/Includes/libc/stddef.pxd +9 -0
- Cython/Includes/libc/stdint.pxd +105 -0
- Cython/Includes/libc/stdio.pxd +80 -0
- Cython/Includes/libc/stdlib.pxd +72 -0
- Cython/Includes/libc/string.pxd +50 -0
- Cython/Includes/libc/threads.pxd +234 -0
- Cython/Includes/libc/time.pxd +52 -0
- Cython/Includes/libcpp/__init__.pxd +4 -0
- Cython/Includes/libcpp/algorithm.pxd +320 -0
- Cython/Includes/libcpp/any.pxd +16 -0
- Cython/Includes/libcpp/atomic.pxd +59 -0
- Cython/Includes/libcpp/barrier.pxd +22 -0
- Cython/Includes/libcpp/bit.pxd +29 -0
- Cython/Includes/libcpp/cast.pxd +12 -0
- Cython/Includes/libcpp/cmath.pxd +518 -0
- Cython/Includes/libcpp/complex.pxd +106 -0
- Cython/Includes/libcpp/condition_variable.pxd +322 -0
- Cython/Includes/libcpp/deque.pxd +165 -0
- Cython/Includes/libcpp/exception.pxd +86 -0
- Cython/Includes/libcpp/execution.pxd +15 -0
- Cython/Includes/libcpp/forward_list.pxd +63 -0
- Cython/Includes/libcpp/functional.pxd +26 -0
- Cython/Includes/libcpp/future.pxd +103 -0
- Cython/Includes/libcpp/iterator.pxd +34 -0
- Cython/Includes/libcpp/latch.pxd +17 -0
- Cython/Includes/libcpp/limits.pxd +61 -0
- Cython/Includes/libcpp/list.pxd +117 -0
- Cython/Includes/libcpp/map.pxd +252 -0
- Cython/Includes/libcpp/memory.pxd +115 -0
- Cython/Includes/libcpp/mutex.pxd +387 -0
- Cython/Includes/libcpp/numbers.pxd +15 -0
- Cython/Includes/libcpp/numeric.pxd +131 -0
- Cython/Includes/libcpp/optional.pxd +34 -0
- Cython/Includes/libcpp/pair.pxd +1 -0
- Cython/Includes/libcpp/queue.pxd +25 -0
- Cython/Includes/libcpp/random.pxd +166 -0
- Cython/Includes/libcpp/semaphore.pxd +43 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +96 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +117 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +183 -0
- Cython/Includes/libcpp/typeindex.pxd +15 -0
- Cython/Includes/libcpp/typeinfo.pxd +10 -0
- Cython/Includes/libcpp/unordered_map.pxd +193 -0
- Cython/Includes/libcpp/unordered_set.pxd +152 -0
- Cython/Includes/libcpp/utility.pxd +30 -0
- Cython/Includes/libcpp/vector.pxd +186 -0
- Cython/Includes/numpy/math.pxd +150 -0
- Cython/Includes/openmp.pxd +50 -0
- Cython/Includes/posix/__init__.pxd +1 -0
- Cython/Includes/posix/dlfcn.pxd +14 -0
- Cython/Includes/posix/fcntl.pxd +86 -0
- Cython/Includes/posix/ioctl.pxd +4 -0
- Cython/Includes/posix/mman.pxd +101 -0
- Cython/Includes/posix/resource.pxd +57 -0
- Cython/Includes/posix/select.pxd +21 -0
- Cython/Includes/posix/signal.pxd +73 -0
- Cython/Includes/posix/stat.pxd +98 -0
- Cython/Includes/posix/stdio.pxd +37 -0
- Cython/Includes/posix/stdlib.pxd +29 -0
- Cython/Includes/posix/strings.pxd +9 -0
- Cython/Includes/posix/time.pxd +71 -0
- Cython/Includes/posix/types.pxd +30 -0
- Cython/Includes/posix/uio.pxd +26 -0
- Cython/Includes/posix/unistd.pxd +271 -0
- Cython/Includes/posix/wait.pxd +38 -0
- Cython/Plex/Actions.pxd +24 -0
- Cython/Plex/Actions.py +119 -0
- Cython/Plex/Actions.pyd +0 -0
- Cython/Plex/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -0
- Cython/Plex/DFA.pyd +0 -0
- Cython/Plex/Errors.py +48 -0
- Cython/Plex/Lexicons.py +178 -0
- Cython/Plex/Machines.pxd +36 -0
- Cython/Plex/Machines.py +238 -0
- Cython/Plex/Machines.pyd +0 -0
- Cython/Plex/Regexps.py +535 -0
- Cython/Plex/Scanners.pxd +45 -0
- Cython/Plex/Scanners.py +328 -0
- Cython/Plex/Scanners.pyd +0 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/Transitions.pyd +0 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyd +0 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/StringIOTree.pyd +0 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/Tempita/_tempita.pyd +0 -0
- Cython/TestUtils.py +422 -0
- Cython/Tests/TestCodeWriter.py +128 -0
- Cython/Tests/TestCythonUtils.py +202 -0
- Cython/Tests/TestJediTyper.py +223 -0
- Cython/Tests/TestShadow.py +114 -0
- Cython/Tests/TestStringIOTree.py +67 -0
- Cython/Tests/TestTestUtils.py +90 -0
- Cython/Tests/__init__.py +1 -0
- Cython/Tests/xmlrunner.py +390 -0
- Cython/Utility/AsyncGen.c +1031 -0
- Cython/Utility/Buffer.c +865 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +810 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +226 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2300 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +282 -0
- Cython/Utility/CppSupport.cpp +151 -0
- Cython/Utility/CythonFunction.c +1832 -0
- Cython/Utility/Dataclasses.c +101 -0
- Cython/Utility/Embed.c +121 -0
- Cython/Utility/Exceptions.c +1016 -0
- Cython/Utility/ExtensionTypes.c +996 -0
- Cython/Utility/FunctionArguments.c +1043 -0
- Cython/Utility/FusedFunction.pyx +44 -0
- Cython/Utility/ImportExport.c +907 -0
- Cython/Utility/MemoryView.pxd +188 -0
- Cython/Utility/MemoryView.pyx +1482 -0
- Cython/Utility/MemoryView_C.c +927 -0
- Cython/Utility/ModuleSetupCode.c +3203 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3273 -0
- Cython/Utility/Optimize.c +1603 -0
- Cython/Utility/Overflow.c +384 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +732 -0
- Cython/Utility/StringTools.c +1379 -0
- Cython/Utility/Synchronization.c +399 -0
- Cython/Utility/TString.c +356 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1385 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +167 -0
- Cython/Utils.py +687 -0
- Cython/Utils.pyd +0 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.2.0.dist-info/METADATA +85 -0
- cython-3.2.0.dist-info/RECORD +333 -0
- cython-3.2.0.dist-info/WHEEL +5 -0
- cython-3.2.0.dist-info/entry_points.txt +4 -0
- cython-3.2.0.dist-info/top_level.txt +3 -0
- cython.py +29 -0
- pyximport/__init__.py +4 -0
- pyximport/pyxbuild.py +160 -0
- 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)
|