A new release candidate based on GNU Classpath 0.91. I did some perf work and a fair bit of restructuring in the way class loaders work, to better support ikvmc and ikvmstub on assemblies loaded in the ReflectionOnly context (on .NET 2.0). The perf work resulted in a significantly improved startup time for Eclipse (IKVM 0.26: 1 minute 23 seconds, IKVM 0.28: 55 seconds).
Updated japi results are available here. The comparison is against JDK 1.5 now and ignores the generics metadata.
- Integrated GNU Classpath 0.91 plus one patch.
- Added explicit null check for return value of GetEntryAssembly() in VMSystemProperties.
- Implemented socket timeout by using Socket.Poll() instead of setting the timeout on the underlying socket (because .NET 2.0 considers the socket broken after a Read timed out).
- Removed classLoader field from TypeWrapper and made GetClassLoader() abstract (to enable subclasses to use a more efficient way to store the class loader).
- Moved creation of java.lang.Class object from TypeWrapper constructor (because it would trigger a call to GetClassLoader before that was ready to return meaningful data and also because it wasn't semantically correct to expose the TypeWrapper instance before it was fully constructed).
- Added ikvm.lang.Internal annotation to mark types and members as internal to the assembly (supported by ikvmc only, not in dynamic mode.) Note that ikvm.lang.Internal should only be applied to public types and members. Note also that to reflection these internal types and members will appears as package private.
- Removed map.xml hacks to work around cross package accessibility issues (now done by marking the appropriate types/members public and annotating them with @ikvm.lang.Internal).
- Added map.xml implementation of Class.newInstance (to support @ikvm.lang.Internal).
- Changed ClassFile to pack major version and flags together to reduce the size of the object.
- Changed ClassFile.FieldOrMethod to pack flags together.
- Simplified (and made more consistent) member access checking in reflection.
- Added -privatepackage option to ikvmc (to mark all classes in a package tree as internal).
- Fixed object model remapping to add methods inherited from Object to Throwable.
- Fixed some edge cases in method override resolution.
- Added optimization to compiler to devirtualize method calls on this reference when it is safe to do so.
- Added volatile opcode prefix to remapper.
- Added support for specifying .NET types in catch block to remapper.
- Made 1.5 support part of the standard build.
- Restructed ikvmc.exe and IKVM.Runtime.dll.
- Centralized caching of ByteCodeHelper MethodInfos in ByteCodeHelperMethods.
- Fixed Thread.join() bug that caused join to spin for large timeouts.
- Added optimization to not emit linenumbertable for methods that cannot throw exceptions.
- Much improved annotation support.
- Fixed ikvmc to only generate corresponding .NET attributes for annotations that have RetentionPolicy.RUNTIME.
- Fixed ikvmc to add AttributeUsageAttribute to annotation attributes (based on the Target annotation).
- Optimized verifier a little by making InstructionState use copy-on-write strategy.
- Changed string comparisons to ReferenceEquals when possible (identifiers are interned, so this is usually possible).
- Improved VMStackWalker.getCalling[Class|ClassLoader] performance by removing the unnecessary check for HideFromJava/HideFromReflection attributes.
- Almost completely removed usage of custom attributes for dynamically compiled code (because defining custom attributes is slow).
- Fixed race condition when two threads define the same class name in two different class loaders at the same time.
- Fixed possible deadlock while finishing dynamically loaded types.
- Fixed bug in Class.getModifiers() for statically compiled anonymous inner classes.
- Moved loading .NET types by their assembly qualified names from the class loader to Class.forName.
- Fixed class loader not to load Java classes, by their .NET array, pointer or reference name.
- Moved hack to return system class loader for .NET and statically compiled types from [Compiled|DotNet]TypeWrapper to Class.getClassLoader.
Files are available here: ikvm-0.28.0.0.zip (sources + binaries), ikvmbin-0.28.0.0.zip (binaries), ikvmbin-generics-0.28.0.0.zip (binaries built from generics branch)