Implement Throwable::nativeFillInStackTrace and nativeGetStackTrace.
Refactor stack trace into compact internal form which is then used to
compute larger and more verbose StackTraceElement[] form. Fix some
potential problems with GC.
Change-Id: I4a4308c1ec5b82fd95b649d5ec0504b9607e688f
diff --git a/src/java_lang_Throwable.cc b/src/java_lang_Throwable.cc
index 1d13907..4c3bfcf 100644
--- a/src/java_lang_Throwable.cc
+++ b/src/java_lang_Throwable.cc
@@ -15,7 +15,7 @@
*/
#include "jni_internal.h"
-#include "object.h"
+#include "thread.h"
#include "JniConstants.h" // Last to avoid problems with LOG redefinition.
@@ -24,22 +24,12 @@
namespace {
jobject Throwable_nativeFillInStackTrace(JNIEnv* env, jclass) {
- UNIMPLEMENTED(WARNING);
- //Object* stackState = dvmFillInStackTrace(dvmThreadSelf());
- //return addLocalReference(env, stackState);
- return NULL;
+ JNIEnvExt* env_ext = reinterpret_cast<JNIEnvExt*>(env);
+ return env_ext->self->CreateInternalStackTrace();
}
jobjectArray Throwable_nativeGetStackTrace(JNIEnv* env, jclass, jobject javaStackState) {
- UNIMPLEMENTED(WARNING);
- //Object* stackState = dvmDecodeIndirectRef(env, javaStackState);
- //if (stackState == NULL) {
- //LOGW("getStackTrace() called but no trace available");
- //return NULL; /* could throw NPE; currently caller will do so */
- //}
- //ArrayObject* elements = dvmGetStackTrace(stackState);
- //return reinterpret_cast<jobjectArray>(addLocalReference(env, elements));
- return NULL;
+ return Thread::InternalStackTraceToStackTraceElementArray(javaStackState, env);
}
JNINativeMethod gMethods[] = {