[vmkit-commits] [vmkit] r108831 - in /vmkit/trunk/lib: J3/Classpath/ClasspathReflect.h J3/Classpath/JavaUpcalls.cpp J3/VMCore/JavaClass.cpp J3/VMCore/VirtualTables.cpp Mvm/Runtime/Object.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jul 20 06:01:41 PDT 2010


Author: geoffray
Date: Tue Jul 20 08:01:41 2010
New Revision: 108831

URL: http://llvm.org/viewvc/llvm-project?rev=108831&view=rev
Log:
Revert to r108827, J3 was crashing.


Modified:
    vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
    vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
    vmkit/trunk/lib/Mvm/Runtime/Object.cpp

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h Tue Jul 20 08:01:41 2010
@@ -210,12 +210,16 @@
     llvm_gcroot(self, 0);
     return &(self->referent);
   }
-
   static void setReferent(JavaObjectReference* self, JavaObject* r) {
     llvm_gcroot(self, 0);
     llvm_gcroot(r, 0);
     self->referent = r;
   }
+  
+  static void staticTracer(JavaObjectReference* obj, uintptr_t closure) {
+    mvm::Collector::markAndTrace(obj, &obj->queue, closure);
+    mvm::Collector::markAndTrace(obj, &obj->nextOnQueue, closure);
+  }
 };
 
 }

Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Tue Jul 20 08:01:41 2010
@@ -511,6 +511,11 @@
   JavaObjectConstructor::staticTracer(obj, closure);
 }
 
+extern "C" void nativeJavaObjectReferenceTracer(
+    JavaObjectReference* obj, uintptr_t closure) {
+  JavaObjectReference::staticTracer(obj, closure);
+}
+
 extern "C" void nativeJavaObjectVMThreadTracer(
     JavaObjectVMThread* obj, uintptr_t closure) {
   JavaObjectVMThread::staticTracer(obj, closure);
@@ -521,9 +526,6 @@
   JavaObjectVMThread::staticDestructor(obj);
 }
 
-extern "C" void ObjectReferenceTracer(
-    JavaObjectReference* obj, uintptr_t closure);
-
 // Defined in Classpath/ClasspathVMClassLoader.cpp
 extern "C" ArrayObject* nativeGetBootPackages();
 
@@ -1041,7 +1043,8 @@
   newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
     
   newReference->getVirtualVT()->setNativeTracer(
-      (uintptr_t)ObjectReferenceTracer, "ObjectReferenceTracer");
+      (uintptr_t)nativeJavaObjectReferenceTracer,
+      "nativeJavaObjectReferenceTracer");
   
   EnqueueReference = 
     UPCALL_METHOD(loader, "java/lang/ref/Reference",  "enqueue", "()Z",

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Tue Jul 20 08:01:41 2010
@@ -41,6 +41,7 @@
 Class** ClassArray::InterfacesArray;
 
 extern "C" void JavaArrayTracer(JavaObject*);
+extern "C" void JavaObjectTracer(JavaObject*);
 extern "C" void ArrayObjectTracer(JavaObject*);
 extern "C" void RegularObjectTracer(JavaObject*);
 
@@ -1476,7 +1477,7 @@
     assert(C->super->virtualVT && "Super has no VT");
 
     // Set the regular object tracer, destructor and delete.
-    tracer = (uintptr_t)C->super->tracer;
+    tracer = (uintptr_t)RegularObjectTracer;
     destructor = 0;
     operatorDelete = 0;
     
@@ -1543,7 +1544,7 @@
 
   } else {
     // Set the tracer, destructor and delete.
-    tracer = (uintptr_t)RegularObjectTracer;
+    tracer = (uintptr_t)JavaObjectTracer;
     destructor = 0;
     operatorDelete = 0;
     

Modified: vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp Tue Jul 20 08:01:41 2010
@@ -20,7 +20,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "ClasspathReflect.h"
 #include "JavaArray.h"
 #include "JavaClass.h"
 #include "JavaObject.h"
@@ -65,62 +64,25 @@
 
 //===----------------------------------------------------------------------===//
 // Trace methods for Java objects. There are four types of objects:
-// (1) Regular object: needs to trace the classloader, and all the virtual
-//     fields.
-// (2) java.lang.ref.Reference objects: needs to trace the class loader and
-//     all the virtual fields except the referent.
-// (3) Object whose class is an array of objects: needs to trace the class loader
-//     and all elements in the array.
-// (4) Object whose class is a native array: nothing to trace. The
+// (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
 //     classloader is the bootstrap loader and is traced by the JVM.
 //===----------------------------------------------------------------------===//
 
-/// Method for scanning regular objects.
-extern "C" void RegularObjectTracer(JavaObject* obj, uintptr_t closure) {
-  Class* cl = JavaObject::getClass(obj)->asClass();
-  assert(cl && "Not a class in regular tracer");
-  mvm::Collector::markAndTraceRoot(
-      cl->classLoader->getJavaClassLoaderPtr(), closure);
-
-  while (cl->super != 0) {
-    for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
-      JavaField& field = cl->virtualFields[i];
-      if (field.isReference()) {
-        JavaObject** ptr = field.getInstanceObjectFieldPtr(obj);
-        mvm::Collector::markAndTrace(obj, ptr, closure);
-      }
-    }
-    cl = cl->super;
-  }
-}
 
