Coverage for cuda / core / _module.pyx: 88.97%

272 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-29 01:27 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5from __future__ import annotations 

6  

7from libc.stddef cimport size_t 

8  

9from collections import namedtuple 

10  

11from cuda.core._device import Device 

12from cuda.core._launch_config cimport LaunchConfig 

13from cuda.core._launch_config import LaunchConfig 

14from cuda.core._stream cimport Stream 

15from cuda.core._resource_handles cimport ( 

16 LibraryHandle, 

17 KernelHandle, 

18 create_library_handle_from_file, 

19 create_library_handle_from_data, 

20 create_kernel_handle, 

21 create_kernel_handle_ref, 

22 get_kernel_library, 

23 get_last_error, 

24 as_cu, 

25 as_py, 

26 as_intptr, 

27) 

28from cuda.core._stream import Stream 

29from cuda.core._utils.clear_error_support import ( 

30 assert_type_str_or_bytes_like, 

31 raise_code_path_meant_to_be_unreachable, 

32) 

33from cuda.core._utils.cuda_utils cimport HANDLE_RETURN 

34from cuda.core._utils.version cimport cy_driver_version 

35from cuda.core._utils.cuda_utils import driver 

36from cuda.bindings cimport cydriver 

37  

38__all__ = ["Kernel", "ObjectCode"] 

39  

40  

41cdef class KernelAttributes: 

42 """Provides access to kernel attributes.""" 

43  

44 def __init__(self, *args, **kwargs): 

45 raise RuntimeError("KernelAttributes cannot be instantiated directly. Please use Kernel APIs.") 2Zh

46  

47 @staticmethod 

48 cdef KernelAttributes _init(KernelHandle h_kernel): 

49 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

50 self._h_kernel = h_kernel 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

51 self._cache = {} 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

52 return self 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

53  

54 cdef int _get_cached_attribute(self, int device_id, cydriver.CUfunction_attribute attribute) except? -1: 

55 """Helper function to get a cached attribute or fetch and cache it if not present.""" 

56 cdef tuple cache_key = (device_id, <int>attribute) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

57 cached = self._cache.get(cache_key, cache_key) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

58 if cached is not cache_key: 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

59 return cached 2'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

60 cdef int result 

61 with nogil: 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

62 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

63 self._cache[cache_key] = result 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

64 return result 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

65  

66 cdef inline int _resolve_device_id(self, device_id) except? -1: 

67 """Convert Device or int to device_id int.""" 

68 return Device(device_id).device_id 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

69  

70 def max_threads_per_block(self, device_id: Device | int = None) -> int: 

71 """int : The maximum number of threads per block. 

72 This attribute is read-only.""" 

73 return self._get_cached_attribute( 2c m n s a ? x ,e

74 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2c m n s a ? x ,e

75 ) 

76  

77 def shared_size_bytes(self, device_id: Device | int = None) -> int: 

78 """int : The size in bytes of statically-allocated shared memory required by this function. 

79 This attribute is read-only.""" 

80 return self._get_cached_attribute( 2?e

81 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2?e

82 ) 

83  

84 def const_size_bytes(self, device_id: Device | int = None) -> int: 

85 """int : The size in bytes of user-allocated constant memory required by this function. 

86 This attribute is read-only.""" 

87 return self._get_cached_attribute( 2)e

88 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2)e

89 ) 

90  

91 def local_size_bytes(self, device_id: Device | int = None) -> int: 

92 """int : The size in bytes of local memory used by each thread of this function. 

93 This attribute is read-only.""" 

94 return self._get_cached_attribute( 2*e

95 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2*e

96 ) 

97  

98 def num_regs(self, device_id: Device | int = None) -> int: 

99 """int : The number of registers used by each thread of this function. 

100 This attribute is read-only.""" 

101 return self._get_cached_attribute( 2VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b-e

102 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b-e

103 ) 

104  

