X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Farrays.cs;h=e65e30a203f73d038a0ead499237957e72e07157;hb=1e726ce7a38a92860acab28f4427813d2ba14c13;hp=012bdfdf7565646297e52a6a20b6c9c2bb4d51db;hpb=496dfbf9ec0fd3143e5dd560a863d916e56a52b8;p=mono.git diff --git a/mono/mini/arrays.cs b/mono/mini/arrays.cs index 012bdfdf756..e65e30a203f 100644 --- a/mono/mini/arrays.cs +++ b/mono/mini/arrays.cs @@ -25,8 +25,8 @@ using System.Reflection; class Tests { - static int Main () { - return TestDriver.RunTests (typeof (Tests)); + public static int Main (string[] args) { + return TestDriver.RunTests (typeof (Tests), args); } public static int test_10_create () { @@ -434,9 +434,31 @@ class Tests { if (sum != 1800) return 12; + /* Null check */ + object[,] a13 = null; + try { + a13 [0, 0] = new Object (); + return 13; + } catch (NullReferenceException) { + } + 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_100_4_dimensional_arrays () { + int[,,,] test = new int[10, 10, 10, 10]; + + test [1, 1, 1, 1] = 100; + return test [1, 1, 1, 1]; + } + public static int test_0_bug_71454 () { int[,] a = new int[4,4]; int[,] b = new int[4,4]; @@ -476,6 +498,264 @@ 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 test_0_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; + } + + // #7438 + public static int test_0_ldelema_2_64bit () { + bool[,] test = new bool[201,201]; + int x,y; + for(x=-100;x<100;x++) for(y=-100;y<100;y++){ + test[x+100,y+100] = true; + } + return 0; + } }