зеркало из 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 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
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче