diff --git a/Directory.Build.props b/Directory.Build.props index 8b02eb2..dd40c57 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ false - 44.0.0 + 48.0.2 $(WasmtimeVersion)$(WasmtimeDotnetVersion)-dev $(WasmtimeVersion)$(WasmtimeDotnetVersion) diff --git a/src/Value.cs b/src/Value.cs index 2f1e428..ade18d7 100644 --- a/src/Value.cs +++ b/src/Value.cs @@ -90,6 +90,9 @@ public static bool IsNull(this in ExternFunc externfunc) internal static class ValueType { + // This is used to identify `v128` types, which cannot be recognised through `wasm_valtype_kind`. + private static readonly IntPtr V128Type = Native.wasmtime_wasm_valtype_v128(); + public static IntPtr FromKind(TableKind kind) { return FromKind((ValueKind)kind); @@ -103,9 +106,12 @@ public static IntPtr FromKind(ValueKind kind) case ValueKind.Int64: case ValueKind.Float32: case ValueKind.Float64: - case ValueKind.V128: return Native.wasm_valtype_new((byte)kind); + // v128 has no `wasm_valkind_t`, so it needs its own constructor. + case ValueKind.V128: + return Native.wasmtime_wasm_valtype_v128(); + case ValueKind.ExternRef: return Native.wasm_valtype_new(128); @@ -119,6 +125,13 @@ public static IntPtr FromKind(ValueKind kind) public static ValueKind ToKind(IntPtr type) { + // `v128` has no `wasm_valkind_t` so `wasm_valtype_kind` cannot be used to identify it. + // It has be identified by using `wasmtime_wasm_valtype_equal`. + if (Native.wasmtime_wasm_valtype_equal(type, V128Type)) + { + return ValueKind.V128; + } + var kind = (ValueKind)Native.wasm_valtype_kind(type); switch (kind) { @@ -145,6 +158,13 @@ private static class Native [DllImport(Engine.LibraryName)] public static extern IntPtr wasm_valtype_new(byte kind); + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_wasm_valtype_v128(); + + [DllImport(Engine.LibraryName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool wasmtime_wasm_valtype_equal(IntPtr a, IntPtr b); + [DllImport(Engine.LibraryName)] [return: MarshalAs(UnmanagedType.I1)] public static extern byte wasm_valtype_kind(IntPtr valueType);