105 def ptx_version(self, device_id: Device | int = None) -> int: 

106 """int : The PTX virtual architecture version for which the function was compiled. 

107 This attribute is read-only.""" 

108 return self._get_cached_attribute( 2/e

109 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2/e

110 ) 

111  

112 def binary_version(self, device_id: Device | int = None) -> int: 

113 """int : The binary architecture version for which the function was compiled. 

114 This attribute is read-only.""" 

115 return self._get_cached_attribute( 2b 'e

116 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2'e

117 ) 

118  

119 def cache_mode_ca(self, device_id: Device | int = None) -> bool: 

120 """bool : Whether the function has been compiled with user specified option "-Xptxas --dlcm=ca" set. 

121 This attribute is read-only.""" 

122 return bool( 28e

123 self._get_cached_attribute( 28e

124 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 28e

125 ) 

126 ) 

127  

128 def max_dynamic_shared_size_bytes(self, device_id: Device | int = None) -> int: 

129 """int : The maximum size in bytes of dynamically-allocated shared memory that can be used 

130 by this function.""" 

131 return self._get_cached_attribute( 2+e

132 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2+e

133 ) 

134  

135 def preferred_shared_memory_carveout(self, device_id: Device | int = None) -> int: 

136 """int : The shared memory carveout preference, in percent of the total shared memory.""" 

137 return self._get_cached_attribute( 2.e

138 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2.e

139 ) 

140  

141 def cluster_size_must_be_set(self, device_id: Device | int = None) -> bool: 

142 """bool : The kernel must launch with a valid cluster size specified. 

143 This attribute is read-only.""" 

144 return bool( 29e

145 self._get_cached_attribute( 29e

146 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 29e

147 ) 

148 ) 

149  

150 def required_cluster_width(self, device_id: Device | int = None) -> int: 

151 """int : The required cluster width in blocks.""" 

152 return self._get_cached_attribute( 2=e

153 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2=e

154 ) 

155  

156 def required_cluster_height(self, device_id: Device | int = None) -> int: 

157 """int : The required cluster height in blocks.""" 

158 return self._get_cached_attribute( 2;e

159 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2;e

160 ) 

161  

162 def required_cluster_depth(self, device_id: Device | int = None) -> int: 

163 """int : The required cluster depth in blocks.""" 

164 return self._get_cached_attribute( 2:e

165 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2:e

166 ) 

167  

168 def non_portable_cluster_size_allowed(self, device_id: Device | int = None) -> bool: 

169 """bool : Whether the function can be launched with non-portable cluster size.""" 

170 return bool( 2!e

171 self._get_cached_attribute( 2!e

172 self._resolve_device_id(device_id), 2!e

173 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 

174 ) 

175 ) 

176  

177 def cluster_scheduling_policy_preference(self, device_id: Device | int = None) -> int: 

178 """int : The block scheduling policy of a function.""" 

179 return self._get_cached_attribute( 2(e

180 self._resolve_device_id(device_id), 2(e

181 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE, 

182 ) 

183  

184  

185MaxPotentialBlockSizeOccupancyResult = namedtuple("MaxPotential", ("min_grid_size", "max_block_size")) 

186  

187  

188cdef class KernelOccupancy: 

189 """This class offers methods to query occupancy metrics that help determine optimal 

190 launch parameters such as block size, grid size, and shared memory usage. 

191 """ 

192  

193 def __init__(self, *args, **kwargs): 

194 raise RuntimeError("KernelOccupancy cannot be instantiated directly. Please use Kernel APIs.") 20h

195  

196 @staticmethod 

197 cdef KernelOccupancy _init(KernelHandle h_kernel): 

198 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

199 self._h_kernel = h_kernel 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

200 return self 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

201  

202 def max_active_blocks_per_multiprocessor(self, block_size: int, dynamic_shared_memory_size: int) -> int: 

203 """Occupancy of the kernel. 

204  

205 Returns the maximum number of active blocks per multiprocessor for this kernel. 

206  

207 Parameters 

208 ---------- 

209 block_size: int 

210 Block size parameter used to launch this kernel. 

211 dynamic_shared_memory_size: int 

212 The amount of dynamic shared memory in bytes needed by block. 

213 Use `0` if block does not need shared memory. 

214  

215 Returns 

216 ------- 

217 int 

218 The maximum number of active blocks per multiprocessor. 

219  

220 Note 

221 ---- 

222 The fraction of the product of maximum number of active blocks per multiprocessor 

223 and the block size to the maximum number of threads per multiprocessor is known as 

224 theoretical multiprocessor utilization (occupancy). 

225  

226 """ 

227 cdef int num_blocks 

228 cdef int c_block_size = block_size 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b

229 cdef size_t c_shmem_size = dynamic_shared_memory_size 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b

230 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b

231 with nogil: 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b

232 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b

233 &num_blocks, func, c_block_size, c_shmem_size 

234 )) 

