|
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