Include OpenJDK 7 java.lang.AutoCloseable interface and make it shadow System.IDisposable. Removed java.io.Closeable special casing to support IDisposable (now automatic because Closeable extends AutoCloseable).

This commit is contained in:
jfrijters 2011-06-27 15:15:32 +00:00
Родитель 524bf7c090
Коммит 1e3a90329d
5 изменённых файлов: 12 добавлений и 15 удалений

Просмотреть файл

@ -868,6 +868,9 @@ sealed class BootstrapBootstrapClassLoader : ClassLoaderWrapper
SetRemappedType(JVM.Import(typeof(string)), new StubTypeWrapper(Modifiers.Public | Modifiers.Final, "java.lang.String", javaLangObject, true));
SetRemappedType(JVM.Import(typeof(Exception)), new StubTypeWrapper(Modifiers.Public, "java.lang.Throwable", javaLangObject, true));
SetRemappedType(JVM.Import(typeof(IComparable)), new StubTypeWrapper(Modifiers.Public | Modifiers.Abstract | Modifiers.Interface, "java.lang.Comparable", null, true));
TypeWrapper tw = new StubTypeWrapper(Modifiers.Public | Modifiers.Abstract | Modifiers.Interface, "java.lang.AutoCloseable", null, true);
tw.SetMethods(new MethodWrapper[] { new SimpleCallMethodWrapper(tw, "close", "()V", JVM.Import(typeof(IDisposable)).GetMethod("Dispose"), PrimitiveTypeWrapper.VOID, TypeWrapper.EmptyArray, Modifiers.Public | Modifiers.Abstract, MemberFlags.None, SimpleOpCode.Callvirt, SimpleOpCode.Callvirt) });
SetRemappedType(JVM.Import(typeof(IDisposable)), tw);
RegisterInitiatingLoader(new StubTypeWrapper(Modifiers.Public, "java.lang.Enum", javaLangObject, false));
RegisterInitiatingLoader(new StubTypeWrapper(Modifiers.Public | Modifiers.Abstract | Modifiers.Interface, "java.lang.annotation.Annotation", null, false));

Просмотреть файл

@ -8435,7 +8435,7 @@ sun/security/jgss/wrapper/SunNativeProvider.java
@OPENJDK6@/jdk/src/share/classes/java/io/CharArrayReader.java
@OPENJDK6@/jdk/src/share/classes/java/io/CharArrayWriter.java
@OPENJDK6@/jdk/src/share/classes/java/io/CharConversionException.java
@OPENJDK6@/jdk/src/share/classes/java/io/Closeable.java
@OPENJDK7@/jdk/src/share/classes/java/io/Closeable.java
@OPENJDK6@/jdk/src/share/classes/java/io/Console.java
@OPENJDK6@/jdk/src/share/classes/java/io/DataInput.java
@OPENJDK6@/jdk/src/share/classes/java/io/DataInputStream.java
@ -8520,6 +8520,7 @@ sun/security/jgss/wrapper/SunNativeProvider.java
@OPENJDK6@/jdk/src/share/classes/java/lang/ArrayStoreException.java
@OPENJDK6@/jdk/src/share/classes/java/lang/AssertionError.java
@OPENJDK6@/jdk/src/share/classes/java/lang/AssertionStatusDirectives.java
@OPENJDK7@/jdk/src/share/classes/java/lang/AutoCloseable.java
@OPENJDK6@/jdk/src/share/classes/java/lang/Boolean.java
@OPENJDK6@/jdk/src/share/classes/java/lang/Byte.java
@OPENJDK6@/jdk/src/share/classes/java/lang/Character.java

Просмотреть файл

@ -1391,6 +1391,12 @@
<override name="CompareTo" />
</method>
</class>
<class name="java.lang.AutoCloseable" shadows="System.IDisposable" modifiers="public abstract interface">
<method name="close" sig="()V" modifiers="public abstract">
<throws class="java.lang.Exception" />
<override name="Dispose" />
</method>
</class>
<!-- Here we are adding/replacing methods to existing classes -->
<class name="java.lang.Class">
<implements class="cli.System.Runtime.Serialization.ISerializable" />

Просмотреть файл

@ -74,6 +74,7 @@ assembly.class
@OPENJDK6@/jdk/src/share/classes/java/beans/PropertyChangeListenerProxy.class
@OPENJDK6@/jdk/src/share/classes/java/beans/PropertyChangeSupport*.class
@OPENJDK6@/jdk/src/share/classes/java/io/*.class
@OPENJDK7@/jdk/src/share/classes/java/io/*.class
@OPENJDK6@/jdk/src/share/classes/java/lang/*.class
@OPENJDK7@/jdk/src/share/classes/java/lang/*.class
@OPENJDK6@/jdk/src/share/classes/java/lang/annotation/*.class

Просмотреть файл

@ -4988,20 +4988,6 @@ namespace IKVM.Internal
ilgen.DoEmit();
}
}
else if (iface.Name == "java.io.Closeable"
&& !wrapper.ImplementsInterface(ClassLoaderWrapper.GetWrapperFromType(JVM.Import(typeof(IDisposable)))))
{
typeBuilder.AddInterfaceImplementation(JVM.Import(typeof(IDisposable)));
MethodBuilder mb = typeBuilder.DefineMethod("__<>Dispose", MethodAttributes.Private | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.Final | MethodAttributes.SpecialName, Types.Void, Type.EmptyTypes);
typeBuilder.DefineMethodOverride(mb, JVM.Import(typeof(IDisposable)).GetMethod("Dispose"));
CodeEmitter ilgen = CodeEmitter.Create(mb);
ilgen.Emit(OpCodes.Ldarg_0);
MethodWrapper mw = iface.GetMethodWrapper("close", "()V", false);
mw.Link();
mw.EmitCallvirt(ilgen);
ilgen.Emit(OpCodes.Ret);
ilgen.DoEmit();
}
}
// if we implement a ghost interface, add an implicit conversion to the ghost reference value type
if (iface.IsGhost && wrapper.IsPublic)