235 return num_blocks 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b

236  

237 def max_potential_block_size( 

238 self, dynamic_shared_memory_needed: int | driver.CUoccupancyB2DSize, block_size_limit: int 

239 ) -> MaxPotentialBlockSizeOccupancyResult: 

240 """MaxPotentialBlockSizeOccupancyResult: Suggested launch configuration for reasonable occupancy. 

241  

242 Returns the minimum grid size needed to achieve the maximum occupancy and 

243 the maximum block size that can achieve the maximum occupancy. 

244  

245 Parameters 

246 ---------- 

247 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize] 

248 The amount of dynamic shared memory in bytes needed by block. 

249 Use `0` if block does not need shared memory. Use C-callable 

250 represented by :obj:`~driver.CUoccupancyB2DSize` to encode 

251 amount of needed dynamic shared memory which varies depending 

252 on tne block size. 

253 block_size_limit: int 

254 Known upper limit on the kernel block size. Use `0` to indicate 

255 the maximum block size permitted by the device / kernel instead 

256  

257 Returns 

258 ------- 

259 :obj:`~MaxPotentialBlockSizeOccupancyResult` 

260 An object with `min_grid_size` amd `max_block_size` attributes encoding 

261 the suggested launch configuration. 

262  

263 Note 

264 ---- 

265 Please be advised that use of C-callable that requires Python Global 

266 Interpreter Lock may lead to deadlocks. 

267  

268 """ 

269 cdef int min_grid_size, max_block_size 

270 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

271 cdef cydriver.CUoccupancyB2DSize callback 

272 cdef size_t c_shmem_size 

273 cdef int c_block_size_limit = block_size_limit 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

274 if isinstance(dynamic_shared_memory_needed, int): 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

275 c_shmem_size = dynamic_shared_memory_needed 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

276 with nogil: 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

277 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

278 &min_grid_size, &max_block_size, func, NULL, c_shmem_size, c_block_size_limit 

279 )) 

280 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

281 # Callback may require GIL, so don't use nogil here 

282 callback = <cydriver.CUoccupancyB2DSize><size_t>dynamic_shared_memory_needed.getPtr() 

283 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 

284 &min_grid_size, &max_block_size, func, callback, 0, c_block_size_limit 

285 )) 

286 else: 

287 raise TypeError( 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

288 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

289 f"got {type(dynamic_shared_memory_needed)}" 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

290 ) 

291 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

292  

293 def available_dynamic_shared_memory_per_block(self, num_blocks_per_multiprocessor: int, block_size: int) -> int: 

294 """Dynamic shared memory available per block for given launch configuration. 

295  

296 The amount of dynamic shared memory per block, in bytes, for given kernel launch configuration. 

297  

298 Parameters 

299 ---------- 

300 num_blocks_per_multiprocessor: int 

301 Number of blocks to be concurrently executing on a multiprocessor. 

302 block_size: int 

303 Block size parameter used to launch this kernel. 

304  

305 Returns 

306 ------- 

307 int 

308 Dynamic shared memory available per block for given launch configuration. 

309 """ 

