X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fexceptions.cs;h=c7b10b3a4c1517217b7c56e798bf9379bced451c;hb=f75e5b4bc3c3964137c68cf854c1201c5adc3762;hp=131a9c63a5ce1b69d7cfe3ffb0f9450325c9817a;hpb=226af94a2345f88d3170823646e1c25a276ba281;p=mono.git diff --git a/mono/mini/exceptions.cs b/mono/mini/exceptions.cs index 131a9c63a5c..c7b10b3a4c1 100644 --- a/mono/mini/exceptions.cs +++ b/mono/mini/exceptions.cs @@ -24,14 +24,14 @@ using System.Runtime.CompilerServices; * the IL code looks. */ -#if MOBILE +#if __MOBILE__ class ExceptionTests #else class Tests #endif { -#if !MOBILE +#if !__MOBILE__ public static int Main (string[] args) { return TestDriver.RunTests (typeof (Tests), args); } @@ -2318,6 +2318,8 @@ class Tests Console.WriteLine (); } + [Category ("!INTERPRETER")] + [Category ("!BITCODE")] public static int test_0_rethrow_stacktrace () { // Check that rethrowing an exception preserves the original stack trace try { @@ -2589,7 +2591,7 @@ class Tests public static int test_0_lmf_filter () { try { // The invoke calls a runtime-invoke wrapper which has a filter clause -#if MOBILE +#if __MOBILE__ typeof (ExceptionTests).GetMethod ("lmf_filter").Invoke (null, new object [] { }); #else typeof (Tests).GetMethod ("lmf_filter").Invoke (null, new object [] { }); @@ -2816,10 +2818,104 @@ class Tests } return finally_called ? 0 : 1; } + + static int array_len_1 = 1; + + public static int test_0_bounds_check_negative_constant () { + try { + byte[] arr = new byte [array_len_1]; + byte b = arr [-1]; + return 1; + } catch { + } + try { + byte[] arr = new byte [array_len_1]; + arr [-1] = 1; + return 2; + } catch { + } + return 0; + } + + public static int test_0_string_bounds_check_negative_constant () { + try { + string s = "A"; + char c = s [-1]; + return 1; + } catch { + } + return 0; + } + + public class MyException : Exception { + public int marker = 0; + public string res = ""; + + public MyException (String res) { + this.res = res; + } + + public bool FilterWithoutState () { + return this.marker == 0x666; + } + + public bool FilterWithState () { + bool ret = this.marker == 0x566; + this.marker += 0x100; + return ret; + } + + public bool FilterWithStringState () { + bool ret = this.marker == 0x777; + this.res = "fromFilter_" + this.res; + return ret; + } + } + + public static int test_1_basic_filter_catch () { + try { + MyException e = new MyException (""); + e.marker = 0x1337; + throw e; + } catch (MyException ex) when (ex.marker == 0x1337) { + return 1; + } + return 0; + } + + public static int test_1234_complicated_filter_catch () { + string res = "init"; + try { + MyException e = new MyException (res); + e.marker = 0x566; + try { + try { + throw e; + } catch (MyException ex) when (ex.FilterWithoutState ()) { + res = "WRONG_" + res; + } finally { + e.marker = 0x777; + res = "innerFinally_" + res; + } + } catch (MyException ex) when (ex.FilterWithState ()) { + res = "2ndcatch_" + res; + } + // "2ndcatch_innerFinally_init" + // Console.WriteLine ("res1: " + res); + e.res = res; + throw e; + } catch (MyException ex) when (ex.FilterWithStringState ()) { + res = "fwos_" + ex.res; + } finally { + res = "outerFinally_" + res; + } + // Console.WriteLine ("res2: " + res); + return "outerFinally_fwos_fromFilter_2ndcatch_innerFinally_init" == res ? 1234 : 0; + } } -#if !MOBILE +#if !__MOBILE__ class ExceptionTests : Tests { } -#endif \ No newline at end of file +#endif