зеркало из https://github.com/mono/ikvm-fork.git
Moved printStackTrace to C# side.
This commit is contained in:
Родитель
d18d00788b
Коммит
4da8e27cf7
|
@ -287,87 +287,6 @@ public final class ExceptionHelper
|
||||||
private static native boolean needStackTraceInfo(Throwable t);
|
private static native boolean needStackTraceInfo(Throwable t);
|
||||||
private static native void setStackTraceInfo(Throwable t, cli.System.Diagnostics.StackTrace part1, cli.System.Diagnostics.StackTrace part2);
|
private static native void setStackTraceInfo(Throwable t, cli.System.Diagnostics.StackTrace part1, cli.System.Diagnostics.StackTrace part2);
|
||||||
|
|
||||||
static void printStackTrace(Throwable x)
|
|
||||||
{
|
|
||||||
x.printStackTrace(System.err);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void printStackTrace(Throwable x, java.io.PrintStream printStream)
|
|
||||||
{
|
|
||||||
synchronized (printStream)
|
|
||||||
{
|
|
||||||
for (String line : buildStackTrace(x))
|
|
||||||
{
|
|
||||||
printStream.println(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void printStackTrace(Throwable x, java.io.PrintWriter printWriter)
|
|
||||||
{
|
|
||||||
synchronized (printWriter)
|
|
||||||
{
|
|
||||||
for (String line : buildStackTrace(x))
|
|
||||||
{
|
|
||||||
printWriter.println(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static ArrayList<String> buildStackTrace(Throwable x)
|
|
||||||
{
|
|
||||||
ArrayList<String> list = new ArrayList<String>();
|
|
||||||
list.add(x.toString());
|
|
||||||
StackTraceElement[] stack = x.getStackTrace();
|
|
||||||
for(int i = 0; i < stack.length; i++)
|
|
||||||
{
|
|
||||||
list.add("\tat " + stack[i]);
|
|
||||||
}
|
|
||||||
Throwable cause = x.getCause();
|
|
||||||
while(cause != null)
|
|
||||||
{
|
|
||||||
list.add("Caused by: " + cause);
|
|
||||||
|
|
||||||
// Cause stacktrace
|
|
||||||
StackTraceElement[] parentStack = stack;
|
|
||||||
stack = cause.getStackTrace();
|
|
||||||
boolean equal = false; // Is rest of stack equal to parent frame?
|
|
||||||
for(int i = 0; i < stack.length && !equal; i++)
|
|
||||||
{
|
|
||||||
// Check if we already printed the rest of the stack
|
|
||||||
// since it was the tail of the parent stack
|
|
||||||
int remaining = stack.length - i;
|
|
||||||
int element = i;
|
|
||||||
int parentElement = parentStack.length - remaining;
|
|
||||||
equal = parentElement >= 0 && parentElement < parentStack.length;
|
|
||||||
while(equal && element < stack.length)
|
|
||||||
{
|
|
||||||
if(stack[element].equals(parentStack[parentElement]))
|
|
||||||
{
|
|
||||||
element++;
|
|
||||||
parentElement++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
equal = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Print stacktrace element or indicate the rest is equal
|
|
||||||
if(!equal)
|
|
||||||
{
|
|
||||||
list.add("\tat " + stack[i]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
list.add("\t... " + remaining + " more");
|
|
||||||
break; // from stack printing for loop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cause = cause.getCause();
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void checkInitCause(Throwable _this, Throwable _this_cause, Throwable cause)
|
static void checkInitCause(Throwable _this, Throwable _this_cause, Throwable cause)
|
||||||
{
|
{
|
||||||
if (_this_cause != _this)
|
if (_this_cause != _this)
|
||||||
|
|
|
@ -1135,15 +1135,15 @@
|
||||||
</body>
|
</body>
|
||||||
</constructor>
|
</constructor>
|
||||||
<method name="printStackTrace" sig="()V" modifiers="public">
|
<method name="printStackTrace" sig="()V" modifiers="public">
|
||||||
<redirect class="java.lang.ExceptionHelper" sig="(Ljava.lang.Throwable;)V" type="static" />
|
<redirect class="cli.IKVM.NativeCode.java.lang.ExceptionHelper" sig="(Ljava.lang.Throwable;)V" type="static" />
|
||||||
</method>
|
</method>
|
||||||
<method name="printStackTrace" sig="(Ljava.io.PrintStream;)V" modifiers="public">
|
<method name="printStackTrace" sig="(Ljava.io.PrintStream;)V" modifiers="public">
|
||||||
<parameter name="s" />
|
<parameter name="s" />
|
||||||
<redirect class="java.lang.ExceptionHelper" sig="(Ljava.lang.Throwable;Ljava.io.PrintStream;)V" type="static" />
|
<redirect class="cli.IKVM.NativeCode.java.lang.ExceptionHelper" sig="(Ljava.lang.Throwable;Ljava.io.PrintStream;)V" type="static" />
|
||||||
</method>
|
</method>
|
||||||
<method name="printStackTrace" sig="(Ljava.io.PrintWriter;)V" modifiers="public">
|
<method name="printStackTrace" sig="(Ljava.io.PrintWriter;)V" modifiers="public">
|
||||||
<parameter name="s" />
|
<parameter name="s" />
|
||||||
<redirect class="java.lang.ExceptionHelper" sig="(Ljava.lang.Throwable;Ljava.io.PrintWriter;)V" type="static" />
|
<redirect class="cli.IKVM.NativeCode.java.lang.ExceptionHelper" sig="(Ljava.lang.Throwable;Ljava.io.PrintWriter;)V" type="static" />
|
||||||
</method>
|
</method>
|
||||||
<method name="getMessage" sig="()Ljava.lang.String;" modifiers="public">
|
<method name="getMessage" sig="()Ljava.lang.String;" modifiers="public">
|
||||||
<body>
|
<body>
|
||||||
|
|
|
@ -30,6 +30,8 @@ namespace java
|
||||||
public class ObjectInputStream { }
|
public class ObjectInputStream { }
|
||||||
public class ObjectOutputStream { }
|
public class ObjectOutputStream { }
|
||||||
public class ObjectStreamField { }
|
public class ObjectStreamField { }
|
||||||
|
public class PrintStream { }
|
||||||
|
public class PrintWriter { }
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace lang
|
namespace lang
|
||||||
|
|
|
@ -31,6 +31,7 @@ using ObjectOutputStream = java.io.ObjectOutputStream;
|
||||||
using StackTraceElement = java.lang.StackTraceElement;
|
using StackTraceElement = java.lang.StackTraceElement;
|
||||||
#if !FIRST_PASS
|
#if !FIRST_PASS
|
||||||
using Throwable = java.lang.Throwable;
|
using Throwable = java.lang.Throwable;
|
||||||
|
using System.Collections.Generic;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace IKVM.NativeCode.java.lang
|
namespace IKVM.NativeCode.java.lang
|
||||||
|
@ -209,5 +210,94 @@ namespace IKVM.NativeCode.java.lang
|
||||||
Throwable.instancehelper_setStackTrace(x, stackTrace == null ? new StackTraceElement[0] : stackTrace);
|
Throwable.instancehelper_setStackTrace(x, stackTrace == null ? new StackTraceElement[0] : stackTrace);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static void printStackTrace(Exception x)
|
||||||
|
{
|
||||||
|
#if !FIRST_PASS
|
||||||
|
Throwable.instancehelper_printStackTrace(x, global::java.lang.System.err);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void printStackTrace(Exception x, global::java.io.PrintStream printStream)
|
||||||
|
{
|
||||||
|
#if !FIRST_PASS
|
||||||
|
lock (printStream)
|
||||||
|
{
|
||||||
|
foreach (string line in BuildStackTrace(x))
|
||||||
|
{
|
||||||
|
printStream.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void printStackTrace(Exception x, global::java.io.PrintWriter printWriter)
|
||||||
|
{
|
||||||
|
#if !FIRST_PASS
|
||||||
|
lock (printWriter)
|
||||||
|
{
|
||||||
|
foreach (string line in BuildStackTrace(x))
|
||||||
|
{
|
||||||
|
printWriter.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !FIRST_PASS
|
||||||
|
private static List<String> BuildStackTrace(Exception x)
|
||||||
|
{
|
||||||
|
List<String> list = new List<String>();
|
||||||
|
list.Add(x.ToString());
|
||||||
|
StackTraceElement[] stack = Throwable.instancehelper_getStackTrace(x);
|
||||||
|
for (int i = 0; i < stack.Length; i++)
|
||||||
|
{
|
||||||
|
list.Add("\tat " + stack[i]);
|
||||||
|
}
|
||||||
|
Exception cause = Throwable.instancehelper_getCause(x);
|
||||||
|
while (cause != null)
|
||||||
|
{
|
||||||
|
list.Add("Caused by: " + cause);
|
||||||
|
|
||||||
|
// Cause stacktrace
|
||||||
|
StackTraceElement[] parentStack = stack;
|
||||||
|
stack = Throwable.instancehelper_getStackTrace(cause);
|
||||||
|
bool equal = false; // Is rest of stack equal to parent frame?
|
||||||
|
for (int i = 0; i < stack.Length && !equal; i++)
|
||||||
|
{
|
||||||
|
// Check if we already printed the rest of the stack
|
||||||
|
// since it was the tail of the parent stack
|
||||||
|
int remaining = stack.Length - i;
|
||||||
|
int element = i;
|
||||||
|
int parentElement = parentStack.Length - remaining;
|
||||||
|
equal = parentElement >= 0 && parentElement < parentStack.Length;
|
||||||
|
while (equal && element < stack.Length)
|
||||||
|
{
|
||||||
|
if (stack[element].equals(parentStack[parentElement]))
|
||||||
|
{
|
||||||
|
element++;
|
||||||
|
parentElement++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
equal = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Print stacktrace element or indicate the rest is equal
|
||||||
|
if (!equal)
|
||||||
|
{
|
||||||
|
list.Add("\tat " + stack[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
list.Add("\t... " + remaining + " more");
|
||||||
|
break; // from stack printing for loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cause = Throwable.instancehelper_getCause(cause);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче