@@ -31,7 +31,19 @@ def __init__(self, store: Storelike, ty: FuncType, func: Callable, access_caller
31
31
raise TypeError ("expected a Store" )
32
32
if not isinstance (ty , FuncType ):
33
33
raise TypeError ("expected a FuncType" )
34
- self ._func_call_init (ty )
34
+ # init signature properties used by call
35
+ self ._ty = ty
36
+ ty_params = ty .params
37
+ ty_results = ty .results
38
+ self ._params_str = (str (i ) for i in ty_params )
39
+ self ._results_str = (str (i ) for i in ty_results )
40
+ params_n = len (ty_params )
41
+ results_n = len (ty_results )
42
+ self ._params_n = params_n
43
+ self ._results_n = results_n
44
+ n = max (params_n , results_n )
45
+ self ._vals_raw_type = wasmtime_val_raw_t * n
46
+
35
47
idx = FUNCTIONS .allocate ((func , ty .results , access_caller ))
36
48
_func = ffi .wasmtime_func_t ()
37
49
ffi .wasmtime_func_new (
@@ -56,19 +68,6 @@ def type(self, store: Storelike) -> FuncType:
56
68
ptr = ffi .wasmtime_func_type (store ._context , byref (self ._func ))
57
69
return FuncType ._from_ptr (ptr , None )
58
70
59
- def _func_call_init (self , ty ):
60
- self ._ty = ty
61
- ty_params = ty .params
62
- ty_results = ty .results
63
- self ._params_str = (str (i ) for i in ty_params )
64
- self ._results_str = (str (i ) for i in ty_results )
65
- params_n = len (ty_params )
66
- results_n = len (ty_results )
67
- self ._params_n = params_n
68
- self ._results_n = results_n
69
- n = max (params_n , results_n )
70
- self ._vals_raw_type = wasmtime_val_raw_t * n
71
-
72
71
def _create_raw_vals (self , * params : IntoVal ) -> ctypes .Array [wasmtime_val_raw_t ]:
73
72
raw = self ._vals_raw_type ()
74
73
for i , param_str in enumerate (self ._params_str ):
@@ -109,7 +108,7 @@ def __call__(self, store: Storelike, *params: IntoVal) -> Union[IntoVal, Sequenc
109
108
# according to https://docs.wasmtime.dev/c-api/func_8h.html#a3b54596199641a8647a7cd89f322966f
110
109
# it's safe to call wasmtime_func_call_unchecked because
111
110
# - we allocate enough space to hold all the parameters and all the results
112
- # - we set proper types
111
+ # - we set proper types by reading types from ty
113
112
# - but not sure about "Values such as externref and funcref are valid within the store being called"
114
113
with enter_wasm (store ) as trap :
115
114
error = None
0 commit comments