Merge pull request #4033 from ntherning/no-stdcall-for-icalls-on-windows-32-bit
[mono.git] / mono / mini / gshared.cs
index 7f54d4b709de41ca9f2aff2ddfbcf7371375014d..65151b07024e8d1a2199d9b76119cd07be48c527 100644 (file)
@@ -732,12 +732,33 @@ public class Tests
        }
 
        public static int test_0_gsharedvt_ginstvt_constructed_arg () {
+               {
+                       // AOT: Force a instantiation of use_kvp<long>
+                       long a = 1;
+                       var t = make_kvp (a, a);
+                       var z = use_kvp (t);
+               }
+
                IFaceKVP c = new ClassKVP ();
                if (c.do_kvp<long> (1) != 1)
                        return 1;
                return 0;
        }
 
+       public static int test_0_gsharedvt_ginstvt_constructed_arg_float () {
+               {
+                       // AOT: Force a instantiation of use_kvp<double>
+                       double a = 1;
+                       var t = make_kvp (a, a);
+                       var z = use_kvp (t);
+               }
+
+               IFaceKVP c = new ClassKVP ();
+               if (c.do_kvp<double> (1) != 1)
+                       return 1;
+               return 0;
+       }
+
        interface IGetter
        {
                T Get<T>();
@@ -1695,6 +1716,23 @@ public class Tests
                return 0;
        }
 
+       interface ISmallArg {
+               T foo<T> (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<T> (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<int> ("", "", "", "", "", "", "", "", "", "", "", "", "", 1);
+       }
+
        // Passing vtype normal arguments on the stack
        public static int test_0_arm64_vtype_stack_args () {
                IFoo3<EmptyStruct> o = (IFoo3<EmptyStruct>)Activator.CreateInstance (typeof (Foo3<>).MakeGenericType (new Type [] { typeof (EmptyStruct) }));
@@ -1760,6 +1798,149 @@ public class Tests
                IFaceTest t = new ClassTest ();
                return obj.foo<IFaceTest, int> (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> {
+               T Copy (int a, int b, int c, int d, T t);
+       }
+
+       class SEClass<T> : SEFace<T> {
+               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<sbyte>)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<byte>)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<short>)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<ushort>)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<int>)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<uint>)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<long>)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<ulong>)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<T> (ref T disposable)
+               where T : class, IDisposable {
+                       try {
+                               disposable.Dispose ();
+                       } finally {
+                               disposable = null;
+                       }
+               }
+
+       [MethodImplAttribute (MethodImplOptions.NoInlining)]
+       static DateTimeOffset gsharedvt_vphi_inner<T> (T t) {
+               return DateTimeOffset.MinValue;
+       }
+
+       static DateTimeOffset gsharedvt_vphi<T> (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