Merge pull request #718 from AustinWise/austin/OtherFixes
[dotnet] Some small fixes and unit tests
This commit is contained in:
1
crates/misc/dotnet/.gitignore
vendored
1
crates/misc/dotnet/.gitignore
vendored
@@ -2,6 +2,7 @@
|
|||||||
*.*~
|
*.*~
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
.vs/
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
bin/
|
bin/
|
||||||
|
|||||||
31
crates/misc/dotnet/Wasmtime.sln
Normal file
31
crates/misc/dotnet/Wasmtime.sln
Normal file
@@ -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
|
||||||
@@ -240,7 +240,7 @@ namespace Wasmtime.Bindings
|
|||||||
{
|
{
|
||||||
SetArgs(arguments, args);
|
SetArgs(arguments, args);
|
||||||
|
|
||||||
var result = Method.Invoke(host, args);
|
var result = Method.Invoke(host, BindingFlags.DoNotWrapExceptions, null, args, null);
|
||||||
|
|
||||||
if (hasReturn)
|
if (hasReturn)
|
||||||
{
|
{
|
||||||
@@ -248,9 +248,9 @@ namespace Wasmtime.Bindings
|
|||||||
}
|
}
|
||||||
return IntPtr.Zero;
|
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)
|
fixed (byte* ptr = bytes)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace Wasmtime.Bindings
|
|||||||
|
|
||||||
internal override SafeHandle Bind(Store store, IHost host)
|
internal override SafeHandle Bind(Store store, IHost host)
|
||||||
{
|
{
|
||||||
dynamic memory = Field.GetValue(host);
|
Memory memory = (Memory)Field.GetValue(host);
|
||||||
if (memory.Handle != null)
|
if (memory.Handle != null)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Cannot bind more than once.");
|
throw new InvalidOperationException("Cannot bind more than once.");
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace Wasmtime
|
namespace Wasmtime
|
||||||
{
|
{
|
||||||
@@ -27,7 +27,13 @@ namespace Wasmtime
|
|||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
Interop.wasm_trap_message(trap, out var bytes);
|
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_byte_vec_delete(ref bytes);
|
||||||
|
|
||||||
Interop.wasm_trap_delete(trap);
|
Interop.wasm_trap_delete(trap);
|
||||||
|
|||||||
71
crates/misc/dotnet/tests/FunctionThunkingTests.cs
Normal file
71
crates/misc/dotnet/tests/FunctionThunkingTests.cs
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
crates/misc/dotnet/tests/Modules/FunctionThunking.wasm
Normal file
BIN
crates/misc/dotnet/tests/Modules/FunctionThunking.wasm
Normal file
Binary file not shown.
20
crates/misc/dotnet/tests/Modules/FunctionThunking.wat
Normal file
20
crates/misc/dotnet/tests/Modules/FunctionThunking.wat
Normal file
@@ -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)
|
||||||
|
)
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user