-/// Method for scanning Java java.lang.ref.Reference objects.
-extern "C" void ObjectReferenceTracer(
-    JavaObjectReference* obj, uintptr_t closure) {
-  Class* cl = JavaObject::getClass(obj)->asClass();
-  assert(cl && "Not a class in reference tracer");
+/// Method for scanning the root of an object.
+extern "C" void JavaObjectTracer(JavaObject* obj, uintptr_t closure) {
+  CommonClass* cl = JavaObject::getClass(obj);
+  assert(cl && "No class");
   mvm::Collector::markAndTraceRoot(
       cl->classLoader->getJavaClassLoaderPtr(), closure);
-
-  bool found = false;
-  while (cl->super != 0) {
-    for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
-      JavaField& field = cl->virtualFields[i];
-      if (field.isReference()) {
-        JavaObject** ptr = field.getInstanceObjectFieldPtr(obj);
-        if (ptr != JavaObjectReference::getReferentPtr(obj)) {
-          mvm::Collector::markAndTrace(obj, ptr, closure);
-        } else {
-          found = true;
-        }
-      }
-    }
-    cl = cl->super;
-  }
-  assert(found && "No referent in a reference");
 }
 
-
 /// 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, uintptr_t closure) {
@@ -129,6 +91,7 @@
   mvm::Collector::markAndTraceRoot(
       cl->classLoader->getJavaClassLoaderPtr(), closure);
   
+
   for (sint32 i = 0; i < ArrayObject::getSize(obj); i++) {
     if (ArrayObject::getElement(obj, i) != NULL) {
       mvm::Collector::markAndTrace(
@@ -143,6 +106,26 @@
 extern "C" void JavaArrayTracer(JavaArray* obj, uintptr_t closure) {
 }
 
+/// Method for scanning regular objects.
+extern "C" void RegularObjectTracer(JavaObject* obj, uintptr_t closure) {
+  Class* cl = JavaObject::getClass(obj)->asClass();
+  assert(cl && "Not a class in regular tracer");
+  mvm::Collector::markAndTraceRoot(
+      cl->classLoader->getJavaClassLoaderPtr(), closure);
+
+  while (cl->super != 0) {
+    for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
+      JavaField& field = cl->virtualFields[i];
+      if (field.isReference()) {
+        JavaObject** ptr = field.getInstanceObjectFieldPtr(obj);
+        mvm::Collector::markAndTrace(obj, ptr, closure);
+      }
+    }
+    cl = cl->super;
+  }
+}
+
+
 //===----------------------------------------------------------------------===//
 // Support for scanning Java objects referenced by classes. All classes must
 // trace:
@@ -158,27 +141,25 @@
 
 void CommonClass::tracer(uintptr_t closure) {
   
-  if (super != NULL && super->classLoader != NULL) {
+  if (super && super->classLoader) {
     JavaObject** Obj = super->classLoader->getJavaClassLoaderPtr();
     if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
   
     for (uint32 i = 0; i < nbInterfaces; ++i) {
-      if (interfaces[i]->classLoader != NULL) {
+      if (interfaces[i]->classLoader) {
         JavaObject** Obj = interfaces[i]->classLoader->getJavaClassLoaderPtr();
-        if ((*Obj) != NULL) mvm::Collector::markAndTraceRoot(Obj, closure);
+        if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
       }
     }
   }
 
-  if (classLoader != NULL) {
+  if (classLoader)
     mvm::Collector::markAndTraceRoot(
         classLoader->getJavaClassLoaderPtr(), closure);
-  }
 
   for (uint32 i = 0; i < NR_ISOLATES; ++i) {
-    if (delegatee[i] != NULL) {
-      // TODO: remove the call to tracer until no j.l.Class are allocated
-      // statically in AOT.
+    // If the delegatee was static allocated, we want to trace its fields.
+    if (delegatee[i]) {
       delegatee[i]->tracer(closure);
       mvm::Collector::markAndTraceRoot(delegatee + i, closure);
     }

Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Tue Jul 20 08:01:41 2010
@@ -202,14 +202,12 @@
     gc* reference, VirtualMachine* vm, uintptr_t closure) {
   if (!Collector::isLive(reference, closure)) {
     vm->clearReferent(reference);
-    return NULL;
+    return 0;
   }
 
   gc* referent = *(vm->getReferentPtr(reference));
 
-  if (!referent) {
-    return NULL;
-  }
+  if (!referent) return 0;
 
   if (semantics == SOFT) {
     // TODO: are we are out of memory? Consider that we always are for now.
@@ -220,16 +218,16 @@
     // Nothing to do.
   }
 
-  gc* newReference =
-      mvm::Collector::getForwardedReference(reference, closure);
   if (Collector::isLive(referent, closure)) {
     gc* newReferent = mvm::Collector::getForwardedReferent(referent, closure);
+    gc* newReference =
+      mvm::Collector::getForwardedReference(reference, closure);
     vm->setReferent(newReference, newReferent);
     return newReference;
   } else {
-    vm->clearReferent(newReference);
-    vm->addToEnqueue(newReference);
-    return NULL;
+    vm->clearReferent(reference);
+    vm->addToEnqueue(reference);
+    return 0;
   }
 }
 





More information about the vmkit-commits mailing list