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[] = {