Implement VMStack.getClosestUserClassLoader for art.
Change-Id: Ia26650984f289b1c5c63a9501f3304d970739a46
diff --git a/src/dalvik_system_VMStack.cc b/src/dalvik_system_VMStack.cc
index 331a64f..d796e69 100644
--- a/src/dalvik_system_VMStack.cc
+++ b/src/dalvik_system_VMStack.cc
@@ -71,6 +71,7 @@
jobject VMStack_getCallingClassLoader(JNIEnv* env, jclass) {
// Returns the defining class loader of the caller's caller.
+ // TODO: need SmartFrame (Thread::WalkStack-like iterator).
Frame frame = Thread::Current()->GetTopOfStack();
frame.Next();
frame.Next();
@@ -79,13 +80,24 @@
return AddLocalReference<jobject>(env, cl);
}
-jobjectArray VMStack_getClasses(JNIEnv* env, jclass, jint maxDepth) {
- UNIMPLEMENTED(FATAL);
+jobject VMStack_getClosestUserClassLoader(JNIEnv* env, jclass, jobject javaBootstrap, jobject javaSystem) {
+ Thread* self = Thread::Current();
+ Object* bootstrap = Decode<Object*>(env, javaBootstrap);
+ Object* system = Decode<Object*>(env, javaSystem);
+ // TODO: need SmartFrame (Thread::WalkStack-like iterator).
+ for (Frame frame = self->GetTopOfStack(); frame.HasNext(); frame.Next()) {
+ Class* c = frame.GetMethod()->GetDeclaringClass();
+ Object* cl = const_cast<ClassLoader*>(c->GetClassLoader());
+ if (cl != bootstrap && cl != system) {
+ return AddLocalReference<jobject>(env, cl);
+ }
+ }
return NULL;
}
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();
@@ -106,7 +118,7 @@
static JNINativeMethod gMethods[] = {
NATIVE_METHOD(VMStack, fillStackTraceElements, "(Ljava/lang/Thread;[Ljava/lang/StackTraceElement;)I"),
NATIVE_METHOD(VMStack, getCallingClassLoader, "()Ljava/lang/ClassLoader;"),
- NATIVE_METHOD(VMStack, getClasses, "(I)[Ljava/lang/Class;"),
+ NATIVE_METHOD(VMStack, getClosestUserClassLoader, "(Ljava/lang/ClassLoader;Ljava/lang/ClassLoader;)Ljava/lang/ClassLoader;"),
NATIVE_METHOD(VMStack, getStackClass2, "()Ljava/lang/Class;"),
NATIVE_METHOD(VMStack, getThreadStackTrace, "(Ljava/lang/Thread;)[Ljava/lang/StackTraceElement;"),
};