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) {