Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2010-05-27 17:23:04 +0400
committerjfrijters <jfrijters>2010-05-27 17:23:04 +0400
commitd67bc55267dae670d6add79755db8ca78e01781d (patch)
treea54f307df8764ac6929288a05469400137d2d48c
parentfa0e1b04f07ee6b2624948e5bd371f050de76b13 (diff)
Moved more ExceptionHelper methods to C# side.
-rw-r--r--classpath/java/lang/ExceptionHelper.java62
-rw-r--r--openjdk/map.xml10
-rw-r--r--runtime/ExceptionHelper.cs80
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
+ }
}
}