Skip to content

Commit

Permalink
Merge pull request bytecodealliance#718 from AustinWise/austin/OtherF…
Browse files Browse the repository at this point in the history
…ixes

[dotnet] Some small fixes and unit tests
  • Loading branch information
peterhuene authored Dec 16, 2019
2 parents 77bf768 + 50d0aa9 commit 321a7a1
Show file tree
Hide file tree
Showing 8 changed files with 135 additions and 6 deletions.
1 change: 1 addition & 0 deletions crates/misc/dotnet/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
*.*~
.DS_Store

.vs/
.vscode

bin/
Expand Down
31 changes: 31 additions & 0 deletions crates/misc/dotnet/Wasmtime.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29519.181
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wasmtime", "src\Wasmtime.csproj", "{5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wasmtime.Tests", "tests\Wasmtime.Tests.csproj", "{8A200114-1D0B-4F90-9F82-1FFE47C207DD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Release|Any CPU.Build.0 = Release|Any CPU
{8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F5AC35E5-1373-49E6-97DC-68CB5E0369E0}
EndGlobalSection
EndGlobal
6 changes: 3 additions & 3 deletions crates/misc/dotnet/src/Bindings/FunctionBinding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -240,17 +240,17 @@ private unsafe Interop.WasmFuncCallback CreateCallback(Store store, IHost host)
{
SetArgs(arguments, args);

var result = Method.Invoke(host, args);
var result = Method.Invoke(host, BindingFlags.DoNotWrapExceptions, null, args, null);

if (hasReturn)
{
SetResults(result, results);
}
return IntPtr.Zero;
}
catch (TargetInvocationException ex)
catch (Exception ex)
{
var bytes = Encoding.UTF8.GetBytes(ex.InnerException.Message + "\0" /* exception messages need a null */);
var bytes = Encoding.UTF8.GetBytes(ex.Message + "\0" /* exception messages need a null */);

fixed (byte* ptr = bytes)
{
Expand Down
2 changes: 1 addition & 1 deletion crates/misc/dotnet/src/Bindings/MemoryBinding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public MemoryBinding(MemoryImport import, FieldInfo field)

internal override SafeHandle Bind(Store store, IHost host)
{
dynamic memory = Field.GetValue(host);
Memory memory = (Memory)Field.GetValue(host);
if (memory.Handle != null)
{
throw new InvalidOperationException("Cannot bind more than once.");
Expand Down
10 changes: 8 additions & 2 deletions crates/misc/dotnet/src/TrapException.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Text;

namespace Wasmtime
{
Expand All @@ -27,7 +27,13 @@ internal static TrapException FromOwnedTrap(IntPtr trap)
unsafe
{
Interop.wasm_trap_message(trap, out var bytes);
var message = Marshal.PtrToStringUTF8((IntPtr)bytes.data, (int)bytes.size - 1 /* remove null */);
var byteSpan = new ReadOnlySpan<byte>(bytes.data, checked((int)bytes.size));

int indexOfNull = byteSpan.IndexOf((byte)0);
if (indexOfNull != -1)
byteSpan = byteSpan.Slice(0, indexOfNull);

var message = Encoding.UTF8.GetString(byteSpan);
Interop.wasm_byte_vec_delete(ref bytes);

Interop.wasm_trap_delete(trap);
Expand Down
71 changes: 71 additions & 0 deletions crates/misc/dotnet/tests/FunctionThunkingTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using FluentAssertions;
using System;
using System.Linq;
using Xunit;

namespace Wasmtime.Tests
{
public class FunctionThunkingFixture : ModuleFixture
{
protected override string ModuleFileName => "FunctionThunking.wasm";
}

public class FunctionThunkingTests : IClassFixture<FunctionThunkingFixture>
{
const string THROW_MESSAGE = "Test error messages for wasmtime dotnet bidnings unit tests.";

class MyHost : IHost
{
public Instance Instance { get; set; }

[Import("add", Module = "env")]
public int Add(int x, int y) => x + y;

[Import("do_throw", Module = "env")]
public void Throw() => throw new Exception(THROW_MESSAGE);
}

public FunctionThunkingTests(FunctionThunkingFixture fixture)
{
Fixture = fixture;
}

private FunctionThunkingFixture Fixture { get; }

[Fact]
public void ItBindsImportMethodsAndCallsThemCorrectly()
{
var host = new MyHost();
using (var instance = Fixture.Module.Instantiate(host))
{
var add_func = instance.Externs.Functions.Where(f => f.Name == "add_wrapper").Single();
int invoke_add(int x, int y) => (int)add_func.Invoke(new object[] { x, y });

invoke_add(40, 2).Should().Be(42);
invoke_add(22, 5).Should().Be(27);

//Collect garbage to make sure delegate function pointers pasted to wasmtime are rooted.
GC.Collect();
GC.WaitForPendingFinalizers();

invoke_add(1970, 50).Should().Be(2020);
}
}

[Fact]
public void ItPropegatesExceptionsToCallersViaTraps()
{
var host = new MyHost();
using (var instance = Fixture.Module.Instantiate(host))
{
var throw_func = instance.Externs.Functions.Where(f => f.Name == "do_throw_wrapper").Single();
Action action = () => throw_func.Invoke();

action
.Should()
.Throw<TrapException>()
.WithMessage(THROW_MESSAGE);
}
}
}
}
Binary file not shown.
20 changes: 20 additions & 0 deletions crates/misc/dotnet/tests/Modules/FunctionThunking.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
(module
(type $FUNCSIG$iii (func (param i32 i32) (result i32)))
(type $FUNCSIG$v (func))
(import "env" "add" (func $add (param i32 i32) (result i32)))
(import "env" "do_throw" (func $do_throw))
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
(export "add_wrapper" (func $add_wrapper))
(export "do_throw_wrapper" (func $do_throw_wrapper))
(func $add_wrapper (; 2 ;) (param $0 i32) (param $1 i32) (result i32)
(call $add
(get_local $0)
(get_local $1)
)
)
(func $do_throw_wrapper (; 3 ;)
(call $do_throw)
)
)

0 comments on commit 321a7a1

Please sign in to comment.