X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Ftests%2Fmarshal9.cs;h=f19059435939a60dfc0eafec50e2c05d152b8594;hb=1cfd52452a4af3fd6eee32f45a8067926af8479e;hp=99f19b23d2f0db8e912d1f0637437dc07d5ffcc1;hpb=538d3bb80572334c18ae117ea7703406a4a22872;p=mono.git diff --git a/mono/tests/marshal9.cs b/mono/tests/marshal9.cs index 99f19b23d2f..f1905943593 100644 --- a/mono/tests/marshal9.cs +++ b/mono/tests/marshal9.cs @@ -5,6 +5,11 @@ using System; using System.Runtime.InteropServices; +[AttributeUsage (AttributeTargets.Method)] +sealed class MonoPInvokeCallbackAttribute : Attribute { + public MonoPInvokeCallbackAttribute (Type t) {} +} + public class Marshal1 : ICustomMarshaler { int param; @@ -78,6 +83,7 @@ public class Tests { public static int Main (string[] args) { return TestDriver.RunTests (typeof (Tests)); + return 0; } [DllImport ("libtest")] @@ -90,6 +96,7 @@ public class Tests Marshal1.cleanup_managed_count = 0; Marshal1.cleanup_native_count = 0; + Marshal1.native_to_managed_count = 0; int res = (int)mono_test_marshal_pass_return_custom (5, 10, 5); @@ -97,6 +104,8 @@ public class Tests return 1; if (Marshal1.cleanup_native_count != 2) return 2; + if (Marshal1.native_to_managed_count != 1) + return 3; return res == 15 ? 0 : 3; } @@ -228,10 +237,12 @@ public class Tests [DllImport ("libtest")] private static extern int mono_test_marshal_pass_return_custom_null_in_delegate (pass_return_int_delegate del); + [MonoPInvokeCallback (typeof (pass_return_int_delegate))] private static object pass_return_int (object i) { return (int)i; } + [MonoPInvokeCallback (typeof (pass_return_int_delegate))] private static object pass_return_null (object i) { return (i == null) ? null : new Object (); } @@ -371,4 +382,67 @@ public class Tests return 1; } + public class Marshal6 : ICustomMarshaler { + public static int managed_to_native_count = 0; + public static int native_to_managed_count = 0; + + public static ICustomMarshaler GetInstance (string s) + { + return new Marshal6 (); + } + + public void CleanUpManagedData (object managedObj) + { + } + + public void CleanUpNativeData (IntPtr pNativeData) + { + } + + public int GetNativeDataSize () + { + return 4; + } + + public IntPtr MarshalManagedToNative (object managedObj) + { + managed_to_native_count++; + return IntPtr.Zero; + } + + public object MarshalNativeToManaged (IntPtr pNativeData) + { + native_to_managed_count++; + return null; + } + } + + public delegate void custom_out_param_delegate ([MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal6), MarshalCookie = "5")] out object o); + + [DllImport ("libtest")] + private static extern int mono_test_marshal_custom_out_param_delegate (custom_out_param_delegate del); + + // ICustomMarshaler.MarshalNativeToManaged should not be called when the + // parameter is marked as an out. + public static int test_0_native_to_managed_custom_parameter () + { + Marshal6.managed_to_native_count = 0; + Marshal6.native_to_managed_count = 0; + + int res = mono_test_marshal_custom_out_param_delegate (new custom_out_param_delegate (custom_out_param)); + + if (Marshal6.managed_to_native_count != 1) + return 1; + if (Marshal6.native_to_managed_count != 0) + return 2; + + return 0; + } + + [MonoPInvokeCallback (typeof (custom_out_param_delegate))] + private static void custom_out_param (out object i) + { + i = new object(); + } + }