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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Jun 7 12:44:17 PDT 2009


Author: geoffray
Date: Sun Jun  7 14:44:16 2009
New Revision: 73035

URL: http://llvm.org/viewvc/llvm-project?rev=73035&view=rev
Log:
Now that the mark and trace function of GCMmap is not recursive,
we can put back a universal tracer. The next step is to remove
dynamic generation of per-class tracer.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
    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=73035&r1=73034&r2=73035&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Sun Jun  7 14:44:16 2009
@@ -18,7 +18,6 @@
 #include <JavaObject.h>
 
 extern "C" jnjvm::JavaObject* internalFillInStackTrace(jnjvm::JavaObject*);
-extern "C" void JavaObjectTracer(jnjvm::JavaObject*);
 
 namespace jnjvm {
 
@@ -36,7 +35,7 @@
   }
 
   static void staticTracer(JavaObjectClass* obj) {
-    JavaObjectTracer(obj);
+    obj->traceLock();
     obj->pd->markAndTrace();
     obj->signers->markAndTrace();
     obj->constructor->markAndTrace();
@@ -57,7 +56,7 @@
 public:
 
   static void staticTracer(JavaObjectField* obj) {
-    JavaObjectTracer(obj);
+    obj->traceLock();
     obj->name->markAndTrace();
     obj->declaringClass->markAndTrace();
   }
@@ -82,7 +81,7 @@
 public:
   
   static void staticTracer(JavaObjectMethod* obj) {
-    JavaObjectTracer(obj);
+    obj->traceLock();
     obj->name->markAndTrace();
     obj->declaringClass->markAndTrace();
   }
@@ -105,7 +104,7 @@
 
 public:
   static void staticTracer(JavaObjectConstructor* obj) {
-    JavaObjectTracer(obj);
+    obj->traceLock();
     obj->clazz->markAndTrace();
   }
   

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sun Jun  7 14:44:16 2009
@@ -43,6 +43,7 @@
 extern "C" void JavaArrayTracer(JavaObject*);
 extern "C" void JavaObjectTracer(JavaObject*);
 extern "C" void ArrayObjectTracer(JavaObject*);
+extern "C" void RegularObjectTracer(JavaObject*);
 
 Attribut::Attribut(const UTF8* name, uint32 length,
                    uint32 offset) {
@@ -1250,6 +1251,12 @@
 JavaVirtualTable::JavaVirtualTable(Class* C) {
    
   if (C->super) {
+
+    // Set the regular object tracer, destructor and delete.
+    tracer = (uintptr_t)RegularObjectTracer;
+    destructor = 0;
+    operatorDelete = 0;
+    
     // Set the class of this VT.
     cl = C;
     

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Sun Jun  7 14:44:16 2009
@@ -1297,6 +1297,11 @@
   }
 
 
+  bool isReference() {
+    uint16 val = type->elements[0];
+    return (val == '[' || val == 'L');
+  }
+
 };
 
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=73035&r1=73034&r2=73035&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Sun Jun  7 14:44:16 2009
@@ -364,6 +364,10 @@
   ///
   void decapsulePrimitive(Jnjvm* vm, uintptr_t &buf, const Typedef* signature);
 
+  void traceLock() {
+    LockObj* l = lockObj();
+    if (l) l->markAndTrace();
+  }
 };
 
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Sun Jun  7 14:44:16 2009
@@ -13,15 +13,13 @@
 //
 // The file is divided into four parts:
 // (1) Declaration of internal GC classes.
-// (2) Tracing roots of objects: regular object, native array, object array.
+// (2) Tracing Java objects: regular object, native array, object array.
 // (3) Tracing a class loader, which involves tracing the Java objects
 //     referenced by classes.
 // (4) Tracing the roots of a program: the JVM and the threads.
 //
 //===----------------------------------------------------------------------===//
 
-#include "mvm/Object.h"
-
 #include "JavaArray.h"
 #include "JavaClass.h"
 #include "JavaObject.h"
@@ -69,12 +67,15 @@
 // Empty tracer for static tracers of classes that do not declare static
 // variables.
 //===----------------------------------------------------------------------===//
+
 extern "C" void EmptyTracer(void*) {}
 
 //===----------------------------------------------------------------------===//
-// Root trace methods for Java objects. There are three types of roots:
-// (1) Object whose class is not an array: needs to trace the classloader and
-//     the lock.
+// Trace methods for Java objects. There are four types of objects:
+// (1) Base object whose class is not an array: needs to trace the classloader
+//     and the lock.
+// (1) Object whose class is not an array: needs to trace the classloader, the
+//     lock and all the virtual fields.
 // (2) Object whose class is an array of objects: needs to trace root (1) and
 //     all elements in the array.
 // (3) Object whose class is a native array: only needs to trace the lock. The
@@ -82,22 +83,25 @@
 //===----------------------------------------------------------------------===//
 
 
-/// Method for scanning the root of an object. This method is called by all
-/// JavObjects except native Java arrays.
+/// Method for scanning the root of an object.
 extern "C" void JavaObjectTracer(JavaObject* obj) {
-  if (obj->getClass())
-    obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
-  LockObj* l = obj->lockObj();
-  if (l) l->markAndTrace();
+  obj->traceLock();
+  
+  CommonClass* cl = obj->getClass();
+  assert(cl && "No class");
+  cl->classLoader->getJavaClassLoader()->markAndTrace();
 }
 
 /// Method for scanning an array whose elements are JavaObjects. This method is
 /// called by all non-native Java arrays.
 extern "C" void ArrayObjectTracer(ArrayObject* obj) {
-  if (obj->getClass())
-    obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
-  LockObj* l = obj->lockObj();
-  if (l) l->markAndTrace();
+  obj->traceLock();
+  
+  CommonClass* cl = obj->getClass();
+  assert(cl && "No class");
+  cl->classLoader->getJavaClassLoader()->markAndTrace();
+  
+
   for (sint32 i = 0; i < obj->size; i++) {
     if (obj->elements[i]) obj->elements[i]->markAndTrace();
   } 
@@ -107,8 +111,27 @@
 /// the class is the bootstrap loader and therefore does not need to be
 /// scanned here.
 extern "C" void JavaArrayTracer(JavaArray* obj) {
-  LockObj* l = obj->lockObj();
-  if (l) l->markAndTrace();
+  obj->traceLock();
+}
+
+/// Method for scanning regular objects.
+extern "C" void RegularObjectTracer(JavaObject* obj) {
+  obj->traceLock();
+
+  Class* cl = obj->getClass()->asClass();
+  assert(cl && "Not a class in regular tracer");
+  cl->classLoader->getJavaClassLoader()->markAndTrace();
+
+  while (cl->super != 0) {
+    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;
+  }
 }
 
 
@@ -156,7 +179,13 @@
   for (uint32 i =0; i < NR_ISOLATES; ++i) {
     TaskClassMirror &M = IsolateInfo[i];
     if (M.staticInstance && staticTracer != EmptyTracer) {
-      staticTracer(M.staticInstance);
+      for (uint32 i = 0; i < nbStaticFields; ++i) {
+        JavaField& field = staticFields[i];
+        if (field.isReference()) {
+          JavaObject* ptr = field.getObjectField(M.staticInstance);
+          ptr->markAndTrace();
+        }
+      }
     }
   }
 }





More information about the vmkit-commits mailing list