Moved printStackTrace to C# side.

This commit is contained in:
jfrijters 2010-05-27 12:08:01 +00:00
Родитель d18d00788b
Коммит 4da8e27cf7
4 изменённых файлов: 95 добавлений и 84 удалений

Просмотреть файл

@ -287,87 +287,6 @@ public final class ExceptionHelper
private static native boolean needStackTraceInfo(Throwable t);
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)
{
if (_this_cause != _this)

Просмотреть файл

@ -1135,15 +1135,15 @@
</body>
</constructor>
<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 name="printStackTrace" sig="(Ljava.io.PrintStream;)V" modifiers="public">
<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 name="printStackTrace" sig="(Ljava.io.PrintWriter;)V" modifiers="public">
<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 name="getMessage" sig="()Ljava.lang.String;" modifiers="public">
<body>

Просмотреть файл

@ -30,6 +30,8 @@ namespace java
public class ObjectInputStream { }
public class ObjectOutputStream { }
public class ObjectStreamField { }
public class PrintStream { }
public class PrintWriter { }
}
namespace lang

Просмотреть файл

@ -31,6 +31,7 @@ using ObjectOutputStream = java.io.ObjectOutputStream;
using StackTraceElement = java.lang.StackTraceElement;
#if !FIRST_PASS
using Throwable = java.lang.Throwable;
using System.Collections.Generic;
#endif
namespace IKVM.NativeCode.java.lang
@ -209,5 +210,94 @@ namespace IKVM.NativeCode.java.lang
Throwable.instancehelper_setStackTrace(x, stackTrace == null ? new StackTraceElement[0] : stackTrace);
#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
}
}