aboutsummaryrefslogtreecommitdiff
path: root/libjava/stacktrace.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/stacktrace.cc')
-rw-r--r--libjava/stacktrace.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/libjava/stacktrace.cc b/libjava/stacktrace.cc
index ba971dd..843c512 100644
--- a/libjava/stacktrace.cc
+++ b/libjava/stacktrace.cc
@@ -534,3 +534,45 @@ _Jv_StackTrace::GetFirstNonSystemClassLoader ()
return NULL;
}
+
+JArray<jobjectArray> *
+_Jv_StackTrace::GetClassMethodStack (_Jv_StackTrace *trace)
+{
+ jint length = 0;
+
+ UpdateNCodeMap();
+ for (int i = 0; i < trace->length; i++)
+ {
+ _Jv_StackFrame *frame = &trace->frames[i];
+ FillInFrameInfo (frame);
+
+ if (frame->klass && frame->meth)
+ length++;
+ }
+
+ jclass array_class = _Jv_GetArrayClass (&::java::lang::Object::class$, NULL);
+ JArray<jobjectArray> *result =
+ (JArray<jobjectArray> *) _Jv_NewObjectArray (2, array_class, NULL);
+ JArray<jclass> *classes = (JArray<jclass> *)
+ _Jv_NewObjectArray (length, &::java::lang::Class::class$, NULL);
+ JArray<jstring> *methods = (JArray<jstring> *)
+ _Jv_NewObjectArray (length, &::java::lang::String::class$, NULL);
+ jclass *c = elements (classes);
+ jstring *m = elements (methods);
+
+ for (int i = 0, j = 0; i < trace->length; i++)
+ {
+ _Jv_StackFrame *frame = &trace->frames[i];
+ if (!frame->klass || !frame->meth)
+ continue;
+ c[j] = frame->klass;
+ m[j] = JvNewStringUTF (frame->meth->name->chars());
+ j++;
+ }
+
+ jobjectArray *elems = elements (result);
+ elems[0] = (jobjectArray) classes;
+ elems[1] = (jobjectArray) methods;
+
+ return result;
+}