310 cdef size_t dynamic_smem_size 

311 cdef int c_num_blocks = num_blocks_per_multiprocessor 2MfNfOfPfQfRf

312 cdef int c_block_size = block_size 2MfNfOfPfQfRf

313 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2MfNfOfPfQfRf

314 with nogil: 2MfNfOfPfQfRf

315 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2MfNfOfPfQfRf

316 &dynamic_smem_size, func, c_num_blocks, c_block_size 

317 )) 

318 return dynamic_smem_size 2MfNfOfPfQfRf

319  

320 def max_potential_cluster_size(self, config: LaunchConfig, stream: Stream | None = None) -> int: 

321 """Maximum potential cluster size. 

322  

323 The maximum potential cluster size for this kernel and given launch configuration. 

324  

325 Parameters 

326 ---------- 

327 config: :obj:`~_launch_config.LaunchConfig` 

328 Kernel launch configuration. Cluster dimensions in the configuration are ignored. 

329 stream: :obj:`~Stream`, optional 

330 The stream on which this kernel is to be launched. 

331  

332 Returns 

333 ------- 

334 int 

335 The maximum cluster size that can be launched for this kernel and launch configuration. 

336 """ 

337 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config() 

338 cdef Stream s 

339 if stream is not None: 

340 s = <Stream>stream 

341 drv_cfg.hStream = as_cu(s._h_stream) 

342 cdef int cluster_size 

343 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 

344 with nogil: 

345 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialClusterSize(&cluster_size, func, &drv_cfg)) 

346 return cluster_size 

347  

348 def max_active_clusters(self, config: LaunchConfig, stream: Stream | None = None) -> int: 

349 """Maximum number of active clusters on the target device. 

350  

351 The maximum number of clusters that could concurrently execute on the target device. 

352  

353 Parameters 

354 ---------- 

355 config: :obj:`~_launch_config.LaunchConfig` 

356 Kernel launch configuration. 

357 stream: :obj:`~Stream`, optional 

358 The stream on which this kernel is to be launched. 

359  

360 Returns 

361 ------- 

362 int 

363 The maximum number of clusters that could co-exist on the target device. 

364 """ 

365 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config() 

366 cdef Stream s 

367 if stream is not None: 

368 s = <Stream>stream 

369 drv_cfg.hStream = as_cu(s._h_stream) 

370 cdef int num_clusters 

371 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 

372 with nogil: 

373 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveClusters(&num_clusters, func, &drv_cfg)) 

374 return num_clusters 

375  

376  

377ParamInfo = namedtuple("ParamInfo", ["offset", "size"]) 

378  

379  

380cdef class Kernel: 

381 """Represent a compiled kernel that had been loaded onto the device. 

382  

383 Kernel instances can execution when passed directly into the 

384 :func:`~launch` function. 

385  

386 Directly creating a :obj:`~_module.Kernel` is not supported, and they 

387 should instead be created through a :obj:`~_module.ObjectCode` object. 

388  

389 """ 

390  

391 def __init__(self, *args, **kwargs): 

392 raise RuntimeError("Kernel objects cannot be instantiated directly. Please use ObjectCode APIs.") 21h

393  

394 @staticmethod 

395 cdef Kernel _from_handle(KernelHandle h_kernel): 

396 cdef Kernel ker = Kernel.__new__(Kernel) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e

397 ker._h_kernel = h_kernel 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e

398 ker._attributes = None 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e

399 ker._occupancy = None 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e

400 return ker 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e

401  

402 @property 

403 def attributes(self) -> KernelAttributes: 

404 """Get the read-only attributes of this kernel.""" 

405 if self._attributes is None: 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

406 self._attributes = KernelAttributes._init(self._h_kernel) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

407 return self._attributes 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e

