16
16
17
17
class Func :
18
18
_func : ffi .wasmtime_func_t
19
+ _ty : FuncType
19
20
_params_n : int
20
21
_results_n : int
21
22
_params_str : list [str ]
22
23
_results_str : list [str ]
24
+ _results_str0 : str
23
25
_vals_raw_type : ctypes .Array [wasmtime_val_raw_t ]
24
26
25
27
def __init__ (self , store : Storelike , ty : FuncType , func : Callable , access_caller : bool = False ):
@@ -36,19 +38,7 @@ def __init__(self, store: Storelike, ty: FuncType, func: Callable, access_caller
36
38
raise TypeError ("expected a Store" )
37
39
if not isinstance (ty , FuncType ):
38
40
raise TypeError ("expected a FuncType" )
39
- # init signature properties used by call
40
- self ._ty = ty
41
- ty_params = ty .params
42
- ty_results = ty .results
43
- self ._params_str = (str (i ) for i in ty_params )
44
- self ._results_str = (str (i ) for i in ty_results )
45
- params_n = len (ty_params )
46
- results_n = len (ty_results )
47
- self ._params_n = params_n
48
- self ._results_n = results_n
49
- n = max (params_n , results_n )
50
- self ._vals_raw_type = wasmtime_val_raw_t * n
51
-
41
+ self ._init_call (ty )
52
42
idx = FUNCTIONS .allocate ((func , ty .results , access_caller ))
53
43
_func = ffi .wasmtime_func_t ()
54
44
ffi .wasmtime_func_new (
@@ -83,10 +73,26 @@ def _extract_return(self, vals_raw: ctypes.Array[wasmtime_val_raw_t]) -> Union[I
83
73
if self ._results_n == 0 :
84
74
return None
85
75
if self ._results_n == 1 :
86
- return getattr (vals_raw [0 ], self ._results_str [ 0 ] )
76
+ return getattr (vals_raw [0 ], self ._results_str0 )
87
77
# we can use tuple construct, but I'm using list for compatability
88
78
return [getattr (val_raw , ret_str ) for val_raw , ret_str in zip (vals_raw , self ._results_str )]
89
79
80
+ def _init_call (self , ty ):
81
+ """init signature properties used by call"""
82
+ self ._ty = ty
83
+ ty_params = ty .params
84
+ ty_results = ty .results
85
+ self ._params_str = (str (i ) for i in ty_params )
86
+ self ._results_str = (str (i ) for i in ty_results )
87
+ self ._results_str0 = str (ty_results [0 ])
88
+ params_n = len (ty_params )
89
+ results_n = len (ty_results )
90
+ self ._params_n = params_n
91
+ self ._results_n = results_n
92
+ n = max (params_n , results_n )
93
+ self ._vals_raw_type = wasmtime_val_raw_t * n
94
+
95
+
90
96
def __call__ (self , store : Storelike , * params : IntoVal ) -> Union [IntoVal , Sequence [IntoVal ], None ]:
91
97
"""
92
98
Calls this function with the given parameters
@@ -101,6 +107,8 @@ def __call__(self, store: Storelike, *params: IntoVal) -> Union[IntoVal, Sequenc
101
107
Note that you can also use the `__call__` method and invoke a `Func` as
102
108
if it were a function directly.
103
109
"""
110
+ if getattr (self , "_ty" , None ) is None :
111
+ self ._init_call (self .type (store ))
104
112
params_n = len (params )
105
113
if params_n > self ._params_n :
106
114
raise WasmtimeError ("too many parameters provided: given %s, expected %s" %
0 commit comments