[vmkit-commits] [PATCH] In OpenJDK, use the 'classes' field of ClassLoader to track VMClassLoader.
Will Dietz
wdietz2 at illinois.edu
Thu Nov 3 07:36:11 PDT 2011
Inlined below.
Traces the internal classloader by stashing a VMClassLoader into the
'classes' field.
FWIW the *only* time anyone 'writes' to the classes field is
initializing it to empty in the constructor.
~Will
>From 1b728ad7ab762680abe320eaf9f66e1e5c981560 Mon Sep 17 00:00:00 2001
From: Will Dietz <w at wdtz.org>
Date: Wed, 2 Nov 2011 22:48:26 -0500
Subject: [PATCH 13/17] In OpenJDK, use the 'classes' field of ClassLoader to
track VMClassLoader.
Also, don't just check the 'vmdata' field for non-null, since in OJ it will be
initialized to an empty vector. Instead, consider the field uninitialized if
it's either null or of the wrong type.
---
lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp | 7 +++----
lib/J3/VMCore/JnjvmClassLoader.cpp | 7 +++++--
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
index 43ff227..22db276 100644
--- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
+++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
@@ -552,10 +552,9 @@ void
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
UPCALL_FIELD(loader, "java/nio/Buffer", "address",
"Lgnu/classpath/Pointer;",
ACC_VIRTUAL);
- // TODO: Resolve how to tie a ClassLoader to its internal representation
- //vmdataClassLoader =
- // UPCALL_FIELD(loader, "java/lang/ClassLoader", "vmdata",
"Ljava/lang/Object;",
- // ACC_VIRTUAL);
+ vmdataClassLoader =
+ UPCALL_FIELD(loader, "java/lang/ClassLoader", "classes",
"Ljava/util/Vector;",
+ ACC_VIRTUAL);
newStackTraceElement =
UPCALL_CLASS(loader, "java/lang/StackTraceElement");
diff --git a/lib/J3/VMCore/JnjvmClassLoader.cpp
b/lib/J3/VMCore/JnjvmClassLoader.cpp
index 5444941..fd1eabb 100644
--- a/lib/J3/VMCore/JnjvmClassLoader.cpp
+++ b/lib/J3/VMCore/JnjvmClassLoader.cpp
@@ -808,11 +808,14 @@
JnjvmClassLoader::getJnjvmLoaderFromJavaObject(JavaObject* loader,
Jnjvm* vm) {
vmdata =
(VMClassLoader*)(upcalls->vmdataClassLoader->getInstanceObjectField(loader));
- if (vmdata == NULL) {
+ // If the vmdata field isn't set yet, or it's set to something other than
+ // a VMClassLoader (which happens in the OpenJDK port), then initialize
+ // the field now.
+ if (vmdata == NULL || !VMClassLoader::isVMClassLoader(vmdata)) {
JavaObject::acquire(loader);
vmdata =
(VMClassLoader*)(upcalls->vmdataClassLoader->getInstanceObjectField(loader));
- if (!vmdata) {
+ if (!vmdata || !VMClassLoader::isVMClassLoader(vmdata)) {
vmdata = VMClassLoader::allocate();
mvm::BumpPtrAllocator* A = new mvm::BumpPtrAllocator();
JCL = new(*A, "Class loader") JnjvmClassLoader(*A, *vm->bootstrapLoader,
--
1.7.5.1
More information about the vmkit-commits
mailing list