Switch to Thread::WalkStack rather than manual Frame::Next.

Also fix test 039.

Change-Id: I07d0559bb86d67a7f7947768bd8370fb4cf06c26
diff --git a/src/dalvik_system_VMStack.cc b/src/dalvik_system_VMStack.cc
index 696d723..8401ec1 100644
--- a/src/dalvik_system_VMStack.cc
+++ b/src/dalvik_system_VMStack.cc
@@ -16,10 +16,10 @@
 
 #include "jni_internal.h"
 #include "class_loader.h"
+#include "nth_caller_visitor.h"
 #include "object.h"
 #include "scoped_heap_lock.h"
 #include "scoped_thread_list_lock.h"
-#include "shadow_frame.h"
 #include "thread_list.h"
 
 #include "JniConstants.h" // Last to avoid problems with LOG redefinition.
@@ -43,23 +43,11 @@
   return depth;
 }
 
+// Returns the defining class loader of the caller's caller.
 static jobject VMStack_getCallingClassLoader(JNIEnv* env, jclass) {
-  // Returns the defining class loader of the caller's caller.
-  // TODO: need SmartFrame (Thread::WalkStack-like iterator).
-#if !defined(ART_USE_LLVM_COMPILER)
-  Frame frame = Thread::Current()->GetTopOfStack();
-  frame.Next();
-  frame.Next();
-  Method* callerCaller = frame.GetMethod();
-#else
-  ShadowFrame* frame = Thread::Current()->GetTopOfShadowFrame();
-  frame = frame->GetLink();
-  frame = frame->GetLink();
-  Method* callerCaller = frame->GetMethod();
-#endif
-  DCHECK(callerCaller != NULL);
-  const Object* cl = callerCaller->GetDeclaringClass()->GetClassLoader();
-  return AddLocalReference<jobject>(env, cl);
+  NthCallerVisitor visitor(2);
+  Thread::Current()->WalkStack(&visitor);
+  return AddLocalReference<jobject>(env, visitor.class_loader);
 }
 
 static jobject VMStack_getClosestUserClassLoader(JNIEnv* env, jclass, jobject javaBootstrap, jobject javaSystem) {
@@ -87,17 +75,11 @@
   return AddLocalReference<jobject>(env, visitor.class_loader);
 }
 
+// Returns the class of the caller's caller's caller.
 static jclass VMStack_getStackClass2(JNIEnv* env, jclass) {
-  // Returns the class of the caller's caller's caller.
-  // TODO: need SmartFrame (Thread::WalkStack-like iterator).
-  Frame frame = Thread::Current()->GetTopOfStack();
-  frame.Next();
-  frame.Next();
-  frame.Next();
-  Method* callerCallerCaller = frame.GetMethod();
-  DCHECK(callerCallerCaller != NULL);
-  Class* c = callerCallerCaller->GetDeclaringClass();
-  return AddLocalReference<jclass>(env, c);
+  NthCallerVisitor visitor(3);
+  Thread::Current()->WalkStack(&visitor);
+  return AddLocalReference<jclass>(env, visitor.declaring_class);
 }
 
 static jobjectArray VMStack_getThreadStackTrace(JNIEnv* env, jclass, jobject javaThread) {