diff options
author | jfrijters <jfrijters> | 2010-05-27 17:23:04 +0400 |
---|---|---|
committer | jfrijters <jfrijters> | 2010-05-27 17:23:04 +0400 |
commit | d67bc55267dae670d6add79755db8ca78e01781d (patch) | |
tree | a54f307df8764ac6929288a05469400137d2d48c | |
parent | fa0e1b04f07ee6b2624948e5bd371f050de76b13 (diff) |
Moved more ExceptionHelper methods to C# side.
-rw-r--r-- | classpath/java/lang/ExceptionHelper.java | 62 | ||||
-rw-r--r-- | openjdk/map.xml | 10 | ||||
-rw-r--r-- | runtime/ExceptionHelper.cs | 80 |
3 files changed, 86 insertions, 66 deletions
diff --git a/classpath/java/lang/ExceptionHelper.java b/classpath/java/lang/ExceptionHelper.java index 042f0c13..8e1e7ae5 100644 --- a/classpath/java/lang/ExceptionHelper.java +++ b/classpath/java/lang/ExceptionHelper.java @@ -38,7 +38,7 @@ import cli.System.Runtime.Serialization.StreamingContext; public final class ExceptionHelper { static final Key EXCEPTION_DATA_KEY = new Key(); - private static final ikvm.internal.WeakIdentityMap exceptions = new ikvm.internal.WeakIdentityMap(); + static final ikvm.internal.WeakIdentityMap exceptions = new ikvm.internal.WeakIdentityMap(); private static final boolean cleanStackTrace = SafeGetEnvironmentVariable("IKVM_DISABLE_STACKTRACE_CLEANING") == null; private static final cli.System.Type System_Reflection_MethodBase = ikvm.runtime.Util.getInstanceTypeFromClass(cli.System.Reflection.MethodBase.class); private static final cli.System.Type System_Exception = ikvm.runtime.Util.getInstanceTypeFromClass(cli.System.Exception.class); @@ -292,66 +292,6 @@ public final class ExceptionHelper exceptions.put(x, NOT_REMAPPED); } - static StackTraceElement[] getStackTrace(cli.System.Exception x) - { - synchronized (x) - { - ExceptionInfoHelper eih = null; - cli.System.Collections.IDictionary data = x.get_Data(); - if (data != null && !data.get_IsReadOnly()) - { - synchronized (data) - { - eih = (ExceptionInfoHelper)data.get_Item(EXCEPTION_DATA_KEY); - } - } - if (eih == null) - { - return new StackTraceElement[0]; - } - return eih.get_StackTrace(x); - } - } - - static StackTraceElement[] checkStackTrace(StackTraceElement[] original) - { - StackTraceElement[] copy = original.clone(); - for (int i = 0; i < copy.length; i++) - { - copy[i].getClass(); // efficient null check - } - return copy; - } - - static void setStackTrace(cli.System.Exception x, StackTraceElement[] stackTrace) - { - ExceptionInfoHelper eih = new ExceptionInfoHelper(checkStackTrace(stackTrace)); - cli.System.Collections.IDictionary data = x.get_Data(); - if (data != null && !data.get_IsReadOnly()) - { - synchronized (data) - { - data.set_Item(EXCEPTION_DATA_KEY, eih); - } - } - } - - static void fillInStackTrace(cli.System.Exception x) - { - synchronized (x) - { - ExceptionInfoHelper eih = new ExceptionInfoHelper(null, new cli.System.Diagnostics.StackTrace(true)); - cli.System.Collections.IDictionary data = x.get_Data(); - if (data != null && !data.get_IsReadOnly()) - { - synchronized (data) - { - data.set_Item(EXCEPTION_DATA_KEY, eih); - } - } - } - } - // also used by ikvm.extensions.ExtensionMethods.printStackTrace() public static Throwable UnmapException(Throwable t) { diff --git a/openjdk/map.xml b/openjdk/map.xml index c6e48ef4..a7458bd3 100644 --- a/openjdk/map.xml +++ b/openjdk/map.xml @@ -1192,7 +1192,7 @@ </body> <alternateBody> <ldarg_0 /> - <call class="java.lang.ExceptionHelper" name="fillInStackTrace" sig="(Lcli.System.Exception;)V" /> + <call class="cli.IKVM.NativeCode.java.lang.ExceptionHelper" name="fillInStackTrace" sig="(Ljava.lang.Throwable;)V" /> <ldarg_0 /> <ret /> </alternateBody> @@ -1255,7 +1255,7 @@ </body> <alternateBody> <ldarg_0 /> - <call class="java.lang.ExceptionHelper" name="getStackTrace" sig="(Lcli.System.Exception;)[Ljava.lang.StackTraceElement;" /> + <call class="cli.IKVM.NativeCode.java.lang.ExceptionHelper" name="getStackTrace" sig="(Ljava.lang.Throwable;)[Ljava.lang.StackTraceElement;" /> <ret /> </alternateBody> </method> @@ -1297,7 +1297,7 @@ </body> <alternateBody> <ldarg_0 /> - <call class="java.lang.ExceptionHelper" name="getStackTrace" sig="(Lcli.System.Exception;)[Ljava.lang.StackTraceElement;" /> + <call class="cli.IKVM.NativeCode.java.lang.ExceptionHelper" name="getStackTrace" sig="(Ljava.lang.Throwable;)[Ljava.lang.StackTraceElement;" /> <ret /> </alternateBody> </method> @@ -1306,7 +1306,7 @@ <body> <ldarg_0 /> <ldarg_1 /> - <call class="java.lang.ExceptionHelper" name="checkStackTrace" sig="([Ljava.lang.StackTraceElement;)[Ljava.lang.StackTraceElement;" /> + <call class="cli.IKVM.NativeCode.java.lang.ExceptionHelper" name="checkStackTrace" sig="([Ljava.lang.StackTraceElement;)[Ljava.lang.StackTraceElement;" /> <stfld class="java.lang.Throwable" name="stackTrace" sig="[Ljava.lang.StackTraceElement;" /> <ldarg_0 /> <ldnull /> @@ -1319,7 +1319,7 @@ <alternateBody> <ldarg_0 /> <ldarg_1 /> - <call class="java.lang.ExceptionHelper" name="setStackTrace" sig="(Lcli.System.Exception;[Ljava.lang.StackTraceElement;)V" /> + <call class="cli.IKVM.NativeCode.java.lang.ExceptionHelper" name="setStackTrace" sig="(Ljava.lang.Throwable;[Ljava.lang.StackTraceElement;)V" /> <ret /> </alternateBody> </method> diff --git a/runtime/ExceptionHelper.cs b/runtime/ExceptionHelper.cs index 609c622d..a117f571 100644 --- a/runtime/ExceptionHelper.cs +++ b/runtime/ExceptionHelper.cs @@ -26,12 +26,14 @@ using System.Reflection; using System.Diagnostics; using IKVM.Attributes; using IKVM.Internal; +using IDictionary = System.Collections.IDictionary; using ObjectInputStream = java.io.ObjectInputStream; using ObjectOutputStream = java.io.ObjectOutputStream; using StackTraceElement = java.lang.StackTraceElement; #if !FIRST_PASS using Throwable = java.lang.Throwable; using System.Collections.Generic; +using ExceptionInfoHelper = java.lang.ExceptionHelper.ExceptionInfoHelper; #endif namespace IKVM.NativeCode.java.lang @@ -369,5 +371,83 @@ namespace IKVM.NativeCode.java.lang return eih.get_StackTrace(x); #endif } + + // this method is *only* for .NET exceptions (i.e. types not derived from java.lang.Throwable) + internal static StackTraceElement[] getStackTrace(Exception x) + { +#if FIRST_PASS + return null; +#else + lock (x) + { + ExceptionInfoHelper eih = null; + IDictionary data = x.Data; + if (data != null && !data.IsReadOnly) + { + lock (data) + { + eih = (ExceptionInfoHelper)data[global::java.lang.ExceptionHelper.EXCEPTION_DATA_KEY]; + } + } + if (eih == null) + { + return new StackTraceElement[0]; + } + return eih.get_StackTrace(x); + } +#endif + } + + internal static StackTraceElement[] checkStackTrace(StackTraceElement[] original) + { +#if FIRST_PASS + return null; +#else + StackTraceElement[] copy = (StackTraceElement[])original.Clone(); + for (int i = 0; i < copy.Length; i++) + { + if (copy[i] == null) + { + throw new global::java.lang.NullPointerException(); + } + } + return copy; +#endif + } + + // this method is *only* for .NET exceptions (i.e. types not derived from java.lang.Throwable) + internal static void setStackTrace(Exception x, StackTraceElement[] stackTrace) + { +#if !FIRST_PASS + ExceptionInfoHelper eih = new ExceptionInfoHelper(checkStackTrace(stackTrace)); + IDictionary data = x.Data; + if (data != null && !data.IsReadOnly) + { + lock (data) + { + data[global::java.lang.ExceptionHelper.EXCEPTION_DATA_KEY] = eih; + } + } +#endif + } + + // this method is *only* for .NET exceptions (i.e. types not derived from java.lang.Throwable) + internal static void fillInStackTrace(Exception x) + { +#if !FIRST_PASS + lock (x) + { + ExceptionInfoHelper eih = new ExceptionInfoHelper(null, new StackTrace(true)); + IDictionary data = x.Data; + if (data != null && !data.IsReadOnly) + { + lock (data) + { + data[global::java.lang.ExceptionHelper.EXCEPTION_DATA_KEY] = eih; + } + } + } +#endif + } } } |