I did some bytecode fuzzing and found and fixed a number of obscure bugs. Also fixed the bug reported here.
Changes:
- Bug fix. If we encounter an invokedynamic in a method that has a jsr (which is always invalid because of class version rules), we need to throw a VerifyError.
- Bug fix. If we encounter a jsr or ret instruction, we should throw a VerifyError (instead of NotImplementedException).
- Bug fix. If a bytecode instruction refers to an invalid constant pool entry, MarkLinkRequiredConstantPoolItem should not throw an exception, but simply ignore the mark, the incorrect bytecode will be reported later during verification.
- Bug fix. It is not valid to call TypeWrapper.IsInterfaceOrInterfaceArray on an UnloadableTypeWrapper.
- Bug fix. There was a logic error in FindBaseMethods7() that caused LinkAndGetMethod() to be called if TryGetClassFileVersion() succeeded and the class version was greater than or equal to 51.
- Bug fix. If a Java class extends a remapped .NET type (cli.System.Object or cli.System.Exception), we should correctly report the base class.
- Bug fix. If a finally/fault handler contains reachable code before the handler's start index, the handler should branch to the handler start index.
- Bug fix. After emitting a finally/fault handler block, we should emit the block leave stubs (even though you can't leave the block, they also emit the backward branch stubs).
Binaries available here: ikvmbin-7.2.4587.zip