|
16 | 16 | WASMTIME_V128, |
17 | 17 | WASMTIME_FUNCREF, |
18 | 18 | WASMTIME_EXTERNREF, |
| 19 | + WASM_ANYREF, |
| 20 | + WASM_FUNCREF, |
19 | 21 | ) |
20 | 22 |
|
21 | 23 |
|
|
31 | 33 | WASMTIME_V128.value: 'v128', |
32 | 34 | WASMTIME_FUNCREF.value: 'funcref', |
33 | 35 | WASMTIME_EXTERNREF.value: 'externref', |
| 36 | + WASM_FUNCREF.value: 'funcref', |
| 37 | + WASM_ANYREF.value: 'externref', |
34 | 38 | } |
35 | 39 |
|
36 | 40 | def get_valtype_attr(ty: ValType): |
37 | 41 | return val_id2attr[wasm_valtype_kind(ty._ptr)] |
38 | 42 |
|
| 43 | +def val_setter(dst, attr, val): |
| 44 | + if attr=='externref': |
| 45 | + # TODO: handle None |
| 46 | + v = Val.externref(val) |
| 47 | + casted = ctypes.addressof(v._raw.of.externref) |
| 48 | + elif isinstance(val, Func): |
| 49 | + # TODO: handle null_funcref |
| 50 | + # TODO: validate same val._func.store_id |
| 51 | + casted = val._func.index |
| 52 | + else: |
| 53 | + casted = val |
| 54 | + setattr(dst, attr, casted) |
| 55 | + |
39 | 56 | class Func: |
40 | 57 | _func: ffi.wasmtime_func_t |
41 | 58 | _ty: FuncType |
@@ -88,7 +105,7 @@ def type(self, store: Storelike) -> FuncType: |
88 | 105 | def _create_raw_vals(self, *params: IntoVal) -> ctypes.Array[wasmtime_val_raw_t]: |
89 | 106 | raw = self._vals_raw_type() |
90 | 107 | for i, param_str in enumerate(self._params_str): |
91 | | - setattr(raw[i], param_str, params[i]) |
| 108 | + val_setter(raw[i], param_str, params[i]) |
92 | 109 | return raw |
93 | 110 |
|
94 | 111 | def _extract_return(self, vals_raw: ctypes.Array[wasmtime_val_raw_t]) -> Union[IntoVal, Sequence[IntoVal], None]: |
|
0 commit comments