I finally did the work necessary to improve the codegen for finally handlers. More improvements are still possible, but at least most finally handlers will now execute without touching the exception object (and hence without having to do any mapping/stack trace collection work). It also means that assembly file sizes are a little bit smaller and that the debugging experience should be improved (less exception catching & rethrowing).
- Restructuring of verifier/analyzer code.
- Fixed exception stack trace collection regression that caused frame part of the exception stack trace collection infrastructure to show up in some stack traces.
- Make synthesized .class resources available via ClassLoader.getResources() (note the plural) as well.
- Use a LinkedHashMap to preserve annotation order (but only in dynamic mode, because for compiled code we get the .NET attributes in unspecified order). By my reading of the API spec there is no guarantee about the ordering, but the Google Guice test suite depends on it.
- TypeWrapper.AssertFinished() doesn't make sense for the static compiler anymore.
- Moved mutable flags from Instruction array into separate array.
- Made ExceptionTableEntry immutable.
- Implemented codegen improvement to use CLR fault handlers for Java catch all handlers, whenever possible.
- IKVM.Reflection: Order try blocks inside handlers before the entries for that handler. Workaround for CLR x86 JIT null pointer dereference bug.
Binaries available here: ikvmbin-0.43.3811.zip