numba-cuda 0.22.0__cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.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.
Potentially problematic release.
This version of numba-cuda might be problematic. Click here for more details.
- _numba_cuda_redirector.pth +4 -0
- _numba_cuda_redirector.py +89 -0
- numba_cuda/VERSION +1 -0
- numba_cuda/__init__.py +6 -0
- numba_cuda/_version.py +11 -0
- numba_cuda/numba/cuda/__init__.py +70 -0
- numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
- numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
- numba_cuda/numba/cuda/api.py +580 -0
- numba_cuda/numba/cuda/api_util.py +76 -0
- numba_cuda/numba/cuda/args.py +72 -0
- numba_cuda/numba/cuda/bf16.py +397 -0
- numba_cuda/numba/cuda/cache_hints.py +287 -0
- numba_cuda/numba/cuda/cext/__init__.py +2 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
- numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
- numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
- numba_cuda/numba/cuda/cext/_helperlib.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
- numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
- numba_cuda/numba/cuda/cext/_typeof.h +19 -0
- numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
- numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
- numba_cuda/numba/cuda/cext/mviewbuf.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
- numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
- numba_cuda/numba/cuda/cg.py +67 -0
- numba_cuda/numba/cuda/cgutils.py +1294 -0
- numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
- numba_cuda/numba/cuda/codegen.py +541 -0
- numba_cuda/numba/cuda/compiler.py +1396 -0
- numba_cuda/numba/cuda/core/analysis.py +758 -0
- numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
- numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
- numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
- numba_cuda/numba/cuda/core/base.py +1332 -0
- numba_cuda/numba/cuda/core/boxing.py +1411 -0
- numba_cuda/numba/cuda/core/bytecode.py +728 -0
- numba_cuda/numba/cuda/core/byteflow.py +2346 -0
- numba_cuda/numba/cuda/core/caching.py +744 -0
- numba_cuda/numba/cuda/core/callconv.py +392 -0
- numba_cuda/numba/cuda/core/codegen.py +171 -0
- numba_cuda/numba/cuda/core/compiler.py +199 -0
- numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
- numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
- numba_cuda/numba/cuda/core/config.py +650 -0
- numba_cuda/numba/cuda/core/consts.py +124 -0
- numba_cuda/numba/cuda/core/controlflow.py +989 -0
- numba_cuda/numba/cuda/core/entrypoints.py +57 -0
- numba_cuda/numba/cuda/core/environment.py +66 -0
- numba_cuda/numba/cuda/core/errors.py +917 -0
- numba_cuda/numba/cuda/core/event.py +511 -0
- numba_cuda/numba/cuda/core/funcdesc.py +330 -0
- numba_cuda/numba/cuda/core/generators.py +387 -0
- numba_cuda/numba/cuda/core/imputils.py +509 -0
- numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
- numba_cuda/numba/cuda/core/interpreter.py +3617 -0
- numba_cuda/numba/cuda/core/ir.py +1812 -0
- numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
- numba_cuda/numba/cuda/core/optional.py +129 -0
- numba_cuda/numba/cuda/core/options.py +262 -0
- numba_cuda/numba/cuda/core/postproc.py +249 -0
- numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
- numba_cuda/numba/cuda/core/registry.py +46 -0
- numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
- numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
- numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
- numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
- numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
- numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
- numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
- numba_cuda/numba/cuda/core/sigutils.py +68 -0
- numba_cuda/numba/cuda/core/ssa.py +498 -0
- numba_cuda/numba/cuda/core/targetconfig.py +330 -0
- numba_cuda/numba/cuda/core/tracing.py +231 -0
- numba_cuda/numba/cuda/core/transforms.py +956 -0
- numba_cuda/numba/cuda/core/typed_passes.py +867 -0
- numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
- numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
- numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
- numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
- numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
- numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
- numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
- numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
- numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
- numba_cuda/numba/cuda/cpython/iterators.py +167 -0
- numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
- numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
- numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
- numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
- numba_cuda/numba/cuda/cpython/slicing.py +322 -0
- numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
- numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
- numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
- numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
- numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
- numba_cuda/numba/cuda/cuda_paths.py +691 -0
- numba_cuda/numba/cuda/cudadecl.py +543 -0
- numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
- numba_cuda/numba/cuda/cudadrv/devicearray.py +954 -0
- numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
- numba_cuda/numba/cuda/cudadrv/driver.py +3238 -0
- numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
- numba_cuda/numba/cuda/cudadrv/dummyarray.py +562 -0
- numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
- numba_cuda/numba/cuda/cudadrv/error.py +48 -0
- numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
- numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
- numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
- numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
- numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
- numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
- numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
- numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
- numba_cuda/numba/cuda/cudaimpl.py +983 -0
- numba_cuda/numba/cuda/cudamath.py +149 -0
- numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
- numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
- numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
- numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
- numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
- numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
- numba_cuda/numba/cuda/datamodel/manager.py +11 -0
- numba_cuda/numba/cuda/datamodel/models.py +9 -0
- numba_cuda/numba/cuda/datamodel/packer.py +9 -0
- numba_cuda/numba/cuda/datamodel/registry.py +11 -0
- numba_cuda/numba/cuda/datamodel/testing.py +11 -0
- numba_cuda/numba/cuda/debuginfo.py +997 -0
- numba_cuda/numba/cuda/decorators.py +294 -0
- numba_cuda/numba/cuda/descriptor.py +35 -0
- numba_cuda/numba/cuda/device_init.py +155 -0
- numba_cuda/numba/cuda/deviceufunc.py +1021 -0
- numba_cuda/numba/cuda/dispatcher.py +2463 -0
- numba_cuda/numba/cuda/errors.py +72 -0
- numba_cuda/numba/cuda/extending.py +697 -0
- numba_cuda/numba/cuda/flags.py +178 -0
- numba_cuda/numba/cuda/fp16.py +357 -0
- numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
- numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
- numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
- numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
- numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
- numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
- numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
- numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
- numba_cuda/numba/cuda/initialize.py +24 -0
- numba_cuda/numba/cuda/intrinsics.py +531 -0
- numba_cuda/numba/cuda/itanium_mangler.py +214 -0
- numba_cuda/numba/cuda/kernels/__init__.py +2 -0
- numba_cuda/numba/cuda/kernels/reduction.py +265 -0
- numba_cuda/numba/cuda/kernels/transpose.py +65 -0
- numba_cuda/numba/cuda/libdevice.py +3386 -0
- numba_cuda/numba/cuda/libdevicedecl.py +20 -0
- numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
- numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
- numba_cuda/numba/cuda/locks.py +19 -0
- numba_cuda/numba/cuda/lowering.py +1980 -0
- numba_cuda/numba/cuda/mathimpl.py +374 -0
- numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
- numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
- numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
- numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
- numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
- numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
- numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
- numba_cuda/numba/cuda/misc/appdirs.py +594 -0
- numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
- numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
- numba_cuda/numba/cuda/misc/dump_style.py +41 -0
- numba_cuda/numba/cuda/misc/findlib.py +75 -0
- numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
- numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
- numba_cuda/numba/cuda/misc/literal.py +28 -0
- numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
- numba_cuda/numba/cuda/misc/special.py +94 -0
- numba_cuda/numba/cuda/models.py +56 -0
- numba_cuda/numba/cuda/np/arraymath.py +5130 -0
- numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
- numba_cuda/numba/cuda/np/extensions.py +11 -0
- numba_cuda/numba/cuda/np/linalg.py +3087 -0
- numba_cuda/numba/cuda/np/math/__init__.py +0 -0
- numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
- numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
- numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
- numba_cuda/numba/cuda/np/npdatetime.py +969 -0
- numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
- numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
- numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
- numba_cuda/numba/cuda/np/numpy_support.py +798 -0
- numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
- numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
- numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
- numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
- numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
- numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
- numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
- numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
- numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
- numba_cuda/numba/cuda/nvvmutils.py +254 -0
- numba_cuda/numba/cuda/printimpl.py +126 -0
- numba_cuda/numba/cuda/random.py +308 -0
- numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
- numba_cuda/numba/cuda/serialize.py +267 -0
- numba_cuda/numba/cuda/simulator/__init__.py +63 -0
- numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
- numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
- numba_cuda/numba/cuda/simulator/api.py +179 -0
- numba_cuda/numba/cuda/simulator/bf16.py +4 -0
- numba_cuda/numba/cuda/simulator/compiler.py +38 -0
- numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
- numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
- numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
- numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
- numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
- numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
- numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
- numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
- numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
- numba_cuda/numba/cuda/simulator/kernel.py +320 -0
- numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
- numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
- numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
- numba_cuda/numba/cuda/simulator/reduction.py +19 -0
- numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
- numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
- numba_cuda/numba/cuda/simulator_init.py +18 -0
- numba_cuda/numba/cuda/stubs.py +624 -0
- numba_cuda/numba/cuda/target.py +505 -0
- numba_cuda/numba/cuda/testing.py +347 -0
- numba_cuda/numba/cuda/tests/__init__.py +62 -0
- numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
- numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
- numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
- numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
- numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
- numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
- numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +191 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +200 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
- numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
- numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
- numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
- numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
- numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
- numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
- numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
- numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
- numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
- numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
- numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
- numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
- numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
- numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
- numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
- numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
- numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
- numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
- numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
- numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +978 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
- numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
- numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
- numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
- numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
- numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
- numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
- numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
- numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
- numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
- numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
- numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
- numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
- numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
- numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
- numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
- numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
- numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
- numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
- numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
- numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
- numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
- numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
- numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
- numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
- numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
- numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
- numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
- numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
- numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
- numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
- numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
- numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
- numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
- numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
- numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
- numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
- numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
- numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
- numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
- numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
- numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +446 -0
- numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
- numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
- numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
- numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
- numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
- numba_cuda/numba/cuda/tests/data/error.cu +12 -0
- numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
- numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
- numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
- numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
- numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
- numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +452 -0
- numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
- numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
- numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
- numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
- numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
- numba_cuda/numba/cuda/tests/support.py +900 -0
- numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
- numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
- numba_cuda/numba/cuda/typeconv/rules.py +63 -0
- numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
- numba_cuda/numba/cuda/types/__init__.py +233 -0
- numba_cuda/numba/cuda/types/__init__.pyi +167 -0
- numba_cuda/numba/cuda/types/abstract.py +9 -0
- numba_cuda/numba/cuda/types/common.py +9 -0
- numba_cuda/numba/cuda/types/containers.py +9 -0
- numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
- numba_cuda/numba/cuda/types/cuda_common.py +110 -0
- numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
- numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
- numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
- numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
- numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
- numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
- numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
- numba_cuda/numba/cuda/types/ext_types.py +101 -0
- numba_cuda/numba/cuda/types/function_type.py +11 -0
- numba_cuda/numba/cuda/types/functions.py +9 -0
- numba_cuda/numba/cuda/types/iterators.py +9 -0
- numba_cuda/numba/cuda/types/misc.py +9 -0
- numba_cuda/numba/cuda/types/npytypes.py +9 -0
- numba_cuda/numba/cuda/types/scalars.py +9 -0
- numba_cuda/numba/cuda/typing/__init__.py +19 -0
- numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
- numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
- numba_cuda/numba/cuda/typing/bufproto.py +70 -0
- numba_cuda/numba/cuda/typing/builtins.py +1209 -0
- numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
- numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
- numba_cuda/numba/cuda/typing/collections.py +138 -0
- numba_cuda/numba/cuda/typing/context.py +782 -0
- numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
- numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
- numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
- numba_cuda/numba/cuda/typing/listdecl.py +147 -0
- numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
- numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
- numba_cuda/numba/cuda/typing/npydecl.py +749 -0
- numba_cuda/numba/cuda/typing/setdecl.py +115 -0
- numba_cuda/numba/cuda/typing/templates.py +1446 -0
- numba_cuda/numba/cuda/typing/typeof.py +301 -0
- numba_cuda/numba/cuda/ufuncs.py +746 -0
- numba_cuda/numba/cuda/utils.py +724 -0
- numba_cuda/numba/cuda/vector_types.py +214 -0
- numba_cuda/numba/cuda/vectorizers.py +260 -0
- numba_cuda-0.22.0.dist-info/METADATA +109 -0
- numba_cuda-0.22.0.dist-info/RECORD +487 -0
- numba_cuda-0.22.0.dist-info/WHEEL +6 -0
- numba_cuda-0.22.0.dist-info/licenses/LICENSE +26 -0
- numba_cuda-0.22.0.dist-info/licenses/LICENSE.numba +24 -0
- numba_cuda-0.22.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1218 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
"""Implements operations on bytes and str (unicode) array items."""
|
|
5
|
+
|
|
6
|
+
import operator
|
|
7
|
+
import numpy as np
|
|
8
|
+
from llvmlite import ir
|
|
9
|
+
|
|
10
|
+
from numba.cuda import types
|
|
11
|
+
from numba.cuda import cgutils
|
|
12
|
+
from numba.cuda.extending import (
|
|
13
|
+
overload,
|
|
14
|
+
overload_method,
|
|
15
|
+
register_jitable,
|
|
16
|
+
intrinsic,
|
|
17
|
+
)
|
|
18
|
+
from numba.cuda.core.imputils import Registry
|
|
19
|
+
from numba.cuda.cgutils import is_nonelike
|
|
20
|
+
from numba.cuda.cpython import unicode
|
|
21
|
+
|
|
22
|
+
registry = Registry("charseq")
|
|
23
|
+
lower = registry.lower
|
|
24
|
+
lower_cast = registry.lower_cast
|
|
25
|
+
|
|
26
|
+
# bytes and str arrays items are of type CharSeq and UnicodeCharSeq,
|
|
27
|
+
# respectively. See numpy/types/npytypes.py for CharSeq,
|
|
28
|
+
# UnicodeCharSeq definitions. The corresponding data models are
|
|
29
|
+
# defined in numpy/datamodel/models.py. Boxing/unboxing of item types
|
|
30
|
+
# are defined in numpy/targets/boxing.py, see box_unicodecharseq,
|
|
31
|
+
# unbox_unicodecharseq, box_charseq, unbox_charseq.
|
|
32
|
+
|
|
33
|
+
s1_dtype = np.dtype("S1")
|
|
34
|
+
assert s1_dtype.itemsize == 1
|
|
35
|
+
bytes_type = types.Bytes(types.uint8, 1, "C", readonly=True)
|
|
36
|
+
|
|
37
|
+
# Currently, NumPy supports only UTF-32 arrays but this may change in
|
|
38
|
+
# future and the approach used here for supporting str arrays may need
|
|
39
|
+
# a revision depending on how NumPy will support UTF-8 and UTF-16
|
|
40
|
+
# arrays.
|
|
41
|
+
u1_dtype = np.dtype("U1")
|
|
42
|
+
unicode_byte_width = u1_dtype.itemsize
|
|
43
|
+
unicode_uint = {1: np.uint8, 2: np.uint16, 4: np.uint32}[unicode_byte_width]
|
|
44
|
+
unicode_kind = {
|
|
45
|
+
1: unicode.PY_UNICODE_1BYTE_KIND,
|
|
46
|
+
2: unicode.PY_UNICODE_2BYTE_KIND,
|
|
47
|
+
4: unicode.PY_UNICODE_4BYTE_KIND,
|
|
48
|
+
}[unicode_byte_width]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# this is modified version of numba.unicode.make_deref_codegen
|
|
52
|
+
def make_deref_codegen(bitsize):
|
|
53
|
+
def codegen(context, builder, signature, args):
|
|
54
|
+
data, idx = args
|
|
55
|
+
rawptr = cgutils.alloca_once_value(builder, value=data)
|
|
56
|
+
ptr = builder.bitcast(rawptr, ir.IntType(bitsize).as_pointer())
|
|
57
|
+
ch = builder.load(builder.gep(ptr, [idx]))
|
|
58
|
+
return builder.zext(ch, ir.IntType(32))
|
|
59
|
+
|
|
60
|
+
return codegen
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@intrinsic
|
|
64
|
+
def deref_uint8(typingctx, data, offset):
|
|
65
|
+
sig = types.uint32(data, types.intp)
|
|
66
|
+
return sig, make_deref_codegen(8)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@intrinsic
|
|
70
|
+
def deref_uint16(typingctx, data, offset):
|
|
71
|
+
sig = types.uint32(data, types.intp)
|
|
72
|
+
return sig, make_deref_codegen(16)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@intrinsic
|
|
76
|
+
def deref_uint32(typingctx, data, offset):
|
|
77
|
+
sig = types.uint32(data, types.intp)
|
|
78
|
+
return sig, make_deref_codegen(32)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@register_jitable(_nrt=False)
|
|
82
|
+
def charseq_get_code(a, i):
|
|
83
|
+
"""Access i-th item of CharSeq object via code value"""
|
|
84
|
+
return deref_uint8(a, i)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@register_jitable
|
|
88
|
+
def charseq_get_value(a, i):
|
|
89
|
+
"""Access i-th item of CharSeq object via code value.
|
|
90
|
+
|
|
91
|
+
null code is interpreted as IndexError
|
|
92
|
+
"""
|
|
93
|
+
code = charseq_get_code(a, i)
|
|
94
|
+
if code == 0:
|
|
95
|
+
raise IndexError("index out of range")
|
|
96
|
+
return code
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@register_jitable(_nrt=False)
|
|
100
|
+
def unicode_charseq_get_code(a, i):
|
|
101
|
+
"""Access i-th item of UnicodeCharSeq object via code value"""
|
|
102
|
+
if unicode_byte_width == 4:
|
|
103
|
+
return deref_uint32(a, i)
|
|
104
|
+
elif unicode_byte_width == 2:
|
|
105
|
+
return deref_uint16(a, i)
|
|
106
|
+
elif unicode_byte_width == 1:
|
|
107
|
+
return deref_uint8(a, i)
|
|
108
|
+
else:
|
|
109
|
+
raise NotImplementedError(
|
|
110
|
+
"unicode_charseq_get_code: unicode_byte_width not in [1, 2, 4]"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@register_jitable
|
|
115
|
+
def unicode_get_code(a, i):
|
|
116
|
+
"""Access i-th item of UnicodeType object."""
|
|
117
|
+
return unicode._get_code_point(a, i)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@register_jitable
|
|
121
|
+
def bytes_get_code(a, i):
|
|
122
|
+
"""Access i-th item of Bytes object."""
|
|
123
|
+
return a[i]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _get_code_impl(a):
|
|
127
|
+
if isinstance(a, types.CharSeq):
|
|
128
|
+
return charseq_get_code
|
|
129
|
+
elif isinstance(a, types.Bytes):
|
|
130
|
+
return bytes_get_code
|
|
131
|
+
elif isinstance(a, types.UnicodeCharSeq):
|
|
132
|
+
return unicode_charseq_get_code
|
|
133
|
+
elif isinstance(a, types.UnicodeType):
|
|
134
|
+
return unicode_get_code
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _same_kind(a, b):
|
|
138
|
+
for t in [
|
|
139
|
+
(types.CharSeq, types.Bytes),
|
|
140
|
+
(types.UnicodeCharSeq, types.UnicodeType),
|
|
141
|
+
]:
|
|
142
|
+
if isinstance(a, t) and isinstance(b, t):
|
|
143
|
+
return True
|
|
144
|
+
return False
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _is_bytes(a):
|
|
148
|
+
return isinstance(a, (types.CharSeq, types.Bytes))
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def is_default(x, default):
|
|
152
|
+
return x == default or isinstance(x, types.Omitted)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
@register_jitable
|
|
156
|
+
def unicode_charseq_get_value(a, i):
|
|
157
|
+
"""Access i-th item of UnicodeCharSeq object via unicode value
|
|
158
|
+
|
|
159
|
+
null code is interpreted as IndexError
|
|
160
|
+
"""
|
|
161
|
+
code = unicode_charseq_get_code(a, i)
|
|
162
|
+
if code == 0:
|
|
163
|
+
raise IndexError("index out of range")
|
|
164
|
+
# Return numpy equivalent of `chr(code)`
|
|
165
|
+
return np.array(code, unicode_uint).view(u1_dtype)[()]
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
#
|
|
169
|
+
# CAST
|
|
170
|
+
#
|
|
171
|
+
# Currently, the following casting operations are supported:
|
|
172
|
+
# Bytes -> CharSeq (ex: a=np.array(b'abc'); a[()] = b'123')
|
|
173
|
+
# UnicodeType -> UnicodeCharSeq (ex: a=np.array('abc'); a[()] = '123')
|
|
174
|
+
# CharSeq -> Bytes (ex: a=np.array(b'abc'); b = bytes(a[()]))
|
|
175
|
+
# UnicodeType -> Bytes (ex: str('123')._to_bytes())
|
|
176
|
+
#
|
|
177
|
+
# The following casting operations can be implemented when required:
|
|
178
|
+
# Bytes -> UnicodeCharSeq (ex: a=np.array('abc'); a[()] = b'123')
|
|
179
|
+
# UnicodeType -> CharSeq (ex: a=np.array(b'abc'); a[()] = '123')
|
|
180
|
+
# UnicodeType -> Bytes (ex: bytes('123', 'utf8'))
|
|
181
|
+
#
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
@lower_cast(types.Bytes, types.CharSeq)
|
|
185
|
+
def bytes_to_charseq(context, builder, fromty, toty, val):
|
|
186
|
+
barr = cgutils.create_struct_proxy(fromty)(context, builder, value=val)
|
|
187
|
+
src = builder.bitcast(barr.data, ir.IntType(8).as_pointer())
|
|
188
|
+
src_length = barr.nitems
|
|
189
|
+
|
|
190
|
+
lty = context.get_value_type(toty)
|
|
191
|
+
dstint_t = ir.IntType(8)
|
|
192
|
+
dst_ptr = cgutils.alloca_once(builder, lty)
|
|
193
|
+
dst = builder.bitcast(dst_ptr, dstint_t.as_pointer())
|
|
194
|
+
|
|
195
|
+
dst_length = ir.Constant(src_length.type, toty.count)
|
|
196
|
+
is_shorter_value = builder.icmp_unsigned("<", src_length, dst_length)
|
|
197
|
+
count = builder.select(is_shorter_value, src_length, dst_length)
|
|
198
|
+
with builder.if_then(is_shorter_value):
|
|
199
|
+
cgutils.memset(
|
|
200
|
+
builder, dst, ir.Constant(src_length.type, toty.count), 0
|
|
201
|
+
)
|
|
202
|
+
with cgutils.for_range(builder, count) as loop:
|
|
203
|
+
in_ptr = builder.gep(src, [loop.index])
|
|
204
|
+
in_val = builder.zext(builder.load(in_ptr), dstint_t)
|
|
205
|
+
builder.store(in_val, builder.gep(dst, [loop.index]))
|
|
206
|
+
|
|
207
|
+
return builder.load(dst_ptr)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _make_constant_bytes(context, builder, nbytes):
|
|
211
|
+
bstr_ctor = cgutils.create_struct_proxy(bytes_type)
|
|
212
|
+
bstr = bstr_ctor(context, builder)
|
|
213
|
+
|
|
214
|
+
if isinstance(nbytes, int):
|
|
215
|
+
nbytes = ir.Constant(bstr.nitems.type, nbytes)
|
|
216
|
+
|
|
217
|
+
bstr.meminfo = context.nrt.meminfo_alloc(builder, nbytes)
|
|
218
|
+
bstr.nitems = nbytes
|
|
219
|
+
bstr.itemsize = ir.Constant(bstr.itemsize.type, 1)
|
|
220
|
+
bstr.data = context.nrt.meminfo_data(builder, bstr.meminfo)
|
|
221
|
+
bstr.parent = cgutils.get_null_value(bstr.parent.type)
|
|
222
|
+
# bstr.shape and bstr.strides are not used
|
|
223
|
+
bstr.shape = cgutils.get_null_value(bstr.shape.type)
|
|
224
|
+
bstr.strides = cgutils.get_null_value(bstr.strides.type)
|
|
225
|
+
return bstr
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
@lower_cast(types.CharSeq, types.Bytes)
|
|
229
|
+
def charseq_to_bytes(context, builder, fromty, toty, val):
|
|
230
|
+
bstr = _make_constant_bytes(context, builder, val.type.count)
|
|
231
|
+
rawptr = cgutils.alloca_once_value(builder, value=val)
|
|
232
|
+
ptr = builder.bitcast(rawptr, bstr.data.type)
|
|
233
|
+
cgutils.memcpy(builder, bstr.data, ptr, bstr.nitems)
|
|
234
|
+
return bstr
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
@lower_cast(types.UnicodeType, types.Bytes)
|
|
238
|
+
def unicode_to_bytes_cast(context, builder, fromty, toty, val):
|
|
239
|
+
uni_str = cgutils.create_struct_proxy(fromty)(context, builder, value=val)
|
|
240
|
+
src1 = builder.bitcast(uni_str.data, ir.IntType(8).as_pointer())
|
|
241
|
+
notkind1 = builder.icmp_unsigned(
|
|
242
|
+
"!=", uni_str.kind, ir.Constant(uni_str.kind.type, 1)
|
|
243
|
+
)
|
|
244
|
+
src_length = uni_str.length
|
|
245
|
+
|
|
246
|
+
with builder.if_then(notkind1):
|
|
247
|
+
context.call_conv.return_user_exc(
|
|
248
|
+
builder,
|
|
249
|
+
ValueError,
|
|
250
|
+
("cannot cast higher than 8-bit unicode_type to bytes",),
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
bstr = _make_constant_bytes(context, builder, src_length)
|
|
254
|
+
cgutils.memcpy(builder, bstr.data, src1, bstr.nitems)
|
|
255
|
+
return bstr
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
@intrinsic
|
|
259
|
+
def _unicode_to_bytes(typingctx, s):
|
|
260
|
+
# used in _to_bytes method
|
|
261
|
+
assert s == types.unicode_type
|
|
262
|
+
sig = bytes_type(s)
|
|
263
|
+
|
|
264
|
+
def codegen(context, builder, signature, args):
|
|
265
|
+
return unicode_to_bytes_cast(
|
|
266
|
+
context, builder, s, bytes_type, args[0]
|
|
267
|
+
)._getvalue()
|
|
268
|
+
|
|
269
|
+
return sig, codegen
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
@lower_cast(types.UnicodeType, types.UnicodeCharSeq)
|
|
273
|
+
def unicode_to_unicode_charseq(context, builder, fromty, toty, val):
|
|
274
|
+
uni_str = cgutils.create_struct_proxy(fromty)(context, builder, value=val)
|
|
275
|
+
src1 = builder.bitcast(uni_str.data, ir.IntType(8).as_pointer())
|
|
276
|
+
src2 = builder.bitcast(uni_str.data, ir.IntType(16).as_pointer())
|
|
277
|
+
src4 = builder.bitcast(uni_str.data, ir.IntType(32).as_pointer())
|
|
278
|
+
kind1 = builder.icmp_unsigned(
|
|
279
|
+
"==", uni_str.kind, ir.Constant(uni_str.kind.type, 1)
|
|
280
|
+
)
|
|
281
|
+
kind2 = builder.icmp_unsigned(
|
|
282
|
+
"==", uni_str.kind, ir.Constant(uni_str.kind.type, 2)
|
|
283
|
+
)
|
|
284
|
+
kind4 = builder.icmp_unsigned(
|
|
285
|
+
"==", uni_str.kind, ir.Constant(uni_str.kind.type, 4)
|
|
286
|
+
)
|
|
287
|
+
src_length = uni_str.length
|
|
288
|
+
|
|
289
|
+
lty = context.get_value_type(toty)
|
|
290
|
+
dstint_t = ir.IntType(8 * unicode_byte_width)
|
|
291
|
+
dst_ptr = cgutils.alloca_once(builder, lty)
|
|
292
|
+
dst = builder.bitcast(dst_ptr, dstint_t.as_pointer())
|
|
293
|
+
|
|
294
|
+
dst_length = ir.Constant(src_length.type, toty.count)
|
|
295
|
+
is_shorter_value = builder.icmp_unsigned("<", src_length, dst_length)
|
|
296
|
+
count = builder.select(is_shorter_value, src_length, dst_length)
|
|
297
|
+
with builder.if_then(is_shorter_value):
|
|
298
|
+
cgutils.memset(
|
|
299
|
+
builder,
|
|
300
|
+
dst,
|
|
301
|
+
ir.Constant(src_length.type, toty.count * unicode_byte_width),
|
|
302
|
+
0,
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
with builder.if_then(kind1):
|
|
306
|
+
with cgutils.for_range(builder, count) as loop:
|
|
307
|
+
in_ptr = builder.gep(src1, [loop.index])
|
|
308
|
+
in_val = builder.zext(builder.load(in_ptr), dstint_t)
|
|
309
|
+
builder.store(in_val, builder.gep(dst, [loop.index]))
|
|
310
|
+
|
|
311
|
+
with builder.if_then(kind2):
|
|
312
|
+
if unicode_byte_width >= 2:
|
|
313
|
+
with cgutils.for_range(builder, count) as loop:
|
|
314
|
+
in_ptr = builder.gep(src2, [loop.index])
|
|
315
|
+
in_val = builder.zext(builder.load(in_ptr), dstint_t)
|
|
316
|
+
builder.store(in_val, builder.gep(dst, [loop.index]))
|
|
317
|
+
else:
|
|
318
|
+
context.call_conv.return_user_exc(
|
|
319
|
+
builder,
|
|
320
|
+
ValueError,
|
|
321
|
+
(
|
|
322
|
+
"cannot cast 16-bit unicode_type to %s-bit %s"
|
|
323
|
+
% (unicode_byte_width * 8, toty)
|
|
324
|
+
),
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
with builder.if_then(kind4):
|
|
328
|
+
if unicode_byte_width >= 4:
|
|
329
|
+
with cgutils.for_range(builder, count) as loop:
|
|
330
|
+
in_ptr = builder.gep(src4, [loop.index])
|
|
331
|
+
in_val = builder.zext(builder.load(in_ptr), dstint_t)
|
|
332
|
+
builder.store(in_val, builder.gep(dst, [loop.index]))
|
|
333
|
+
else:
|
|
334
|
+
context.call_conv.return_user_exc(
|
|
335
|
+
builder,
|
|
336
|
+
ValueError,
|
|
337
|
+
(
|
|
338
|
+
"cannot cast 32-bit unicode_type to %s-bit %s"
|
|
339
|
+
% (unicode_byte_width * 8, toty)
|
|
340
|
+
),
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
return builder.load(dst_ptr)
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
#
|
|
347
|
+
# Operations on bytes/str array items
|
|
348
|
+
#
|
|
349
|
+
# Implementation note: while some operations need
|
|
350
|
+
# CharSeq/UnicodeCharSeq specific implementations (getitem, len, str,
|
|
351
|
+
# etc), many operations can be supported by casting
|
|
352
|
+
# CharSeq/UnicodeCharSeq objects to Bytes/UnicodeType objects and
|
|
353
|
+
# re-use existing operations.
|
|
354
|
+
#
|
|
355
|
+
# However, in numba more operations are implemented for UnicodeType
|
|
356
|
+
# than for Bytes objects, hence the support for operations with bytes
|
|
357
|
+
# array items will be less complete than for str arrays. Although, in
|
|
358
|
+
# some cases (hash, contains, etc) the UnicodeType implementations can
|
|
359
|
+
# be reused for Bytes objects via using `_to_str` method.
|
|
360
|
+
#
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
@overload(operator.getitem)
|
|
364
|
+
def charseq_getitem(s, i):
|
|
365
|
+
get_value = None
|
|
366
|
+
if isinstance(i, types.Integer):
|
|
367
|
+
if isinstance(s, types.CharSeq):
|
|
368
|
+
get_value = charseq_get_value
|
|
369
|
+
if isinstance(s, types.UnicodeCharSeq):
|
|
370
|
+
get_value = unicode_charseq_get_value
|
|
371
|
+
if get_value is not None:
|
|
372
|
+
max_i = s.count
|
|
373
|
+
msg = "index out of range [0, %s]" % (max_i - 1)
|
|
374
|
+
|
|
375
|
+
def getitem_impl(s, i):
|
|
376
|
+
if i < max_i and i >= 0:
|
|
377
|
+
return get_value(s, i)
|
|
378
|
+
raise IndexError(msg)
|
|
379
|
+
|
|
380
|
+
return getitem_impl
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
@overload(len)
|
|
384
|
+
def charseq_len(s):
|
|
385
|
+
if isinstance(s, (types.CharSeq, types.UnicodeCharSeq)):
|
|
386
|
+
get_code = _get_code_impl(s)
|
|
387
|
+
n = s.count
|
|
388
|
+
if n == 0:
|
|
389
|
+
|
|
390
|
+
def len_impl(s):
|
|
391
|
+
return 0
|
|
392
|
+
|
|
393
|
+
return len_impl
|
|
394
|
+
else:
|
|
395
|
+
|
|
396
|
+
def len_impl(s):
|
|
397
|
+
# return the index of the last non-null value (numpy
|
|
398
|
+
# behavior)
|
|
399
|
+
i = n
|
|
400
|
+
code = 0
|
|
401
|
+
while code == 0:
|
|
402
|
+
i = i - 1
|
|
403
|
+
if i < 0:
|
|
404
|
+
break
|
|
405
|
+
code = get_code(s, i)
|
|
406
|
+
return i + 1
|
|
407
|
+
|
|
408
|
+
return len_impl
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
@overload(operator.add)
|
|
412
|
+
@overload(operator.iadd)
|
|
413
|
+
def charseq_concat(a, b):
|
|
414
|
+
if not _same_kind(a, b):
|
|
415
|
+
return
|
|
416
|
+
if isinstance(a, types.UnicodeCharSeq) and isinstance(b, types.UnicodeType):
|
|
417
|
+
|
|
418
|
+
def impl(a, b):
|
|
419
|
+
return str(a) + b
|
|
420
|
+
|
|
421
|
+
return impl
|
|
422
|
+
if isinstance(b, types.UnicodeCharSeq) and isinstance(a, types.UnicodeType):
|
|
423
|
+
|
|
424
|
+
def impl(a, b):
|
|
425
|
+
return a + str(b)
|
|
426
|
+
|
|
427
|
+
return impl
|
|
428
|
+
if isinstance(a, types.UnicodeCharSeq) and isinstance(
|
|
429
|
+
b, types.UnicodeCharSeq
|
|
430
|
+
):
|
|
431
|
+
|
|
432
|
+
def impl(a, b):
|
|
433
|
+
return str(a) + str(b)
|
|
434
|
+
|
|
435
|
+
return impl
|
|
436
|
+
if isinstance(a, (types.CharSeq, types.Bytes)) and isinstance(
|
|
437
|
+
b, (types.CharSeq, types.Bytes)
|
|
438
|
+
):
|
|
439
|
+
|
|
440
|
+
def impl(a, b):
|
|
441
|
+
return (a._to_str() + b._to_str())._to_bytes()
|
|
442
|
+
|
|
443
|
+
return impl
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
@overload(operator.mul)
|
|
447
|
+
def charseq_repeat(a, b):
|
|
448
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
449
|
+
|
|
450
|
+
def wrap(a, b):
|
|
451
|
+
return str(a) * b
|
|
452
|
+
|
|
453
|
+
return wrap
|
|
454
|
+
if isinstance(b, types.UnicodeCharSeq):
|
|
455
|
+
|
|
456
|
+
def wrap(a, b):
|
|
457
|
+
return a * str(b)
|
|
458
|
+
|
|
459
|
+
return wrap
|
|
460
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
461
|
+
|
|
462
|
+
def wrap(a, b):
|
|
463
|
+
return (a._to_str() * b)._to_bytes()
|
|
464
|
+
|
|
465
|
+
return wrap
|
|
466
|
+
if isinstance(b, (types.CharSeq, types.Bytes)):
|
|
467
|
+
|
|
468
|
+
def wrap(a, b):
|
|
469
|
+
return (a * b._to_str())._to_bytes()
|
|
470
|
+
|
|
471
|
+
return wrap
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
@overload(operator.not_)
|
|
475
|
+
def charseq_not(a):
|
|
476
|
+
if isinstance(a, (types.UnicodeCharSeq, types.CharSeq, types.Bytes)):
|
|
477
|
+
|
|
478
|
+
def impl(a):
|
|
479
|
+
return len(a) == 0
|
|
480
|
+
|
|
481
|
+
return impl
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
@overload(operator.eq)
|
|
485
|
+
def charseq_eq(a, b):
|
|
486
|
+
if not _same_kind(a, b):
|
|
487
|
+
return
|
|
488
|
+
left_code = _get_code_impl(a)
|
|
489
|
+
right_code = _get_code_impl(b)
|
|
490
|
+
if left_code is not None and right_code is not None:
|
|
491
|
+
|
|
492
|
+
def eq_impl(a, b):
|
|
493
|
+
n = len(a)
|
|
494
|
+
if n != len(b):
|
|
495
|
+
return False
|
|
496
|
+
for i in range(n):
|
|
497
|
+
if left_code(a, i) != right_code(b, i):
|
|
498
|
+
return False
|
|
499
|
+
return True
|
|
500
|
+
|
|
501
|
+
return eq_impl
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
@overload(operator.ne)
|
|
505
|
+
def charseq_ne(a, b):
|
|
506
|
+
if not _same_kind(a, b):
|
|
507
|
+
return
|
|
508
|
+
left_code = _get_code_impl(a)
|
|
509
|
+
right_code = _get_code_impl(b)
|
|
510
|
+
if left_code is not None and right_code is not None:
|
|
511
|
+
|
|
512
|
+
def ne_impl(a, b):
|
|
513
|
+
return not (a == b)
|
|
514
|
+
|
|
515
|
+
return ne_impl
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
@overload(operator.lt)
|
|
519
|
+
def charseq_lt(a, b):
|
|
520
|
+
if not _same_kind(a, b):
|
|
521
|
+
return
|
|
522
|
+
left_code = _get_code_impl(a)
|
|
523
|
+
right_code = _get_code_impl(b)
|
|
524
|
+
if left_code is not None and right_code is not None:
|
|
525
|
+
|
|
526
|
+
def lt_impl(a, b):
|
|
527
|
+
na = len(a)
|
|
528
|
+
nb = len(b)
|
|
529
|
+
n = min(na, nb)
|
|
530
|
+
for i in range(n):
|
|
531
|
+
ca, cb = left_code(a, i), right_code(b, i)
|
|
532
|
+
if ca != cb:
|
|
533
|
+
return ca < cb
|
|
534
|
+
return na < nb
|
|
535
|
+
|
|
536
|
+
return lt_impl
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
@overload(operator.gt)
|
|
540
|
+
def charseq_gt(a, b):
|
|
541
|
+
if not _same_kind(a, b):
|
|
542
|
+
return
|
|
543
|
+
left_code = _get_code_impl(a)
|
|
544
|
+
right_code = _get_code_impl(b)
|
|
545
|
+
if left_code is not None and right_code is not None:
|
|
546
|
+
|
|
547
|
+
def gt_impl(a, b):
|
|
548
|
+
return b < a
|
|
549
|
+
|
|
550
|
+
return gt_impl
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
@overload(operator.le)
|
|
554
|
+
def charseq_le(a, b):
|
|
555
|
+
if not _same_kind(a, b):
|
|
556
|
+
return
|
|
557
|
+
left_code = _get_code_impl(a)
|
|
558
|
+
right_code = _get_code_impl(b)
|
|
559
|
+
if left_code is not None and right_code is not None:
|
|
560
|
+
|
|
561
|
+
def le_impl(a, b):
|
|
562
|
+
return not (a > b)
|
|
563
|
+
|
|
564
|
+
return le_impl
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
@overload(operator.ge)
|
|
568
|
+
def charseq_ge(a, b):
|
|
569
|
+
if not _same_kind(a, b):
|
|
570
|
+
return
|
|
571
|
+
left_code = _get_code_impl(a)
|
|
572
|
+
right_code = _get_code_impl(b)
|
|
573
|
+
if left_code is not None and right_code is not None:
|
|
574
|
+
|
|
575
|
+
def ge_impl(a, b):
|
|
576
|
+
return not (a < b)
|
|
577
|
+
|
|
578
|
+
return ge_impl
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
@overload(operator.contains)
|
|
582
|
+
def charseq_contains(a, b):
|
|
583
|
+
if not _same_kind(a, b):
|
|
584
|
+
return
|
|
585
|
+
left_code = _get_code_impl(a)
|
|
586
|
+
right_code = _get_code_impl(b)
|
|
587
|
+
if left_code is not None and right_code is not None:
|
|
588
|
+
if _is_bytes(a):
|
|
589
|
+
|
|
590
|
+
def contains_impl(a, b):
|
|
591
|
+
# Ideally, `return bytes(b) in bytes(a)` would be used
|
|
592
|
+
# here, but numba Bytes does not implement
|
|
593
|
+
# contains. So, using `unicode_type` implementation
|
|
594
|
+
# here:
|
|
595
|
+
return b._to_str() in a._to_str()
|
|
596
|
+
else:
|
|
597
|
+
|
|
598
|
+
def contains_impl(a, b):
|
|
599
|
+
return str(b) in str(a)
|
|
600
|
+
|
|
601
|
+
return contains_impl
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
@overload_method(types.UnicodeCharSeq, "isascii")
|
|
605
|
+
@overload_method(types.CharSeq, "isascii")
|
|
606
|
+
@overload_method(types.Bytes, "isascii")
|
|
607
|
+
def charseq_isascii(s):
|
|
608
|
+
get_code = _get_code_impl(s)
|
|
609
|
+
|
|
610
|
+
def impl(s):
|
|
611
|
+
for i in range(len(s)):
|
|
612
|
+
if get_code(s, i) > 127:
|
|
613
|
+
return False
|
|
614
|
+
return True
|
|
615
|
+
|
|
616
|
+
return impl
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
@overload_method(types.UnicodeCharSeq, "_get_kind")
|
|
620
|
+
@overload_method(types.CharSeq, "_get_kind")
|
|
621
|
+
def charseq_get_kind(s):
|
|
622
|
+
get_code = _get_code_impl(s)
|
|
623
|
+
|
|
624
|
+
def impl(s):
|
|
625
|
+
max_code = 0
|
|
626
|
+
for i in range(len(s)):
|
|
627
|
+
code = get_code(s, i)
|
|
628
|
+
if code > max_code:
|
|
629
|
+
max_code = code
|
|
630
|
+
if max_code > 0xFFFF:
|
|
631
|
+
return unicode.PY_UNICODE_4BYTE_KIND
|
|
632
|
+
if max_code > 0xFF:
|
|
633
|
+
return unicode.PY_UNICODE_2BYTE_KIND
|
|
634
|
+
return unicode.PY_UNICODE_1BYTE_KIND
|
|
635
|
+
|
|
636
|
+
return impl
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
@overload_method(types.UnicodeType, "_to_bytes")
|
|
640
|
+
def unicode_to_bytes_mth(s):
|
|
641
|
+
"""Convert unicode_type object to Bytes object.
|
|
642
|
+
|
|
643
|
+
Note: The usage of _to_bytes method can be eliminated once all
|
|
644
|
+
Python bytes operations are implemented for numba Bytes objects.
|
|
645
|
+
|
|
646
|
+
"""
|
|
647
|
+
|
|
648
|
+
def impl(s):
|
|
649
|
+
return _unicode_to_bytes(s)
|
|
650
|
+
|
|
651
|
+
return impl
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
@overload_method(types.CharSeq, "_to_str")
|
|
655
|
+
@overload_method(types.Bytes, "_to_str")
|
|
656
|
+
def charseq_to_str_mth(s):
|
|
657
|
+
"""Convert bytes array item or bytes instance to UTF-8 str.
|
|
658
|
+
|
|
659
|
+
Note: The usage of _to_str method can be eliminated once all
|
|
660
|
+
Python bytes operations are implemented for numba Bytes objects.
|
|
661
|
+
"""
|
|
662
|
+
get_code = _get_code_impl(s)
|
|
663
|
+
|
|
664
|
+
def tostr_impl(s):
|
|
665
|
+
n = len(s)
|
|
666
|
+
is_ascii = s.isascii()
|
|
667
|
+
result = unicode._empty_string(
|
|
668
|
+
unicode.PY_UNICODE_1BYTE_KIND, n, is_ascii
|
|
669
|
+
)
|
|
670
|
+
for i in range(n):
|
|
671
|
+
code = get_code(s, i)
|
|
672
|
+
unicode._set_code_point(result, i, code)
|
|
673
|
+
return result
|
|
674
|
+
|
|
675
|
+
return tostr_impl
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
@overload_method(types.UnicodeCharSeq, "__str__")
|
|
679
|
+
def charseq_str(s):
|
|
680
|
+
get_code = _get_code_impl(s)
|
|
681
|
+
|
|
682
|
+
def str_impl(s):
|
|
683
|
+
n = len(s)
|
|
684
|
+
kind = s._get_kind()
|
|
685
|
+
is_ascii = kind == 1 and s.isascii()
|
|
686
|
+
result = unicode._empty_string(kind, n, is_ascii)
|
|
687
|
+
for i in range(n):
|
|
688
|
+
code = get_code(s, i)
|
|
689
|
+
unicode._set_code_point(result, i, code)
|
|
690
|
+
return result
|
|
691
|
+
|
|
692
|
+
return str_impl
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
@overload(bytes)
|
|
696
|
+
def charseq_bytes(s):
|
|
697
|
+
if isinstance(s, types.CharSeq):
|
|
698
|
+
return lambda s: s
|
|
699
|
+
|
|
700
|
+
|
|
701
|
+
@overload_method(types.UnicodeCharSeq, "__hash__")
|
|
702
|
+
def unicode_charseq_hash(s):
|
|
703
|
+
def impl(s):
|
|
704
|
+
return hash(str(s))
|
|
705
|
+
|
|
706
|
+
return impl
|
|
707
|
+
|
|
708
|
+
|
|
709
|
+
@overload_method(types.CharSeq, "__hash__")
|
|
710
|
+
def charseq_hash(s):
|
|
711
|
+
def impl(s):
|
|
712
|
+
# Ideally, `return hash(bytes(s))` would be used here but
|
|
713
|
+
# numba Bytes does not implement hash (yet). However, for a
|
|
714
|
+
# UTF-8 string `s`, we have hash(bytes(s)) == hash(s), hence,
|
|
715
|
+
# we can convert CharSeq object to unicode_type and reuse its
|
|
716
|
+
# hash implementation:
|
|
717
|
+
return hash(s._to_str())
|
|
718
|
+
|
|
719
|
+
return impl
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
@overload_method(types.UnicodeCharSeq, "isupper")
|
|
723
|
+
def unicode_charseq_isupper(s):
|
|
724
|
+
def impl(s):
|
|
725
|
+
# workaround unicode_type.isupper bug: it returns int value
|
|
726
|
+
return not not str(s).isupper()
|
|
727
|
+
|
|
728
|
+
return impl
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
@overload_method(types.CharSeq, "isupper")
|
|
732
|
+
def charseq_isupper(s):
|
|
733
|
+
def impl(s):
|
|
734
|
+
# return bytes(s).isupper() # TODO: implement isupper for Bytes
|
|
735
|
+
return not not s._to_str().isupper()
|
|
736
|
+
|
|
737
|
+
return impl
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
@overload_method(types.UnicodeCharSeq, "upper")
|
|
741
|
+
def unicode_charseq_upper(s):
|
|
742
|
+
def impl(s):
|
|
743
|
+
return str(s).upper()
|
|
744
|
+
|
|
745
|
+
return impl
|
|
746
|
+
|
|
747
|
+
|
|
748
|
+
@overload_method(types.CharSeq, "upper")
|
|
749
|
+
def charseq_upper(s):
|
|
750
|
+
def impl(s):
|
|
751
|
+
# return bytes(s).upper() # TODO: implement upper for Bytes
|
|
752
|
+
return s._to_str().upper()._to_bytes()
|
|
753
|
+
|
|
754
|
+
return impl
|
|
755
|
+
|
|
756
|
+
|
|
757
|
+
@overload_method(types.UnicodeCharSeq, "find")
|
|
758
|
+
@overload_method(types.CharSeq, "find")
|
|
759
|
+
@overload_method(types.Bytes, "find")
|
|
760
|
+
def unicode_charseq_find(a, b):
|
|
761
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
762
|
+
if isinstance(b, types.UnicodeCharSeq):
|
|
763
|
+
|
|
764
|
+
def impl(a, b):
|
|
765
|
+
return str(a).find(str(b))
|
|
766
|
+
|
|
767
|
+
return impl
|
|
768
|
+
if isinstance(b, types.UnicodeType):
|
|
769
|
+
|
|
770
|
+
def impl(a, b):
|
|
771
|
+
return str(a).find(b)
|
|
772
|
+
|
|
773
|
+
return impl
|
|
774
|
+
if isinstance(a, types.CharSeq):
|
|
775
|
+
if isinstance(b, (types.CharSeq, types.Bytes)):
|
|
776
|
+
|
|
777
|
+
def impl(a, b):
|
|
778
|
+
return a._to_str().find(b._to_str())
|
|
779
|
+
|
|
780
|
+
return impl
|
|
781
|
+
if isinstance(a, types.UnicodeType):
|
|
782
|
+
if isinstance(b, types.UnicodeCharSeq):
|
|
783
|
+
|
|
784
|
+
def impl(a, b):
|
|
785
|
+
return a.find(str(b))
|
|
786
|
+
|
|
787
|
+
return impl
|
|
788
|
+
if isinstance(a, types.Bytes):
|
|
789
|
+
if isinstance(b, types.CharSeq):
|
|
790
|
+
|
|
791
|
+
def impl(a, b):
|
|
792
|
+
return a._to_str().find(b._to_str())
|
|
793
|
+
|
|
794
|
+
return impl
|
|
795
|
+
|
|
796
|
+
|
|
797
|
+
@overload_method(types.UnicodeCharSeq, "rfind")
|
|
798
|
+
@overload_method(types.CharSeq, "rfind")
|
|
799
|
+
@overload_method(types.Bytes, "rfind")
|
|
800
|
+
def unicode_charseq_rfind(a, b):
|
|
801
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
802
|
+
if isinstance(b, types.UnicodeCharSeq):
|
|
803
|
+
|
|
804
|
+
def impl(a, b):
|
|
805
|
+
return str(a).rfind(str(b))
|
|
806
|
+
|
|
807
|
+
return impl
|
|
808
|
+
if isinstance(b, types.UnicodeType):
|
|
809
|
+
|
|
810
|
+
def impl(a, b):
|
|
811
|
+
return str(a).rfind(b)
|
|
812
|
+
|
|
813
|
+
return impl
|
|
814
|
+
if isinstance(a, types.CharSeq):
|
|
815
|
+
if isinstance(b, (types.CharSeq, types.Bytes)):
|
|
816
|
+
|
|
817
|
+
def impl(a, b):
|
|
818
|
+
return a._to_str().rfind(b._to_str())
|
|
819
|
+
|
|
820
|
+
return impl
|
|
821
|
+
if isinstance(a, types.UnicodeType):
|
|
822
|
+
if isinstance(b, types.UnicodeCharSeq):
|
|
823
|
+
|
|
824
|
+
def impl(a, b):
|
|
825
|
+
return a.rfind(str(b))
|
|
826
|
+
|
|
827
|
+
return impl
|
|
828
|
+
if isinstance(a, types.Bytes):
|
|
829
|
+
if isinstance(b, types.CharSeq):
|
|
830
|
+
|
|
831
|
+
def impl(a, b):
|
|
832
|
+
return a._to_str().rfind(b._to_str())
|
|
833
|
+
|
|
834
|
+
return impl
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
@overload_method(types.UnicodeCharSeq, "startswith")
|
|
838
|
+
@overload_method(types.CharSeq, "startswith")
|
|
839
|
+
@overload_method(types.Bytes, "startswith")
|
|
840
|
+
def unicode_charseq_startswith(a, b):
|
|
841
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
842
|
+
if isinstance(b, types.UnicodeCharSeq):
|
|
843
|
+
|
|
844
|
+
def impl(a, b):
|
|
845
|
+
return str(a).startswith(str(b))
|
|
846
|
+
|
|
847
|
+
return impl
|
|
848
|
+
if isinstance(b, types.UnicodeType):
|
|
849
|
+
|
|
850
|
+
def impl(a, b):
|
|
851
|
+
return str(a).startswith(b)
|
|
852
|
+
|
|
853
|
+
return impl
|
|
854
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
855
|
+
if isinstance(b, (types.CharSeq, types.Bytes)):
|
|
856
|
+
|
|
857
|
+
def impl(a, b):
|
|
858
|
+
return a._to_str().startswith(b._to_str())
|
|
859
|
+
|
|
860
|
+
return impl
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
@overload_method(types.UnicodeCharSeq, "endswith")
|
|
864
|
+
@overload_method(types.CharSeq, "endswith")
|
|
865
|
+
@overload_method(types.Bytes, "endswith")
|
|
866
|
+
def unicode_charseq_endswith(a, b):
|
|
867
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
868
|
+
if isinstance(b, types.UnicodeCharSeq):
|
|
869
|
+
|
|
870
|
+
def impl(a, b):
|
|
871
|
+
return str(a).endswith(str(b))
|
|
872
|
+
|
|
873
|
+
return impl
|
|
874
|
+
if isinstance(b, types.UnicodeType):
|
|
875
|
+
|
|
876
|
+
def impl(a, b):
|
|
877
|
+
return str(a).endswith(b)
|
|
878
|
+
|
|
879
|
+
return impl
|
|
880
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
881
|
+
if isinstance(b, (types.CharSeq, types.Bytes)):
|
|
882
|
+
|
|
883
|
+
def impl(a, b):
|
|
884
|
+
return a._to_str().endswith(b._to_str())
|
|
885
|
+
|
|
886
|
+
return impl
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
@register_jitable
|
|
890
|
+
def _map_bytes(seq):
|
|
891
|
+
return [s._to_bytes() for s in seq]
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
@overload_method(types.UnicodeCharSeq, "split")
|
|
895
|
+
@overload_method(types.CharSeq, "split")
|
|
896
|
+
@overload_method(types.Bytes, "split")
|
|
897
|
+
def unicode_charseq_split(a, sep=None, maxsplit=-1):
|
|
898
|
+
if not (
|
|
899
|
+
maxsplit == -1
|
|
900
|
+
or isinstance(
|
|
901
|
+
maxsplit, (types.Omitted, types.Integer, types.IntegerLiteral)
|
|
902
|
+
)
|
|
903
|
+
):
|
|
904
|
+
return None
|
|
905
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
906
|
+
if isinstance(sep, types.UnicodeCharSeq):
|
|
907
|
+
|
|
908
|
+
def impl(a, sep=None, maxsplit=-1):
|
|
909
|
+
return str(a).split(sep=str(sep), maxsplit=maxsplit)
|
|
910
|
+
|
|
911
|
+
return impl
|
|
912
|
+
if isinstance(sep, types.UnicodeType):
|
|
913
|
+
|
|
914
|
+
def impl(a, sep=None, maxsplit=-1):
|
|
915
|
+
return str(a).split(sep=sep, maxsplit=maxsplit)
|
|
916
|
+
|
|
917
|
+
return impl
|
|
918
|
+
if is_nonelike(sep):
|
|
919
|
+
if is_default(maxsplit, -1):
|
|
920
|
+
|
|
921
|
+
def impl(a, sep=None, maxsplit=-1):
|
|
922
|
+
return str(a).split()
|
|
923
|
+
else:
|
|
924
|
+
|
|
925
|
+
def impl(a, sep=None, maxsplit=-1):
|
|
926
|
+
return str(a).split(maxsplit=maxsplit)
|
|
927
|
+
|
|
928
|
+
return impl
|
|
929
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
930
|
+
if isinstance(sep, (types.CharSeq, types.Bytes)):
|
|
931
|
+
|
|
932
|
+
def impl(a, sep=None, maxsplit=-1):
|
|
933
|
+
return _map_bytes(
|
|
934
|
+
a._to_str().split(sep._to_str(), maxsplit=maxsplit)
|
|
935
|
+
)
|
|
936
|
+
|
|
937
|
+
return impl
|
|
938
|
+
if is_nonelike(sep):
|
|
939
|
+
if is_default(maxsplit, -1):
|
|
940
|
+
|
|
941
|
+
def impl(a, sep=None, maxsplit=-1):
|
|
942
|
+
return _map_bytes(a._to_str().split())
|
|
943
|
+
else:
|
|
944
|
+
|
|
945
|
+
def impl(a, sep=None, maxsplit=-1):
|
|
946
|
+
return _map_bytes(a._to_str().split(maxsplit=maxsplit))
|
|
947
|
+
|
|
948
|
+
return impl
|
|
949
|
+
|
|
950
|
+
|
|
951
|
+
# NOT IMPLEMENTED: rsplit
|
|
952
|
+
|
|
953
|
+
|
|
954
|
+
@overload_method(types.UnicodeCharSeq, "ljust")
|
|
955
|
+
@overload_method(types.CharSeq, "ljust")
|
|
956
|
+
@overload_method(types.Bytes, "ljust")
|
|
957
|
+
def unicode_charseq_ljust(a, width, fillchar=" "):
|
|
958
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
959
|
+
if is_default(fillchar, " "):
|
|
960
|
+
|
|
961
|
+
def impl(a, width, fillchar=" "):
|
|
962
|
+
return str(a).ljust(width)
|
|
963
|
+
|
|
964
|
+
return impl
|
|
965
|
+
elif isinstance(fillchar, types.UnicodeCharSeq):
|
|
966
|
+
|
|
967
|
+
def impl(a, width, fillchar=" "):
|
|
968
|
+
return str(a).ljust(width, str(fillchar))
|
|
969
|
+
|
|
970
|
+
return impl
|
|
971
|
+
elif isinstance(fillchar, types.UnicodeType):
|
|
972
|
+
|
|
973
|
+
def impl(a, width, fillchar=" "):
|
|
974
|
+
return str(a).ljust(width, fillchar)
|
|
975
|
+
|
|
976
|
+
return impl
|
|
977
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
978
|
+
if is_default(fillchar, " ") or is_default(fillchar, b" "):
|
|
979
|
+
|
|
980
|
+
def impl(a, width, fillchar=" "):
|
|
981
|
+
return a._to_str().ljust(width)._to_bytes()
|
|
982
|
+
|
|
983
|
+
return impl
|
|
984
|
+
elif isinstance(fillchar, (types.CharSeq, types.Bytes)):
|
|
985
|
+
|
|
986
|
+
def impl(a, width, fillchar=" "):
|
|
987
|
+
return a._to_str().ljust(width, fillchar._to_str())._to_bytes()
|
|
988
|
+
|
|
989
|
+
return impl
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
@overload_method(types.UnicodeCharSeq, "rjust")
|
|
993
|
+
@overload_method(types.CharSeq, "rjust")
|
|
994
|
+
@overload_method(types.Bytes, "rjust")
|
|
995
|
+
def unicode_charseq_rjust(a, width, fillchar=" "):
|
|
996
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
997
|
+
if is_default(fillchar, " "):
|
|
998
|
+
|
|
999
|
+
def impl(a, width, fillchar=" "):
|
|
1000
|
+
return str(a).rjust(width)
|
|
1001
|
+
|
|
1002
|
+
return impl
|
|
1003
|
+
elif isinstance(fillchar, types.UnicodeCharSeq):
|
|
1004
|
+
|
|
1005
|
+
def impl(a, width, fillchar=" "):
|
|
1006
|
+
return str(a).rjust(width, str(fillchar))
|
|
1007
|
+
|
|
1008
|
+
return impl
|
|
1009
|
+
elif isinstance(fillchar, types.UnicodeType):
|
|
1010
|
+
|
|
1011
|
+
def impl(a, width, fillchar=" "):
|
|
1012
|
+
return str(a).rjust(width, fillchar)
|
|
1013
|
+
|
|
1014
|
+
return impl
|
|
1015
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
1016
|
+
if is_default(fillchar, " ") or is_default(fillchar, b" "):
|
|
1017
|
+
|
|
1018
|
+
def impl(a, width, fillchar=" "):
|
|
1019
|
+
return a._to_str().rjust(width)._to_bytes()
|
|
1020
|
+
|
|
1021
|
+
return impl
|
|
1022
|
+
elif isinstance(fillchar, (types.CharSeq, types.Bytes)):
|
|
1023
|
+
|
|
1024
|
+
def impl(a, width, fillchar=" "):
|
|
1025
|
+
return a._to_str().rjust(width, fillchar._to_str())._to_bytes()
|
|
1026
|
+
|
|
1027
|
+
return impl
|
|
1028
|
+
|
|
1029
|
+
|
|
1030
|
+
@overload_method(types.UnicodeCharSeq, "center")
|
|
1031
|
+
@overload_method(types.CharSeq, "center")
|
|
1032
|
+
@overload_method(types.Bytes, "center")
|
|
1033
|
+
def unicode_charseq_center(a, width, fillchar=" "):
|
|
1034
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
1035
|
+
if is_default(fillchar, " "):
|
|
1036
|
+
|
|
1037
|
+
def impl(a, width, fillchar=" "):
|
|
1038
|
+
return str(a).center(width)
|
|
1039
|
+
|
|
1040
|
+
return impl
|
|
1041
|
+
elif isinstance(fillchar, types.UnicodeCharSeq):
|
|
1042
|
+
|
|
1043
|
+
def impl(a, width, fillchar=" "):
|
|
1044
|
+
return str(a).center(width, str(fillchar))
|
|
1045
|
+
|
|
1046
|
+
return impl
|
|
1047
|
+
elif isinstance(fillchar, types.UnicodeType):
|
|
1048
|
+
|
|
1049
|
+
def impl(a, width, fillchar=" "):
|
|
1050
|
+
return str(a).center(width, fillchar)
|
|
1051
|
+
|
|
1052
|
+
return impl
|
|
1053
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
1054
|
+
if is_default(fillchar, " ") or is_default(fillchar, b" "):
|
|
1055
|
+
|
|
1056
|
+
def impl(a, width, fillchar=" "):
|
|
1057
|
+
return a._to_str().center(width)._to_bytes()
|
|
1058
|
+
|
|
1059
|
+
return impl
|
|
1060
|
+
elif isinstance(fillchar, (types.CharSeq, types.Bytes)):
|
|
1061
|
+
|
|
1062
|
+
def impl(a, width, fillchar=" "):
|
|
1063
|
+
return a._to_str().center(width, fillchar._to_str())._to_bytes()
|
|
1064
|
+
|
|
1065
|
+
return impl
|
|
1066
|
+
|
|
1067
|
+
|
|
1068
|
+
@overload_method(types.UnicodeCharSeq, "zfill")
|
|
1069
|
+
@overload_method(types.CharSeq, "zfill")
|
|
1070
|
+
@overload_method(types.Bytes, "zfill")
|
|
1071
|
+
def unicode_charseq_zfill(a, width):
|
|
1072
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
1073
|
+
|
|
1074
|
+
def impl(a, width):
|
|
1075
|
+
return str(a).zfill(width)
|
|
1076
|
+
|
|
1077
|
+
return impl
|
|
1078
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
1079
|
+
|
|
1080
|
+
def impl(a, width):
|
|
1081
|
+
return a._to_str().zfill(width)._to_bytes()
|
|
1082
|
+
|
|
1083
|
+
return impl
|
|
1084
|
+
|
|
1085
|
+
|
|
1086
|
+
@overload_method(types.UnicodeCharSeq, "lstrip")
|
|
1087
|
+
@overload_method(types.CharSeq, "lstrip")
|
|
1088
|
+
@overload_method(types.Bytes, "lstrip")
|
|
1089
|
+
def unicode_charseq_lstrip(a, chars=None):
|
|
1090
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
1091
|
+
if is_nonelike(chars):
|
|
1092
|
+
|
|
1093
|
+
def impl(a, chars=None):
|
|
1094
|
+
return str(a).lstrip()
|
|
1095
|
+
|
|
1096
|
+
return impl
|
|
1097
|
+
elif isinstance(chars, types.UnicodeCharSeq):
|
|
1098
|
+
|
|
1099
|
+
def impl(a, chars=None):
|
|
1100
|
+
return str(a).lstrip(str(chars))
|
|
1101
|
+
|
|
1102
|
+
return impl
|
|
1103
|
+
elif isinstance(chars, types.UnicodeType):
|
|
1104
|
+
|
|
1105
|
+
def impl(a, chars=None):
|
|
1106
|
+
return str(a).lstrip(chars)
|
|
1107
|
+
|
|
1108
|
+
return impl
|
|
1109
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
1110
|
+
if is_nonelike(chars):
|
|
1111
|
+
|
|
1112
|
+
def impl(a, chars=None):
|
|
1113
|
+
return a._to_str().lstrip()._to_bytes()
|
|
1114
|
+
|
|
1115
|
+
return impl
|
|
1116
|
+
elif isinstance(chars, (types.CharSeq, types.Bytes)):
|
|
1117
|
+
|
|
1118
|
+
def impl(a, chars=None):
|
|
1119
|
+
return a._to_str().lstrip(chars._to_str())._to_bytes()
|
|
1120
|
+
|
|
1121
|
+
return impl
|
|
1122
|
+
|
|
1123
|
+
|
|
1124
|
+
@overload_method(types.UnicodeCharSeq, "rstrip")
|
|
1125
|
+
@overload_method(types.CharSeq, "rstrip")
|
|
1126
|
+
@overload_method(types.Bytes, "rstrip")
|
|
1127
|
+
def unicode_charseq_rstrip(a, chars=None):
|
|
1128
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
1129
|
+
if is_nonelike(chars):
|
|
1130
|
+
|
|
1131
|
+
def impl(a, chars=None):
|
|
1132
|
+
return str(a).rstrip()
|
|
1133
|
+
|
|
1134
|
+
return impl
|
|
1135
|
+
elif isinstance(chars, types.UnicodeCharSeq):
|
|
1136
|
+
|
|
1137
|
+
def impl(a, chars=None):
|
|
1138
|
+
return str(a).rstrip(str(chars))
|
|
1139
|
+
|
|
1140
|
+
return impl
|
|
1141
|
+
elif isinstance(chars, types.UnicodeType):
|
|
1142
|
+
|
|
1143
|
+
def impl(a, chars=None):
|
|
1144
|
+
return str(a).rstrip(chars)
|
|
1145
|
+
|
|
1146
|
+
return impl
|
|
1147
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
1148
|
+
if is_nonelike(chars):
|
|
1149
|
+
|
|
1150
|
+
def impl(a, chars=None):
|
|
1151
|
+
return a._to_str().rstrip()._to_bytes()
|
|
1152
|
+
|
|
1153
|
+
return impl
|
|
1154
|
+
elif isinstance(chars, (types.CharSeq, types.Bytes)):
|
|
1155
|
+
|
|
1156
|
+
def impl(a, chars=None):
|
|
1157
|
+
return a._to_str().rstrip(chars._to_str())._to_bytes()
|
|
1158
|
+
|
|
1159
|
+
return impl
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
@overload_method(types.UnicodeCharSeq, "strip")
|
|
1163
|
+
@overload_method(types.CharSeq, "strip")
|
|
1164
|
+
@overload_method(types.Bytes, "strip")
|
|
1165
|
+
def unicode_charseq_strip(a, chars=None):
|
|
1166
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
1167
|
+
if is_nonelike(chars):
|
|
1168
|
+
|
|
1169
|
+
def impl(a, chars=None):
|
|
1170
|
+
return str(a).strip()
|
|
1171
|
+
|
|
1172
|
+
return impl
|
|
1173
|
+
elif isinstance(chars, types.UnicodeCharSeq):
|
|
1174
|
+
|
|
1175
|
+
def impl(a, chars=None):
|
|
1176
|
+
return str(a).strip(str(chars))
|
|
1177
|
+
|
|
1178
|
+
return impl
|
|
1179
|
+
elif isinstance(chars, types.UnicodeType):
|
|
1180
|
+
|
|
1181
|
+
def impl(a, chars=None):
|
|
1182
|
+
return str(a).strip(chars)
|
|
1183
|
+
|
|
1184
|
+
return impl
|
|
1185
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
1186
|
+
if is_nonelike(chars):
|
|
1187
|
+
|
|
1188
|
+
def impl(a, chars=None):
|
|
1189
|
+
return a._to_str().strip()._to_bytes()
|
|
1190
|
+
|
|
1191
|
+
return impl
|
|
1192
|
+
elif isinstance(chars, (types.CharSeq, types.Bytes)):
|
|
1193
|
+
|
|
1194
|
+
def impl(a, chars=None):
|
|
1195
|
+
return a._to_str().strip(chars._to_str())._to_bytes()
|
|
1196
|
+
|
|
1197
|
+
return impl
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
@overload_method(types.UnicodeCharSeq, "join")
|
|
1201
|
+
@overload_method(types.CharSeq, "join")
|
|
1202
|
+
@overload_method(types.Bytes, "join")
|
|
1203
|
+
def unicode_charseq_join(a, parts):
|
|
1204
|
+
if isinstance(a, types.UnicodeCharSeq):
|
|
1205
|
+
# assuming parts contains UnicodeCharSeq or UnicodeType objects
|
|
1206
|
+
def impl(a, parts):
|
|
1207
|
+
_parts = [str(p) for p in parts]
|
|
1208
|
+
return str(a).join(_parts)
|
|
1209
|
+
|
|
1210
|
+
return impl
|
|
1211
|
+
|
|
1212
|
+
if isinstance(a, (types.CharSeq, types.Bytes)):
|
|
1213
|
+
# assuming parts contains CharSeq or Bytes objects
|
|
1214
|
+
def impl(a, parts):
|
|
1215
|
+
_parts = [p._to_str() for p in parts]
|
|
1216
|
+
return a._to_str().join(_parts)._to_bytes()
|
|
1217
|
+
|
|
1218
|
+
return impl
|