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,344 @@
|
|
|
1
|
+
import Cython
|
|
2
|
+
from .TreeFragment import parse_from_strings, StringParseContext
|
|
3
|
+
from .Scanning import FileSourceDescriptor
|
|
4
|
+
from .Errors import CompileError
|
|
5
|
+
from . import Symtab
|
|
6
|
+
from . import Naming
|
|
7
|
+
from . import Code
|
|
8
|
+
from . import Options
|
|
9
|
+
|
|
10
|
+
import os.path
|
|
11
|
+
import re
|
|
12
|
+
import io
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class NonManglingModuleScope(Symtab.ModuleScope):
|
|
16
|
+
|
|
17
|
+
def __init__(self, prefix, *args, **kw):
|
|
18
|
+
self.prefix = prefix
|
|
19
|
+
self.cython_scope = None
|
|
20
|
+
self.cpp = kw.pop('cpp', False)
|
|
21
|
+
Symtab.ModuleScope.__init__(self, *args, **kw)
|
|
22
|
+
|
|
23
|
+
def add_imported_entry(self, name, entry, pos):
|
|
24
|
+
entry.used = True
|
|
25
|
+
return super().add_imported_entry(name, entry, pos)
|
|
26
|
+
|
|
27
|
+
def mangle(self, prefix, name=None):
|
|
28
|
+
if name:
|
|
29
|
+
if prefix in (Naming.typeobj_prefix, Naming.func_prefix, Naming.var_prefix, Naming.pyfunc_prefix):
|
|
30
|
+
# Functions, classes etc. gets a manually defined prefix easily
|
|
31
|
+
# manually callable instead (the one passed to CythonUtilityCode)
|
|
32
|
+
prefix = self.prefix
|
|
33
|
+
return "%s%s" % (prefix, name)
|
|
34
|
+
else:
|
|
35
|
+
return Symtab.ModuleScope.mangle(self, prefix)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class CythonUtilityCodeContext(StringParseContext):
|
|
39
|
+
scope = None
|
|
40
|
+
|
|
41
|
+
def find_module(self, module_name, from_module=None, pos=None, need_pxd=True, absolute_fallback=True, relative_import=False):
|
|
42
|
+
if from_module:
|
|
43
|
+
raise AssertionError("Relative imports not supported in utility code.")
|
|
44
|
+
if module_name != self.module_name:
|
|
45
|
+
if module_name not in self.modules:
|
|
46
|
+
raise AssertionError("Only the cython cimport is supported.")
|
|
47
|
+
else:
|
|
48
|
+
return self.modules[module_name]
|
|
49
|
+
|
|
50
|
+
if self.scope is None:
|
|
51
|
+
self.scope = NonManglingModuleScope(
|
|
52
|
+
self.prefix, module_name, parent_module=None, context=self, cpp=self.cpp)
|
|
53
|
+
|
|
54
|
+
return self.scope
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class CythonUtilityCode(Code.UtilityCodeBase):
|
|
58
|
+
"""
|
|
59
|
+
Utility code written in the Cython language itself.
|
|
60
|
+
|
|
61
|
+
The @cname decorator can set the cname for a function, method of cdef class.
|
|
62
|
+
Functions decorated with @cname('c_func_name') get the given cname.
|
|
63
|
+
|
|
64
|
+
For cdef classes the rules are as follows:
|
|
65
|
+
obj struct -> <cname>_obj
|
|
66
|
+
obj type ptr -> <cname>_type
|
|
67
|
+
methods -> <class_cname>_<method_cname>
|
|
68
|
+
|
|
69
|
+
For methods the cname decorator is optional, but without the decorator the
|
|
70
|
+
methods will not be prototyped. See Cython.Compiler.CythonScope and
|
|
71
|
+
tests/run/cythonscope.pyx for examples.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
is_cython_utility = True
|
|
75
|
+
|
|
76
|
+
def __init__(self, impl, name="__pyxutil", prefix="", requires=None,
|
|
77
|
+
file=None, from_scope=None, context=None, compiler_directives=None,
|
|
78
|
+
outer_module_scope=None):
|
|
79
|
+
# 1) We need to delay the parsing/processing, so that all modules can be
|
|
80
|
+
# imported without import loops
|
|
81
|
+
# 2) The same utility code object can be used for multiple source files;
|
|
82
|
+
# while the generated node trees can be altered in the compilation of a
|
|
83
|
+
# single file.
|
|
84
|
+
# Hence, delay any processing until later.
|
|
85
|
+
context_types = {}
|
|
86
|
+
if context is not None:
|
|
87
|
+
from .PyrexTypes import BaseType
|
|
88
|
+
for key, value in context.items():
|
|
89
|
+
if isinstance(value, BaseType):
|
|
90
|
+
context[key] = key
|
|
91
|
+
context_types[key] = value
|
|
92
|
+
impl = Code.sub_tempita(impl, context, file, name)
|
|
93
|
+
self.impl = impl
|
|
94
|
+
self.name = name
|
|
95
|
+
self.file = file
|
|
96
|
+
self.prefix = prefix
|
|
97
|
+
self.requires = requires or []
|
|
98
|
+
self.from_scope = from_scope
|
|
99
|
+
self.outer_module_scope = outer_module_scope
|
|
100
|
+
self.compiler_directives = compiler_directives
|
|
101
|
+
self.context_types = context_types
|
|
102
|
+
|
|
103
|
+
def __eq__(self, other):
|
|
104
|
+
if isinstance(other, CythonUtilityCode):
|
|
105
|
+
return self._equality_params() == other._equality_params()
|
|
106
|
+
else:
|
|
107
|
+
return False
|
|
108
|
+
|
|
109
|
+
def _equality_params(self):
|
|
110
|
+
outer_scope = self.outer_module_scope
|
|
111
|
+
while isinstance(outer_scope, NonManglingModuleScope):
|
|
112
|
+
outer_scope = outer_scope.outer_scope
|
|
113
|
+
return self.impl, outer_scope, self.compiler_directives
|
|
114
|
+
|
|
115
|
+
def __hash__(self):
|
|
116
|
+
return hash(self.impl)
|
|
117
|
+
|
|
118
|
+
def get_tree(self, entries_only=False, cython_scope=None):
|
|
119
|
+
from .AnalysedTreeTransforms import AutoTestDictTransform
|
|
120
|
+
# The AutoTestDictTransform creates the statement "__test__ = {}",
|
|
121
|
+
# which when copied into the main ModuleNode overwrites
|
|
122
|
+
# any __test__ in user code; not desired
|
|
123
|
+
excludes = [AutoTestDictTransform]
|
|
124
|
+
|
|
125
|
+
from . import Pipeline, ParseTreeTransforms
|
|
126
|
+
context = CythonUtilityCodeContext(
|
|
127
|
+
self.name, compiler_directives=self.compiler_directives,
|
|
128
|
+
cpp=cython_scope.is_cpp() if cython_scope else False)
|
|
129
|
+
context.prefix = self.prefix
|
|
130
|
+
context.cython_scope = cython_scope
|
|
131
|
+
#context = StringParseContext(self.name)
|
|
132
|
+
tree = parse_from_strings(
|
|
133
|
+
self.name, self.impl, context=context, allow_struct_enum_decorator=True,
|
|
134
|
+
in_utility_code=True)
|
|
135
|
+
pipeline = Pipeline.create_pipeline(context, 'pyx', exclude_classes=excludes)
|
|
136
|
+
|
|
137
|
+
if entries_only:
|
|
138
|
+
p = []
|
|
139
|
+
for t in pipeline:
|
|
140
|
+
p.append(t)
|
|
141
|
+
if isinstance(t, ParseTreeTransforms.AnalyseDeclarationsTransform):
|
|
142
|
+
break
|
|
143
|
+
|
|
144
|
+
pipeline = p
|
|
145
|
+
|
|
146
|
+
transform = ParseTreeTransforms.CnameDirectivesTransform(context)
|
|
147
|
+
# InterpretCompilerDirectives already does a cdef declarator check
|
|
148
|
+
#before = ParseTreeTransforms.DecoratorTransform
|
|
149
|
+
before = ParseTreeTransforms.InterpretCompilerDirectives
|
|
150
|
+
pipeline = Pipeline.insert_into_pipeline(pipeline, transform,
|
|
151
|
+
before=before)
|
|
152
|
+
|
|
153
|
+
def merge_scope(scope):
|
|
154
|
+
def merge_scope_transform(module_node):
|
|
155
|
+
module_node.scope.merge_in(scope)
|
|
156
|
+
return module_node
|
|
157
|
+
return merge_scope_transform
|
|
158
|
+
|
|
159
|
+
if self.from_scope:
|
|
160
|
+
pipeline = Pipeline.insert_into_pipeline(
|
|
161
|
+
pipeline, merge_scope(self.from_scope),
|
|
162
|
+
before=ParseTreeTransforms.AnalyseDeclarationsTransform)
|
|
163
|
+
|
|
164
|
+
for dep in self.requires:
|
|
165
|
+
if isinstance(dep, CythonUtilityCode) and hasattr(dep, 'tree') and not cython_scope:
|
|
166
|
+
pipeline = Pipeline.insert_into_pipeline(
|
|
167
|
+
pipeline, merge_scope(dep.tree.scope),
|
|
168
|
+
before=ParseTreeTransforms.AnalyseDeclarationsTransform)
|
|
169
|
+
|
|
170
|
+
if self.outer_module_scope:
|
|
171
|
+
# inject outer module between utility code module and builtin module
|
|
172
|
+
def scope_transform(module_node):
|
|
173
|
+
module_node.scope.outer_scope = self.outer_module_scope
|
|
174
|
+
return module_node
|
|
175
|
+
|
|
176
|
+
pipeline = Pipeline.insert_into_pipeline(
|
|
177
|
+
pipeline, scope_transform,
|
|
178
|
+
before=ParseTreeTransforms.AnalyseDeclarationsTransform)
|
|
179
|
+
|
|
180
|
+
if self.context_types:
|
|
181
|
+
# inject types into module scope
|
|
182
|
+
def scope_transform(module_node):
|
|
183
|
+
dummy_entry = object()
|
|
184
|
+
for name, type in self.context_types.items():
|
|
185
|
+
# Restore the old type entry after declaring the type.
|
|
186
|
+
# We need to access types in the scope, but this shouldn't alter the entry
|
|
187
|
+
# that is visible from everywhere else
|
|
188
|
+
old_type_entry = getattr(type, "entry", dummy_entry)
|
|
189
|
+
entry = module_node.scope.declare_type(name, type, None, visibility='extern')
|
|
190
|
+
if old_type_entry is not dummy_entry:
|
|
191
|
+
type.entry = old_type_entry
|
|
192
|
+
entry.in_cinclude = True
|
|
193
|
+
return module_node
|
|
194
|
+
|
|
195
|
+
pipeline = Pipeline.insert_into_pipeline(
|
|
196
|
+
pipeline, scope_transform,
|
|
197
|
+
before=ParseTreeTransforms.AnalyseDeclarationsTransform)
|
|
198
|
+
|
|
199
|
+
(err, tree) = Pipeline.run_pipeline(pipeline, tree, printtree=False)
|
|
200
|
+
assert not err, err
|
|
201
|
+
self.tree = tree
|
|
202
|
+
return tree
|
|
203
|
+
|
|
204
|
+
def put_code(self, output):
|
|
205
|
+
pass
|
|
206
|
+
|
|
207
|
+
@classmethod
|
|
208
|
+
def load(cls, util_code_name, from_file, **kwargs):
|
|
209
|
+
if re.search("[.]c(pp)?::", util_code_name):
|
|
210
|
+
# We're trying to load a C/C++ utility code.
|
|
211
|
+
# For now, just handle the simple case with no tempita
|
|
212
|
+
return Code.UtilityCode.load_cached(util_code_name, from_file)
|
|
213
|
+
return super().load(util_code_name, from_file, **kwargs)
|
|
214
|
+
|
|
215
|
+
@classmethod
|
|
216
|
+
def load_as_string(cls, util_code_name, from_file=None, **kwargs):
|
|
217
|
+
"""
|
|
218
|
+
Load a utility code as a string. Returns (proto, implementation)
|
|
219
|
+
"""
|
|
220
|
+
util = cls.load(util_code_name, from_file, **kwargs)
|
|
221
|
+
return util.proto, util.impl # keep line numbers => no lstrip()
|
|
222
|
+
|
|
223
|
+
def declare_in_scope(self, dest_scope, used=False, cython_scope=None,
|
|
224
|
+
allowlist=None):
|
|
225
|
+
"""
|
|
226
|
+
Declare all entries from the utility code in dest_scope. Code will only
|
|
227
|
+
be included for used entries. If module_name is given, declare the
|
|
228
|
+
type entries with that name.
|
|
229
|
+
"""
|
|
230
|
+
tree = self.get_tree(entries_only=True, cython_scope=cython_scope)
|
|
231
|
+
|
|
232
|
+
entries = tree.scope.entries
|
|
233
|
+
entries.pop('__name__')
|
|
234
|
+
entries.pop('__file__')
|
|
235
|
+
entries.pop('__builtins__')
|
|
236
|
+
entries.pop('__doc__')
|
|
237
|
+
|
|
238
|
+
for entry in entries.values():
|
|
239
|
+
entry.utility_code_definition = self
|
|
240
|
+
entry.used = used
|
|
241
|
+
|
|
242
|
+
original_scope = tree.scope
|
|
243
|
+
dest_scope.merge_in(original_scope, merge_unused=True, allowlist=allowlist)
|
|
244
|
+
tree.scope = dest_scope
|
|
245
|
+
|
|
246
|
+
for dep in self.requires:
|
|
247
|
+
if dep.is_cython_utility:
|
|
248
|
+
dep.declare_in_scope(dest_scope, cython_scope=cython_scope)
|
|
249
|
+
|
|
250
|
+
return original_scope
|
|
251
|
+
|
|
252
|
+
@staticmethod
|
|
253
|
+
def filter_inherited_directives(current_directives):
|
|
254
|
+
"""
|
|
255
|
+
Cython utility code should usually only pick up a few directives from the
|
|
256
|
+
environment (those that intentionally control its function) and ignore most
|
|
257
|
+
other compiler directives. This function provides a sensible default list
|
|
258
|
+
of directives to copy.
|
|
259
|
+
"""
|
|
260
|
+
from .Options import _directive_defaults
|
|
261
|
+
utility_code_directives = dict(_directive_defaults)
|
|
262
|
+
inherited_directive_names = (
|
|
263
|
+
'binding', 'always_allow_keywords', 'allow_none_for_extension_args',
|
|
264
|
+
'auto_pickle', 'ccomplex',
|
|
265
|
+
'c_string_type', 'c_string_encoding',
|
|
266
|
+
'optimize.inline_defnode_calls', 'optimize.unpack_method_calls',
|
|
267
|
+
'optimize.unpack_method_calls_in_pyinit', 'optimize.use_switch')
|
|
268
|
+
for name in inherited_directive_names:
|
|
269
|
+
if name in current_directives:
|
|
270
|
+
utility_code_directives[name] = current_directives[name]
|
|
271
|
+
return utility_code_directives
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
class TemplatedFileSourceDescriptor(FileSourceDescriptor):
|
|
275
|
+
|
|
276
|
+
def __init__(self, filename, path_description, context):
|
|
277
|
+
super().__init__(filename, path_description)
|
|
278
|
+
self._context = context
|
|
279
|
+
|
|
280
|
+
def get_file_object(self, encoding=None, error_handling=None):
|
|
281
|
+
with super().get_file_object(encoding, error_handling) as f:
|
|
282
|
+
data = f.read()
|
|
283
|
+
ret = Code.sub_tempita(data, self._context, self.filename)
|
|
284
|
+
# We need stream to have .encoding attribute set
|
|
285
|
+
stream = io.TextIOWrapper(io.BytesIO(ret.encode(f.encoding)), encoding=f.encoding, errors=error_handling)
|
|
286
|
+
return stream
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
class CythonSharedUtilityCode(Code.AbstractUtilityCode):
|
|
290
|
+
def __init__(self, pxd_name, shared_utility_qualified_name, template_context, requires):
|
|
291
|
+
self._pxd_name = pxd_name
|
|
292
|
+
self._shared_utility_qualified_name = shared_utility_qualified_name
|
|
293
|
+
self.template_context = template_context
|
|
294
|
+
self.requires = requires
|
|
295
|
+
self._shared_library_scope = None
|
|
296
|
+
|
|
297
|
+
def find_module(self, context):
|
|
298
|
+
scope = context
|
|
299
|
+
for name, is_package in scope._split_qualified_name(self._shared_utility_qualified_name, relative_import=False):
|
|
300
|
+
scope = scope.find_submodule(name, as_package=is_package)
|
|
301
|
+
|
|
302
|
+
pxd_pathname = os.path.join(
|
|
303
|
+
os.path.split(Cython.__file__)[0],
|
|
304
|
+
'Utility',
|
|
305
|
+
self._pxd_name
|
|
306
|
+
)
|
|
307
|
+
try:
|
|
308
|
+
rel_path = self._shared_utility_qualified_name.replace('.', os.sep) + os.path.splitext(pxd_pathname)[1]
|
|
309
|
+
source_desc = TemplatedFileSourceDescriptor(pxd_pathname, rel_path, self.template_context)
|
|
310
|
+
source_desc.in_utility_code = True
|
|
311
|
+
err, result = context.process_pxd(source_desc, scope, self._shared_utility_qualified_name)
|
|
312
|
+
(pxd_codenodes, pxd_scope) = result
|
|
313
|
+
context.utility_pxds[self._pxd_name] = (pxd_codenodes, pxd_scope)
|
|
314
|
+
scope.pxd_file_loaded = True
|
|
315
|
+
if err:
|
|
316
|
+
raise err
|
|
317
|
+
except CompileError:
|
|
318
|
+
pass
|
|
319
|
+
return scope
|
|
320
|
+
|
|
321
|
+
def declare_in_scope(self, dest_scope, used=False, cython_scope=None,
|
|
322
|
+
allowlist=None):
|
|
323
|
+
if self._pxd_name not in cython_scope.context.utility_pxds:
|
|
324
|
+
self._shared_library_scope = self.find_module(cython_scope.context)
|
|
325
|
+
for dep in self.requires:
|
|
326
|
+
if dep.is_cython_utility:
|
|
327
|
+
dep.declare_in_scope(scope, cython_scope=cython_scope)
|
|
328
|
+
for e in self._shared_library_scope.c_class_entries:
|
|
329
|
+
dest_scope.add_imported_entry(e.name, e, e.pos)
|
|
330
|
+
return dest_scope
|
|
331
|
+
|
|
332
|
+
def get_shared_library_scope(self, cython_scope):
|
|
333
|
+
if self._pxd_name not in cython_scope.context.utility_pxds:
|
|
334
|
+
self._shared_library_scope = self.find_module(cython_scope.context)
|
|
335
|
+
return self._shared_library_scope
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def declare_declarations_in_scope(declaration_string, env, private_type=True,
|
|
339
|
+
*args, **kwargs):
|
|
340
|
+
"""
|
|
341
|
+
Declare some declarations given as Cython code in declaration_string
|
|
342
|
+
in scope env.
|
|
343
|
+
"""
|
|
344
|
+
CythonUtilityCode(declaration_string, *args, **kwargs).declare_in_scope(env)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
cimport cython
|
|
2
|
+
|
|
3
|
+
cdef class TreeVisitor:
|
|
4
|
+
cdef public list access_path
|
|
5
|
+
cdef dict dispatch_table
|
|
6
|
+
|
|
7
|
+
cpdef visit(self, obj)
|
|
8
|
+
cdef _visit(self, obj)
|
|
9
|
+
cdef find_handler(self, obj)
|
|
10
|
+
cdef _visitchild(self, child, parent, attrname, idx)
|
|
11
|
+
cdef dict _visitchildren(self, parent, attrs, exclude)
|
|
12
|
+
cpdef visitchildren(self, parent, attrs=*, exclude=*)
|
|
13
|
+
cdef _raise_compiler_error(self, child, e)
|
|
14
|
+
|
|
15
|
+
cdef class VisitorTransform(TreeVisitor):
|
|
16
|
+
cdef dict _process_children(self, parent, attrs=*, exclude=*)
|
|
17
|
+
cpdef visitchildren(self, parent, attrs=*, exclude=*)
|
|
18
|
+
cdef list _flatten_list(self, list orig_list)
|
|
19
|
+
cpdef visitchild(self, parent, str attr, idx=*)
|
|
20
|
+
|
|
21
|
+
cdef class CythonTransform(VisitorTransform):
|
|
22
|
+
cdef public context
|
|
23
|
+
cdef public current_directives
|
|
24
|
+
|
|
25
|
+
cdef class ScopeTrackingTransform(CythonTransform):
|
|
26
|
+
cdef public scope_type
|
|
27
|
+
cdef public scope_node
|
|
28
|
+
cdef visit_scope(self, node, scope_type)
|
|
29
|
+
|
|
30
|
+
cdef class EnvTransform(CythonTransform):
|
|
31
|
+
cdef public list env_stack
|
|
32
|
+
|
|
33
|
+
cdef class MethodDispatcherTransform(EnvTransform):
|
|
34
|
+
@cython.final
|
|
35
|
+
cdef _visit_binop_node(self, node)
|
|
36
|
+
@cython.final
|
|
37
|
+
cdef _find_handler(self, match_name, bint has_kwargs)
|
|
38
|
+
@cython.final
|
|
39
|
+
cdef _delegate_to_assigned_value(self, node, function, arg_list, kwargs)
|
|
40
|
+
@cython.final
|
|
41
|
+
cdef _dispatch_to_handler(self, node, function, arg_list, kwargs)
|
|
42
|
+
@cython.final
|
|
43
|
+
cdef _dispatch_to_method_handler(self, attr_name, self_arg,
|
|
44
|
+
is_unbound_method, type_name,
|
|
45
|
+
node, function, arg_list, kwargs)
|
|
46
|
+
|
|
47
|
+
cdef class RecursiveNodeReplacer(VisitorTransform):
|
|
48
|
+
cdef public orig_node
|
|
49
|
+
cdef public new_node
|
|
50
|
+
|
|
51
|
+
cdef class NodeFinder(TreeVisitor):
|
|
52
|
+
cdef node
|
|
53
|
+
cdef public bint found
|