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
}
}