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
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Thread and interpreter state structures and their interfaces
|
|
2
|
+
|
|
3
|
+
from .object cimport PyObject
|
|
4
|
+
|
|
5
|
+
cdef extern from "Python.h":
|
|
6
|
+
|
|
7
|
+
# We make these an opaque types. If the user wants specific attributes,
|
|
8
|
+
# they can be declared manually.
|
|
9
|
+
|
|
10
|
+
ctypedef long PY_INT64_T # FIXME: Py2.7+, not defined here but used here
|
|
11
|
+
|
|
12
|
+
ctypedef struct PyInterpreterState:
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
ctypedef struct PyThreadState:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
ctypedef struct PyFrameObject:
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
# This is not actually a struct, but make sure it can never be coerced to
|
|
22
|
+
# an int or used in arithmetic expressions
|
|
23
|
+
ctypedef struct PyGILState_STATE:
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
# The type of the trace function registered using PyEval_SetProfile() and
|
|
27
|
+
# PyEval_SetTrace().
|
|
28
|
+
# Py_tracefunc return -1 when raising an exception, or 0 for success.
|
|
29
|
+
ctypedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *)
|
|
30
|
+
|
|
31
|
+
# The following values are used for 'what' for tracefunc functions
|
|
32
|
+
enum:
|
|
33
|
+
PyTrace_CALL
|
|
34
|
+
PyTrace_EXCEPTION
|
|
35
|
+
PyTrace_LINE
|
|
36
|
+
PyTrace_RETURN
|
|
37
|
+
PyTrace_C_CALL
|
|
38
|
+
PyTrace_C_EXCEPTION
|
|
39
|
+
PyTrace_C_RETURN
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
PyInterpreterState * PyInterpreterState_New()
|
|
43
|
+
void PyInterpreterState_Clear(PyInterpreterState *)
|
|
44
|
+
void PyInterpreterState_Delete(PyInterpreterState *)
|
|
45
|
+
PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *)
|
|
46
|
+
|
|
47
|
+
PyThreadState * PyThreadState_New(PyInterpreterState *)
|
|
48
|
+
void PyThreadState_Clear(PyThreadState *)
|
|
49
|
+
void PyThreadState_Delete(PyThreadState *)
|
|
50
|
+
|
|
51
|
+
PyThreadState * PyThreadState_Get()
|
|
52
|
+
PyThreadState * PyThreadState_Swap(PyThreadState *) # NOTE: DO NOT USE IN CYTHON CODE !
|
|
53
|
+
PyObject * PyThreadState_GetDict()
|
|
54
|
+
int PyThreadState_SetAsyncExc(long, PyObject *)
|
|
55
|
+
|
|
56
|
+
# Ensure that the current thread is ready to call the Python
|
|
57
|
+
# C API, regardless of the current state of Python, or of its
|
|
58
|
+
# thread lock. This may be called as many times as desired
|
|
59
|
+
# by a thread so long as each call is matched with a call to
|
|
60
|
+
# PyGILState_Release(). In general, other thread-state APIs may
|
|
61
|
+
# be used between _Ensure() and _Release() calls, so long as the
|
|
62
|
+
# thread-state is restored to its previous state before the Release().
|
|
63
|
+
# For example, normal use of the Py_BEGIN_ALLOW_THREADS/
|
|
64
|
+
# Py_END_ALLOW_THREADS macros are acceptable.
|
|
65
|
+
|
|
66
|
+
# The return value is an opaque "handle" to the thread state when
|
|
67
|
+
# PyGILState_Ensure() was called, and must be passed to
|
|
68
|
+
# PyGILState_Release() to ensure Python is left in the same state. Even
|
|
69
|
+
# though recursive calls are allowed, these handles can *not* be shared -
|
|
70
|
+
# each unique call to PyGILState_Ensure must save the handle for its
|
|
71
|
+
# call to PyGILState_Release.
|
|
72
|
+
|
|
73
|
+
# When the function returns, the current thread will hold the GIL.
|
|
74
|
+
|
|
75
|
+
# Failure is a fatal error.
|
|
76
|
+
PyGILState_STATE PyGILState_Ensure()
|
|
77
|
+
|
|
78
|
+
# Release any resources previously acquired. After this call, Python's
|
|
79
|
+
# state will be the same as it was prior to the corresponding
|
|
80
|
+
# PyGILState_Ensure() call (but generally this state will be unknown to
|
|
81
|
+
# the caller, hence the use of the GILState API.)
|
|
82
|
+
|
|
83
|
+
# Every call to PyGILState_Ensure must be matched by a call to
|
|
84
|
+
# PyGILState_Release on the same thread.
|
|
85
|
+
void PyGILState_Release(PyGILState_STATE)
|
|
86
|
+
|
|
87
|
+
# Return 1 if the current thread holds the GIL and 0 otherwise.
|
|
88
|
+
int PyGILState_Check()
|
|
89
|
+
|
|
90
|
+
# Routines for advanced debuggers, requested by David Beazley.
|
|
91
|
+
# Don't use unless you know what you are doing!
|
|
92
|
+
PyInterpreterState * PyInterpreterState_Head()
|
|
93
|
+
PyInterpreterState * PyInterpreterState_Next(PyInterpreterState *)
|
|
94
|
+
PyThreadState * PyInterpreterState_ThreadHead(PyInterpreterState *)
|
|
95
|
+
PyThreadState * PyThreadState_Next(PyThreadState *)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
cdef extern from "pythread.h":
|
|
4
|
+
|
|
5
|
+
ctypedef void *PyThread_type_lock
|
|
6
|
+
ctypedef void *PyThread_type_sema
|
|
7
|
+
|
|
8
|
+
void PyThread_init_thread()
|
|
9
|
+
long PyThread_start_new_thread(void (*)(void *), void *) # FIXME: legacy
|
|
10
|
+
#unsigned long PyThread_start_new_thread(void (*)(void *), void *) # returned 'long' before Py3.7
|
|
11
|
+
void PyThread_exit_thread()
|
|
12
|
+
long PyThread_get_thread_ident() # FIXME: legacy
|
|
13
|
+
#unsigned long PyThread_get_thread_ident() # returned 'long' before Py3.7
|
|
14
|
+
|
|
15
|
+
PyThread_type_lock PyThread_allocate_lock()
|
|
16
|
+
void PyThread_free_lock(PyThread_type_lock)
|
|
17
|
+
int PyThread_acquire_lock(PyThread_type_lock, int mode) nogil
|
|
18
|
+
void PyThread_release_lock(PyThread_type_lock) nogil
|
|
19
|
+
|
|
20
|
+
enum:
|
|
21
|
+
# 'mode' in PyThread_acquire_lock()
|
|
22
|
+
WAIT_LOCK # 1
|
|
23
|
+
NOWAIT_LOCK # 0
|
|
24
|
+
|
|
25
|
+
ctypedef enum PyLockStatus:
|
|
26
|
+
# return values of PyThread_acquire_lock() in CPython 3.2+
|
|
27
|
+
PY_LOCK_FAILURE = 0
|
|
28
|
+
PY_LOCK_ACQUIRED = 1
|
|
29
|
+
PY_LOCK_INTR
|
|
30
|
+
|
|
31
|
+
size_t PyThread_get_stacksize()
|
|
32
|
+
int PyThread_set_stacksize(size_t)
|
|
33
|
+
|
|
34
|
+
# Thread Local Storage (TLS) API deprecated in CPython 3.7+
|
|
35
|
+
int PyThread_create_key()
|
|
36
|
+
void PyThread_delete_key(int)
|
|
37
|
+
int PyThread_set_key_value(int, void *)
|
|
38
|
+
void * PyThread_get_key_value(int)
|
|
39
|
+
void PyThread_delete_key_value(int key)
|
|
40
|
+
|
|
41
|
+
# Cleanup after a fork
|
|
42
|
+
void PyThread_ReInitTLS()
|
|
43
|
+
|
|
44
|
+
# Thread Specific Storage (TSS) API in CPython 3.7+ (also backported)
|
|
45
|
+
#ctypedef struct Py_tss_t: pass # Cython built-in type
|
|
46
|
+
Py_tss_t Py_tss_NEEDS_INIT # Not normally useful: Cython auto-initialises declared "Py_tss_t" variables.
|
|
47
|
+
Py_tss_t * PyThread_tss_alloc()
|
|
48
|
+
void PyThread_tss_free(Py_tss_t *key)
|
|
49
|
+
int PyThread_tss_is_created(Py_tss_t *key)
|
|
50
|
+
int PyThread_tss_create(Py_tss_t *key)
|
|
51
|
+
void PyThread_tss_delete(Py_tss_t *key)
|
|
52
|
+
int PyThread_tss_set(Py_tss_t *key, void *value)
|
|
53
|
+
void * PyThread_tss_get(Py_tss_t *key)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from .object cimport PyObject, PyTypeObject, Py_TYPE # legacy imports for re-export
|
|
2
|
+
|
|
3
|
+
cdef extern from "Python.h":
|
|
4
|
+
#####################################################################
|
|
5
|
+
# 3. Reference Counts
|
|
6
|
+
#####################################################################
|
|
7
|
+
# The macros in this section are used for managing reference counts of Python objects.
|
|
8
|
+
void Py_INCREF(object o)
|
|
9
|
+
# Increment the reference count for object o. The object must not
|
|
10
|
+
# be NULL; if you aren't sure that it isn't NULL, use
|
|
11
|
+
# Py_XINCREF().
|
|
12
|
+
|
|
13
|
+
void Py_XINCREF(PyObject* o)
|
|
14
|
+
# Increment the reference count for object o. The object may be NULL, in which case the macro has no effect.
|
|
15
|
+
|
|
16
|
+
void Py_DECREF(object o)
|
|
17
|
+
# Decrement the reference count for object o. The object must not
|
|
18
|
+
# be NULL; if you aren't sure that it isn't NULL, use
|
|
19
|
+
# Py_XDECREF(). If the reference count reaches zero, the object's
|
|
20
|
+
# type's deallocation function (which must not be NULL) is
|
|
21
|
+
# invoked.
|
|
22
|
+
|
|
23
|
+
# Warning: The deallocation function can cause arbitrary Python
|
|
24
|
+
# code to be invoked (e.g. when a class instance with a __del__()
|
|
25
|
+
# method is deallocated). While exceptions in such code are not
|
|
26
|
+
# propagated, the executed code has free access to all Python
|
|
27
|
+
# global variables. This means that any object that is reachable
|
|
28
|
+
# from a global variable should be in a consistent state before
|
|
29
|
+
# Py_DECREF() is invoked. For example, code to delete an object
|
|
30
|
+
# from a list should copy a reference to the deleted object in a
|
|
31
|
+
# temporary variable, update the list data structure, and then
|
|
32
|
+
# call Py_DECREF() for the temporary variable.
|
|
33
|
+
|
|
34
|
+
void Py_XDECREF(PyObject* o)
|
|
35
|
+
# Decrement the reference count for object o. The object may be
|
|
36
|
+
# NULL, in which case the macro has no effect; otherwise the
|
|
37
|
+
# effect is the same as for Py_DECREF(), and the same warning
|
|
38
|
+
# applies.
|
|
39
|
+
|
|
40
|
+
void Py_CLEAR(PyObject* o)
|
|
41
|
+
# Decrement the reference count for object o. The object may be
|
|
42
|
+
# NULL, in which case the macro has no effect; otherwise the
|
|
43
|
+
# effect is the same as for Py_DECREF(), except that the argument
|
|
44
|
+
# is also set to NULL. The warning for Py_DECREF() does not apply
|
|
45
|
+
# with respect to the object passed because the macro carefully
|
|
46
|
+
# uses a temporary variable and sets the argument to NULL before
|
|
47
|
+
# decrementing its reference count.
|
|
48
|
+
# It is a good idea to use this macro whenever decrementing the
|
|
49
|
+
# value of a variable that might be traversed during garbage
|
|
50
|
+
# collection.
|
|
51
|
+
|
|
52
|
+
Py_ssize_t Py_REFCNT(object o)
|
|
53
|
+
# Get the reference count of the Python object o.
|
|
54
|
+
|
|
55
|
+
# Note that the returned value may not actually reflect how many
|
|
56
|
+
# references to the object are actually held. For example, some
|
|
57
|
+
# objects are “immortal” and have a very high refcount that does not
|
|
58
|
+
# reflect the actual number of references. Consequently, do not rely
|
|
59
|
+
# on the returned value to be accurate, other than a value of 0 or
|
|
60
|
+
# 1.
|
|
61
|
+
|
|
62
|
+
Py_ssize_t _Py_REFCNT "Py_REFCNT" (PyObject *ptr)
|
|
63
|
+
# Get the reference count for the PyObject pointer ptr.
|
|
64
|
+
|
|
65
|
+
# This is useful when it would be awkward to create an owned reference just
|
|
66
|
+
# to get the reference count. See the note for Py_REFCNT above about the
|
|
67
|
+
# accuracy of reference counts.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
from .object cimport PyObject
|
|
2
|
+
|
|
3
|
+
cdef extern from "Python.h":
|
|
4
|
+
|
|
5
|
+
############################################################################
|
|
6
|
+
# 6.3 Sequence Protocol
|
|
7
|
+
############################################################################
|
|
8
|
+
|
|
9
|
+
bint PySequence_Check(object o)
|
|
10
|
+
# Return 1 if the object provides sequence protocol, and 0
|
|
11
|
+
# otherwise. This function always succeeds.
|
|
12
|
+
|
|
13
|
+
Py_ssize_t PySequence_Size(object o) except -1
|
|
14
|
+
# Returns the number of objects in sequence o on success, and -1
|
|
15
|
+
# on failure. For objects that do not provide sequence protocol,
|
|
16
|
+
# this is equivalent to the Python expression "len(o)".
|
|
17
|
+
|
|
18
|
+
Py_ssize_t PySequence_Length(object o) except -1
|
|
19
|
+
# Alternate name for PySequence_Size().
|
|
20
|
+
|
|
21
|
+
object PySequence_Concat(object o1, object o2)
|
|
22
|
+
# Return value: New reference.
|
|
23
|
+
# Return the concatenation of o1 and o2 on success, and NULL on
|
|
24
|
+
# failure. This is the equivalent of the Python expression "o1 +
|
|
25
|
+
# o2".
|
|
26
|
+
|
|
27
|
+
object PySequence_Repeat(object o, Py_ssize_t count)
|
|
28
|
+
# Return value: New reference.
|
|
29
|
+
# Return the result of repeating sequence object o count times, or
|
|
30
|
+
# NULL on failure. This is the equivalent of the Python expression
|
|
31
|
+
# "o * count".
|
|
32
|
+
|
|
33
|
+
object PySequence_InPlaceConcat(object o1, object o2)
|
|
34
|
+
# Return value: New reference.
|
|
35
|
+
# Return the concatenation of o1 and o2 on success, and NULL on
|
|
36
|
+
# failure. The operation is done in-place when o1 supports
|
|
37
|
+
# it. This is the equivalent of the Python expression "o1 += o2".
|
|
38
|
+
|
|
39
|
+
object PySequence_InPlaceRepeat(object o, Py_ssize_t count)
|
|
40
|
+
# Return value: New reference.
|
|
41
|
+
# Return the result of repeating sequence object o count times, or
|
|
42
|
+
# NULL on failure. The operation is done in-place when o supports
|
|
43
|
+
# it. This is the equivalent of the Python expression "o *=
|
|
44
|
+
# count".
|
|
45
|
+
|
|
46
|
+
object PySequence_GetItem(object o, Py_ssize_t i)
|
|
47
|
+
# Return value: New reference.
|
|
48
|
+
# Return the ith element of o, or NULL on failure. This is the
|
|
49
|
+
# equivalent of the Python expression "o[i]".
|
|
50
|
+
|
|
51
|
+
object PySequence_GetSlice(object o, Py_ssize_t i1, Py_ssize_t i2)
|
|
52
|
+
# Return value: New reference.
|
|
53
|
+
# Return the slice of sequence object o between i1 and i2, or NULL
|
|
54
|
+
# on failure. This is the equivalent of the Python expression
|
|
55
|
+
# "o[i1:i2]".
|
|
56
|
+
|
|
57
|
+
int PySequence_SetItem(object o, Py_ssize_t i, object v) except -1
|
|
58
|
+
# Assign object v to the ith element of o. Returns -1 on
|
|
59
|
+
# failure. This is the equivalent of the Python statement "o[i] =
|
|
60
|
+
# v". This function does not steal a reference to v.
|
|
61
|
+
|
|
62
|
+
int PySequence_DelItem(object o, Py_ssize_t i) except -1
|
|
63
|
+
# Delete the ith element of object o. Returns -1 on failure. This
|
|
64
|
+
# is the equivalent of the Python statement "del o[i]".
|
|
65
|
+
|
|
66
|
+
int PySequence_SetSlice(object o, Py_ssize_t i1, Py_ssize_t i2, object v) except -1
|
|
67
|
+
# Assign the sequence object v to the slice in sequence object o
|
|
68
|
+
# from i1 to i2. This is the equivalent of the Python statement
|
|
69
|
+
# "o[i1:i2] = v".
|
|
70
|
+
|
|
71
|
+
int PySequence_DelSlice(object o, Py_ssize_t i1, Py_ssize_t i2) except -1
|
|
72
|
+
# Delete the slice in sequence object o from i1 to i2. Returns -1
|
|
73
|
+
# on failure. This is the equivalent of the Python statement "del
|
|
74
|
+
# o[i1:i2]".
|
|
75
|
+
|
|
76
|
+
int PySequence_Count(object o, object value) except -1
|
|
77
|
+
# Return the number of occurrences of value in o, that is, return
|
|
78
|
+
# the number of keys for which o[key] == value. On failure, return
|
|
79
|
+
# -1. This is equivalent to the Python expression
|
|
80
|
+
# "o.count(value)".
|
|
81
|
+
|
|
82
|
+
int PySequence_Contains(object o, object value) except -1
|
|
83
|
+
# Determine if o contains value. If an item in o is equal to
|
|
84
|
+
# value, return 1, otherwise return 0. On error, return -1. This
|
|
85
|
+
# is equivalent to the Python expression "value in o".
|
|
86
|
+
|
|
87
|
+
Py_ssize_t PySequence_Index(object o, object value) except -1
|
|
88
|
+
# Return the first index i for which o[i] == value. On error,
|
|
89
|
+
# return -1. This is equivalent to the Python expression
|
|
90
|
+
# "o.index(value)".
|
|
91
|
+
|
|
92
|
+
object PySequence_List(object o)
|
|
93
|
+
# Return value: New reference.
|
|
94
|
+
# Return a list object with the same contents as the arbitrary
|
|
95
|
+
# sequence o. The returned list is guaranteed to be new.
|
|
96
|
+
|
|
97
|
+
object PySequence_Tuple(object o)
|
|
98
|
+
# Return value: New reference.
|
|
99
|
+
# Return a tuple object with the same contents as the arbitrary
|
|
100
|
+
# sequence o or NULL on failure. If o is a tuple, a new reference
|
|
101
|
+
# will be returned, otherwise a tuple will be constructed with the
|
|
102
|
+
# appropriate contents. This is equivalent to the Python
|
|
103
|
+
# expression "tuple(o)".
|
|
104
|
+
|
|
105
|
+
object PySequence_Fast(object o, char *m)
|
|
106
|
+
# Return value: New reference.
|
|
107
|
+
# Returns the sequence o as a tuple, unless it is already a tuple
|
|
108
|
+
# or list, in which case o is returned. Use
|
|
109
|
+
# PySequence_Fast_GET_ITEM() to access the members of the
|
|
110
|
+
# result. Returns NULL on failure. If the object is not a
|
|
111
|
+
# sequence, raises TypeError with m as the message text.
|
|
112
|
+
|
|
113
|
+
PyObject* PySequence_Fast_GET_ITEM(object o, Py_ssize_t i)
|
|
114
|
+
# Return value: Borrowed reference.
|
|
115
|
+
# Return the ith element of o, assuming that o was returned by
|
|
116
|
+
# PySequence_Fast(), o is not NULL, and that i is within bounds.
|
|
117
|
+
|
|
118
|
+
PyObject** PySequence_Fast_ITEMS(object o)
|
|
119
|
+
# Return the underlying array of PyObject pointers. Assumes that o
|
|
120
|
+
# was returned by PySequence_Fast() and o is not NULL.
|
|
121
|
+
|
|
122
|
+
object PySequence_ITEM(object o, Py_ssize_t i)
|
|
123
|
+
# Return value: New reference.
|
|
124
|
+
# Return the ith element of o or NULL on failure. Macro form of
|
|
125
|
+
# PySequence_GetItem() but without checking that
|
|
126
|
+
# PySequence_Check(o) is true and without adjustment for negative
|
|
127
|
+
# indices.
|
|
128
|
+
|
|
129
|
+
Py_ssize_t PySequence_Fast_GET_SIZE(object o)
|
|
130
|
+
# Returns the length of o, assuming that o was returned by
|
|
131
|
+
# PySequence_Fast() and that o is not NULL. The size can also be
|
|
132
|
+
# gotten by calling PySequence_Size() on o, but
|
|
133
|
+
# PySequence_Fast_GET_SIZE() is faster because it can assume o is
|
|
134
|
+
# a list or tuple.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
cdef extern from "Python.h":
|
|
2
|
+
|
|
3
|
+
############################################################################
|
|
4
|
+
# 7.5.14 Set Objects
|
|
5
|
+
############################################################################
|
|
6
|
+
|
|
7
|
+
# This section details the public API for set and frozenset
|
|
8
|
+
# objects. Any functionality not listed below is best accessed
|
|
9
|
+
# using the either the abstract object protocol (including
|
|
10
|
+
# PyObject_CallMethod(), PyObject_RichCompareBool(),
|
|
11
|
+
# PyObject_Hash(), PyObject_Repr(), PyObject_IsTrue(),
|
|
12
|
+
# PyObject_Print(), and PyObject_GetIter()) or the abstract number
|
|
13
|
+
# protocol (including PyNumber_Add(), PyNumber_Subtract(),
|
|
14
|
+
# PyNumber_Or(), PyNumber_Xor(), PyNumber_InPlaceAdd(),
|
|
15
|
+
# PyNumber_InPlaceSubtract(), PyNumber_InPlaceOr(), and
|
|
16
|
+
# PyNumber_InPlaceXor()).
|
|
17
|
+
|
|
18
|
+
# PySetObject
|
|
19
|
+
# This subtype of PyObject is used to hold the internal data for
|
|
20
|
+
# both set and frozenset objects. It is like a PyDictObject in
|
|
21
|
+
# that it is a fixed size for small sets (much like tuple storage)
|
|
22
|
+
# and will point to a separate, variable sized block of memory for
|
|
23
|
+
# medium and large sized sets (much like list storage). None of
|
|
24
|
+
# the fields of this structure should be considered public and are
|
|
25
|
+
# subject to change. All access should be done through the
|
|
26
|
+
# documented API rather than by manipulating the values in the
|
|
27
|
+
# structure.
|
|
28
|
+
|
|
29
|
+
# PyTypeObject PySet_Type
|
|
30
|
+
# This is an instance of PyTypeObject representing the Python set type.
|
|
31
|
+
|
|
32
|
+
# PyTypeObject PyFrozenSet_Type
|
|
33
|
+
# This is an instance of PyTypeObject representing the Python frozenset type.
|
|
34
|
+
|
|
35
|
+
# The following type check macros work on pointers to any Python
|
|
36
|
+
# object. Likewise, the constructor functions work with any
|
|
37
|
+
# iterable Python object.
|
|
38
|
+
|
|
39
|
+
bint PyAnySet_Check(object p)
|
|
40
|
+
# Return true if p is a set object, a frozenset object, or an
|
|
41
|
+
# instance of a subtype.
|
|
42
|
+
|
|
43
|
+
bint PyAnySet_CheckExact(object p)
|
|
44
|
+
# Return true if p is a set object or a frozenset object but not
|
|
45
|
+
# an instance of a subtype.
|
|
46
|
+
|
|
47
|
+
bint PyFrozenSet_Check(object p)
|
|
48
|
+
# Return true if p is a frozenset object or an instance of a subtype.
|
|
49
|
+
|
|
50
|
+
bint PyFrozenSet_CheckExact(object p)
|
|
51
|
+
# Return true if p is a frozenset object but not an instance of a subtype.
|
|
52
|
+
|
|
53
|
+
bint PySet_Check(object p)
|
|
54
|
+
# Return true if p is a set object or an instance of a subtype.
|
|
55
|
+
|
|
56
|
+
object PySet_New(object iterable)
|
|
57
|
+
# Return value: New reference.
|
|
58
|
+
# Return a new set containing objects returned by the
|
|
59
|
+
# iterable. The iterable may be NULL to create a new empty
|
|
60
|
+
# set. Return the new set on success or NULL on failure. Raise
|
|
61
|
+
# TypeError if iterable is not actually iterable. The constructor
|
|
62
|
+
# is also useful for copying a set (c=set(s)).
|
|
63
|
+
|
|
64
|
+
object PyFrozenSet_New(object iterable)
|
|
65
|
+
# Return value: New reference.
|
|
66
|
+
# Return a new frozenset containing objects returned by the
|
|
67
|
+
# iterable. The iterable may be NULL to create a new empty
|
|
68
|
+
# frozenset. Return the new set on success or NULL on
|
|
69
|
+
# failure. Raise TypeError if iterable is not actually iterable.
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# The following functions and macros are available for instances
|
|
73
|
+
# of set or frozenset or instances of their subtypes.
|
|
74
|
+
|
|
75
|
+
Py_ssize_t PySet_Size(object anyset) except -1
|
|
76
|
+
# Return the length of a set or frozenset object. Equivalent to
|
|
77
|
+
# "len(anyset)". Raises a PyExc_SystemError if anyset is not a
|
|
78
|
+
# set, frozenset, or an instance of a subtype.
|
|
79
|
+
|
|
80
|
+
Py_ssize_t PySet_GET_SIZE(object anyset)
|
|
81
|
+
# Macro form of PySet_Size() without error checking.
|
|
82
|
+
|
|
83
|
+
bint PySet_Contains(object anyset, object key) except -1
|
|
84
|
+
# Return 1 if found, 0 if not found, and -1 if an error is
|
|
85
|
+
# encountered. Unlike the Python __contains__() method, this
|
|
86
|
+
# function does not automatically convert unhashable sets into
|
|
87
|
+
# temporary frozensets. Raise a TypeError if the key is
|
|
88
|
+
# unhashable. Raise PyExc_SystemError if anyset is not a set,
|
|
89
|
+
# frozenset, or an instance of a subtype.
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# The following functions are available for instances of set or
|
|
93
|
+
# its subtypes but not for instances of frozenset or its subtypes.
|
|
94
|
+
|
|
95
|
+
int PySet_Add(object set, object key) except -1
|
|
96
|
+
# Add key to a set instance. Does not apply to frozenset
|
|
97
|
+
# instances. Return 0 on success or -1 on failure. Raise a
|
|
98
|
+
# TypeError if the key is unhashable. Raise a MemoryError if there
|
|
99
|
+
# is no room to grow. Raise a SystemError if set is an not an
|
|
100
|
+
# instance of set or its subtype.
|
|
101
|
+
|
|
102
|
+
bint PySet_Discard(object set, object key) except -1
|
|
103
|
+
# Return 1 if found and removed, 0 if not found (no action taken),
|
|
104
|
+
# and -1 if an error is encountered. Does not raise KeyError for
|
|
105
|
+
# missing keys. Raise a TypeError if the key is unhashable. Unlike
|
|
106
|
+
# the Python discard() method, this function does not
|
|
107
|
+
# automatically convert unhashable sets into temporary
|
|
108
|
+
# frozensets. Raise PyExc_SystemError if set is an not an instance
|
|
109
|
+
# of set or its subtype.
|
|
110
|
+
|
|
111
|
+
object PySet_Pop(object set)
|
|
112
|
+
# Return value: New reference.
|
|
113
|
+
# Return a new reference to an arbitrary object in the set, and
|
|
114
|
+
# removes the object from the set. Return NULL on failure. Raise
|
|
115
|
+
# KeyError if the set is empty. Raise a SystemError if set is an
|
|
116
|
+
# not an instance of set or its subtype.
|
|
117
|
+
|
|
118
|
+
int PySet_Clear(object set)
|
|
119
|
+
# Empty an existing set of all elements.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
cdef extern from "Python.h":
|
|
2
|
+
|
|
3
|
+
# PyTypeObject PySlice_Type
|
|
4
|
+
#
|
|
5
|
+
# The type object for slice objects. This is the same as slice and types.SliceType
|
|
6
|
+
|
|
7
|
+
bint PySlice_Check(object ob)
|
|
8
|
+
#
|
|
9
|
+
# Return true if ob is a slice object; ob must not be NULL.
|
|
10
|
+
|
|
11
|
+
slice PySlice_New(object start, object stop, object step)
|
|
12
|
+
#
|
|
13
|
+
# Return a new slice object with the given values. The start, stop, and step
|
|
14
|
+
# parameters are used as the values of the slice object attributes of the same
|
|
15
|
+
# names. Any of the values may be NULL, in which case the None will be used
|
|
16
|
+
# for the corresponding attribute. Return NULL if the new object could not be
|
|
17
|
+
# allocated.
|
|
18
|
+
|
|
19
|
+
int PySlice_GetIndices(object slice, Py_ssize_t length,
|
|
20
|
+
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step) except? -1
|
|
21
|
+
#
|
|
22
|
+
# Retrieve the start, stop and step indices from the slice object slice,
|
|
23
|
+
# assuming a sequence of length length. Treats indices greater than length
|
|
24
|
+
# as errors.
|
|
25
|
+
#
|
|
26
|
+
# Returns 0 on success and -1 on error with no exception set (unless one
|
|
27
|
+
# of the indices was not None and failed to be converted to an integer,
|
|
28
|
+
# in which case -1 is returned with an exception set).
|
|
29
|
+
#
|
|
30
|
+
# You probably do not want to use this function.
|
|
31
|
+
#
|
|
32
|
+
# Changed in version 3.2: The parameter type for the slice parameter was
|
|
33
|
+
# PySliceObject* before.
|
|
34
|
+
|
|
35
|
+
int PySlice_GetIndicesEx(object slice, Py_ssize_t length,
|
|
36
|
+
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
|
|
37
|
+
Py_ssize_t *slicelength) except -1
|
|
38
|
+
#
|
|
39
|
+
# Usable replacement for PySlice_GetIndices(). Retrieve the start, stop, and step
|
|
40
|
+
# indices from the slice object slice assuming a sequence of length length, and
|
|
41
|
+
# store the length of the slice in slicelength. Out of bounds indices are clipped
|
|
42
|
+
# in a manner consistent with the handling of normal slices.
|
|
43
|
+
#
|
|
44
|
+
# Returns 0 on success and -1 on error with exception set.
|
|
45
|
+
#
|
|
46
|
+
# Changed in version 3.2: The parameter type for the slice parameter was
|
|
47
|
+
# PySliceObject* before.
|
|
48
|
+
|
|
49
|
+
int PySlice_Unpack(object slice, Py_ssize_t *start, Py_ssize_t *stop,
|
|
50
|
+
Py_ssize_t *step) except -1
|
|
51
|
+
# Extract the start, stop and step data members from a slice object as C
|
|
52
|
+
# integers. Silently reduce values larger than PY_SSIZE_T_MAX to
|
|
53
|
+
# PY_SSIZE_T_MAX, silently boost the start and stop values less than
|
|
54
|
+
# PY_SSIZE_T_MIN to PY_SSIZE_T_MIN, and silently boost the step values
|
|
55
|
+
# less than -PY_SSIZE_T_MAX to -PY_SSIZE_T_MAX.
|
|
56
|
+
|
|
57
|
+
# Return -1 on error, 0 on success.
|
|
58
|
+
|
|
59
|
+
# New in version 3.6.1.
|
|
60
|
+
|
|
61
|
+
Py_ssize_t PySlice_AdjustIndices(Py_ssize_t length, Py_ssize_t *start,
|
|
62
|
+
Py_ssize_t *stop, Py_ssize_t step)
|
|
63
|
+
# Adjust start/end slice indices assuming a sequence of the specified
|
|
64
|
+
# length. Out of bounds indices are clipped in a manner consistent with
|
|
65
|
+
# the handling of normal slices.
|
|
66
|
+
|
|
67
|
+
# Return the length of the slice. Always successful. Doesn’t call Python
|
|
68
|
+
# code.
|
|
69
|
+
|
|
70
|
+
# New in version 3.6.1.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cython implementation of (parts of) the standard library time module.
|
|
3
|
+
|
|
4
|
+
Note: On implementations that lack a C-API for monotonic/perfcounter clocks
|
|
5
|
+
(like PyPy), the fallback code uses the system clock which may return absolute
|
|
6
|
+
time values from a different value range, differing from those provided by
|
|
7
|
+
Python's "time" module.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from libc.stdint cimport int64_t
|
|
11
|
+
from cpython.exc cimport PyErr_SetFromErrno
|
|
12
|
+
|
|
13
|
+
cdef extern from *:
|
|
14
|
+
"""
|
|
15
|
+
#if PY_VERSION_HEX >= 0x030d00b1 || defined(PyTime_t)
|
|
16
|
+
#define __Pyx_PyTime_t PyTime_t
|
|
17
|
+
#else
|
|
18
|
+
#define __Pyx_PyTime_t _PyTime_t
|
|
19
|
+
#endif
|
|
20
|
+
|
|
21
|
+
#if PY_VERSION_HEX >= 0x030d00b1 || defined(PyTime_TimeRaw)
|
|
22
|
+
static CYTHON_INLINE __Pyx_PyTime_t __Pyx_PyTime_TimeRaw(void) {
|
|
23
|
+
__Pyx_PyTime_t tic;
|
|
24
|
+
(void) PyTime_TimeRaw(&tic);
|
|
25
|
+
return tic;
|
|
26
|
+
}
|
|
27
|
+
#else
|
|
28
|
+
#define __Pyx_PyTime_TimeRaw() _PyTime_GetSystemClock()
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
#if PY_VERSION_HEX >= 0x030d00b1 || defined(PyTime_MonotonicRaw)
|
|
32
|
+
static CYTHON_INLINE __Pyx_PyTime_t __Pyx_PyTime_MonotonicRaw(void) {
|
|
33
|
+
__Pyx_PyTime_t tic;
|
|
34
|
+
(void) PyTime_MonotonicRaw(&tic);
|
|
35
|
+
return tic;
|
|
36
|
+
}
|
|
37
|
+
#elif CYTHON_COMPILING_IN_PYPY && !defined(_PyTime_GetMonotonicClock)
|
|
38
|
+
#define __Pyx_PyTime_MonotonicRaw() _PyTime_GetSystemClock()
|
|
39
|
+
#else
|
|
40
|
+
#define __Pyx_PyTime_MonotonicRaw() _PyTime_GetMonotonicClock()
|
|
41
|
+
#endif
|
|
42
|
+
|
|
43
|
+
#if PY_VERSION_HEX >= 0x030d00b1 || defined(PyTime_PerfCounterRaw)
|
|
44
|
+
static CYTHON_INLINE __Pyx_PyTime_t __Pyx_PyTime_PerfCounterRaw(void) {
|
|
45
|
+
__Pyx_PyTime_t tic;
|
|
46
|
+
(void) PyTime_PerfCounterRaw(&tic);
|
|
47
|
+
return tic;
|
|
48
|
+
}
|
|
49
|
+
#elif CYTHON_COMPILING_IN_PYPY && !defined(_PyTime_GetPerfCounter)
|
|
50
|
+
#define __Pyx_PyTime_PerfCounterRaw() __Pyx_PyTime_MonotonicRaw()
|
|
51
|
+
#else
|
|
52
|
+
#define __Pyx_PyTime_PerfCounterRaw() _PyTime_GetPerfCounter()
|
|
53
|
+
#endif
|
|
54
|
+
|
|
55
|
+
#if PY_VERSION_HEX >= 0x030d00b1 || defined(PyTime_AsSecondsDouble)
|
|
56
|
+
#define __Pyx_PyTime_AsSecondsDouble(t) PyTime_AsSecondsDouble(t)
|
|
57
|
+
#else
|
|
58
|
+
#define __Pyx_PyTime_AsSecondsDouble(t) _PyTime_AsSecondsDouble(t)
|
|
59
|
+
#endif
|
|
60
|
+
"""
|
|
61
|
+
ctypedef int64_t PyTime_t "__Pyx_PyTime_t"
|
|
62
|
+
|
|
63
|
+
ctypedef PyTime_t _PyTime_t "__Pyx_PyTime_t" # legacy, use "PyTime_t" instead
|
|
64
|
+
PyTime_t PyTime_TimeUnchecked "__Pyx_PyTime_TimeRaw" () noexcept nogil # legacy, use "PyTime_TimeRaw" instead
|
|
65
|
+
|
|
66
|
+
PyTime_t PyTime_TimeRaw "__Pyx_PyTime_TimeRaw" () noexcept nogil
|
|
67
|
+
PyTime_t PyTime_MonotonicRaw "__Pyx_PyTime_MonotonicRaw" () noexcept nogil
|
|
68
|
+
PyTime_t PyTime_PerfCounterRaw "__Pyx_PyTime_PerfCounterRaw" () noexcept nogil
|
|
69
|
+
double PyTime_AsSecondsDouble "__Pyx_PyTime_AsSecondsDouble" (PyTime_t t) noexcept nogil
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
from libc.time cimport (
|
|
73
|
+
tm,
|
|
74
|
+
time_t,
|
|
75
|
+
localtime as libc_localtime,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
cdef inline double time() noexcept nogil:
|
|
80
|
+
cdef PyTime_t tic = PyTime_TimeRaw()
|
|
81
|
+
return PyTime_AsSecondsDouble(tic)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
cdef inline int64_t time_ns() noexcept nogil:
|
|
85
|
+
return <int64_t> PyTime_TimeRaw()
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
cdef inline double perf_counter() noexcept nogil:
|
|
89
|
+
cdef PyTime_t tic = PyTime_PerfCounterRaw()
|
|
90
|
+
return PyTime_AsSecondsDouble(tic)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
cdef inline int64_t perf_counter_ns() noexcept nogil:
|
|
94
|
+
return <int64_t> PyTime_PerfCounterRaw()
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
cdef inline double monotonic() noexcept nogil:
|
|
98
|
+
cdef PyTime_t tic = PyTime_MonotonicRaw()
|
|
99
|
+
return PyTime_AsSecondsDouble(tic)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
cdef inline int64_t monotonic_ns() noexcept nogil:
|
|
103
|
+
return <int64_t> PyTime_MonotonicRaw()
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
cdef inline int _raise_from_errno() except -1 with gil:
|
|
107
|
+
PyErr_SetFromErrno(RuntimeError)
|
|
108
|
+
return <int> -1 # Let the C compiler know that this function always raises.
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
cdef inline tm localtime() except * nogil:
|
|
112
|
+
"""
|
|
113
|
+
Analogue to the stdlib time.localtime. The returned struct
|
|
114
|
+
has some entries that the stdlib version does not: tm_gmtoff, tm_zone
|
|
115
|
+
"""
|
|
116
|
+
cdef:
|
|
117
|
+
time_t tic = <time_t>time()
|
|
118
|
+
tm* result
|
|
119
|
+
|
|
120
|
+
result = libc_localtime(&tic)
|
|
121
|
+
if result is NULL:
|
|
122
|
+
_raise_from_errno()
|
|
123
|
+
# Fix 0-based date values (and the 1900-based year).
|
|
124
|
+
# See tmtotuple() in https://github.com/python/cpython/blob/master/Modules/timemodule.c
|
|
125
|
+
result.tm_year += 1900
|
|
126
|
+
result.tm_mon += 1
|
|
127
|
+
result.tm_wday = <int> ((result.tm_wday + 6) % 7)
|
|
128
|
+
result.tm_yday += 1
|
|
129
|
+
return result[0]
|