implement Throwable.resolveTrace(); bugfixes

This commit is contained in:
Joel Dice 2007-07-14 12:37:04 -06:00
parent 2df8a60a78
commit 3121002ffd
7 changed files with 81 additions and 36 deletions

View File

@ -19,6 +19,6 @@ public final class Class <T> {
private Class() { }
public String getName() {
return new String(name, 0, name.length, false);
return new String(name, 0, name.length - 1, false);
}
}

View File

@ -51,6 +51,7 @@ public class Throwable {
for (int i = 0; i < trace.length; ++i) {
sb.append(" at ")
.append(trace[i].getClassName())
.append(".")
.append(trace[i].getMethodName());
if (trace[i].isNativeMethod()) {

View File

@ -130,9 +130,37 @@ trace(Thread* t, jint skipCount)
}
jarray
resolveTrace(Thread* t, object trace)
resolveTrace(Thread* t, jobject trace)
{
// todo
unsigned length = arrayLength(t, *trace);
object array = makeObjectArray
(t, arrayBody(t, t->vm->types, Machine::StackTraceElementType),
length, true);
PROTECT(t, array);
object e = 0;
PROTECT(t, e);
object class_ = 0;
PROTECT(t, class_);
for (unsigned i = 0; i < length; ++i) {
e = arrayBody(t, *trace, i);
class_ = className(t, methodClass(t, traceElementMethod(t, e)));
class_ = makeString(t, class_, 0, byteArrayLength(t, class_) - 1, 0);
object method = methodName(t, traceElementMethod(t, e));
method = makeString(t, method, 0, byteArrayLength(t, method) - 1, 0);
unsigned line = lineNumber
(t, traceElementMethod(t, e), traceElementIp(t, e));
object ste = makeStackTraceElement(t, class_, method, 0, line);
set(t, objectArrayBody(t, array, i), ste);
}
return pushReference(t, array);
}
void
@ -202,6 +230,8 @@ populate(Thread* t, object map)
reinterpret_cast<void*>(arraycopy) },
{ "Java_java_lang_Throwable_trace",
reinterpret_cast<void*>(trace) },
{ "Java_java_lang_Throwable_resolveTrace",
reinterpret_cast<void*>(resolveTrace) },
{ "Java_java_lang_Thread_start",
reinterpret_cast<void*>(start) },
{ 0, 0 }

View File

@ -1374,8 +1374,13 @@ makeArrayClass(Thread* t, object spec)
}
}
object elementClass = resolveClass(t, elementSpec);
if (UNLIKELY(t->exception)) return 0;
object elementClass = hashMapFind
(t, t->vm->bootstrapClassMap, elementSpec, byteArrayHash, byteArrayEqual);
if (elementClass == 0) {
elementClass = resolveClass(t, elementSpec);
if (UNLIKELY(t->exception)) return 0;
}
return makeArrayClass(t, dimensions, spec, elementClass);
}
@ -1886,7 +1891,7 @@ makeTrace(Thread* t, int frame)
unsigned index = 0;
for (int f = frame; f >= 0; f = frameNext(t, f)) {
object e = makeStackTraceElement(t, frameMethod(t, f), frameIp(t, f));
object e = makeTraceElement(t, frameMethod(t, f), frameIp(t, f));
set(t, arrayBody(t, trace, index++), e);
}
@ -2121,6 +2126,30 @@ makeObjectArray(Thread* t, object elementClass, unsigned count, bool clear)
return array;
}
int
lineNumber(Thread* t, object method, unsigned ip)
{
if (methodFlags(t, method) & ACC_NATIVE) {
return NativeLine;
}
object table = codeLineNumberTable(t, methodCode(t, method));
if (table) {
// todo: do a binary search:
int last = UnknownLine;
for (unsigned i = 0; i < lineNumberTableLength(t, table); ++i) {
if (ip <= lineNumberIp(lineNumberTableBody(t, table, i))) {
return last;
} else {
last = lineNumberLine(lineNumberTableBody(t, table, i));
}
}
return last;
} else {
return UnknownLine;
}
}
void
addFinalizer(Thread* t, object target, void (*finalize)(Thread*, object))
{

View File

@ -1868,9 +1868,12 @@ objectArrayBody(Thread* t, object array, unsigned index)
assert(t, classObjectMask(t, objectClass(t, array))
== classObjectMask(t, arrayBody
(t, t->vm->types, Machine::ArrayType)));
return cast<object>(array, (1 + index) * BytesPerWord);
return cast<object>(array, (2 + index) * BytesPerWord);
}
int
lineNumber(Thread* t, object method, unsigned ip);
void
addFinalizer(Thread* t, object target, void (*finalize)(Thread*, object));

View File

@ -199,30 +199,6 @@ findMethodInClass(Thread* t, object class_, object reference)
methodSpec);
}
int
lineNumber(Thread* t, object method, unsigned ip)
{
if (methodFlags(t, method) & ACC_NATIVE) {
return NativeLine;
}
object table = codeLineNumberTable(t, methodCode(t, method));
if (table) {
// todo: do a binary search:
int last = UnknownLine;
for (unsigned i = 0; i < lineNumberTableLength(t, table); ++i) {
if (ip <= lineNumberIp(lineNumberTableBody(t, table, i))) {
return last;
} else {
last = lineNumberLine(lineNumberTableBody(t, table, i));
}
}
return last;
} else {
return UnknownLine;
}
}
inline object
resolveClass(Thread* t, object pool, unsigned index)
{
@ -2216,11 +2192,10 @@ run(Thread* t)
for (unsigned i = 0; i < arrayLength(t, trace); ++i) {
object e = arrayBody(t, trace, i);
const int8_t* class_ = &byteArrayBody
(t, className(t, methodClass(t, stackTraceElementMethod(t, e))), 0);
(t, className(t, methodClass(t, traceElementMethod(t, e))), 0);
const int8_t* method = &byteArrayBody
(t, methodName(t, stackTraceElementMethod(t, e)), 0);
int line = lineNumber
(t, stackTraceElementMethod(t, e), stackTraceElementIp(t, e));
(t, methodName(t, traceElementMethod(t, e)), 0);
int line = lineNumber(t, traceElementMethod(t, e), traceElementIp(t, e));
fprintf(stderr, " at %s.%s ", class_, method);

View File

@ -103,7 +103,7 @@
(object front)
(object rear))
(type stackTraceElement
(type traceElement
(object method)
(int32_t ip))
@ -122,6 +122,13 @@
(object task)
(int64_t peer))
(type stackTraceElement java/lang/StackTraceElement
(extends jobject)
(object class)
(object method)
(object file)
(int32_t line))
(type throwable java/lang/Throwable
(extends jobject)
(object message)