[Mono-list] patch for mono/jit/exception.c

Linus Upson linus@linus.com
Sat, 4 May 2002 14:39:00 -0700


I forgot to include the small test program which demonstrates the
problem:

using System;

public class TryTest {
	public static void ThrowException() {
		throw new Exception();
	}

	public static void Main() {
		ThrowException();

		// If the following line is uncommented, mono will work
right.
		// Console.WriteLine("This shouldn't matter");

		try {
			Console.WriteLine("In try block");
		} catch (Exception e) {
			Console.WriteLine("------------------------");
			Console.WriteLine(e);
			Console.WriteLine("------------------------");
		}
	}
}

Before the patch, the Exception thrown in ThrowException() would be
caught by the catch block in Main().

Linus


-----Original Message-----
From: mono-list-admin@ximian.com [mailto:mono-list-admin@ximian.com] On
Behalf Of Linus Upson
Sent: Saturday, May 04, 2002 2:09 PM
To: mono-list@ximian.com
Subject: [Mono-list] patch for mono/jit/exception.c


Running NUnitConsole_mono.exe in mono on Windows exposed the following
bug:

If an exception were throw by the instruction immediately preceding a
try block, the exception would be considered to be thrown inside the try
block.

A patch is attached which appears to solve the problem. The patch won't
work if arch_handle_exception() can be called with ctx->SC_EIP pointing
to the instruction which threw the exception. I think an exception can
only be thrown by a CALL (as far as managed code is concerned) so EIP
will always point to the instruction after the CALL. If this isn't the
case, a different fix will be needed.

I believe the same problem exists on Linux as well, but I haven't
tested. 

Cheers,
Linus