Cython 3.1.0__py3-none-any.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 +323 -0
- Cython/Build/Dependencies.py +1306 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +76 -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 +8 -0
- Cython/CodeWriter.py +811 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +326 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +934 -0
- Cython/Compiler/CmdLine.py +259 -0
- Cython/Compiler/Code.pxd +148 -0
- Cython/Compiler/Code.py +3375 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +187 -0
- Cython/Compiler/Dataclass.py +868 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +295 -0
- Cython/Compiler/ExprNodes.py +15267 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1455 -0
- Cython/Compiler/FusedNode.py +1002 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +340 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/Main.py +853 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +922 -0
- Cython/Compiler/ModuleNode.py +4024 -0
- Cython/Compiler/Naming.py +374 -0
- Cython/Compiler/Nodes.py +10826 -0
- Cython/Compiler/Optimize.py +5256 -0
- Cython/Compiler/Options.py +835 -0
- Cython/Compiler/ParseTreeTransforms.pxd +77 -0
- Cython/Compiler/ParseTreeTransforms.py +4509 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4789 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5762 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +40 -0
- Cython/Compiler/Scanning.py +577 -0
- Cython/Compiler/StringEncoding.py +347 -0
- Cython/Compiler/Symtab.py +3080 -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 +86 -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 +33 -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 +584 -0
- Cython/Compiler/TypeSlots.py +1181 -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/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +175 -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 +174 -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 +67 -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 +84 -0
- Cython/Includes/libc/time.pxd +51 -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/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 +130 -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 +44 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +72 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +105 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +181 -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/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/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -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/Regexps.py +539 -0
- Cython/Plex/Scanners.pxd +47 -0
- Cython/Plex/Scanners.py +360 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/TestUtils.py +410 -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 +1002 -0
- Cython/Utility/Buffer.c +875 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +776 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +118 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2206 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +279 -0
- Cython/Utility/CppSupport.cpp +143 -0
- Cython/Utility/CythonFunction.c +1794 -0
- Cython/Utility/Dataclasses.c +185 -0
- Cython/Utility/Dataclasses.py +112 -0
- Cython/Utility/Embed.c +125 -0
- Cython/Utility/Exceptions.c +1012 -0
- Cython/Utility/ExtensionTypes.c +809 -0
- Cython/Utility/FunctionArguments.c +965 -0
- Cython/Utility/ImportExport.c +987 -0
- Cython/Utility/Lock.c +136 -0
- Cython/Utility/MemoryView.pxd +187 -0
- Cython/Utility/MemoryView.pyx +1481 -0
- Cython/Utility/MemoryView_C.c +1046 -0
- Cython/Utility/ModuleSetupCode.c +3059 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3342 -0
- Cython/Utility/Optimize.c +1589 -0
- Cython/Utility/Overflow.c +404 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +709 -0
- Cython/Utility/StringTools.c +1259 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1284 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +148 -0
- Cython/Utils.py +687 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.1.0.dist-info/COPYING.txt +19 -0
- cython-3.1.0.dist-info/LICENSE.txt +176 -0
- cython-3.1.0.dist-info/METADATA +636 -0
- cython-3.1.0.dist-info/RECORD +316 -0
- cython-3.1.0.dist-info/WHEEL +5 -0
- cython-3.1.0.dist-info/entry_points.txt +4 -0
- cython-3.1.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
Cython/Utility/Lock.c
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
////////////////////// PyThreadTypeLock.proto //////////
|
|
2
|
+
//@proto_block: utility_code_proto_before_types
|
|
3
|
+
|
|
4
|
+
// This lock type always uses PyThread_type_lock. The main reason
|
|
5
|
+
// to use it is if you are using the Limited API and want to
|
|
6
|
+
// share locks between modules.
|
|
7
|
+
|
|
8
|
+
#define __Pyx_Locks_PyThreadTypeLock PyThread_type_lock
|
|
9
|
+
#define __Pyx_Locks_PyThreadTypeLock_DECL NULL
|
|
10
|
+
#define __Pyx_Locks_PyThreadTypeLock_Init(l) l = PyThread_allocate_lock()
|
|
11
|
+
#define __Pyx_Locks_PyThreadTypeLock_Delete(l) PyThread_free_lock(l)
|
|
12
|
+
#define __Pyx_Locks_PyThreadTypeLock_LockNogil(l) (void)PyThread_acquire_lock(l, WAIT_LOCK)
|
|
13
|
+
#define __Pyx_Locks_PyThreadTypeLock_Unlock(l) PyThread_release_lock(l)
|
|
14
|
+
static void __Pyx__Locks_PyThreadTypeLock_Lock(__Pyx_Locks_PyThreadTypeLock lock); /* proto */
|
|
15
|
+
static void __Pyx__Locks_PyThreadTypeLock_LockGil(__Pyx_Locks_PyThreadTypeLock lock); /* proto */
|
|
16
|
+
// CYTHON_INLINE because these may be unused
|
|
17
|
+
static CYTHON_INLINE void __Pyx_Locks_PyThreadTypeLock_Lock(__Pyx_Locks_PyThreadTypeLock lock) {
|
|
18
|
+
__Pyx__Locks_PyThreadTypeLock_Lock(lock);
|
|
19
|
+
}
|
|
20
|
+
static CYTHON_INLINE void __Pyx_Locks_PyThreadTypeLock_LockGil(__Pyx_Locks_PyThreadTypeLock lock) {
|
|
21
|
+
__Pyx__Locks_PyThreadTypeLock_LockGil(lock);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
////////////////////// PyThreadTypeLock ////////////////
|
|
25
|
+
|
|
26
|
+
static void __Pyx__Locks_PyThreadTypeLock_LockGil_slow_spin(__Pyx_Locks_PyThreadTypeLock lock) {
|
|
27
|
+
while (1) {
|
|
28
|
+
// If we've been spinning for a while take a slower path, where
|
|
29
|
+
// we release the GIL, get the lock, release the lock, reacquire the GIL
|
|
30
|
+
// and then hope the lock is still available when we try to reacquire it.
|
|
31
|
+
Py_BEGIN_ALLOW_THREADS
|
|
32
|
+
(void)PyThread_acquire_lock(lock, WAIT_LOCK);
|
|
33
|
+
PyThread_release_lock(lock);
|
|
34
|
+
Py_END_ALLOW_THREADS
|
|
35
|
+
if (likely(PyThread_acquire_lock_timed(lock, 0, 0) == PY_LOCK_ACQUIRED)) {
|
|
36
|
+
// All good - we got the lock
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static void __Pyx__Locks_PyThreadTypeLock_LockGil_quick_spin(__Pyx_Locks_PyThreadTypeLock lock) {
|
|
43
|
+
for (int spin_count=0; spin_count<100; ++spin_count) {
|
|
44
|
+
// Release and re-acquire the GIL, try to get the lock again.
|
|
45
|
+
Py_BEGIN_ALLOW_THREADS
|
|
46
|
+
Py_END_ALLOW_THREADS
|
|
47
|
+
if (likely(PyThread_acquire_lock_timed(lock, 0, 0) == PY_LOCK_ACQUIRED)) {
|
|
48
|
+
// All good - we got the lock
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
__Pyx__Locks_PyThreadTypeLock_LockGil_slow_spin(lock);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static CYTHON_INLINE void __Pyx__Locks_PyThreadTypeLock_LockGil(__Pyx_Locks_PyThreadTypeLock lock) {
|
|
56
|
+
if (likely(PyThread_acquire_lock_timed(lock, 0, 0) == PY_LOCK_ACQUIRED)) {
|
|
57
|
+
// All good - we got the lock
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
__Pyx__Locks_PyThreadTypeLock_LockGil_quick_spin(lock);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
static void __Pyx__Locks_PyThreadTypeLock_Lock(__Pyx_Locks_PyThreadTypeLock lock) {
|
|
64
|
+
#if CYTHON_COMPILING_IN_LIMITED_API
|
|
65
|
+
// We can't tell if we have the GIL. Therefore make sure we do have it
|
|
66
|
+
// and then restore whatever state was there before.
|
|
67
|
+
PyGILState_STATE state = PyGILState_Ensure();
|
|
68
|
+
__Pyx_Locks_PyThreadTypeLock_LockNogil(lock);
|
|
69
|
+
PyGILState_Release(state);
|
|
70
|
+
#else
|
|
71
|
+
if (PyGILState_Check()) {
|
|
72
|
+
__Pyx_Locks_PyThreadTypeLock_LockGil(lock);
|
|
73
|
+
} else {
|
|
74
|
+
__Pyx_Locks_PyThreadTypeLock_LockNogil(lock);
|
|
75
|
+
}
|
|
76
|
+
#endif
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
////////////////////// PyMutex.proto ////////////////////
|
|
80
|
+
//@proto_block: utility_code_proto_before_types
|
|
81
|
+
//@requires: PyThreadTypeLock
|
|
82
|
+
|
|
83
|
+
// We support two implementations - a Py3.13+ version using PyMutex and
|
|
84
|
+
// an older version using PyThread_type_lock.
|
|
85
|
+
// In principle it'd be possible to also use things like c++ std::mutex
|
|
86
|
+
// (in the absence of PyMutex). I've decided against this for ABI reasons.
|
|
87
|
+
|
|
88
|
+
// With the Limited API There is an ABI problem - if a lock is ever
|
|
89
|
+
// shared between two modules then they must agree on the definition,
|
|
90
|
+
// and so Limited API sharing with regular API will disagree.
|
|
91
|
+
|
|
92
|
+
// Therefore I explicitly ban Limited API modules from using
|
|
93
|
+
// CythonLockType in a public way. However, they can use
|
|
94
|
+
// CythonCompatibleLockType which will always be PyThread_type_lock.
|
|
95
|
+
|
|
96
|
+
#if PY_VERSION_HEX > 0x030d0000 && !CYTHON_COMPILING_IN_LIMITED_API
|
|
97
|
+
#define __Pyx_Locks_PyMutex PyMutex
|
|
98
|
+
#define __Pyx_Locks_PyMutex_DECL {0}
|
|
99
|
+
#define __Pyx_Locks_PyMutex_Init(l) (void)(l)
|
|
100
|
+
#define __Pyx_Locks_PyMutex_Delete(l) (void)(l)
|
|
101
|
+
// Py_Mutex takes care of all GIL handling itself
|
|
102
|
+
#define __Pyx_Locks_PyMutex_Lock(l) PyMutex_Lock(&l)
|
|
103
|
+
#define __Pyx_Locks_PyMutex_Unlock(l) PyMutex_Unlock(&l)
|
|
104
|
+
#define __Pyx_Locks_PyMutex_LockGil(l) PyMutex_Lock(&l)
|
|
105
|
+
#define __Pyx_Locks_PyMutex_LockNogil(l) PyMutex_Lock(&l)
|
|
106
|
+
|
|
107
|
+
#else
|
|
108
|
+
|
|
109
|
+
#define __Pyx_Locks_PyMutex __Pyx_Locks_PyThreadTypeLock
|
|
110
|
+
#define __Pyx_Locks_PyMutex_DECL __Pyx_Locks_PyThreadTypeLock_DECL
|
|
111
|
+
#define __Pyx_Locks_PyMutex_Init(l) __Pyx_Locks_PyThreadTypeLock_Init(l)
|
|
112
|
+
#define __Pyx_Locks_PyMutex_Delete(l) __Pyx_Locks_PyThreadTypeLock_Delete(l)
|
|
113
|
+
#define __Pyx_Locks_PyMutex_Lock(l) __Pyx_Locks_PyThreadTypeLock_Lock(l)
|
|
114
|
+
#define __Pyx_Locks_PyMutex_Unlock(l) __Pyx_Locks_PyThreadTypeLock_Unlock(l)
|
|
115
|
+
#define __Pyx_Locks_PyMutex_LockGil(l) __Pyx_Locks_PyThreadTypeLock_LockGil(l)
|
|
116
|
+
#define __Pyx_Locks_PyMutex_LockNogil(l) __Pyx_Locks_PyThreadTypeLock_LockNogil(l)
|
|
117
|
+
|
|
118
|
+
#endif
|
|
119
|
+
|
|
120
|
+
//////////////////////////// CythonPyMutexPublicCheck ///////////////////////////////////
|
|
121
|
+
|
|
122
|
+
#ifndef CYTHON_UNSAFE_IGNORE_PYMUTEX_ABI_COMPATIBILITY
|
|
123
|
+
#define CYTHON_UNSAFE_IGNORE_PYMUTEX_ABI_COMPATIBILITY 0
|
|
124
|
+
#endif
|
|
125
|
+
|
|
126
|
+
/* CYTHON_UNSAFE_IGNORE_PYMUTEX_ABI_COMPATIBILITY is left for an advanced user who
|
|
127
|
+
* wants to disable this error. However, please don't complain to us when your code
|
|
128
|
+
* breaks. Whatever you do, the Limited API version always uses the "compatible" lock
|
|
129
|
+
* type anyway, so you're only saving yourself a few extra characters typing.
|
|
130
|
+
*/
|
|
131
|
+
#if CYTHON_COMPILING_IN_LIMITED_API && !CYTHON_UNSAFE_IGNORE_PYMUTEX_ABI_COMPATIBILITY
|
|
132
|
+
#error cython.pymutex is shared between multiple modules in the Limited API.\
|
|
133
|
+
This is intentionally disabled because it is not possible for regular API and Limited API\
|
|
134
|
+
modules to be compatible with each other. Use cython.pythread_type_lock for a safe\
|
|
135
|
+
alternative lock type instead.
|
|
136
|
+
#endif
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# from cpython cimport ...
|
|
2
|
+
|
|
3
|
+
cimport cython
|
|
4
|
+
cdef extern from "Python.h":
|
|
5
|
+
ctypedef struct PyObject
|
|
6
|
+
ctypedef void *PyThread_type_lock
|
|
7
|
+
|
|
8
|
+
cdef extern from *:
|
|
9
|
+
ctypedef struct {{memviewslice_name}}:
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
ctypedef struct __pyx_buffer "Py_buffer":
|
|
13
|
+
PyObject *obj
|
|
14
|
+
|
|
15
|
+
ctypedef struct __Pyx_TypeInfo:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
cdef struct __pyx_memoryview "__pyx_memoryview_obj":
|
|
19
|
+
Py_buffer view
|
|
20
|
+
PyObject *obj
|
|
21
|
+
const __Pyx_TypeInfo *typeinfo
|
|
22
|
+
|
|
23
|
+
ctypedef int __pyx_atomic_int_type
|
|
24
|
+
|
|
25
|
+
{{memviewslice_name}} slice_copy_contig "__pyx_memoryview_copy_new_contig"(
|
|
26
|
+
{{memviewslice_name}} *from_mvs,
|
|
27
|
+
char *mode, int ndim,
|
|
28
|
+
size_t sizeof_dtype, int contig_flag,
|
|
29
|
+
bint dtype_is_object) except * nogil
|
|
30
|
+
bint slice_is_contig "__pyx_memviewslice_is_contig" (
|
|
31
|
+
{{memviewslice_name}} mvs, char order, int ndim) nogil
|
|
32
|
+
bint slices_overlap "__pyx_slices_overlap" ({{memviewslice_name}} *slice1,
|
|
33
|
+
{{memviewslice_name}} *slice2,
|
|
34
|
+
int ndim, size_t itemsize) nogil
|
|
35
|
+
|
|
36
|
+
@cname("__pyx_array")
|
|
37
|
+
cdef class array:
|
|
38
|
+
|
|
39
|
+
cdef:
|
|
40
|
+
char *data
|
|
41
|
+
Py_ssize_t len
|
|
42
|
+
char *format
|
|
43
|
+
int ndim
|
|
44
|
+
Py_ssize_t *_shape
|
|
45
|
+
Py_ssize_t *_strides
|
|
46
|
+
Py_ssize_t itemsize
|
|
47
|
+
unicode mode # FIXME: this should have been a simple 'char'
|
|
48
|
+
bytes _format
|
|
49
|
+
void (*callback_free_data)(void *data) noexcept
|
|
50
|
+
# cdef object _memview
|
|
51
|
+
cdef bint free_data
|
|
52
|
+
cdef bint dtype_is_object
|
|
53
|
+
|
|
54
|
+
@cname('get_memview')
|
|
55
|
+
cdef get_memview(self)
|
|
56
|
+
|
|
57
|
+
@cname("__pyx_array_allocate_buffer")
|
|
58
|
+
cdef int _allocate_buffer(array self) except -1
|
|
59
|
+
|
|
60
|
+
@cname("__pyx_array_new")
|
|
61
|
+
cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, const char *c_mode, char *buf)
|
|
62
|
+
|
|
63
|
+
@cname('__pyx_memoryview')
|
|
64
|
+
cdef class memoryview:
|
|
65
|
+
|
|
66
|
+
cdef object obj
|
|
67
|
+
cdef object _size
|
|
68
|
+
cdef object _array_interface
|
|
69
|
+
cdef PyThread_type_lock lock
|
|
70
|
+
cdef __pyx_atomic_int_type acquisition_count
|
|
71
|
+
cdef Py_buffer view
|
|
72
|
+
cdef int flags
|
|
73
|
+
cdef bint dtype_is_object
|
|
74
|
+
cdef const __Pyx_TypeInfo *typeinfo
|
|
75
|
+
|
|
76
|
+
cdef char *get_item_pointer(memoryview self, object index) except NULL
|
|
77
|
+
cdef is_slice(self, obj)
|
|
78
|
+
cdef setitem_slice_assignment(self, dst, src)
|
|
79
|
+
cdef setitem_slice_assign_scalar(self, memoryview dst, value)
|
|
80
|
+
cdef setitem_indexed(self, index, value)
|
|
81
|
+
cdef convert_item_to_object(self, char *itemp)
|
|
82
|
+
cdef assign_item_from_object(self, char *itemp, object value)
|
|
83
|
+
cdef _get_base(self)
|
|
84
|
+
|
|
85
|
+
@cname('__pyx_memoryview_new')
|
|
86
|
+
cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, const __Pyx_TypeInfo *typeinfo)
|
|
87
|
+
|
|
88
|
+
@cname('__pyx_memoryview_check')
|
|
89
|
+
cdef inline bint memoryview_check(object o) noexcept:
|
|
90
|
+
return isinstance(o, memoryview)
|
|
91
|
+
|
|
92
|
+
@cname('__pyx_memview_slice')
|
|
93
|
+
cdef memoryview memview_slice(memoryview memview, object indices)
|
|
94
|
+
|
|
95
|
+
@cname('__pyx_memoryview_slice_memviewslice')
|
|
96
|
+
cdef int slice_memviewslice(
|
|
97
|
+
{{memviewslice_name}} *dst,
|
|
98
|
+
Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset,
|
|
99
|
+
int dim, int new_ndim, int *suboffset_dim,
|
|
100
|
+
Py_ssize_t start, Py_ssize_t stop, Py_ssize_t step,
|
|
101
|
+
int have_start, int have_stop, int have_step,
|
|
102
|
+
bint is_slice) except -1 nogil
|
|
103
|
+
|
|
104
|
+
@cname('__pyx_pybuffer_index')
|
|
105
|
+
cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index,
|
|
106
|
+
Py_ssize_t dim) except NULL
|
|
107
|
+
|
|
108
|
+
@cname('__pyx_memslice_transpose')
|
|
109
|
+
cdef int transpose_memslice({{memviewslice_name}} *memslice) except -1 nogil
|
|
110
|
+
|
|
111
|
+
@cname('__pyx_memoryview_fromslice')
|
|
112
|
+
cdef memoryview_fromslice({{memviewslice_name}} memviewslice,
|
|
113
|
+
int ndim,
|
|
114
|
+
object (*to_object_func)(char *),
|
|
115
|
+
int (*to_dtype_func)(char *, object) except 0,
|
|
116
|
+
bint dtype_is_object)
|
|
117
|
+
|
|
118
|
+
@cname('__pyx_memoryview_get_slice_from_memoryview')
|
|
119
|
+
cdef {{memviewslice_name}} *get_slice_from_memview(memoryview memview,
|
|
120
|
+
{{memviewslice_name}} *mslice) except NULL
|
|
121
|
+
|
|
122
|
+
@cname('__pyx_memoryview_slice_copy')
|
|
123
|
+
cdef void slice_copy(memoryview memview, {{memviewslice_name}} *dst) noexcept
|
|
124
|
+
|
|
125
|
+
@cname('__pyx_memoryview_copy_object')
|
|
126
|
+
cdef memoryview_copy(memoryview memview)
|
|
127
|
+
|
|
128
|
+
@cname('__pyx_memoryview_copy_object_from_slice')
|
|
129
|
+
cdef memoryview_copy_from_slice(memoryview memview, {{memviewslice_name}} *memviewslice)
|
|
130
|
+
|
|
131
|
+
@cname('__pyx_get_best_slice_order')
|
|
132
|
+
cdef char get_best_order({{memviewslice_name}} *mslice, int ndim) noexcept nogil
|
|
133
|
+
|
|
134
|
+
@cname('__pyx_memoryview_slice_get_size')
|
|
135
|
+
cdef Py_ssize_t slice_get_size({{memviewslice_name}} *src, int ndim) noexcept nogil
|
|
136
|
+
|
|
137
|
+
@cname('__pyx_fill_contig_strides_array')
|
|
138
|
+
cdef Py_ssize_t fill_contig_strides_array(
|
|
139
|
+
Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride,
|
|
140
|
+
int ndim, char order) noexcept nogil
|
|
141
|
+
|
|
142
|
+
@cname('__pyx_memoryview_copy_data_to_temp')
|
|
143
|
+
cdef void *copy_data_to_temp({{memviewslice_name}} *src,
|
|
144
|
+
{{memviewslice_name}} *tmpslice,
|
|
145
|
+
char order,
|
|
146
|
+
int ndim) except NULL nogil
|
|
147
|
+
|
|
148
|
+
@cname('__pyx_memoryview_err_extents')
|
|
149
|
+
cdef int _err_extents(int i, Py_ssize_t extent1,
|
|
150
|
+
Py_ssize_t extent2) except -1 with gil
|
|
151
|
+
|
|
152
|
+
@cname('__pyx_memoryview_err_dim')
|
|
153
|
+
cdef int _err_dim(PyObject *error, str msg, int dim) except -1 with gil
|
|
154
|
+
|
|
155
|
+
@cname('__pyx_memoryview_err')
|
|
156
|
+
cdef int _err(PyObject *error, str msg) except -1 with gil
|
|
157
|
+
|
|
158
|
+
@cname('__pyx_memoryview_err_no_memory')
|
|
159
|
+
cdef int _err_no_memory() except -1 with gil
|
|
160
|
+
|
|
161
|
+
@cname('__pyx_memoryview_copy_contents')
|
|
162
|
+
cdef int memoryview_copy_contents({{memviewslice_name}} src,
|
|
163
|
+
{{memviewslice_name}} dst,
|
|
164
|
+
int src_ndim, int dst_ndim,
|
|
165
|
+
bint dtype_is_object) except -1 nogil
|
|
166
|
+
|
|
167
|
+
@cname('__pyx_memoryview_broadcast_leading')
|
|
168
|
+
cdef void broadcast_leading({{memviewslice_name}} *mslice,
|
|
169
|
+
int ndim,
|
|
170
|
+
int ndim_other) noexcept nogil
|
|
171
|
+
|
|
172
|
+
@cname('__pyx_memoryview_refcount_copying')
|
|
173
|
+
cdef void refcount_copying({{memviewslice_name}} *dst, bint dtype_is_object, int ndim, bint inc) noexcept nogil
|
|
174
|
+
|
|
175
|
+
@cname('__pyx_memoryview_refcount_objects_in_slice')
|
|
176
|
+
cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape,
|
|
177
|
+
Py_ssize_t *strides, int ndim, bint inc) noexcept
|
|
178
|
+
|
|
179
|
+
@cname('__pyx_memoryview_slice_assign_scalar')
|
|
180
|
+
cdef void slice_assign_scalar({{memviewslice_name}} *dst, int ndim,
|
|
181
|
+
size_t itemsize, void *item,
|
|
182
|
+
bint dtype_is_object) noexcept nogil
|
|
183
|
+
|
|
184
|
+
@cname('__pyx_memoryview__slice_assign_scalar')
|
|
185
|
+
cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape,
|
|
186
|
+
Py_ssize_t *strides, int ndim,
|
|
187
|
+
size_t itemsize, void *item) noexcept nogil
|