X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=inline;f=mono%2Fmini%2Fgshared.cs;h=65151b07024e8d1a2199d9b76119cd07be48c527;hb=fb5bc8d4c539fe82b36f1cd3a3bc89236b39c4aa;hp=48a3e4416315c97845cd8008ec433f47f67f3979;hpb=2dc628d36f9ebd44d25126bfba00cffc6c2df8e4;p=mono.git diff --git a/mono/mini/gshared.cs b/mono/mini/gshared.cs index 48a3e441631..65151b07024 100644 --- a/mono/mini/gshared.cs +++ b/mono/mini/gshared.cs @@ -464,6 +464,21 @@ public class Tests return 0; } + class DelClass { + [MethodImplAttribute (MethodImplOptions.NoInlining)] + public static T return_t (T t) { + return t; + } + } + + public static int test_0_gsharedvt_in_delegates_reflection () { + var m = typeof(DelClass).GetMethod ("return_t").MakeGenericMethod (new Type [] { typeof (int) }); + Func f = (Func)Delegate.CreateDelegate (typeof (Func), null, m, false); + if (f (42) != 42) + return 1; + return 0; + } + [MethodImplAttribute (MethodImplOptions.NoInlining)] static T return2_t (T t) { return return_t (t); @@ -717,12 +732,33 @@ public class Tests } public static int test_0_gsharedvt_ginstvt_constructed_arg () { + { + // AOT: Force a instantiation of use_kvp + long a = 1; + var t = make_kvp (a, a); + var z = use_kvp (t); + } + IFaceKVP c = new ClassKVP (); if (c.do_kvp (1) != 1) return 1; return 0; } + public static int test_0_gsharedvt_ginstvt_constructed_arg_float () { + { + // AOT: Force a instantiation of use_kvp + double a = 1; + var t = make_kvp (a, a); + var z = use_kvp (t); + } + + IFaceKVP c = new ClassKVP (); + if (c.do_kvp (1) != 1) + return 1; + return 0; + } + interface IGetter { T Get(); @@ -1680,6 +1716,23 @@ public class Tests return 0; } + interface ISmallArg { + T foo (string s1, string s2, string s3, string s4, string s5, string s6, string s7, string s8, + string s9, string s10, string s11, string s12, string s13, T t); + } + + class SmallArgClass : ISmallArg { + public T foo (string s1, string s2, string s3, string s4, string s5, string s6, string s7, string s8, + string s9, string s10, string s11, string s12, string s13, T t) { + return t; + } + } + + public static int test_1_small_gsharedvt_stack_arg_ios () { + ISmallArg o = new SmallArgClass (); + return o.foo ("", "", "", "", "", "", "", "", "", "", "", "", "", 1); + } + // Passing vtype normal arguments on the stack public static int test_0_arm64_vtype_stack_args () { IFoo3 o = (IFoo3)Activator.CreateInstance (typeof (Foo3<>).MakeGenericType (new Type [] { typeof (EmptyStruct) })); @@ -1745,6 +1798,149 @@ public class Tests IFaceTest t = new ClassTest (); return obj.foo (ref t); } + + // Sign extension tests + // 0x55 == 85 == 01010101 + // 0xAA == 170 == 10101010 + // 0x5555 == 21845 == 0101010101010101 + // 0xAAAA == 43690 == 1010101010101010 + // 0x55555555 == 1431655765 + // 0xAAAAAAAA == 2863311530 + // 0x5555555555555555 == 6148914691236517205 + // 0xAAAAAAAAAAAAAAAA == 12297829382473034410 + + public interface SEFace { + T Copy (int a, int b, int c, int d, T t); + } + + class SEClass : SEFace { + public T Copy (int a, int b, int c, int d, T t) { + return t; + } + } + + // Test extension + static int test_20_signextension_sbyte () { + Type t = typeof (sbyte); + object o = Activator.CreateInstance (typeof (SEClass<>).MakeGenericType (new Type[] { t })); + var i = (SEFace)o; + + long zz = i.Copy (1,2,3,4,(sbyte)(-0x55)); + + bool success = zz == -0x55; + return success ? 20 : 1; + } + + static int test_20_signextension_byte () { + Type t = typeof (byte); + object o = Activator.CreateInstance (typeof (SEClass<>).MakeGenericType (new Type[] { t })); + var i = (SEFace)o; + + ulong zz = i.Copy (1,2,3,4,(byte)(0xAA)); + + bool success = zz == 0xAA; + return success ? 20 : 1; + } + + static int test_20_signextension_short () { + Type t = typeof (short); + object o = Activator.CreateInstance (typeof (SEClass<>).MakeGenericType (new Type[] { t })); + var i = (SEFace)o; + + long zz = i.Copy (1,2,3,4,(short)(-0x5555)); + + bool success = zz == -0x5555; + return success ? 20 : 1; + } + + static int test_20_signextension_ushort () { + Type t = typeof (ushort); + object o = Activator.CreateInstance (typeof (SEClass<>).MakeGenericType (new Type[] { t })); + var i = (SEFace)o; + + ulong zz = i.Copy (1,2,3,4,(ushort)(0xAAAA)); + + bool success = zz == 0xAAAA; + return success ? 20 : 1; + } + + static int test_20_signextension_int () { + Type t = typeof (int); + object o = Activator.CreateInstance (typeof (SEClass<>).MakeGenericType (new Type[] { t })); + var i = (SEFace)o; + + long zz = i.Copy (1,2,3,4,(int)(-0x55555555)); + + bool success = zz == -0x55555555; + return success ? 20 : 1; + } + + static int test_20_signextension_uint () { + Type t = typeof (uint); + object o = Activator.CreateInstance (typeof (SEClass<>).MakeGenericType (new Type[] { t })); + var i = (SEFace)o; + + ulong zz = i.Copy (1,2,3,4,(uint)(0xAAAAAAAA)); + + bool success = zz == 0xAAAAAAAA; + return success ? 20 : 1; + } + + static int test_20_signextension_long () { + Type t = typeof (long); + object o = Activator.CreateInstance (typeof (SEClass<>).MakeGenericType (new Type[] { t })); + var i = (SEFace)o; + + long zz = i.Copy (1,2,3,4,(long)(-0x5555555555555555)); + + bool success = zz == -0x5555555555555555; + return success ? 20 : 1; + } + + static int test_20_signextension_ulong () { + Type t = typeof (ulong); + object o = Activator.CreateInstance (typeof (SEClass<>).MakeGenericType (new Type[] { t })); + var i = (SEFace)o; + + ulong zz = i.Copy (1,2,3,4,(ulong)(0xAAAAAAAAAAAAAAAA)); + + bool success = zz == 0xAAAAAAAAAAAAAAAA; + return success ? 20 : 1; + } + + void gsharedvt_try_at_offset_0 (ref T disposable) + where T : class, IDisposable { + try { + disposable.Dispose (); + } finally { + disposable = null; + } + } + + [MethodImplAttribute (MethodImplOptions.NoInlining)] + static DateTimeOffset gsharedvt_vphi_inner (T t) { + return DateTimeOffset.MinValue; + } + + static DateTimeOffset gsharedvt_vphi (T t) { + int[] arr = new int [10]; + + try { + DateTimeOffset v; + if (arr [0] == 0) + v = gsharedvt_vphi_inner (t); + else + v = gsharedvt_vphi_inner (t); + return v; + } catch { + return DateTimeOffset.MinValue; + } + } + + static int test_0_gsharedvt_vphi_volatile () { + gsharedvt_vphi (0); + return 0; + } } // #13191