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>