numba-cuda 0.21.1__cp313-cp313-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.
Files changed (488) hide show
  1. _numba_cuda_redirector.pth +4 -0
  2. _numba_cuda_redirector.py +89 -0
  3. numba_cuda/VERSION +1 -0
  4. numba_cuda/__init__.py +6 -0
  5. numba_cuda/_version.py +11 -0
  6. numba_cuda/numba/cuda/__init__.py +70 -0
  7. numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
  8. numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
  9. numba_cuda/numba/cuda/api.py +577 -0
  10. numba_cuda/numba/cuda/api_util.py +76 -0
  11. numba_cuda/numba/cuda/args.py +72 -0
  12. numba_cuda/numba/cuda/bf16.py +397 -0
  13. numba_cuda/numba/cuda/cache_hints.py +287 -0
  14. numba_cuda/numba/cuda/cext/__init__.py +2 -0
  15. numba_cuda/numba/cuda/cext/_devicearray.cp313-win_amd64.pyd +0 -0
  16. numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
  17. numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
  18. numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
  19. numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
  20. numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
  21. numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
  22. numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
  23. numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
  24. numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
  25. numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
  26. numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
  27. numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
  28. numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
  29. numba_cuda/numba/cuda/cext/_typeof.h +19 -0
  30. numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
  31. numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
  32. numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
  33. numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
  34. numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
  35. numba_cuda/numba/cuda/cg.py +67 -0
  36. numba_cuda/numba/cuda/cgutils.py +1294 -0
  37. numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
  38. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
  39. numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
  40. numba_cuda/numba/cuda/codegen.py +541 -0
  41. numba_cuda/numba/cuda/compiler.py +1396 -0
  42. numba_cuda/numba/cuda/core/analysis.py +758 -0
  43. numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
  44. numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
  45. numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
  46. numba_cuda/numba/cuda/core/base.py +1332 -0
  47. numba_cuda/numba/cuda/core/boxing.py +1411 -0
  48. numba_cuda/numba/cuda/core/bytecode.py +728 -0
  49. numba_cuda/numba/cuda/core/byteflow.py +2346 -0
  50. numba_cuda/numba/cuda/core/caching.py +744 -0
  51. numba_cuda/numba/cuda/core/callconv.py +392 -0
  52. numba_cuda/numba/cuda/core/codegen.py +171 -0
  53. numba_cuda/numba/cuda/core/compiler.py +199 -0
  54. numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
  55. numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
  56. numba_cuda/numba/cuda/core/config.py +650 -0
  57. numba_cuda/numba/cuda/core/consts.py +124 -0
  58. numba_cuda/numba/cuda/core/controlflow.py +989 -0
  59. numba_cuda/numba/cuda/core/entrypoints.py +57 -0
  60. numba_cuda/numba/cuda/core/environment.py +66 -0
  61. numba_cuda/numba/cuda/core/errors.py +917 -0
  62. numba_cuda/numba/cuda/core/event.py +511 -0
  63. numba_cuda/numba/cuda/core/funcdesc.py +330 -0
  64. numba_cuda/numba/cuda/core/generators.py +387 -0
  65. numba_cuda/numba/cuda/core/imputils.py +509 -0
  66. numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
  67. numba_cuda/numba/cuda/core/interpreter.py +3617 -0
  68. numba_cuda/numba/cuda/core/ir.py +1812 -0
  69. numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
  70. numba_cuda/numba/cuda/core/optional.py +129 -0
  71. numba_cuda/numba/cuda/core/options.py +262 -0
  72. numba_cuda/numba/cuda/core/postproc.py +249 -0
  73. numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
  74. numba_cuda/numba/cuda/core/registry.py +46 -0
  75. numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
  76. numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
  77. numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
  78. numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
  79. numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
  80. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
  81. numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
  82. numba_cuda/numba/cuda/core/sigutils.py +68 -0
  83. numba_cuda/numba/cuda/core/ssa.py +498 -0
  84. numba_cuda/numba/cuda/core/targetconfig.py +330 -0
  85. numba_cuda/numba/cuda/core/tracing.py +231 -0
  86. numba_cuda/numba/cuda/core/transforms.py +956 -0
  87. numba_cuda/numba/cuda/core/typed_passes.py +867 -0
  88. numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
  89. numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
  90. numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
  91. numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
  92. numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
  93. numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
  94. numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
  95. numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
  96. numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
  97. numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
  98. numba_cuda/numba/cuda/cpython/iterators.py +167 -0
  99. numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
  100. numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
  101. numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
  102. numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
  103. numba_cuda/numba/cuda/cpython/slicing.py +322 -0
  104. numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
  105. numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
  106. numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
  107. numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
  108. numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
  109. numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
  110. numba_cuda/numba/cuda/cuda_paths.py +691 -0
  111. numba_cuda/numba/cuda/cudadecl.py +556 -0
  112. numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
  113. numba_cuda/numba/cuda/cudadrv/devicearray.py +951 -0
  114. numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
  115. numba_cuda/numba/cuda/cudadrv/driver.py +3222 -0
  116. numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
  117. numba_cuda/numba/cuda/cudadrv/dummyarray.py +558 -0
  118. numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
  119. numba_cuda/numba/cuda/cudadrv/error.py +48 -0
  120. numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
  121. numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
  122. numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
  123. numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
  124. numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
  125. numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
  126. numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
  127. numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
  128. numba_cuda/numba/cuda/cudaimpl.py +995 -0
  129. numba_cuda/numba/cuda/cudamath.py +149 -0
  130. numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
  131. numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
  132. numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
  133. numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
  134. numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
  135. numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
  136. numba_cuda/numba/cuda/datamodel/manager.py +11 -0
  137. numba_cuda/numba/cuda/datamodel/models.py +9 -0
  138. numba_cuda/numba/cuda/datamodel/packer.py +9 -0
  139. numba_cuda/numba/cuda/datamodel/registry.py +11 -0
  140. numba_cuda/numba/cuda/datamodel/testing.py +11 -0
  141. numba_cuda/numba/cuda/debuginfo.py +903 -0
  142. numba_cuda/numba/cuda/decorators.py +294 -0
  143. numba_cuda/numba/cuda/descriptor.py +35 -0
  144. numba_cuda/numba/cuda/device_init.py +158 -0
  145. numba_cuda/numba/cuda/deviceufunc.py +1021 -0
  146. numba_cuda/numba/cuda/dispatcher.py +2463 -0
  147. numba_cuda/numba/cuda/errors.py +72 -0
  148. numba_cuda/numba/cuda/extending.py +697 -0
  149. numba_cuda/numba/cuda/flags.py +178 -0
  150. numba_cuda/numba/cuda/fp16.py +357 -0
  151. numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
  152. numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
  153. numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
  154. numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
  155. numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
  156. numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
  157. numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
  158. numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
  159. numba_cuda/numba/cuda/initialize.py +24 -0
  160. numba_cuda/numba/cuda/intrinsic_wrapper.py +41 -0
  161. numba_cuda/numba/cuda/intrinsics.py +382 -0
  162. numba_cuda/numba/cuda/itanium_mangler.py +214 -0
  163. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  164. numba_cuda/numba/cuda/kernels/reduction.py +265 -0
  165. numba_cuda/numba/cuda/kernels/transpose.py +65 -0
  166. numba_cuda/numba/cuda/libdevice.py +3386 -0
  167. numba_cuda/numba/cuda/libdevicedecl.py +20 -0
  168. numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
  169. numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
  170. numba_cuda/numba/cuda/locks.py +19 -0
  171. numba_cuda/numba/cuda/lowering.py +1951 -0
  172. numba_cuda/numba/cuda/mathimpl.py +374 -0
  173. numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
  174. numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
  175. numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
  176. numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
  177. numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
  178. numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
  179. numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
  180. numba_cuda/numba/cuda/misc/appdirs.py +594 -0
  181. numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
  182. numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
  183. numba_cuda/numba/cuda/misc/dump_style.py +41 -0
  184. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  185. numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
  186. numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
  187. numba_cuda/numba/cuda/misc/literal.py +28 -0
  188. numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
  189. numba_cuda/numba/cuda/misc/special.py +94 -0
  190. numba_cuda/numba/cuda/models.py +56 -0
  191. numba_cuda/numba/cuda/np/arraymath.py +5130 -0
  192. numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
  193. numba_cuda/numba/cuda/np/extensions.py +11 -0
  194. numba_cuda/numba/cuda/np/linalg.py +3087 -0
  195. numba_cuda/numba/cuda/np/math/__init__.py +0 -0
  196. numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
  197. numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
  198. numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
  199. numba_cuda/numba/cuda/np/npdatetime.py +969 -0
  200. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  201. numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
  202. numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
  203. numba_cuda/numba/cuda/np/numpy_support.py +798 -0
  204. numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
  205. numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
  206. numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
  207. numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
  208. numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
  209. numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
  210. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
  211. numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
  212. numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
  213. numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
  214. numba_cuda/numba/cuda/nvvmutils.py +254 -0
  215. numba_cuda/numba/cuda/printimpl.py +126 -0
  216. numba_cuda/numba/cuda/random.py +308 -0
  217. numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
  218. numba_cuda/numba/cuda/serialize.py +267 -0
  219. numba_cuda/numba/cuda/simulator/__init__.py +63 -0
  220. numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
  221. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  222. numba_cuda/numba/cuda/simulator/api.py +179 -0
  223. numba_cuda/numba/cuda/simulator/bf16.py +4 -0
  224. numba_cuda/numba/cuda/simulator/compiler.py +38 -0
  225. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
  226. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
  227. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
  228. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
  229. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
  230. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
  231. numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
  232. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
  233. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
  234. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
  235. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
  236. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
  237. numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
  238. numba_cuda/numba/cuda/simulator/kernel.py +320 -0
  239. numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
  240. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
  241. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
  242. numba_cuda/numba/cuda/simulator/reduction.py +19 -0
  243. numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
  244. numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
  245. numba_cuda/numba/cuda/simulator_init.py +18 -0
  246. numba_cuda/numba/cuda/stubs.py +635 -0
  247. numba_cuda/numba/cuda/target.py +505 -0
  248. numba_cuda/numba/cuda/testing.py +347 -0
  249. numba_cuda/numba/cuda/tests/__init__.py +62 -0
  250. numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
  251. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
  252. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  253. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
  254. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
  255. numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
  256. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
  257. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
  258. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
  259. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
  260. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
  261. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
  262. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
  263. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +187 -0
  264. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
  265. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
  266. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
  267. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +198 -0
  268. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
  269. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
  270. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
  271. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
  272. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
  273. numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
  274. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
  275. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
  276. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
  277. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
  278. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
  279. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
  280. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
  281. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
  282. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
  283. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
  284. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
  285. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
  286. numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
  287. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
  288. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
  289. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
  290. numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
  291. numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
  292. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
  293. numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
  294. numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
  295. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
  296. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
  297. numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
  298. numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
  299. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
  300. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
  301. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
  302. numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
  303. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
  304. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
  305. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
  306. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
  307. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
  308. numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
  309. numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
  310. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
  311. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
  312. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
  313. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
  314. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
  315. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
  316. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
  317. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
  318. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
  319. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
  320. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
  321. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
  322. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
  323. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
  324. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +889 -0
  325. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
  326. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
  327. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
  328. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
  329. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
  330. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
  331. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
  332. numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
  333. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
  334. numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
  335. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
  336. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
  337. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
  338. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
  339. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
  340. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
  341. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
  342. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
  343. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
  344. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
  345. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
  346. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
  347. numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
  348. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
  349. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
  350. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
  351. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
  352. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
  353. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
  354. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
  355. numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
  356. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
  357. numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
  358. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
  359. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
  360. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
  361. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
  362. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
  363. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
  364. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
  365. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
  366. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
  367. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
  368. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
  369. numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
  370. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
  371. numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
  372. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
  373. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
  374. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
  375. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
  376. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
  377. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
  378. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
  379. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
  380. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
  381. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
  382. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
  383. numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
  384. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
  385. numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
  386. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  387. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
  388. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
  389. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
  390. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
  391. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
  392. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
  393. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
  394. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
  395. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
  396. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +331 -0
  397. numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
  398. numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
  399. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
  400. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  401. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
  402. numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
  403. numba_cuda/numba/cuda/tests/data/error.cu +12 -0
  404. numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
  405. numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
  406. numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
  407. numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
  408. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
  409. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  410. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
  411. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
  412. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
  413. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
  414. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
  415. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
  416. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
  417. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
  418. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
  419. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
  420. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
  421. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
  422. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
  423. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
  424. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
  425. numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
  426. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +391 -0
  427. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
  428. numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
  429. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
  430. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
  431. numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
  432. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
  433. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
  434. numba_cuda/numba/cuda/tests/support.py +900 -0
  435. numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
  436. numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
  437. numba_cuda/numba/cuda/typeconv/rules.py +63 -0
  438. numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
  439. numba_cuda/numba/cuda/types/__init__.py +233 -0
  440. numba_cuda/numba/cuda/types/__init__.pyi +167 -0
  441. numba_cuda/numba/cuda/types/abstract.py +9 -0
  442. numba_cuda/numba/cuda/types/common.py +9 -0
  443. numba_cuda/numba/cuda/types/containers.py +9 -0
  444. numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
  445. numba_cuda/numba/cuda/types/cuda_common.py +110 -0
  446. numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
  447. numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
  448. numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
  449. numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
  450. numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
  451. numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
  452. numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
  453. numba_cuda/numba/cuda/types/ext_types.py +101 -0
  454. numba_cuda/numba/cuda/types/function_type.py +11 -0
  455. numba_cuda/numba/cuda/types/functions.py +9 -0
  456. numba_cuda/numba/cuda/types/iterators.py +9 -0
  457. numba_cuda/numba/cuda/types/misc.py +9 -0
  458. numba_cuda/numba/cuda/types/npytypes.py +9 -0
  459. numba_cuda/numba/cuda/types/scalars.py +9 -0
  460. numba_cuda/numba/cuda/typing/__init__.py +19 -0
  461. numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
  462. numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
  463. numba_cuda/numba/cuda/typing/bufproto.py +70 -0
  464. numba_cuda/numba/cuda/typing/builtins.py +1209 -0
  465. numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
  466. numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
  467. numba_cuda/numba/cuda/typing/collections.py +138 -0
  468. numba_cuda/numba/cuda/typing/context.py +782 -0
  469. numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
  470. numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
  471. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  472. numba_cuda/numba/cuda/typing/listdecl.py +147 -0
  473. numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
  474. numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
  475. numba_cuda/numba/cuda/typing/npydecl.py +749 -0
  476. numba_cuda/numba/cuda/typing/setdecl.py +115 -0
  477. numba_cuda/numba/cuda/typing/templates.py +1446 -0
  478. numba_cuda/numba/cuda/typing/typeof.py +301 -0
  479. numba_cuda/numba/cuda/ufuncs.py +746 -0
  480. numba_cuda/numba/cuda/utils.py +724 -0
  481. numba_cuda/numba/cuda/vector_types.py +214 -0
  482. numba_cuda/numba/cuda/vectorizers.py +260 -0
  483. numba_cuda-0.21.1.dist-info/METADATA +109 -0
  484. numba_cuda-0.21.1.dist-info/RECORD +488 -0
  485. numba_cuda-0.21.1.dist-info/WHEEL +5 -0
  486. numba_cuda-0.21.1.dist-info/licenses/LICENSE +26 -0
  487. numba_cuda-0.21.1.dist-info/licenses/LICENSE.numba +24 -0
  488. numba_cuda-0.21.1.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