[vmkit-commits] [vmkit] r72416 - in /vmkit/trunk/lib/JnJVM: Compiler/JnjvmModule.cpp VMCore/JavaArray.h VMCore/JavaClass.h VMCore/JavaObject.h VMCore/VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue May 26 07:46:41 PDT 2009


Author: geoffray
Date: Tue May 26 09:46:31 2009
New Revision: 72416

URL: http://llvm.org/viewvc/llvm-project?rev=72416&view=rev
Log:
Provide a universal tracer for Java objects.


Modified:
    vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h
    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/Compiler/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=72416&r1=72415&r2=72416&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Tue May 26 09:46:31 2009
@@ -148,7 +148,7 @@
   
   for (uint32 i = 0; i < nbFields; ++i) {
     JavaField& cur = fields[i];
-    if (cur.getSignature()->trace()) {
+    if (cur.isReference()) {
       LLVMFieldInfo* LFI = getFieldInfo(&cur);
       std::vector<Value*> args; //size = 2
       args.push_back(zero);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Tue May 26 09:46:31 2009
@@ -65,11 +65,6 @@
   static const unsigned int T_INT;
   static const unsigned int T_LONG;
   
-  /// tracer - The trace method of Java arrays of primitive types. Since their
-  /// class lives throughout the lifetime of the application, there is no need
-  /// to trace them. Therefore this trace function does nothing.
-  virtual void TRACER;
-  
 };
 
 /// Instantiation of the TJavaArray class for Java arrays of primitive types.
@@ -86,20 +81,10 @@
 ARRAYCLASS(ArrayLong,   sint64);
 ARRAYCLASS(ArrayFloat,  float);
 ARRAYCLASS(ArrayDouble, double);
+ARRAYCLASS(ArrayObject, JavaObject*);
 
 #undef ARRAYCLASS
 
-/// ArrayObject - Instantiation of the TJavaArray class for arrays of objects.
-/// Arrays of objects are different than arrays of primitive types because
-/// they have to trace all objects in the array.
-class ArrayObject : public TJavaArray<JavaObject*> {
-public:
-  /// tracer - The tracer method of Java arrays of objects. This method will
-  /// trace all objects in the array.
-  virtual void TRACER;
-};
-
-
 /// UTF8 - The UTF8 class is basically the ArrayUInt16 class (arrays of elements
 /// of type uint16) with helper functions for manipulating UTF8. Each JVM
 /// instance hashes UTF8. UTF8 are not allocated by the application's garbage

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Tue May 26 09:46:31 2009
@@ -1440,6 +1440,10 @@
     return static_cast<Ty*>(JInfo);
   }
 
+  bool isReference() {
+    uint16 val = type->elements[0];
+    return (val == 'L' || val == '[');
+  }
 
 };
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Tue May 26 09:46:31 2009
@@ -194,9 +194,6 @@
     if (obj == 0) JavaThread::get()->getJVM()->nullPointerException();
 #endif
   
-  virtual void TRACER;
-
-
   /// lockObj - Get the LockObj if the lock is a fat lock.
   LockObj* lockObj() {
     return lock.getFatLock();

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Tue May 26 09:46:31 2009
@@ -69,6 +69,7 @@
 // Empty tracer for static tracers of classes that do not declare static
 // variables.
 //===----------------------------------------------------------------------===//
+
 extern "C" void EmptyTracer(void*) {}
 
 //===----------------------------------------------------------------------===//
@@ -81,44 +82,57 @@
 //     classloader is the bootstrap loader and is traced by the JVM.
 //===----------------------------------------------------------------------===//
 
-
-/// Method for scanning the root of an object. This method is called by all
-/// JavObjects except native Java arrays.
-void JavaObject::tracer() {
-  if (getClass()) getClass()->classLoader->getJavaClassLoader()->markAndTrace();
-  LockObj* l = lockObj();
-  if (l) l->markAndTrace();
-}
-
+/// Method for scanning the root of an object.
 extern "C" void JavaObjectTracer(JavaObject* obj) {
-  obj->JavaObject::tracer();
+  if (obj->getClass())
+    obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
+  LockObj* l = obj->lockObj();
+  if (l) l->markAndTrace();
 }
 
 /// Method for scanning an array whose elements are JavaObjects. This method is
 /// called by all non-native Java arrays.
-void ArrayObject::tracer() {
-  JavaObject::tracer();
-  for (sint32 i = 0; i < size; i++) {
-    if (elements[i]) elements[i]->MARK_AND_TRACE;
-  } 
-}
-
 extern "C" void ArrayObjectTracer(ArrayObject* obj) {
-  obj->ArrayObject::tracer();
+  if (obj->getClass())
+    obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
+  LockObj* l = obj->lockObj();
+  if (l) l->markAndTrace();
+  for (sint32 i = 0; i < obj->size; i++) {
+    if (obj->elements[i]) obj->elements[i]->MARK_AND_TRACE;
+  } 
 }
 
 /// Method for scanning a native array. Only scan the lock. The classloader of
 /// the class is the bootstrap loader and therefore does not need to be
 /// scanned here.
-void JavaArray::tracer() {
-  LockObj* l = lockObj();
+extern "C" void JavaArrayTracer(JavaArray* obj) {
+  LockObj* l = obj->lockObj();
   if (l) l->markAndTrace();
 }
 
-extern "C" void JavaArrayTracer(JavaArray* obj) {
-  obj->JavaArray::tracer();
-}
+//===----------------------------------------------------------------------===//
+// Tracer for regular Java objects.
+//===----------------------------------------------------------------------===//
 
+extern "C" void RegularObjectTracer(JavaObject* obj) {
+  LockObj* l = obj->lockObj();
+  if (l) l->markAndTrace();
+  
+  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;
+  }
+}
 
 //===----------------------------------------------------------------------===//
 // Support for scanning Java objects referenced by classes. All classes must





More information about the vmkit-commits mailing list