[vmkit-commits] [vmkit] r147052 - in /vmkit/trunk/lib/j3: ClassLib/OpenJDK/OpenJDK.inc VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h

Will Dietz wdietz2 at illinois.edu
Wed Dec 21 06:11:41 PST 2011


Author: wdietz2
Date: Wed Dec 21 08:11:40 2011
New Revision: 147052

URL: http://llvm.org/viewvc/llvm-project?rev=147052&view=rev
Log:
Track boot packages as they're loaded and report this set upon request.

Used in OpenJDK only, as the Classpath API expects a static 'complete' list.

Modified:
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=147052&r1=147051&r2=147052&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Wed Dec 21 08:11:40 2011
@@ -910,7 +910,19 @@
 
 JNIEXPORT jobjectArray JNICALL
 JVM_GetSystemPackages(JNIEnv *env) {
-  NYI();
+  ArrayObject * res = 0;
+  llvm_gcroot(res, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  res = vm->bootstrapLoader->getBootPackages(vm);
+
+  RETURN_REF_FROM_JNI(res, jobjectArray);
+
+  END_JNI_EXCEPTION
+
+  return NULL;
 }
 
 /*

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=147052&r1=147051&r2=147052&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Wed Dec 21 08:11:40 2011
@@ -297,6 +297,23 @@
     if (doResolve) cl->asClass()->resolveClass();
   }
 
+  if (cl) {
+    // If we don't have knowledge of the package containing this class,
+    // add it to the set of packages defined in this classLoader
+    UTF8Buffer buffer(name);
+    const char * cname = buffer.cString();
+    const char * slash = strrchr(cname, '/');
+    if (slash) {
+      int packagelen = slash - cname;
+      const UTF8 * package = name->extract(hashUTF8, 0, packagelen);
+      lock.lock();
+      packages.insert(package);
+      lock.unlock();
+    }
+  }
+
+
+
   return (UserClass*)cl;
 }
 
@@ -1052,3 +1069,20 @@
   nativesLock.unlock();
   return res;
 }
+
+ArrayObject* JnjvmBootstrapLoader::getBootPackages(Jnjvm * vm) {
+  ArrayObject* res = 0;
+  llvm_gcroot(res, 0);
+
+  lock.lock();
+  res = (ArrayObject*)vm->upcalls->ArrayOfString->doNew(packages.size(), vm);
+  std::set<const UTF8*>::const_iterator I = packages.begin(),
+                                        E = packages.end();
+  for (int i = 0; I != E; ++I, ++i) {
+    ArrayObject::setElement(res, *UTF8ToStr(*I), i);
+  }
+
+  lock.unlock();
+
+  return res;
+}

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h?rev=147052&r1=147051&r2=147052&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h Wed Dec 21 08:11:40 2011
@@ -12,6 +12,7 @@
 #define JNJVM_CLASSLOADER_H
 
 #include <map>
+#include <set>
 #include <vector>
 
 #include "types.h"
@@ -45,6 +46,7 @@
 class TypeMap;
 class VMClassLoader;
 class ZipArchive;
+class ArrayObject;
 
 /// JnjvmClassLoader - Runtime representation of a class loader. It contains
 /// its own tables (signatures, UTF8, types) which are mapped to a single
@@ -429,6 +431,11 @@
   /// primitiveMap - Map of primitive classes, hashed by id.
   std::map<const char, UserClassPrimitive*> primitiveMap;
 
+  // Set of boot packages
+  std::set<const UTF8*> packages;
+
+  ArrayObject* getBootPackages(Jnjvm* vm);
+
   UserClassPrimitive* getPrimitiveClass(char id) {
     return primitiveMap[id];
   }





More information about the vmkit-commits mailing list