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