Coverage for wasmtime/_globals.py: 95%

40 statements  

« prev     ^ index     » next       coverage.py v7.11.3, created at 2025-12-01 19:40 +0000

1import ctypes 

2 

3from . import _ffi as ffi 

4from wasmtime import GlobalType, Val, WasmtimeError 

5from typing import Any 

6from ._store import Storelike 

7 

8 

9class Global: 

10 _global: ffi.wasmtime_global_t 

11 

12 def __init__(self, store: Storelike, ty: GlobalType, val: Any): 

13 if not isinstance(ty, GlobalType): 

14 raise TypeError("expected a GlobalType") 

15 val = Val._convert_to_raw(store, ty.content, val) 

16 global_ = ffi.wasmtime_global_t() 

17 error = ffi.wasmtime_global_new( 

18 store._context(), 

19 ty.ptr(), 

20 ctypes.byref(val), 

21 ctypes.byref(global_)) 

22 ffi.wasmtime_val_unroot(ctypes.byref(val)) 

23 if error: 

24 raise WasmtimeError._from_ptr(error) 

25 self._global = global_ 

26 

27 @classmethod 

28 def _from_raw(cls, global_: ffi.wasmtime_global_t) -> "Global": 

29 ty: "Global" = cls.__new__(cls) 

30 ty._global = global_ 

31 return ty 

32 

33 def type(self, store: Storelike) -> GlobalType: 

34 """ 

35 Gets the type of this global as a `GlobalType` 

36 """ 

37 

38 ptr = ffi.wasmtime_global_type(store._context(), ctypes.byref(self._global)) 

39 return GlobalType._from_ptr(ptr, None) 

40 

41 def value(self, store: Storelike) -> Any: 

42 """ 

43 Gets the current value of this global 

44 

45 Returns a native python type 

46 """ 

47 raw = ffi.wasmtime_val_t() 

48 ffi.wasmtime_global_get(store._context(), ctypes.byref(self._global), ctypes.byref(raw)) 

49 val = Val._from_raw(store, raw) 

50 if val.value is not None: 

51 return val.value 

52 else: 

53 return val 

54 

55 def set_value(self, store: Storelike, val: Any) -> None: 

56 """ 

57 Sets the value of this global to a new value 

58 """ 

59 val = Val._convert_to_raw(store, self.type(store).content, val) 

60 error = ffi.wasmtime_global_set(store._context(), ctypes.byref(self._global), ctypes.byref(val)) 

61 ffi.wasmtime_val_unroot(ctypes.byref(val)) 

62 if error: 

63 raise WasmtimeError._from_ptr(error) 

64 

65 def _as_extern(self) -> ffi.wasmtime_extern_t: 

66 union = ffi.wasmtime_extern_union(global_=self._global) 

67 return ffi.wasmtime_extern_t(ffi.WASMTIME_EXTERN_GLOBAL, union)