Skip to content

Commit

Permalink
Port Alex's latest API changes.
Browse files Browse the repository at this point in the history
  • Loading branch information
peterhuene committed Apr 6, 2020
1 parent 417be48 commit 0e7d23a
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 20 deletions.
19 changes: 11 additions & 8 deletions src/Host.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,10 @@ public void DefineWasi(string name, WasiConfiguration config = null)

using var wasi = config.CreateWasi(Store, name);

if (!Interop.wasmtime_linker_define_wasi(Linker, wasi))
var error = Interop.wasmtime_linker_define_wasi(Linker, wasi);
if (error != IntPtr.Zero)
{
throw new WasmtimeException($"Failed to define WASI module '{name}'.");
throw WasmtimeException.FromOwnedError(error);
}
}

Expand Down Expand Up @@ -618,12 +619,10 @@ public Module LoadModuleText(string name, string text)
textVec.size = (UIntPtr)textBytes.Length;
textVec.data = ptr;

if (!Interop.wasmtime_wat2wasm(ref textVec, out var bytes, out var error))
var error = Interop.wasmtime_wat2wasm(ref textVec, out var bytes);
if (error != IntPtr.Zero)
{
var errorSpan = new ReadOnlySpan<byte>(error.data, checked((int)error.size));
var message = Encoding.UTF8.GetString(errorSpan);
Interop.wasm_byte_vec_delete(ref error);
throw new WasmtimeException($"Failed to parse module text: {message}");
throw WasmtimeException.FromOwnedError(error);
}

var byteSpan = new ReadOnlySpan<byte>(bytes.data, checked((int)bytes.size));
Expand Down Expand Up @@ -792,7 +791,11 @@ private bool Define(string moduleName, string name, IntPtr ext)
nameVec.size = (UIntPtr)nameBytes.Length;
nameVec.data = namePtr;

return Interop.wasmtime_linker_define(Linker, ref moduleNameVec, ref nameVec, ext);
var error = Interop.wasmtime_linker_define(Linker, ref moduleNameVec, ref nameVec, ext);
if (error == IntPtr.Zero)
return true;
Interop.wasmtime_error_delete(error);
return false;
}
}
}
Expand Down
7 changes: 6 additions & 1 deletion src/Instance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,13 @@ internal Instance(Interop.LinkerHandle linker, Module module)

unsafe
{
Handle = Interop.wasmtime_linker_instantiate(linker, module.Handle, out var trap);
var error = Interop.wasmtime_linker_instantiate(linker, module.Handle, out var handle, out var trap);
Handle = handle;

if (error != IntPtr.Zero)
{
throw WasmtimeException.FromOwnedError(error);
}
if (trap != IntPtr.Zero)
{
throw TrapException.FromOwnedTrap(trap);
Expand Down
39 changes: 28 additions & 11 deletions src/Interop.cs
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,21 @@ protected override bool ReleaseHandle()
}
}

internal class ErrorHandle : SafeHandle
{
public ErrorHandle() : base(IntPtr.Zero, true)
{
}

public override bool IsInvalid => handle == IntPtr.Zero;

protected override bool ReleaseHandle()
{
Interop.wasmtime_error_delete(handle);
return true;
}
}

[StructLayout(LayoutKind.Sequential)]
internal unsafe struct wasm_byte_vec_t
{
Expand Down Expand Up @@ -1003,7 +1018,7 @@ out IntPtr trap
public static extern void wasmtime_config_wasm_multi_value_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);

[DllImport(LibraryName)]
public static extern void wasmtime_config_strategy_set(WasmConfigHandle config, wasmtime_strategy_t strategy);
public static extern IntPtr wasmtime_config_strategy_set(WasmConfigHandle config, wasmtime_strategy_t strategy);

[DllImport(LibraryName)]
public static extern void wasmtime_config_cranelift_debug_verifier_set(WasmConfigHandle config, [MarshalAs(UnmanagedType.I1)] bool enable);
Expand All @@ -1013,9 +1028,8 @@ out IntPtr trap

// Utility functions

[DllImport(LibraryName, CharSet=CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasmtime_wat2wasm(ref wasm_byte_vec_t text, out wasm_byte_vec_t bytes, out wasm_byte_vec_t error);
[DllImport(LibraryName)]
public static extern IntPtr wasmtime_wat2wasm(ref wasm_byte_vec_t text, out wasm_byte_vec_t bytes);

// Linking functions

Expand All @@ -1029,19 +1043,16 @@ out IntPtr trap
public static extern void wasmtime_linker_delete(IntPtr linker);

[DllImport(LibraryName)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasmtime_linker_define(LinkerHandle linker, ref wasm_byte_vec_t module, ref wasm_byte_vec_t name, IntPtr externType);
public static extern IntPtr wasmtime_linker_define(LinkerHandle linker, ref wasm_byte_vec_t module, ref wasm_byte_vec_t name, IntPtr externType);

[DllImport(LibraryName)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasmtime_linker_define_wasi(LinkerHandle linker, WasiInstanceHandle wasi);
public static extern IntPtr wasmtime_linker_define_wasi(LinkerHandle linker, WasiInstanceHandle wasi);

[DllImport(LibraryName)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool wasmtime_linker_define_instance(LinkerHandle linker, ref wasm_byte_vec_t name, InstanceHandle instance);
public static extern IntPtr wasmtime_linker_define_instance(LinkerHandle linker, ref wasm_byte_vec_t name, InstanceHandle instance);

[DllImport(LibraryName)]
public static extern InstanceHandle wasmtime_linker_instantiate(LinkerHandle linker, ModuleHandle module, out IntPtr trap);
public static extern IntPtr wasmtime_linker_instantiate(LinkerHandle linker, ModuleHandle module, out InstanceHandle instance, out IntPtr trap);

// Caller functions

Expand All @@ -1050,5 +1061,11 @@ out IntPtr trap

[DllImport(LibraryName)]
public static extern ExternHandle wasmtime_caller_export_get(IntPtr caller, ref wasm_byte_vec_t name);

[DllImport(LibraryName)]
public static extern void wasmtime_error_message(IntPtr error, out wasm_byte_vec_t message);

[DllImport(LibraryName)]
public static extern void wasmtime_error_delete(IntPtr error);
}
}
16 changes: 16 additions & 0 deletions src/WasmtimeException.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Runtime.Serialization;
using System.Text;

namespace Wasmtime
{
Expand All @@ -20,5 +21,20 @@ public WasmtimeException(string message, Exception inner) : base(message, inner)

/// <inheritdoc/>
protected WasmtimeException(SerializationInfo info, StreamingContext context) : base(info, context) { }

internal static WasmtimeException FromOwnedError(IntPtr error)
{
unsafe
{
Interop.wasmtime_error_message(error, out var bytes);
var byteSpan = new ReadOnlySpan<byte>(bytes.data, checked((int)bytes.size));
var message = Encoding.UTF8.GetString(byteSpan);
Interop.wasm_byte_vec_delete(ref bytes);

Interop.wasmtime_error_delete(error);

return new WasmtimeException(message);
}
}
}
}

0 comments on commit 0e7d23a

Please sign in to comment.