[vmkit-commits] [PATCH] Impl JVM_{FindClassFromClassLoader, FindClassFromBootLoader, FindLoadedClass}

Will Dietz wdietz2 at illinois.edu
Thu Nov 3 07:26:25 PDT 2011


Inlined below.

Thanks! :)

~Will

>From 84f0b389681480cafbb4cd096f160504e223f543 Mon Sep 17 00:00:00 2001
From: Will Dietz <w at wdtz.org>
Date: Wed, 2 Nov 2011 20:41:10 -0500
Subject: [PATCH 05/17] Impl
 JVM_{FindClassFromClassLoader,FindClassFromBootLoader,FindLoadedClass}

---
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc |   66 +++++++++++++++++++++++++++++++++--
 1 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
index 9305e66..60db37a 100644
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
@@ -962,12 +962,52 @@ JVM_ResolveClass(JNIEnv *env, jclass cls) {
 JNIEXPORT jclass JNICALL
 JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init,
                              jobject _loader, jboolean throwError) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+
+  JavaObject * loader = _loader ? *(JavaObject**)_loader : 0;
+  llvm_gcroot(loader, 0);
+
+  jclass res;
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  JnjvmClassLoader* JCL = NULL;
+  JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
+
+  CommonClass * Cl = JCL->loadClassFromAsciiz(name, true, throwError);
+  if (Cl) {
+    if (init && Cl->asClass())
+      Cl->asClass()->initialiseClass(vm);
+    res = (jclass)Cl->getClassDelegateePtr(vm);
+  }
+  else {
+    vm->classNotFoundException(vm->asciizToStr(name));
+  }
+
+  RETURN_FROM_JNI(res);
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 JNIEXPORT jclass JNICALL
 JVM_FindClassFromBootLoader(JNIEnv *env, const char *name) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+
+  jclass res = 0;
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  JnjvmClassLoader* JCL = vm->bootstrapLoader;
+
+  CommonClass * Cl = JCL->loadClassFromAsciiz(name, true, false);
+  if (Cl) {
+    res = (jclass)Cl->getClassDelegateePtr(vm);
+  }
+  RETURN_FROM_JNI(res);
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 /*
@@ -982,7 +1022,27 @@ JVM_FindClassFromClass(JNIEnv *env, const char
*name, jboolean init,
 /* Find a loaded class cached by the VM */
 JNIEXPORT jclass JNICALL
 JVM_FindLoadedClass(JNIEnv *env, jobject _loader, jstring name) {
-  NYI();
+  JavaObject * loader = 0;
+  llvm_gcroot(loader, 0);
+  BEGIN_JNI_EXCEPTION
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  JnjvmClassLoader* JCL = NULL;
+
+  JavaString * str = *(JavaString**)name;
+
+  loader = *(JavaObject**)_loader;
+
+  CommonClass * Cl = 0;
+
+  JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
+  if (JCL)
+   Cl = JCL->lookupClassFromJavaString(str);
+  jclass res = Cl ? (jclass)Cl->getClassDelegateePtr(vm) : 0;
+  RETURN_FROM_JNI(res);
+
+  END_JNI_EXCEPTION
+
 }

 /* Define a class */
-- 
1.7.5.1



More information about the vmkit-commits mailing list