From 527abcd11521282476d53f101c3b39d6c46d2ae3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Laban?= Date: Thu, 16 May 2019 13:54:12 -0400 Subject: [PATCH] Update the driver to support MONO_TYPE_I Add tests to validate boxing/unboxing --- sdks/wasm/bindings-test.cs | 26 ++++++++++++++++++++-- sdks/wasm/driver.c | 2 ++ .../framework/src/WebAssembly.Bindings/Runtime.cs | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/sdks/wasm/bindings-test.cs b/sdks/wasm/bindings-test.cs index 31367e1bf33..c5f6b736c90 100644 --- a/sdks/wasm/bindings-test.cs +++ b/sdks/wasm/bindings-test.cs @@ -51,6 +51,12 @@ public class TestClass { intptr_val = i; } + public static IntPtr mkintptr_val; + public static IntPtr InvokeMkIntPtr() { + intptr_val = (IntPtr)42; + return intptr_val; + } + public static object obj1; public static object InvokeObj1(object obj) { @@ -652,13 +658,29 @@ public class BindingTests { public static void BindIntPtrStaticMethod () { TestClass.intptr_val = IntPtr.Zero; Runtime.InvokeJS (@" - var invoke_int = Module.mono_bind_static_method (""[binding_tests]TestClass:InvokeIntPtr""); - invoke_int (42); + var invoke_int_ptr = Module.mono_bind_static_method (""[binding_tests]TestClass:InvokeIntPtr""); + invoke_int_ptr (42); "); Assert.AreEqual (42, TestClass.intptr_val); } + + [Test] + public static void MarshalIntPtrToJS () { + TestClass.mkstr = TestClass.string_res = null; + Runtime.InvokeJS (@" + var invoke_mk_int = Module.mono_bind_static_method (""[binding_tests]TestClass:InvokeMkIntPtr""); + var r = invoke_mk_int (); + + if (r != 42) throw `Invalid int_ptr value`; + "); + Assert.IsNotNull (TestClass.mkstr); + + Assert.AreEqual (TestClass.mkstr, TestClass.string_res); + } + + [Test] public static void InvokeStaticMethod () { TestClass.int_val = 0; diff --git a/sdks/wasm/driver.c b/sdks/wasm/driver.c index a6005dbc0e9..3847c44aab1 100644 --- a/sdks/wasm/driver.c +++ b/sdks/wasm/driver.c @@ -488,6 +488,7 @@ mono_wasm_get_obj_type (MonoObject *obj) case MONO_TYPE_U4: case MONO_TYPE_I8: case MONO_TYPE_U8: + case MONO_TYPE_I: // IntPtr return MARSHAL_TYPE_INT; case MONO_TYPE_R4: case MONO_TYPE_R8: @@ -552,6 +553,7 @@ mono_unbox_int (MonoObject *obj) case MONO_TYPE_U2: return *(unsigned short*)ptr; case MONO_TYPE_I4: + case MONO_TYPE_I: return *(int*)ptr; case MONO_TYPE_U4: return *(unsigned int*)ptr; diff --git a/sdks/wasm/framework/src/WebAssembly.Bindings/Runtime.cs b/sdks/wasm/framework/src/WebAssembly.Bindings/Runtime.cs index b2fee915b09..5c2960637e0 100644 --- a/sdks/wasm/framework/src/WebAssembly.Bindings/Runtime.cs +++ b/sdks/wasm/framework/src/WebAssembly.Bindings/Runtime.cs @@ -351,8 +351,8 @@ namespace WebAssembly { } else { if (t.IsValueType) throw new Exception("Can't handle VT arguments"); + res += "o"; } - res += "o"; break; } } -- 2.11.4.GIT