diff --git a/classpath/java/lang/ExceptionHelper.java b/classpath/java/lang/ExceptionHelper.java index 1b548bfe..f35c98f3 100644 --- a/classpath/java/lang/ExceptionHelper.java +++ b/classpath/java/lang/ExceptionHelper.java @@ -276,14 +276,12 @@ public final class ExceptionHelper static native String getClassNameFromType(cli.System.Type type); static native int GetLineNumber(cli.System.Diagnostics.StackFrame frame); static native String GetFileName(cli.System.Diagnostics.StackFrame frame); - static native void initThrowable(Object throwable, Object detailMessage, Object cause); static native Throwable MapExceptionImpl(Throwable t); static native cli.System.Type getTypeFromObject(Object o); private static native String SafeGetEnvironmentVariable(String name); // native methods implemented in map.xml - private static native Throwable getCauseForSerialization(Throwable t); private static native cli.System.Exception getOriginalAndClear(Throwable t); private static native void setOriginal(Throwable t, cli.System.Exception org); private static native boolean needStackTraceInfo(Throwable t); @@ -594,31 +592,6 @@ public final class ExceptionHelper return type.IsInstanceOfType(t); } - static void writeObject(Throwable t, ObjectOutputStream s) throws IOException - { - synchronized (t) - { - ObjectOutputStream.PutField fields = s.putFields(); - fields.put("detailMessage", t.getMessage()); - Throwable cause = t.getCause(); - if (cause == null && !(t instanceof cli.System.Exception)) - { - cause = getCauseForSerialization(t); - } - fields.put("cause", cause); - fields.put("stackTrace", t.getStackTrace()); - s.writeFields(); - } - } - - static void readObject(Throwable t, ObjectInputStream s) throws IOException, ClassNotFoundException - { - ObjectInputStream.GetField fields = s.readFields(); - initThrowable(t, fields.get("detailMessage", null), fields.get("cause", null)); - StackTraceElement[] stackTrace = (StackTraceElement[])fields.get("stackTrace", null); - t.setStackTrace(stackTrace == null ? new StackTraceElement[0] : stackTrace); - } - static Throwable MapTypeInitializeException(cli.System.TypeInitializationException t, cli.System.Type handler) { boolean wrapped = false; diff --git a/openjdk/map.xml b/openjdk/map.xml index 077bce41..a63397b2 100644 --- a/openjdk/map.xml +++ b/openjdk/map.xml @@ -997,7 +997,7 @@ - + @@ -1006,7 +1006,7 @@ - + @@ -2008,14 +2008,6 @@ - - - - - - - - diff --git a/runtime/Dummy.OpenJDK.Core.cs b/runtime/Dummy.OpenJDK.Core.cs index cf9696b7..19915bf0 100644 --- a/runtime/Dummy.OpenJDK.Core.cs +++ b/runtime/Dummy.OpenJDK.Core.cs @@ -27,6 +27,8 @@ namespace java namespace io { public class File { } + public class ObjectInputStream { } + public class ObjectOutputStream { } public class ObjectStreamField { } } @@ -35,6 +37,7 @@ namespace java public class Class { } public class ClassLoader { } public class SecurityManager { } + public class StackTraceElement { } namespace reflect { diff --git a/runtime/ExceptionHelper.cs b/runtime/ExceptionHelper.cs index 60d1b724..aa257cfd 100644 --- a/runtime/ExceptionHelper.cs +++ b/runtime/ExceptionHelper.cs @@ -26,6 +26,12 @@ using System.Reflection; using System.Diagnostics; using IKVM.Attributes; using IKVM.Internal; +using ObjectInputStream = java.io.ObjectInputStream; +using ObjectOutputStream = java.io.ObjectOutputStream; +using StackTraceElement = java.lang.StackTraceElement; +#if !FIRST_PASS +using Throwable = java.lang.Throwable; +#endif namespace IKVM.NativeCode.java.lang { @@ -110,7 +116,7 @@ namespace IKVM.NativeCode.java.lang return type.FullName; } - public static void initThrowable(object throwable, object detailMessage, object cause) + private static void initThrowable(object throwable, object detailMessage, object cause) { #if !FIRST_PASS if(cause == throwable) @@ -172,6 +178,35 @@ namespace IKVM.NativeCode.java.lang new global::java.io.ObjectStreamField("cause", typeof(global::java.lang.Throwable)), new global::java.io.ObjectStreamField("stackTrace", typeof(global::java.lang.StackTraceElement[])) }; +#endif + } + + internal static void writeObject(Exception x, ObjectOutputStream s) + { +#if !FIRST_PASS + lock (x) + { + ObjectOutputStream.PutField fields = s.putFields(); + fields.put("detailMessage", Throwable.instancehelper_getMessage(x)); + Exception cause = Throwable.instancehelper_getCause(x); + if (cause == null && x is Throwable) + { + cause = ((Throwable)x).cause; + } + fields.put("cause", cause); + fields.put("stackTrace", Throwable.instancehelper_getStackTrace(x)); + s.writeFields(); + } +#endif + } + + internal static void readObject(Exception x, ObjectInputStream s) + { +#if !FIRST_PASS + ObjectInputStream.GetField fields = s.readFields(); + initThrowable(x, fields.get("detailMessage", null), fields.get("cause", null)); + StackTraceElement[] stackTrace = (StackTraceElement[])fields.get("stackTrace", null); + Throwable.instancehelper_setStackTrace(x, stackTrace == null ? new StackTraceElement[0] : stackTrace); #endif } }