X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Farrays.cs;h=65606e0d2b2e90403dbe9a77d332055f0d5095ef;hb=04713a947f77fb5a41d66d39aaaeadb8c7049fe6;hp=0656649389b0988dc64a7aabec27d4e48a7188b3;hpb=b585d00928892398dfbfc315ed78b8032fa14708;p=mono.git diff --git a/mono/mini/arrays.cs b/mono/mini/arrays.cs index 0656649389b..65606e0d2b2 100644 --- a/mono/mini/arrays.cs +++ b/mono/mini/arrays.cs @@ -188,6 +188,262 @@ class Tests { return 0; } + struct FooStruct { + public int i; + + public FooStruct (int i) { + this.i = i; + } + } + + public static int test_0_arrays () { + + int sum; + + byte[] a1 = new byte [10]; + for (int i = 0; i < 10; ++i) + a1 [i] = (byte)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a1 [i]; + if (sum != 45) + return 1; + + sbyte[] a2 = new sbyte [10]; + for (int i = 0; i < 10; ++i) + a2 [i] = (sbyte)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a2 [i]; + if (sum != 45) + return 2; + + short[] a3 = new short [10]; + for (int i = 0; i < 10; ++i) + a3 [i] = (short)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a3 [i]; + if (sum != 45) + return 3; + + ushort[] a4 = new ushort [10]; + for (int i = 0; i < 10; ++i) + a4 [i] = (ushort)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a4 [i]; + if (sum != 45) + return 4; + + int[] a5 = new int [10]; + for (int i = 0; i < 10; ++i) + a5 [i] = (int)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a5 [i]; + if (sum != 45) + return 5; + + uint[] a6 = new uint [10]; + for (int i = 0; i < 10; ++i) + a6 [i] = (uint)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a6 [i]; + if (sum != 45) + return 6; + + long[] a7 = new long [10]; + for (int i = 0; i < 10; ++i) + a7 [i] = i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a7 [i]; + if (sum != 45) + return 7; + + ulong[] a8 = new ulong [10]; + for (int i = 0; i < 10; ++i) + a8 [i] = (ulong)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a8 [i]; + if (sum != 45) + return 8; + + float[] a9 = new float [10]; + for (int i = 0; i < 10; ++i) + a9 [i] = (float)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a9 [i]; + if (sum != 45) + return 9; + + double[] a10 = new double [10]; + for (int i = 0; i < 10; ++i) + a10 [i] = i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a10 [i]; + if (sum != 45) + return 10; + + object[] a11 = new object [10]; + object o = new Object (); + for (int i = 0; i < 10; ++i) + a11 [i] = o; + for (int i = 0; i < 10; ++i) + if (a11 [i] != o) + return 11; + + FooStruct[] a12 = new FooStruct [10]; + for (int i = 0; i < 10; ++i) + a12 [i] = new FooStruct (i); + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a12 [i].i; + if (sum != 45) + return 12; + + return 0; + } + + public static int test_0_multi_dimension_arrays () { + int sum; + + byte[,] a1 = new byte [10, 10]; + for (int i = 0; i < 10; ++i) + a1 [i, i] = (byte)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a1 [i, i]; + if (sum != 45) + return 1; + + sbyte[,] a2 = new sbyte [10, 10]; + for (int i = 0; i < 10; ++i) + a2 [i, i] = (sbyte)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a2 [i, i]; + if (sum != 45) + return 2; + + short[,] a3 = new short [10, 10]; + for (int i = 0; i < 10; ++i) + a3 [i, i] = (short)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a3 [i, i]; + if (sum != 45) + return 3; + + ushort[,] a4 = new ushort [10, 10]; + for (int i = 0; i < 10; ++i) + a4 [i, i] = (ushort)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a4 [i, i]; + if (sum != 45) + return 4; + + int[,] a5 = new int [10, 10]; + for (int i = 0; i < 10; ++i) + a5 [i, i] = (int)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += a5 [i, i]; + if (sum != 45) + return 5; + + uint[,] a6 = new uint [10, 10]; + for (int i = 0; i < 10; ++i) + a6 [i, i] = (uint)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a6 [i, i]; + if (sum != 45) + return 6; + + long[,] a7 = new long [10, 10]; + for (int i = 0; i < 10; ++i) + a7 [i, i] = i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a7 [i, i]; + if (sum != 45) + return 7; + + ulong[,] a8 = new ulong [10, 10]; + for (int i = 0; i < 10; ++i) + a8 [i, i] = (ulong)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a8 [i, i]; + if (sum != 45) + return 8; + + float[,] a9 = new float [10, 10]; + for (int i = 0; i < 10; ++i) + a9 [i, i] = (float)i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a9 [i, i]; + if (sum != 45) + return 9; + + double[,] a10 = new double [10, 10]; + for (int i = 0; i < 10; ++i) + a10 [i, i] = i; + sum = 0; + for (int i = 0; i < 10; ++i) + sum += (int)a10 [i, i]; + if (sum != 45) + return 10; + + object[,] a11 = new object [10, 10]; + object o = new Object (); + for (int i = 0; i < 10; ++i) + a11 [i, i] = o; + for (int i = 0; i < 10; ++i) + if (a11 [i, i] != o) + return 11; + + FooStruct[,] a12 = new FooStruct [10, 10]; + for (int i = 0; i < 10; ++i) + for (int j = 0; j < 10; ++j) { + /* This one calls Address */ + a12 [i, j] = new FooStruct (i + j); + + /* Test Set as well */ + FooStruct s = new FooStruct (i + j); + a12 [i, j] = s; + } + sum = 0; + for (int i = 0; i < 10; ++i) + for (int j = 0; j < 10; ++j) { + /* This one calls Address */ + sum += a12 [i, j].i; + + /* Test Get as well */ + FooStruct s = a12 [i, j]; + sum += s.i; + } + if (sum != 1800) + return 12; + + return 0; + } + + public static int test_100_3_dimensional_arrays () { + int[,,] test = new int[10, 10, 10]; + + test [1, 1, 1] = 100; + return test [1, 1, 1]; + } + public static int test_0_bug_71454 () { int[,] a = new int[4,4]; int[,] b = new int[4,4]; @@ -227,6 +483,254 @@ class Tests { return y; } + + public static int test_0_stelem_ref_null_opt () { + object[] arr = new Tests [1]; + + arr [0] = new Tests (); + arr [0] = null; + + return arr [0] == null ? 0 : 1; + } + + public static int test_0_invalid_new_array_size () { + int size; + object res = null; + size = -1; + try { + res = new float [size]; + } catch (OverflowException e) { + + } catch (Exception) { + return 1; + } + if (res != null) + return 2; + + size = -2147483648; + try { + res = new float [size]; + } catch (OverflowException e) { + + } catch (Exception) { + return 3; + } + + if (res != null) + return 4; + + return 0; + } + + public static int test_0_multidym_array_with_negative_lower_bound () { + int[,] x = (int[,]) Array.CreateInstance(typeof (int), new int[] { 2, 2 }, new int[] { -2, -3 }); + + if(x.GetLowerBound (0) != -2) + return 1; + if (x.GetLowerBound (1) != -3) + return 2; + + x.SetValue (10, new int [] { -2, -3 }); + x.SetValue (20, new int [] { -2, -2 }); + x.SetValue (30, new int [] { -1, -3 }); + x.SetValue (40, new int [] { -1, -2 }); + + try { + x.SetValue (10, new int [] { -3, -3 }); + return 3; + } catch (IndexOutOfRangeException) { } + + try { + x.SetValue (10, new int [] { -2, -4 }); + return 4; + } catch (IndexOutOfRangeException) { } + + try { + x.SetValue (10, new int [] { 0, -3 }); + return 5; + } catch (IndexOutOfRangeException) { } + + try { + x.SetValue (10, new int [] { -1, -1 }); + return 6; + } catch (IndexOutOfRangeException) { } + + if ((int)x.GetValue (new int [] { -2, -3 }) != 10) + return 7; + if ((int)x.GetValue (new int [] { -2, -2 }) != 20) + return 8; + if ((int)x.GetValue (new int [] { -1, -3 }) != 30) + return 9; + if ((int)x.GetValue (new int [] { -1, -2 }) != 40) + return 10; + + try { + x.GetValue (new int [] { -3, -3 }); + return 11; + } catch (IndexOutOfRangeException) { } + + try { + x.GetValue ( new int [] { -2, -4 }); + return 12; + } catch (IndexOutOfRangeException) { } + + try { + x.GetValue (new int [] { 0, -3 }); + return 13; + } catch (IndexOutOfRangeException) { } + + try { + x.GetValue (new int [] { -1, -1 }); + return 14; + } catch (IndexOutOfRangeException) { } + return 0; + } + + + public static int test_0_invalid_new_multi_dym_array_size () { + int dym_size = 1; + int size; + object res = null; + size = -1; + try { + res = new float [dym_size, size]; + } catch (OverflowException e) { + + } catch (Exception) { + return 1; + } + if (res != null) + return 2; + + size = -2147483648; + try { + res = new float [size, dym_size]; + } catch (OverflowException e) { + + } catch (Exception) { + return 3; + } + + if (res != null) + return 4; + + return 0; + } + + public enum IntEnum { + A,B,C + } + + public enum UintEnum : uint { + A,B,C + } + + static bool TryCast (object o) { + return o is T[]; + } + + public static int test_0_primitive_array_cast () { + object a = new int[1]; + object b = new uint[1]; + object c = new IntEnum[1]; + object d = new UintEnum[1]; + + object[] arr = new object[] { a, b, c, d }; + int err = 1; + + foreach (var v in arr) { + if (!TryCast (v)) + return err; + if (!TryCast (v)) + return err + 1; + if (!TryCast (v)) + return err + 2; + if (!TryCast (v)) + return err + 3; + err += 4; + } + + foreach (var v in arr) { + if (!(v is int[])) + return err; + if (!(v is uint[])) + return err; + if (!(v is IntEnum[])) + return err; + if (!(v is UintEnum[])) + return err; + err += 4; + } + return 0; + } + + public static int test_0_intptr_array_cast () { + object[] a = new object[] { new int[1], new uint[1] }; + object[] b = new object[] { new long[1], new ulong[1] }; + object[] c = new object[] { new IntPtr[1], new UIntPtr[1] }; + + int err = 1; + if (IntPtr.Size == 4) { + foreach (var v in a) { + if (!(v is IntPtr[])) + return err; + if (!(v is IntPtr[])) + return err; + err += 2; + } + foreach (var v in b) { + if (v is IntPtr[]) + return err; + if (v is IntPtr[]) + return err; + err += 2; + } + + foreach (var v in c) { + if (!(v is int[])) + return err; + if (!(v is uint[])) + return err; + err += 2; + } + } else { + foreach (var v in a) { + if (v is IntPtr[]) + return err; + if (v is IntPtr[]) + return err; + err += 2; + } + foreach (var v in b) { + if (!(v is IntPtr[])) + return err; + if (!(v is IntPtr[])) + return err; + err += 2; + } + foreach (var v in c) { + if (!(v is long[])) + return err; + if (!(v is ulong[])) + return err; + err += 2; + } + } + return 0; + } + + public static int long_indices () { + int[] arr = new int [10]; + int[,] arr2 = new int [10, 10]; + long index = 1; + arr [index] = 5; + if (arr [index] != 5) + return 1; + arr2 [index, index] = 5; + if (arr2 [index, index] != 5) + return 2; + return 0; + } }