Coverage for wasmtime/_globals.py: 95%
40 statements
« prev ^ index » next coverage.py v7.11.3, created at 2025-12-01 19:40 +0000
« prev ^ index » next coverage.py v7.11.3, created at 2025-12-01 19:40 +0000
1import ctypes
3from . import _ffi as ffi
4from wasmtime import GlobalType, Val, WasmtimeError
5from typing import Any
6from ._store import Storelike
9class Global:
10 _global: ffi.wasmtime_global_t
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_
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
33 def type(self, store: Storelike) -> GlobalType:
34 """
35 Gets the type of this global as a `GlobalType`
36 """
38 ptr = ffi.wasmtime_global_type(store._context(), ctypes.byref(self._global))
39 return GlobalType._from_ptr(ptr, None)
41 def value(self, store: Storelike) -> Any:
42 """
43 Gets the current value of this global
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
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)
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)