[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