Cython 3.3.0__cp315-cp315-win_amd64.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 +156 -0
- Cython/Build/Cache.py +199 -0
- Cython/Build/Cythonize.py +349 -0
- Cython/Build/Dependencies.py +1281 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +467 -0
- Cython/Build/IpythonMagic.py +559 -0
- Cython/Build/SharedModule.py +165 -0
- Cython/Build/Tests/TestCyCache.py +195 -0
- Cython/Build/Tests/TestCythonizeArgsParser.py +480 -0
- Cython/Build/Tests/TestDependencies.py +133 -0
- Cython/Build/Tests/TestInline.py +177 -0
- Cython/Build/Tests/TestIpythonMagic.py +303 -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 +825 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +328 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +679 -0
- Cython/Compiler/Builtin.py +1102 -0
- Cython/Compiler/CmdLine.py +373 -0
- Cython/Compiler/Code.cp315-win_amd64.pyd +0 -0
- Cython/Compiler/Code.pxd +154 -0
- Cython/Compiler/Code.py +3760 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +208 -0
- Cython/Compiler/Dataclass.py +890 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +310 -0
- Cython/Compiler/ExprNodes.py +16273 -0
- Cython/Compiler/FlowControl.cp315-win_amd64.pyd +0 -0
- Cython/Compiler/FlowControl.pxd +112 -0
- Cython/Compiler/FlowControl.py +1573 -0
- Cython/Compiler/FusedNode.cp315-win_amd64.pyd +0 -0
- Cython/Compiler/FusedNode.py +978 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +422 -0
- Cython/Compiler/LineTable.cp315-win_amd64.pyd +0 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/Main.py +856 -0
- Cython/Compiler/MatchCaseNodes.py +2200 -0
- Cython/Compiler/MemoryView.py +930 -0
- Cython/Compiler/ModuleNode.py +4548 -0
- Cython/Compiler/Naming.py +370 -0
- Cython/Compiler/Nodes.py +11304 -0
- Cython/Compiler/Optimize.py +5564 -0
- Cython/Compiler/Options.py +840 -0
- Cython/Compiler/ParseTreeTransforms.pxd +80 -0
- Cython/Compiler/ParseTreeTransforms.py +4808 -0
- Cython/Compiler/Parsing.cp315-win_amd64.pyd +0 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4809 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +6588 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.cp315-win_amd64.pyd +0 -0
- Cython/Compiler/Scanning.pxd +70 -0
- Cython/Compiler/Scanning.py +720 -0
- Cython/Compiler/StringEncoding.cp315-win_amd64.pyd +0 -0
- Cython/Compiler/StringEncoding.py +354 -0
- Cython/Compiler/Symtab.py +3121 -0
- Cython/Compiler/Tests/TestBuffer.py +105 -0
- Cython/Compiler/Tests/TestBuiltin.py +196 -0
- Cython/Compiler/Tests/TestCmdLine.py +652 -0
- Cython/Compiler/Tests/TestCode.py +145 -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 +132 -0
- Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
- Cython/Compiler/Tests/TestStringEncoding.py +20 -0
- Cython/Compiler/Tests/TestTreeFragment.py +63 -0
- Cython/Compiler/Tests/TestTreePath.py +103 -0
- Cython/Compiler/Tests/TestTypes.py +119 -0
- Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
- Cython/Compiler/Tests/TestVisitor.py +119 -0
- Cython/Compiler/Tests/Utils.py +36 -0
- Cython/Compiler/Tests/__init__.py +1 -0
- Cython/Compiler/TreeFragment.py +279 -0
- Cython/Compiler/TreePath.py +303 -0
- Cython/Compiler/TypeInference.py +611 -0
- Cython/Compiler/TypeSlots.py +1329 -0
- Cython/Compiler/UFuncs.py +317 -0
- Cython/Compiler/UtilNodes.py +389 -0
- Cython/Compiler/UtilityCode.py +354 -0
- Cython/Compiler/Version.py +8 -0
- Cython/Compiler/Visitor.cp315-win_amd64.pyd +0 -0
- Cython/Compiler/Visitor.pxd +52 -0
- Cython/Compiler/Visitor.py +914 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +214 -0
- Cython/Debugger/DebugWriter.py +82 -0
- Cython/Debugger/Tests/TestLibCython.py +280 -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 +580 -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 +143 -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 +152 -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 +268 -0
- Cython/Includes/cpython/exc.pxd +263 -0
- Cython/Includes/cpython/fileobject.pxd +57 -0
- Cython/Includes/cpython/float.pxd +56 -0
- Cython/Includes/cpython/frozendict.pxd +37 -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 +144 -0
- Cython/Includes/cpython/long.pxd +180 -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 +430 -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/sentinel.pxd +17 -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 +146 -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 +216 -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/LZSS.cp315-win_amd64.pyd +0 -0
- Cython/LZSS.py +184 -0
- Cython/Plex/Actions.cp315-win_amd64.pyd +0 -0
- Cython/Plex/Actions.pxd +24 -0
- Cython/Plex/Actions.py +119 -0
- Cython/Plex/DFA.cp315-win_amd64.pyd +0 -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.cp315-win_amd64.pyd +0 -0
- Cython/Plex/Machines.pxd +36 -0
- Cython/Plex/Machines.py +238 -0
- Cython/Plex/Regexps.py +535 -0
- Cython/Plex/Scanners.cp315-win_amd64.pyd +0 -0
- Cython/Plex/Scanners.pxd +45 -0
- Cython/Plex/Scanners.py +328 -0
- Cython/Plex/Transitions.cp315-win_amd64.pyd +0 -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.cp315-win_amd64.pyd +0 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +1174 -0
- Cython/StringIOTree.cp315-win_amd64.pyd +0 -0
- Cython/StringIOTree.py +169 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.cp315-win_amd64.pyd +0 -0
- Cython/Tempita/_tempita.py +1087 -0
- Cython/TestUtils.py +472 -0
- Cython/Tests/TestCodeWriter.py +128 -0
- Cython/Tests/TestCythonUtils.py +202 -0
- Cython/Tests/TestJediTyper.py +223 -0
- Cython/Tests/TestShadow.py +125 -0
- Cython/Tests/TestStringIOTree.py +68 -0
- Cython/Tests/TestTestUtils.py +89 -0
- Cython/Tests/__init__.py +1 -0
- Cython/Tests/xmlrunner.py +390 -0
- Cython/Utility/AsyncGen.c +1152 -0
- Cython/Utility/Buffer.c +866 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +1068 -0
- Cython/Utility/CConvert.pyx +153 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +244 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2344 -0
- Cython/Utility/CpdefEnums.pyx +119 -0
- Cython/Utility/CppConvert.pyx +282 -0
- Cython/Utility/CppSupport.cpp +151 -0
- Cython/Utility/CythonFunction.c +2185 -0
- Cython/Utility/Dataclasses.c +101 -0
- Cython/Utility/Embed.c +129 -0
- Cython/Utility/Exceptions.c +1331 -0
- Cython/Utility/Exceptions_Cy.pyx +109 -0
- Cython/Utility/ExtensionTypes.c +1199 -0
- Cython/Utility/FunctionArguments.c +1052 -0
- Cython/Utility/FusedFunction.pyx +44 -0
- Cython/Utility/ImportExport.c +972 -0
- Cython/Utility/MatchCase.c +981 -0
- Cython/Utility/MatchCase_Cy.pyx +12 -0
- Cython/Utility/MemoryView.pxd +108 -0
- Cython/Utility/MemoryView.pyx +1499 -0
- Cython/Utility/MemoryView_C.c +1056 -0
- Cython/Utility/ModuleSetupCode.c +3319 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3404 -0
- Cython/Utility/Optimize.c +2564 -0
- Cython/Utility/Overflow.c +378 -0
- Cython/Utility/Profile.c +736 -0
- Cython/Utility/StringTools.c +1534 -0
- Cython/Utility/Synchronization.c +438 -0
- Cython/Utility/TString.c +369 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1588 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +172 -0
- Cython/Utils.cp315-win_amd64.pyd +0 -0
- Cython/Utils.py +680 -0
- Cython/__init__.py +12 -0
- Cython/_shared.cp315-win_amd64.pyd +0 -0
- Cython/py.typed +0 -0
- cython-3.3.0.dist-info/METADATA +555 -0
- cython-3.3.0.dist-info/RECORD +339 -0
- cython-3.3.0.dist-info/WHEEL +5 -0
- cython-3.3.0.dist-info/entry_points.txt +4 -0
- cython-3.3.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,105 @@
|
|
|
1
|
+
from Cython.TestUtils import CythonTest
|
|
2
|
+
import Cython.Compiler.Errors as Errors
|
|
3
|
+
from Cython.Compiler.Nodes import *
|
|
4
|
+
from Cython.Compiler.ParseTreeTransforms import *
|
|
5
|
+
from Cython.Compiler.Buffer import *
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TestBufferParsing(CythonTest):
|
|
9
|
+
# First, we only test the raw parser, i.e.
|
|
10
|
+
# the number and contents of arguments are NOT checked.
|
|
11
|
+
# However "dtype"/the first positional argument is special-cased
|
|
12
|
+
# to parse a type argument rather than an expression
|
|
13
|
+
|
|
14
|
+
def parse(self, s):
|
|
15
|
+
return self.should_not_fail(lambda: self.fragment(s)).root
|
|
16
|
+
|
|
17
|
+
def not_parseable(self, expected_error, s):
|
|
18
|
+
e = self.should_fail(lambda: self.fragment(s), Errors.CompileError)
|
|
19
|
+
self.assertEqual(expected_error, e.message_only)
|
|
20
|
+
|
|
21
|
+
def test_basic(self):
|
|
22
|
+
t = self.parse("cdef object[float, 4, ndim=2, foo=foo] x")
|
|
23
|
+
bufnode = t.stats[0].base_type
|
|
24
|
+
self.assertTrue(isinstance(bufnode, TemplatedTypeNode))
|
|
25
|
+
self.assertEqual(2, len(bufnode.positional_args))
|
|
26
|
+
# print bufnode.dump()
|
|
27
|
+
# should put more here...
|
|
28
|
+
|
|
29
|
+
def test_type_pos(self):
|
|
30
|
+
self.parse("cdef object[short unsigned int, 3] x")
|
|
31
|
+
|
|
32
|
+
def test_type_keyword(self):
|
|
33
|
+
self.parse("cdef object[foo=foo, dtype=short unsigned int] x")
|
|
34
|
+
|
|
35
|
+
def test_pos_after_key(self):
|
|
36
|
+
self.not_parseable("Non-keyword arg following keyword arg",
|
|
37
|
+
"cdef object[foo=1, 2] x")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# See also tests/error/e_bufaccess.pyx and tets/run/bufaccess.pyx
|
|
41
|
+
# THESE TESTS ARE NOW DISABLED, the code they test was pretty much
|
|
42
|
+
# refactored away
|
|
43
|
+
class TestBufferOptions(CythonTest):
|
|
44
|
+
# Tests the full parsing of the options within the brackets
|
|
45
|
+
|
|
46
|
+
def nonfatal_error(self, error):
|
|
47
|
+
# We're passing self as context to transform to trap this
|
|
48
|
+
self.error = error
|
|
49
|
+
self.assertTrue(self.expect_error)
|
|
50
|
+
|
|
51
|
+
def parse_opts(self, opts, expect_error=False):
|
|
52
|
+
assert opts != ""
|
|
53
|
+
s = "def f():\n cdef object[%s] x" % opts
|
|
54
|
+
self.expect_error = expect_error
|
|
55
|
+
root = self.fragment(s, pipeline=[NormalizeTree(self), PostParse(self)]).root
|
|
56
|
+
if not expect_error:
|
|
57
|
+
vardef = root.stats[0].body.stats[0]
|
|
58
|
+
assert isinstance(vardef, CVarDefNode) # use normal assert as this is to validate the test code
|
|
59
|
+
buftype = vardef.base_type
|
|
60
|
+
self.assertTrue(isinstance(buftype, TemplatedTypeNode))
|
|
61
|
+
self.assertTrue(isinstance(buftype.base_type_node, CSimpleBaseTypeNode))
|
|
62
|
+
self.assertEqual("object", buftype.base_type_node.name)
|
|
63
|
+
return buftype
|
|
64
|
+
else:
|
|
65
|
+
self.assertTrue(len(root.stats[0].body.stats) == 0)
|
|
66
|
+
|
|
67
|
+
def non_parse(self, expected_err, opts):
|
|
68
|
+
self.parse_opts(opts, expect_error=True)
|
|
69
|
+
# e = self.should_fail(lambda: self.parse_opts(opts))
|
|
70
|
+
self.assertEqual(expected_err, self.error.message_only)
|
|
71
|
+
|
|
72
|
+
def __test_basic(self):
|
|
73
|
+
buf = self.parse_opts("unsigned short int, 3")
|
|
74
|
+
self.assertTrue(isinstance(buf.dtype_node, CSimpleBaseTypeNode))
|
|
75
|
+
self.assertTrue(buf.dtype_node.signed == 0 and buf.dtype_node.longness == -1)
|
|
76
|
+
self.assertEqual(3, buf.ndim)
|
|
77
|
+
|
|
78
|
+
def __test_dict(self):
|
|
79
|
+
buf = self.parse_opts("ndim=3, dtype=unsigned short int")
|
|
80
|
+
self.assertTrue(isinstance(buf.dtype_node, CSimpleBaseTypeNode))
|
|
81
|
+
self.assertTrue(buf.dtype_node.signed == 0 and buf.dtype_node.longness == -1)
|
|
82
|
+
self.assertEqual(3, buf.ndim)
|
|
83
|
+
|
|
84
|
+
def __test_ndim(self):
|
|
85
|
+
self.parse_opts("int, 2")
|
|
86
|
+
self.non_parse(ERR_BUF_NDIM, "int, 'a'")
|
|
87
|
+
self.non_parse(ERR_BUF_NDIM, "int, -34")
|
|
88
|
+
|
|
89
|
+
def __test_use_DEF(self):
|
|
90
|
+
t = self.fragment("""
|
|
91
|
+
DEF ndim = 3
|
|
92
|
+
def f():
|
|
93
|
+
cdef object[int, ndim] x
|
|
94
|
+
cdef object[ndim=ndim, dtype=int] y
|
|
95
|
+
""", pipeline=[NormalizeTree(self), PostParse(self)]).root
|
|
96
|
+
stats = t.stats[0].body.stats
|
|
97
|
+
self.assertTrue(stats[0].base_type.ndim == 3)
|
|
98
|
+
self.assertTrue(stats[1].base_type.ndim == 3)
|
|
99
|
+
|
|
100
|
+
# add exotic and impossible combinations as they come along...
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
if __name__ == '__main__':
|
|
104
|
+
import unittest
|
|
105
|
+
unittest.main()
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import builtins
|
|
2
|
+
import json
|
|
3
|
+
import subprocess
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
from .. import PyrexTypes
|
|
7
|
+
from ..Builtin import (
|
|
8
|
+
inferred_method_return_types, find_return_type_of_builtin_method,
|
|
9
|
+
unsafe_compile_time_methods, is_safe_compile_time_method,
|
|
10
|
+
builtin_scope, builtin_types,
|
|
11
|
+
)
|
|
12
|
+
from ..Symtab import ModuleScope
|
|
13
|
+
from ..PyrexTypes import (
|
|
14
|
+
py_object_type,
|
|
15
|
+
KNOWN_PYTHON_BUILTINS_VERSION, KNOWN_PYTHON_BUILTINS,
|
|
16
|
+
uncachable_builtins,
|
|
17
|
+
KNOWN_EXCEPTION_NAMES, exception_supertypes,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
from ...TestUtils import TimedTest
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TestBuiltinReturnTypes(TimedTest):
|
|
24
|
+
_min_versions = {
|
|
25
|
+
'frozendict': (3, 15, 0, 'alpha', 7),
|
|
26
|
+
'sentinel': (3, 15, 0, 'beta', 1),
|
|
27
|
+
}
|
|
28
|
+
_min_method_versions = {
|
|
29
|
+
'int.is_integer': (3, 12),
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
def test_find_return_type_of_builtin_method(self):
|
|
33
|
+
# It's enough to test the method existence in a recent Python that likely has them.
|
|
34
|
+
test_module_scope = ModuleScope('test', None, None)
|
|
35
|
+
|
|
36
|
+
for type_name in inferred_method_return_types:
|
|
37
|
+
builtin_type = builtin_scope.lookup(type_name).type
|
|
38
|
+
self._test_return_type_of_builtin_type(builtin_type, test_module_scope)
|
|
39
|
+
|
|
40
|
+
def test_find_return_type_of_builtin_method_specialised(self):
|
|
41
|
+
test_module_scope = ModuleScope('test', None, None)
|
|
42
|
+
|
|
43
|
+
pos = None
|
|
44
|
+
for type_name in inferred_method_return_types:
|
|
45
|
+
builtin_type = builtin_scope.lookup(type_name).type
|
|
46
|
+
if not builtin_type.supports_container_type:
|
|
47
|
+
continue
|
|
48
|
+
|
|
49
|
+
if type_name == 'tuple':
|
|
50
|
+
generic_test_types = [
|
|
51
|
+
# Avoid C tuples by using at least one Python object type.
|
|
52
|
+
[py_object_type],
|
|
53
|
+
[PyrexTypes.c_int_type, py_object_type],
|
|
54
|
+
[py_object_type, PyrexTypes.c_float_type],
|
|
55
|
+
[builtin_type, builtin_type, builtin_type, builtin_type],
|
|
56
|
+
]
|
|
57
|
+
elif type_name in ['dict', 'frozendict']:
|
|
58
|
+
generic_test_types = [
|
|
59
|
+
[PyrexTypes.c_float_type, PyrexTypes.c_int_type],
|
|
60
|
+
[PyrexTypes.c_int_type, py_object_type],
|
|
61
|
+
[py_object_type, py_object_type],
|
|
62
|
+
[builtin_type, builtin_type],
|
|
63
|
+
[py_object_type, builtin_type],
|
|
64
|
+
]
|
|
65
|
+
else:
|
|
66
|
+
generic_test_types = [
|
|
67
|
+
[PyrexTypes.c_float_type],
|
|
68
|
+
[PyrexTypes.c_int_type],
|
|
69
|
+
[py_object_type],
|
|
70
|
+
[builtin_type],
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
for subscript_types in generic_test_types:
|
|
74
|
+
builtin_type = builtin_type.specialize_here(pos, test_module_scope, subscript_types)
|
|
75
|
+
self._test_return_type_of_builtin_type(builtin_type, test_module_scope)
|
|
76
|
+
|
|
77
|
+
def _test_return_type_of_builtin_type(self, builtin_type, test_module_scope):
|
|
78
|
+
container_type = builtin_type.get_container_type() or builtin_type
|
|
79
|
+
methods = inferred_method_return_types[container_type.name]
|
|
80
|
+
type_name = container_type.name
|
|
81
|
+
|
|
82
|
+
py_version = sys.version_info
|
|
83
|
+
look_up_methods = py_version >= (3,10)
|
|
84
|
+
pos = py_type = None
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
py_type = getattr(builtins, type_name if type_name != 'unicode' else 'str')
|
|
88
|
+
except AttributeError:
|
|
89
|
+
if sys.version_info >= self._min_versions.get(type_name, ()):
|
|
90
|
+
raise
|
|
91
|
+
look_up_methods = False
|
|
92
|
+
|
|
93
|
+
current_subscript_types = builtin_type.subscripted_types if builtin_type.supports_container_type else []
|
|
94
|
+
|
|
95
|
+
def parse_subscripted_type(type_string):
|
|
96
|
+
if type_string == 'T':
|
|
97
|
+
return builtin_type
|
|
98
|
+
if type_string == 'I':
|
|
99
|
+
return current_subscript_types[-1] if current_subscript_types else py_object_type
|
|
100
|
+
if type_string == 'K':
|
|
101
|
+
return current_subscript_types[0] if current_subscript_types else py_object_type
|
|
102
|
+
if '[' in type_string:
|
|
103
|
+
origin_type_name, _, subscripted_type_names = type_string[:-1].partition('[')
|
|
104
|
+
subscripted_types = [
|
|
105
|
+
parse_subscripted_type(t)
|
|
106
|
+
for t in subscripted_type_names.split(',')
|
|
107
|
+
]
|
|
108
|
+
parsed_type = builtin_types[origin_type_name]
|
|
109
|
+
if current_subscript_types:
|
|
110
|
+
return parsed_type.specialize_here(pos, test_module_scope, subscripted_types)
|
|
111
|
+
return parsed_type
|
|
112
|
+
|
|
113
|
+
return builtin_types.get(type_string) or PyrexTypes.parse_basic_ctype(type_string)
|
|
114
|
+
|
|
115
|
+
for method_name, return_type_name in methods.items():
|
|
116
|
+
fq_method_name = f"{type_name}.{method_name}"
|
|
117
|
+
if look_up_methods and py_version >= self._min_method_versions.get(fq_method_name, py_version):
|
|
118
|
+
self.assertTrue(hasattr(py_type, method_name), fq_method_name)
|
|
119
|
+
|
|
120
|
+
actual_return_type = find_return_type_of_builtin_method(
|
|
121
|
+
pos, test_module_scope, builtin_type, method_name)
|
|
122
|
+
|
|
123
|
+
expected_return_type = parse_subscripted_type(return_type_name)
|
|
124
|
+
if actual_return_type.is_builtin_type:
|
|
125
|
+
self.assertEqual(actual_return_type.name, expected_return_type.name)
|
|
126
|
+
|
|
127
|
+
self.assertEqual(actual_return_type.empty_declaration_code(pyrex=True), expected_return_type.empty_declaration_code(pyrex=True))
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class TestBuiltinCompatibility(TimedTest):
|
|
131
|
+
def test_python_builtin_compatibility(self):
|
|
132
|
+
expected_builtins = set(KNOWN_PYTHON_BUILTINS)
|
|
133
|
+
if sys.platform != 'win32':
|
|
134
|
+
expected_builtins.discard("WindowsError")
|
|
135
|
+
|
|
136
|
+
# Read builtins from fresh Python process to prevent modifications by test dependencies.
|
|
137
|
+
output = subprocess.run(
|
|
138
|
+
[sys.executable, '-c', 'import builtins, json, sys; sys.stdout.write(json.dumps(dir(builtins)))'],
|
|
139
|
+
capture_output=True,
|
|
140
|
+
encoding='utf8',
|
|
141
|
+
)
|
|
142
|
+
runtime_builtins = frozenset(
|
|
143
|
+
name for name in json.loads(output.stdout)
|
|
144
|
+
if name not in ('__doc__', '__loader__', '__name__', '__package__', '__spec__'))
|
|
145
|
+
|
|
146
|
+
if sys.version_info < KNOWN_PYTHON_BUILTINS_VERSION:
|
|
147
|
+
missing_builtins = expected_builtins - runtime_builtins
|
|
148
|
+
if missing_builtins:
|
|
149
|
+
missing_from_uncachable = missing_builtins - set(uncachable_builtins)
|
|
150
|
+
self.assertSetEqual(missing_from_uncachable, set())
|
|
151
|
+
self.skipTest(f'skipping test, older Python release found. Missing builtins: {", ".join(sorted(missing_builtins))}')
|
|
152
|
+
self.skipTest('skipping test, older Python release found.')
|
|
153
|
+
self.assertSetEqual(runtime_builtins, expected_builtins)
|
|
154
|
+
|
|
155
|
+
def test_unsafe_compile_time_methods(self):
|
|
156
|
+
"""Validate the table of builtin methods that are not safe for compile time evaluation
|
|
157
|
+
against the table of known builtin methods (and their types).
|
|
158
|
+
"""
|
|
159
|
+
for builtin_type_name, unsafe_methods in unsafe_compile_time_methods.items():
|
|
160
|
+
self.assertIsInstance(unsafe_methods, set)
|
|
161
|
+
|
|
162
|
+
builtin_type = getattr(builtins, builtin_type_name) # All named types must exist as builtin types.
|
|
163
|
+
|
|
164
|
+
known_methods = sorted(
|
|
165
|
+
inferred_method_return_types[builtin_type_name]) # All types are also in "inferred_method_return_types".
|
|
166
|
+
|
|
167
|
+
self.assertFalse(unsafe_methods.difference(known_methods)) # Only known methods are listed.
|
|
168
|
+
|
|
169
|
+
for method_name in known_methods:
|
|
170
|
+
builtin_method = getattr(builtin_type, method_name, None)
|
|
171
|
+
if builtin_method is None:
|
|
172
|
+
self.assertIn(method_name, unsafe_methods) # Non-portable methods are always unsafe.
|
|
173
|
+
continue
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class TestExceptions(TimedTest):
|
|
177
|
+
def test_hierarchy_completeness(self):
|
|
178
|
+
self.assertSetEqual(KNOWN_EXCEPTION_NAMES, set(exception_supertypes.keys()))
|
|
179
|
+
self.assertFalse(KNOWN_EXCEPTION_NAMES - set(KNOWN_PYTHON_BUILTINS))
|
|
180
|
+
|
|
181
|
+
def test_parents(self):
|
|
182
|
+
for exc_name, supertype_names in exception_supertypes.items():
|
|
183
|
+
exc_type = getattr(builtins, exc_name, None)
|
|
184
|
+
if exc_type is None:
|
|
185
|
+
# Older Python version?
|
|
186
|
+
self.assertIn(exc_name, uncachable_builtins)
|
|
187
|
+
continue
|
|
188
|
+
|
|
189
|
+
for supertype_name in supertype_names:
|
|
190
|
+
supertype = getattr(builtins, supertype_name, None)
|
|
191
|
+
if supertype is None:
|
|
192
|
+
# Older Python version?
|
|
193
|
+
self.assertIn(supertype_name, uncachable_builtins)
|
|
194
|
+
continue
|
|
195
|
+
|
|
196
|
+
self.assertTrue(issubclass(exc_type, supertype), (exc_type, supertype))
|