Coverage for wasmtime/_extern.py: 72%

43 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-02-20 16:25 +0000

1from . import _ffi as ffi 

2import ctypes 

3from ._exportable import AsExtern 

4from wasmtime import WasmtimeError, Managed 

5 

6 

7def wrap_extern(ptr: ffi.wasmtime_extern_t) -> AsExtern: 

8 from wasmtime import Func, Table, Global, Memory, SharedMemory, Module, Instance 

9 

10 if ptr.kind == ffi.WASMTIME_EXTERN_FUNC.value: 

11 return Func._from_raw(ptr.of.func) 

12 if ptr.kind == ffi.WASMTIME_EXTERN_TABLE.value: 

13 return Table._from_raw(ptr.of.table) 

14 if ptr.kind == ffi.WASMTIME_EXTERN_GLOBAL.value: 

15 return Global._from_raw(ptr.of.global_) 

16 if ptr.kind == ffi.WASMTIME_EXTERN_MEMORY.value: 

17 return Memory._from_raw(ptr.of.memory) 

18 if ptr.kind == ffi.WASMTIME_EXTERN_SHAREDMEMORY.value: 

19 return SharedMemory._from_ptr(ptr.of.sharedmemory) 

20 if ptr.kind == ffi.WASMTIME_EXTERN_INSTANCE.value: 

21 return Instance._from_raw(ptr.of.instance) 

22 if ptr.kind == ffi.WASMTIME_EXTERN_MODULE.value: 

23 return Module._from_ptr(ptr.of.module) 

24 raise WasmtimeError("unknown extern") 

25 

26 

27def get_extern_ptr(item: AsExtern) -> ffi.wasmtime_extern_t: 

28 from wasmtime import Func, Table, Global, Memory, SharedMemory, Module, Instance 

29 

30 if isinstance(item, Func): 

31 return item._as_extern() 

32 elif isinstance(item, Global): 

33 return item._as_extern() 

34 elif isinstance(item, Memory): 

35 return item._as_extern() 

36 elif isinstance(item, SharedMemory): 

37 return item._as_extern() 

38 elif isinstance(item, Table): 

39 return item._as_extern() 

40 elif isinstance(item, Module): 

41 return item._as_extern() 

42 elif isinstance(item, Instance): 

43 return item._as_extern() 

44 else: 

45 raise TypeError("expected a Func, Global, Memory, Table, Module, or Instance") 

46 

47 

48class Extern(Managed["ctypes._Pointer[ffi.wasm_extern_t]"]): 

49 def __init__(self, ptr: "ctypes._Pointer[ffi.wasm_extern_t]"): 

50 self._set_ptr(ptr) 

51 

52 def _delete(self, ptr: "ctypes._Pointer[ffi.wasm_extern_t]") -> None: 

53 ffi.wasm_extern_delete(ptr)