[vmkit-commits] [vmkit] r72522 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathReflect.h VMCore/JavaClass.cpp VMCore/JavaUpcalls.cpp VMCore/VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu May 28 03:43:24 PDT 2009


Author: geoffray
Date: Thu May 28 05:43:06 2009
New Revision: 72522

URL: http://llvm.org/viewvc/llvm-project?rev=72522&view=rev
Log:
Classes that inherit java.lang.ref.Reference have a special tracer.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
    vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=72522&r1=72521&r2=72522&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Thu May 28 05:43:06 2009
@@ -167,11 +167,7 @@
 
   JavaObject* getReferent() const { return referent; }
   void setReferent(JavaObject* r) { referent = r; }
-  
-  static void STATIC_TRACER(JavaObjectReference) {
-    obj->queue->MARK_AND_TRACE;
-    obj->nextOnQueue->MARK_AND_TRACE;
-  }
+
 };
 
 }

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=72522&r1=72521&r2=72522&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu May 28 05:43:06 2009
@@ -40,9 +40,10 @@
 Class* ClassArray::SuperArray;
 Class** ClassArray::InterfacesArray;
 
+extern "C" void ArrayObjectTracer(JavaObject*);
 extern "C" void JavaArrayTracer(JavaObject*);
 extern "C" void JavaObjectTracer(JavaObject*);
-extern "C" void ArrayObjectTracer(JavaObject*);
+extern "C" void ReferenceObjectTracer(JavaObject*);
 extern "C" void RegularObjectTracer(JavaObject*);
 
 Attribut::Attribut(const UTF8* name, uint32 length,
@@ -1253,7 +1254,6 @@
   if (C->super) {
     // Set the class of this VT.
     cl = C;
-    tracer = (uintptr_t)RegularObjectTracer;
     
     // Set depth and display for fast dynamic type checking.
     JavaVirtualTable* superVT = C->super->virtualVT;
@@ -1311,6 +1311,15 @@
              sizeof(JavaVirtualTable*) * cur->nbSecondaryTypes);
       lastIndex += cur->nbSecondaryTypes;
     }
+    
+    JnjvmClassLoader* JCL = cl->classLoader;
+    Classpath* upcalls = JCL->bootstrapLoader->upcalls;
+    Class* ref = upcalls->newReference;
+    if (ref && display[1] == ref->virtualVT) {
+      tracer = (uintptr_t)ReferenceObjectTracer;
+    } else {
+      tracer = (uintptr_t)RegularObjectTracer;
+    }
 
   } else {
     // Set the tracer, destructor and delete

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=72522&r1=72521&r2=72522&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Thu May 28 05:43:06 2009
@@ -404,10 +404,6 @@
   JavaObjectConstructor::staticTracer(obj);
 }
 
-extern "C" void nativeJavaObjectReferenceTracer(JavaObjectReference* obj) {
-  JavaObjectReference::staticTracer(obj);
-}
-
 extern "C" void nativeJavaObjectVMThreadDestructor(JavaObjectVMThread* obj) {
   JavaObjectVMThread::staticDestructor(obj);
 }
@@ -415,6 +411,8 @@
 // Defined in Classpath/ClasspathVMClassLoader.cpp
 extern "C" ArrayObject* nativeGetBootPackages();
 
+extern "C" void ReferenceObjectTracer(JavaObject*);
+
 void Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
 
   newClassLoader = 
@@ -885,11 +883,11 @@
 
    
   newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
-    
-  newReference->getVirtualVT()->setNativeTracer(
-      (uintptr_t)nativeJavaObjectReferenceTracer,
-      "nativeJavaObjectReferenceTracer");
   
+  newReference->getVirtualVT()->setNativeTracer(
+      (uintptr_t)ReferenceObjectTracer,
+      "ReferenceObjectTracer");
+
   EnqueueReference = 
     UPCALL_METHOD(loader, "java/lang/ref/Reference",  "enqueue", "()Z",
                   ACC_VIRTUAL);

Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=72522&r1=72521&r2=72522&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Thu May 28 05:43:06 2009
@@ -134,6 +134,36 @@
   }
 }
 
+extern "C" void ReferenceObjectTracer(JavaObject* obj) {
+  LockObj* l = obj->lockObj();
+  if (l) l->markAndTrace();
+  
+  Class* cl = obj->getClass()->asClass();
+  assert(cl && "Not a class in reference tracer");
+  cl->classLoader->getJavaClassLoader()->markAndTrace();
+  Classpath* upcalls = cl->classLoader->bootstrapLoader->upcalls;
+  
+
+  while (cl != upcalls->newReference) {
+    for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
+      JavaField& field = cl->virtualFields[i];
+      if (field.isReference()) {
+        JavaObject* ptr = field.getObjectField(obj);
+        ptr->markAndTrace();
+      }
+    }
+    cl = cl->super;
+  }
+
+  for (uint32 i = 1; i < cl->nbVirtualFields; ++i) {
+    JavaField& field = cl->virtualFields[i];
+    if (field.isReference()) {
+      JavaObject* ptr = field.getObjectField(obj);
+      ptr->markAndTrace();
+    }
+  }
+}
+
 //===----------------------------------------------------------------------===//
 // Support for scanning Java objects referenced by classes. All classes must
 // trace:





More information about the vmkit-commits mailing list