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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jul 20 05:32:30 PDT 2010


Author: geoffray
Date: Tue Jul 20 07:32:30 2010
New Revision: 108829

URL: http://llvm.org/viewvc/llvm-project?rev=108829&view=rev
Log:
Bugfix for references: the special tracer wasn't set, so the referent was always traced!


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/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=108829&r1=108828&r2=108829&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h Tue Jul 20 07:32:30 2010
@@ -210,16 +210,12 @@
     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=108829&r1=108828&r2=108829&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Tue Jul 20 07:32:30 2010
@@ -511,11 +511,6 @@
   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);
@@ -526,6 +521,9 @@
   JavaObjectVMThread::staticDestructor(obj);
 }
 
+extern "C" void ObjectReferenceTracer(
+    JavaObjectReference* obj, uintptr_t closure);
+
 // Defined in Classpath/ClasspathVMClassLoader.cpp
 extern "C" ArrayObject* nativeGetBootPackages();
 
@@ -1043,8 +1041,7 @@
   newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
     
   newReference->getVirtualVT()->setNativeTracer(
-      (uintptr_t)nativeJavaObjectReferenceTracer,
-      "nativeJavaObjectReferenceTracer");
+      (uintptr_t)ObjectReferenceTracer, "ObjectReferenceTracer");
   
   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=108829&r1=108828&r2=108829&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Tue Jul 20 07:32:30 2010
@@ -41,7 +41,6 @@
 Class** ClassArray::InterfacesArray;
 
 extern "C" void JavaArrayTracer(JavaObject*);
-extern "C" void JavaObjectTracer(JavaObject*);
 extern "C" void ArrayObjectTracer(JavaObject*);
 extern "C" void RegularObjectTracer(JavaObject*);
 
@@ -1477,7 +1476,7 @@
     assert(C->super->virtualVT && "Super has no VT");
 
     // Set the regular object tracer, destructor and delete.
-    tracer = (uintptr_t)RegularObjectTracer;
+    tracer = (uintptr_t)C->super->tracer;
     destructor = 0;
     operatorDelete = 0;
     
@@ -1544,7 +1543,7 @@
 
   } else {
     // Set the tracer, destructor and delete.
-    tracer = (uintptr_t)JavaObjectTracer;
+    tracer = (uintptr_t)RegularObjectTracer;
     destructor = 0;
     operatorDelete = 0;
     

Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=108829&r1=108828&r2=108829&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Tue Jul 20 07:32:30 2010
@@ -202,12 +202,14 @@
     gc* reference, VirtualMachine* vm, uintptr_t closure) {
   if (!Collector::isLive(reference, closure)) {
     vm->clearReferent(reference);
-    return 0;
+    return NULL;
   }
 
   gc* referent = *(vm->getReferentPtr(reference));
 
-  if (!referent) return 0;
+  if (!referent) {
+    return NULL;
+  }
 
   if (semantics == SOFT) {
     // TODO: are we are out of memory? Consider that we always are for now.
@@ -218,16 +220,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(reference);
-    vm->addToEnqueue(reference);
-    return 0;
+    vm->clearReferent(newReference);
+    vm->addToEnqueue(newReference);
+    return NULL;
   }
 }
 





More information about the vmkit-commits mailing list