408  

409 cdef tuple _get_arguments_info(self, bint param_info=False): 

410 if cy_driver_version() < (12, 4, 0): 2d t q e f g h r i j k l [e

411 raise NotImplementedError( 

412 "Driver version 12.4 or newer is required for this function. " 

413 f"Using driver version {'.'.join(map(str, cy_driver_version()))}" 

414 ) 

415 cdef size_t arg_pos = 0 2d t q e f g h r i j k l [e

416 cdef list param_info_data = [] 2d t q e f g h r i j k l [e

417 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2d t q e f g h r i j k l [e

418 cdef size_t param_offset, param_size 

419 cdef cydriver.CUresult err 

420 while True: 2d t q e f g h r i j k l [e

421 with nogil: 2d t q e f g h r i j k l [e

422 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, &param_offset, &param_size) 2d t q e f g h r i j k l [e

423 if err != cydriver.CUDA_SUCCESS: 2d t q e f g h r i j k l [e

424 break 2d t q e f g h r i j k l [e

425 if param_info: 2d e f g h i j k l [e

426 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2e f g h i j k l [e

427 arg_pos = arg_pos + 1 2d e f g h i j k l [e

428 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2d t q e f g h r i j k l [e

429 HANDLE_RETURN(err) 1t

430 return arg_pos, param_info_data 2d q e f g h r i j k l [e

431  

432 @property 

433 def num_arguments(self) -> int: 

434 """int : The number of arguments of this function""" 

435 num_args, _ = self._get_arguments_info() 2d t q e f g h r i j k l [e

436 return num_args 2d q e f g h r i j k l [e

437  

438 @property 

439 def arguments_info(self) -> list[ParamInfo]: 

440 """list[ParamInfo]: (offset, size) for each argument of this function""" 

441 _, param_info = self._get_arguments_info(param_info=True) 2q e f g h r i j k l [e

442 return param_info 2q e f g h r i j k l [e

443  

444 @property 

445 def occupancy(self) -> KernelOccupancy: 

446 """Get the occupancy information for launching this kernel.""" 

447 if self._occupancy is None: 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

448 self._occupancy = KernelOccupancy._init(self._h_kernel) 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

449 return self._occupancy 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf

450  

451 @property 

452 def handle(self): 

453 """Return the underlying kernel handle object. 

454  

455 .. caution:: 

456  

457 This handle is a Python object. To get the memory address of the underlying C 

458 handle, call ``int(Kernel.handle)``. 

459 """ 

460 return as_py(self._h_kernel) 2c 2ha @e? x d u o

461  

462 @property 

463 def _handle(self): 

464 return self.handle 

465  

466 @staticmethod 

467 def from_handle(handle, mod: ObjectCode = None) -> Kernel: 

468 """Creates a new :obj:`Kernel` object from a kernel handle. 

469  

470 Parameters 

471 ---------- 

472 handle : int 

473 Kernel handle representing the address of a foreign 

474 kernel object (CUkernel). 

475 mod : :obj:`ObjectCode`, optional 

476 The ObjectCode object associated with this kernel. Provides 

477 library lifetime for foreign kernels not created by 

478 cuda.core. 

479 """ 

480  

481 if not isinstance(handle, int): 2c s a @e? PhQhRhShThUhVhWhXhYhx o

482 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2PhQhRhShThUhVhWhXhYh

483  

484 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2c s a @e? x o

485 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2c s a @e? x o

486 if not h_kernel: 2c s a @e? x o

487 HANDLE_RETURN(get_last_error()) 

488  

489 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2c s a @e? x o

490 cdef LibraryHandle h_caller_lib 

491  

492 if mod is not None: 2c s a @e? x o

493 h_caller_lib = (<ObjectCode>mod)._h_library 2a @ex

494 if h_existing_lib and h_caller_lib: 2a @ex

495 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a @ex

496 import warnings 1a

497 warnings.warn( 1a

498 "The library from the provided ObjectCode does not match " 

499 "the library associated with this kernel.", 

500 stacklevel=2, 

501 ) 

502  

503 cdef Kernel k = Kernel._from_handle(h_kernel) 2c s a @e? x o

504 if mod is not None and not h_existing_lib: 2c s a @e? x o

505 k._keepalive = mod 

506 return k 2c s a @e? x o

507  

508 def __eq__(self, other) -> bool: 

509 if not isinstance(other, Kernel): 2KhLhu o A B C D E F G H I J K L M N O P Q R S T U V w W X y z

510 return NotImplemented 1uABCDEFGHIJKLMNOPQRSTUVwW

511 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2KhLhu o X y z

512  

513 def __hash__(self) -> int: 

514 return hash(as_intptr(self._h_kernel)) 1oYZ0123456789!#$%'()*+,-v./;=yz

515  

516 def __repr__(self) -> str: 

517 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 1:

518  

519  

520CodeTypeT = bytes | bytearray | str 

521  

522cdef tuple _supported_code_type = ("cubin", "ptx", "ltoir", "fatbin", "object", "library") 

523  

524cdef class ObjectCode: 

525 """Represent a compiled program to be loaded onto the device. 

526  

527 This object provides a unified interface for different types of 

528 compiled programs that will be loaded onto the device. 

529  

530 Note 

531 ---- 

532 This class has no default constructor. If you already have a cubin that you would 

533 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly 

534 from all other possible code types should be avoided in favor of compilation through 

535 :class:`~cuda.core.Program` 

536 """ 

537  

538 def __init__(self, *args, **kwargs): 

539 raise RuntimeError( 23h

540 "ObjectCode objects cannot be instantiated directly. " 

541 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)." 

542 ) 

543  

544 @classmethod 

545 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict | None = None): 

546 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh

547 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh

548  

549 # _h_library is assigned during _lazy_load_module 

550 self._h_library = LibraryHandle() # Empty handle 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh

551  

552 self._code_type = code_type 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh

553 self._module = module 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh

554 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh

555 self._name = name if name else "" 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh

556  

557 return self 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh

558  

559 @staticmethod 

560 def _reduce_helper(module, code_type, name, symbol_mapping): 

561 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2Lfvgwg

562  

563 def __reduce__(self): 

564 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2Lfvgwg

565  

566 @staticmethod 

567 def from_cubin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

568 """Create an :class:`ObjectCode` instance from an existing cubin. 

569  

570 Parameters 

571 ---------- 

572 module : Union[bytes, str] 

573 Either a bytes object containing the in-memory cubin to load, or 

574 a file path string pointing to the on-disk cubin to load. 

575 name : Optional[str] 

576 A human-readable identifier representing this code object. 

577 symbol_mapping : Optional[dict] 

578 A dictionary specifying how the unmangled symbol names (as keys) 

579 should be mapped to the mangled names before trying to retrieve 

580 them (default to no mappings). 

581 """ 

582 return ObjectCode._init(module, "cubin", name=name, symbol_mapping=symbol_mapping) 1|}

583  

584 @staticmethod 

585 def from_ptx(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

586 """Create an :class:`ObjectCode` instance from an existing PTX. 

587  

588 Parameters 

589 ---------- 

590 module : Union[bytes, str] 

591 Either a bytes object containing the in-memory ptx code to load, or 

592 a file path string pointing to the on-disk ptx file to load. 

593 name : Optional[str] 

594 A human-readable identifier representing this code object. 

595 symbol_mapping : Optional[dict] 

596 A dictionary specifying how the unmangled symbol names (as keys) 

597 should be mapped to the mangled names before trying to retrieve 

598 them (default to no mappings). 

599 """ 

600 return ObjectCode._init(module, "ptx", name=name, symbol_mapping=symbol_mapping) 2SfUf;f

601  

602 @staticmethod 

603 def from_ltoir(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

604 """Create an :class:`ObjectCode` instance from an existing LTOIR. 

605  

606 Parameters 

607 ---------- 

608 module : Union[bytes, str] 

609 Either a bytes object containing the in-memory ltoir code to load, or 

610 a file path string pointing to the on-disk ltoir file to load. 

611 name : Optional[str] 

612 A human-readable identifier representing this code object. 

613 symbol_mapping : Optional[dict] 

614 A dictionary specifying how the unmangled symbol names (as keys) 

615 should be mapped to the mangled names before trying to retrieve 

616 them (default to no mappings). 

617 """ 

618 return ObjectCode._init(module, "ltoir", name=name, symbol_mapping=symbol_mapping) 2Tf3e

619  

620 @staticmethod 

621 def from_fatbin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

622 """Create an :class:`ObjectCode` instance from an existing fatbin. 

623  

624 Parameters 

625 ---------- 

626 module : Union[bytes, str] 

627 Either a bytes object containing the in-memory fatbin to load, or 

628 a file path string pointing to the on-disk fatbin to load. 

629 name : Optional[str] 

630 A human-readable identifier representing this code object. 

631 symbol_mapping : Optional[dict] 

632 A dictionary specifying how the unmangled symbol names (as keys) 

633 should be mapped to the mangled names before trying to retrieve 

634 them (default to no mappings). 

635 """ 

636 return ObjectCode._init(module, "fatbin", name=name, symbol_mapping=symbol_mapping) 2~ ab

637  

638 @staticmethod 

639 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

640 """Create an :class:`ObjectCode` instance from an existing object code. 

641  

642 Parameters 

643 ---------- 

644 module : Union[bytes, str] 

645 Either a bytes object containing the in-memory object code to load, or 

646 a file path string pointing to the on-disk object code to load. 

647 name : Optional[str] 

648 A human-readable identifier representing this code object. 

649 symbol_mapping : Optional[dict] 

650 A dictionary specifying how the unmangled symbol names (as keys) 

651 should be mapped to the mangled names before trying to retrieve 

652 them (default to no mappings). 

653 """ 

654 return ObjectCode._init(module, "object", name=name, symbol_mapping=symbol_mapping) 

655  

656 @staticmethod 

657 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

658 """Create an :class:`ObjectCode` instance from an existing library. 

659  

660 Parameters 

661 ---------- 

662 module : Union[bytes, str] 

663 Either a bytes object containing the in-memory library to load, or 

664 a file path string pointing to the on-disk library to load. 

665 name : Optional[str] 

666 A human-readable identifier representing this code object. 

667 symbol_mapping : Optional[dict] 

668 A dictionary specifying how the unmangled symbol names (as keys) 

669 should be mapped to the mangled names before trying to retrieve 

670 them (default to no mappings). 

671 """ 

672 return ObjectCode._init(module, "library", name=name, symbol_mapping=symbol_mapping) 

673  

674 # TODO: do we want to unload in a finalizer? Probably not.. 

675  

676 cdef int _lazy_load_module(self) except -1: 

677 if self._h_library: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l Mh5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb

678 return 0 2hbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbMh4e#ev $e%e5e6eUb

679 module = self._module 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb

680 assert_type_str_or_bytes_like(module) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb

681 cdef bytes path_bytes 

682 if isinstance(module, str): 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb

683 path_bytes = module.encode() 1|~

684 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 1|~

685 if not self._h_library: 1|~

686 HANDLE_RETURN(get_last_error()) 

687 return 0 1|~

688 if isinstance(module, (bytes, bytearray)): 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c6c} 7cab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb

689 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c6c} 7cab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb

690 if not self._h_library: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c6c} 7cab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb

691 HANDLE_RETURN(get_last_error()) 

692 return 0 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c6c} 7cab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb

693 raise_code_path_meant_to_be_unreachable() 

694 return -1 

695  

696 def get_kernel(self, name) -> Kernel: 

697 """Return the :obj:`~_module.Kernel` of a specified name from this object code. 

698  

699 Parameters 

700 ---------- 

701 name : str | bytes 

702 Name of the kernel to retrieve. 

703  

704 Returns 

705 ------- 

706 :obj:`~_module.Kernel` 

707 Newly created kernel object. 

708  

709 """ 

710 self._lazy_load_module() 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb

711 supported_code_types = ("cubin", "ptx", "fatbin") 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb

712 if self._code_type not in supported_code_types: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb

713 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 23e

714 try: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb

715 name = self._sym_map[name] 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb

716 except KeyError: 2@ [ ] ^ _ ` p { d u o Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - v . / A B C D E F G H I J K L M N O P Q R S T U V w W : X ; = y z bbcbUb

717 if isinstance(name, str): 2@ [ ] ^ _ ` p { d u o Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - v . / A B C D E F G H I J K L M N O P Q R S T U V w W : X ; = y z bbcbUb

718 name = name.encode() 2@ [ ] ^ _ ` p { d u o Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - v . / A B C D E F G H I J K L M N O P Q R S T U V w W : X ; = y z bbcbUb

719  

720 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb

721 if not h_kernel: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb

722 HANDLE_RETURN(get_last_error()) 2Ub

723 return Kernel._from_handle(h_kernel) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e

724  

725 @property 

726 def code(self) -> CodeTypeT: 

727 """Return the underlying code object.""" 

728 return self._module 2VfWfNhXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.fOhSf/f:fs Lf| } ~ }fab~fTf3eUfNg;fOgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMg4h=f?f@f[f]f^f_f`f{f|f

729  

730 @property 

731 def name(self) -> str: 

732 """Return a human-readable name of this code object.""" 

733 return self._name 2VfWfNhXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.fOhSf/f:fxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|f

734  

735 @property 

736 def code_type(self) -> str: 

737 """Return the type of the underlying code object.""" 

738 return self._code_type 2VfWfNhXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.fOhSf/f:fLf~ abTf3eUf=f?f@f[f]f^f_f`f{f|f

739  

740 @property 

741 def symbol_mapping(self) -> dict: 

742 """Return a copy of the symbol mapping dictionary.""" 

743 return dict(self._sym_map) 2s Lf| } }f~fTf3eUf;f

744  

745 @property 

746 def handle(self): 

747 """Return the underlying handle object. 

748  

749 .. caution:: 

750  

751 This handle is a Python object. To get the memory address of the underlying C 

752 handle, call ``int(ObjectCode.handle)``. 

753 """ 

754 self._lazy_load_module() 2Mh4e

755 return as_py(self._h_library) 2Mh4e

756  

757 def __eq__(self, other) -> bool: 

758 if not isinstance(other, ObjectCode): 24eagbgcgdgegfgfbgghgigjgkglgmgngogw gbpgqgrgsgtgug7e5e6e

759 return NotImplemented 24eagbgcgdgegfgfbgghgigjgkglgmgngogw gbpgqgrgsgtgug

760 # Trigger lazy load for both objects to compare handles 

761 self._lazy_load_module() 24e7e5e6e

762 (<ObjectCode>other)._lazy_load_module() 24e7e5e6e

763 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 24e7e5e6e

764  

765 def __hash__(self) -> int: 

766 # Trigger lazy load to get the handle 

767 self._lazy_load_module() 2#e]e^e_e`e{e|edb}e~eafbfcfdfefffgfv ebhfifjfkflfmfnf$e%e5e6e

768 return hash(as_intptr(self._h_library)) 2#e]e^e_e`e{e|edb}e~eafbfcfdfefffgfv ebhfifjfkflfmfnf$e%e5e6e

769  

770 def __repr__(self) -> str: 

771 # Trigger lazy load to get the handle 

772 self._lazy_load_module() 2ofpfUb

773 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2ofpfUb