[vmkit-commits] [vmkit] r104859 - in /vmkit/trunk: include/mvm/ include/mvm/GC/ include/mvm/Threads/ lib/J3/Classpath/ lib/J3/VMCore/ lib/Mvm/Compiler/ lib/Mvm/GCMmap2/ lib/Mvm/MMTk/ lib/Mvm/Runtime/ mmtk/mmtk-alloc/ mmtk/mmtk-j3/

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu May 27 11:07:44 PDT 2010


Author: geoffray
Date: Thu May 27 13:07:44 2010
New Revision: 104859

URL: http://llvm.org/viewvc/llvm-project?rev=104859&view=rev
Log:
Pass the transitive closure to the tracing functions instead of making it static.


Modified:
    vmkit/trunk/include/mvm/GC/GC.h
    vmkit/trunk/include/mvm/JIT.h
    vmkit/trunk/include/mvm/MethodInfo.h
    vmkit/trunk/include/mvm/Object.h
    vmkit/trunk/include/mvm/Threads/Thread.h
    vmkit/trunk/include/mvm/VirtualMachine.h
    vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
    vmkit/trunk/lib/J3/VMCore/JavaClass.h
    vmkit/trunk/lib/J3/VMCore/JavaThread.h
    vmkit/trunk/lib/J3/VMCore/Jnjvm.h
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
    vmkit/trunk/lib/Mvm/Compiler/JIT.cpp
    vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h
    vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp
    vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
    vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp
    vmkit/trunk/lib/Mvm/MMTk/MvmGC.h
    vmkit/trunk/lib/Mvm/Runtime/MethodInfo.cpp
    vmkit/trunk/lib/Mvm/Runtime/Object.cpp
    vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
    vmkit/trunk/mmtk/mmtk-j3/FinalizableProcessor.cpp
    vmkit/trunk/mmtk/mmtk-j3/ReferenceProcessor.cpp
    vmkit/trunk/mmtk/mmtk-j3/Scanning.cpp

Modified: vmkit/trunk/include/mvm/GC/GC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/GC/GC.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/GC/GC.h (original)
+++ vmkit/trunk/include/mvm/GC/GC.h Thu May 27 13:07:44 2010
@@ -18,7 +18,7 @@
 class gcRoot {
 public:
   virtual           ~gcRoot() {}
-  virtual void      tracer(void) {}
+  virtual void      tracer(uintptr_t closure) {}
   
   /// getVirtualTable - Returns the virtual table of this object.
   ///
@@ -39,18 +39,18 @@
 
 class StackScanner {
 public:
-  virtual void scanStack(mvm::Thread* th) = 0;
+  virtual void scanStack(mvm::Thread* th, uintptr_t closure) = 0;
   virtual ~StackScanner() {}
 };
 
 class UnpreciseStackScanner : public StackScanner {
 public:
-  virtual void scanStack(mvm::Thread* th);
+  virtual void scanStack(mvm::Thread* th, uintptr_t closure);
 };
 
 class PreciseStackScanner : public StackScanner {
 public:
-  virtual void scanStack(mvm::Thread* th);
+  virtual void scanStack(mvm::Thread* th, uintptr_t closure);
 };
 
 }

Modified: vmkit/trunk/include/mvm/JIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/JIT.h (original)
+++ vmkit/trunk/include/mvm/JIT.h Thu May 27 13:07:44 2010
@@ -207,7 +207,7 @@
 class JITMethodInfo : public MethodInfo {
   llvm::GCFunctionInfo* GCInfo;
 public:
-  virtual void scan(void* TL, void* ip, void* addr);
+  virtual void scan(uintptr_t closure, void* ip, void* addr);
   JITMethodInfo(llvm::GCFunctionInfo* GFI) : GCInfo(GFI) {}
 };
 

Modified: vmkit/trunk/include/mvm/MethodInfo.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/MethodInfo.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/MethodInfo.h (original)
+++ vmkit/trunk/include/mvm/MethodInfo.h Thu May 27 13:07:44 2010
@@ -18,7 +18,7 @@
 class MethodInfo : public PermanentObject {
 public:
   virtual void print(void* ip, void* addr) = 0;
-  virtual void scan(void* TL, void* ip, void* addr) = 0;
+  virtual void scan(uintptr_t closure, void* ip, void* addr) = 0;
 
   static void* isStub(void* ip, void* addr) {
     bool isStub = ((unsigned char*)ip)[0] == 0xCE;
@@ -46,7 +46,7 @@
 class CamlMethodInfo : public MethodInfo {
   CamlFrame* CF;
 public:
-  virtual void scan(void* TL, void* ip, void* addr);
+  virtual void scan(uintptr_t closure, void* ip, void* addr);
   CamlMethodInfo(CamlFrame* C, void* ip);
 };
 
@@ -64,7 +64,7 @@
 class DefaultMethodInfo : public MethodInfo {
 public:
   virtual void print(void* ip, void* addr);
-  virtual void scan(void* TL, void* ip, void* addr);
+  virtual void scan(uintptr_t closure, void* ip, void* addr);
   static DefaultMethodInfo DM;
     
   DefaultMethodInfo() {

Modified: vmkit/trunk/include/mvm/Object.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Object.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Object.h (original)
+++ vmkit/trunk/include/mvm/Object.h Thu May 27 13:07:44 2010
@@ -32,13 +32,13 @@
 ///
 class Object : public gc {
 public:
-	static void     default_tracer(gc *o)                    {}
+	static void     default_tracer(gc *o, uintptr_t closure) {}
 	static intptr_t default_hashCode(const gc *o)            { return (intptr_t)o; }
 	static void     default_print(const gc *o, PrintBuffer *buf);
 
   /// tracer - Default implementation of tracer. Does nothing.
   ///
-  virtual void tracer() { default_tracer(this); }
+  virtual void tracer(uintptr_t closure) { default_tracer(this, closure); }
 
   /// print - Default implementation of print.
   ///

Modified: vmkit/trunk/include/mvm/Threads/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Threads/Thread.h (original)
+++ vmkit/trunk/include/mvm/Threads/Thread.h Thu May 27 13:07:44 2010
@@ -240,7 +240,7 @@
   /// tracer - Does nothing. Used for child classes which may defined
   /// a tracer.
   ///
-  virtual void tracer() {}
+  virtual void tracer(uintptr_t closure) {}
   
   void* getLastSP() { return lastSP; }
   void  setLastSP(void* V) { lastSP = V; }

Modified: vmkit/trunk/include/mvm/VirtualMachine.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/VirtualMachine.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/VirtualMachine.h (original)
+++ vmkit/trunk/include/mvm/VirtualMachine.h Thu May 27 13:07:44 2010
@@ -123,7 +123,7 @@
   mvm::SpinLock QueueLock;
   uint8_t semantics;
 
-  gc* processReference(gc*, VirtualMachine*);
+  gc* processReference(gc*, VirtualMachine*, uintptr_t closure);
 public:
 
   static const uint8_t WEAK = 1;
@@ -169,7 +169,7 @@
     QueueLock.release();
   }
 
-  void scan(VirtualMachine* vm);
+  void scan(VirtualMachine* vm, uintptr_t closure);
 };
 
 
@@ -262,7 +262,7 @@
   }
 
 
-  virtual void tracer();
+  virtual void tracer(uintptr_t closure);
 
   virtual ~VirtualMachine() {
     if (scanner) delete scanner;
@@ -398,7 +398,7 @@
   /// scanFinalizationQueue - Scan objets with a finalized method and schedule
   /// them for finalization if they are not live.
   ///
-  void scanFinalizationQueue();
+  void scanFinalizationQueue(uintptr_t closure);
 
   /// wakeUpFinalizers - Wake the finalizers.
   ///
@@ -427,22 +427,22 @@
   /// scanWeakReferencesQueue - Scan all weak references. Called by the GC
   /// before scanning the finalization queue.
   /// 
-  void scanWeakReferencesQueue() {
-    WeakReferencesQueue.scan(this);
+  void scanWeakReferencesQueue(uintptr_t closure) {
+    WeakReferencesQueue.scan(this, closure);
   }
   
   /// scanSoftReferencesQueue - Scan all soft references. Called by the GC
   /// before scanning the finalization queue.
   ///
-  void scanSoftReferencesQueue() {
-    SoftReferencesQueue.scan(this);
+  void scanSoftReferencesQueue(uintptr_t closure) {
+    SoftReferencesQueue.scan(this, closure);
   }
   
   /// scanPhantomReferencesQueue - Scan all phantom references. Called by the GC
   /// after the finalization queue.
   ///
-  void scanPhantomReferencesQueue() {
-    PhantomReferencesQueue.scan(this);
+  void scanPhantomReferencesQueue(uintptr_t closure) {
+    PhantomReferencesQueue.scan(this, closure);
   }
   
   /// addWeakReference - Add a weak reference to the queue.

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h Thu May 27 13:07:44 2010
@@ -34,13 +34,13 @@
     return vmdata;
   }
 
-  static void staticTracer(JavaObjectClass* obj) {
-    mvm::Collector::markAndTrace(obj, &obj->pd);
-    mvm::Collector::markAndTrace(obj, &obj->signers);
-    mvm::Collector::markAndTrace(obj, &obj->constructor);
+  static void staticTracer(JavaObjectClass* obj, uintptr_t closure) {
+    mvm::Collector::markAndTrace(obj, &obj->pd, closure);
+    mvm::Collector::markAndTrace(obj, &obj->signers, closure);
+    mvm::Collector::markAndTrace(obj, &obj->constructor, closure);
     if (obj->vmdata) {
       JavaObject** Obj = obj->vmdata->classLoader->getJavaClassLoaderPtr();
-      if (*Obj) mvm::Collector::markAndTraceRoot(Obj);
+      if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
     }
   }
 };
@@ -54,9 +54,9 @@
 
 public:
 
-  static void staticTracer(JavaObjectField* obj) {
-    mvm::Collector::markAndTrace(obj, &obj->name);
-    mvm::Collector::markAndTrace(obj, &obj->declaringClass);
+  static void staticTracer(JavaObjectField* obj, uintptr_t closure) {
+    mvm::Collector::markAndTrace(obj, &obj->name, closure);
+    mvm::Collector::markAndTrace(obj, &obj->declaringClass, closure);
   }
 
   JavaField* getInternalField() {
@@ -78,9 +78,9 @@
 
 public:
   
-  static void staticTracer(JavaObjectMethod* obj) {
-    mvm::Collector::markAndTrace(obj, &obj->name);
-    mvm::Collector::markAndTrace(obj, &obj->declaringClass);
+  static void staticTracer(JavaObjectMethod* obj, uintptr_t closure) {
+    mvm::Collector::markAndTrace(obj, &obj->name, closure);
+    mvm::Collector::markAndTrace(obj, &obj->declaringClass, closure);
   }
   
   JavaMethod* getInternalMethod() {
@@ -100,8 +100,8 @@
   uint32 slot;
 
 public:
-  static void staticTracer(JavaObjectConstructor* obj) {
-    mvm::Collector::markAndTrace(obj, &obj->clazz);
+  static void staticTracer(JavaObjectConstructor* obj, uintptr_t closure) {
+    mvm::Collector::markAndTrace(obj, &obj->clazz, closure);
   }
   
   JavaMethod* getInternalMethod() {
@@ -125,8 +125,8 @@
     mvm::Thread::releaseThread(obj->vmdata);
   }
   
-  static void staticTracer(JavaObjectVMThread* obj) {
-    mvm::Collector::markAndTrace(obj, &obj->thread);
+  static void staticTracer(JavaObjectVMThread* obj, uintptr_t closure) {
+    mvm::Collector::markAndTrace(obj, &obj->thread, closure);
   }
 
 };
@@ -167,9 +167,9 @@
   JavaObject** getReferentPtr() { return &referent; }
   void setReferent(JavaObject* r) { referent = r; }
   
-  static void staticTracer(JavaObjectReference* obj) {
-    mvm::Collector::markAndTrace(obj, &obj->queue);
-    mvm::Collector::markAndTrace(obj, &obj->nextOnQueue);
+  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=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Thu May 27 13:07:44 2010
@@ -489,32 +489,38 @@
 extern "C" void nativePropertiesPostInit(JavaObject* prop);
 
 
-extern "C" void nativeJavaObjectClassTracer(JavaObjectClass* obj) {
-  JavaObjectClass::staticTracer(obj);
+extern "C" void nativeJavaObjectClassTracer(
+    JavaObjectClass* obj, uintptr_t closure) {
+  JavaObjectClass::staticTracer(obj, closure);
 }
 
-extern "C" void nativeJavaObjectFieldTracer(JavaObjectField* obj) {
-  JavaObjectField::staticTracer(obj);
+extern "C" void nativeJavaObjectFieldTracer(
+    JavaObjectField* obj, uintptr_t closure) {
+  JavaObjectField::staticTracer(obj, closure);
 }
 
-extern "C" void nativeJavaObjectMethodTracer(JavaObjectMethod* obj) {
-  JavaObjectMethod::staticTracer(obj);
+extern "C" void nativeJavaObjectMethodTracer(
+    JavaObjectMethod* obj, uintptr_t closure) {
+  JavaObjectMethod::staticTracer(obj, closure);
 }
 
-extern "C" void nativeJavaObjectConstructorTracer(JavaObjectConstructor* obj) {
-  JavaObjectConstructor::staticTracer(obj);
+extern "C" void nativeJavaObjectConstructorTracer(
+    JavaObjectConstructor* obj, uintptr_t closure) {
+  JavaObjectConstructor::staticTracer(obj, closure);
 }
 
-extern "C" void nativeJavaObjectReferenceTracer(JavaObjectReference* obj) {
-  JavaObjectReference::staticTracer(obj);
+extern "C" void nativeJavaObjectReferenceTracer(
+    JavaObjectReference* obj, uintptr_t closure) {
+  JavaObjectReference::staticTracer(obj, closure);
 }
 
-extern "C" void nativeJavaObjectVMThreadDestructor(JavaObjectVMThread* obj) {
-  JavaObjectVMThread::staticDestructor(obj);
+extern "C" void nativeJavaObjectVMThreadTracer(
+    JavaObjectVMThread* obj, uintptr_t closure) {
+  JavaObjectVMThread::staticTracer(obj, closure);
 }
 
-extern "C" void nativeJavaObjectVMThreadTracer(JavaObjectVMThread* obj) {
-  JavaObjectVMThread::staticTracer(obj);
+extern "C" void nativeJavaObjectVMThreadDestructor(JavaObjectVMThread* obj) {
+  JavaObjectVMThread::staticDestructor(obj);
 }
 
 // Defined in Classpath/ClasspathVMClassLoader.cpp

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Thu May 27 13:07:44 2010
@@ -283,7 +283,7 @@
 
   /// tracer - The tracer of this GC-allocated class.
   ///
-  void tracer();
+  void tracer(uintptr_t closure);
   
   /// inheritName - Does this class in its class hierarchy inherits
   /// the given name? Equality is on the name. This function does not take
@@ -672,7 +672,7 @@
   
   /// tracer - Tracer function of instances of Class.
   ///
-  void tracer();
+  void tracer(uintptr_t closure);
   
   ~Class();
   Class();

Modified: vmkit/trunk/lib/J3/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaThread.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaThread.h Thu May 27 13:07:44 2010
@@ -131,7 +131,7 @@
 
   /// tracer - Traces GC-objects pointed by this thread object.
   ///
-  virtual void tracer();
+  virtual void tracer(uintptr_t closure);
 
   /// JavaThread - Empty constructor, used to get the VT.
   ///

Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.h Thu May 27 13:07:44 2010
@@ -163,7 +163,7 @@
   
   /// tracer - Traces instances of this class.
   ///
-  virtual void tracer();
+  virtual void tracer(uintptr_t closure);
   
   /// dirSeparator - Directory separator for file paths, e.g. '\' for windows,
   /// '/' for Unix.

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Thu May 27 13:07:44 2010
@@ -134,7 +134,7 @@
 
   /// tracer - Traces a JnjvmClassLoader for GC.
   ///
-  virtual void tracer();
+  virtual void tracer(uintptr_t closure);
   
   /// getJnjvmLoaderFromJavaObject - Return the Jnjvm runtime representation
   /// of the given class loader.
@@ -327,7 +327,7 @@
   
   /// tracer - Traces instances of this class.
   ///
-  virtual void tracer();
+  virtual void tracer(uintptr_t closure);
 
   /// libClasspathEnv - The paths for dynamic libraries of Classpath, separated
   /// by ':'.
@@ -456,8 +456,8 @@
 
   /// staticTracer - Trace the internal class loader.
   ///
-  static void staticTracer(VMClassLoader* obj) {
-    if (obj->JCL) obj->JCL->tracer();
+  static void staticTracer(VMClassLoader* obj, uintptr_t closure) {
+    if (obj->JCL) obj->JCL->tracer(closure);
   }
 
   /// ~VMClassLoader - Delete the internal class loader.

Modified: vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp Thu May 27 13:07:44 2010
@@ -59,7 +59,7 @@
 // variables.
 //===----------------------------------------------------------------------===//
 
-extern "C" void EmptyTracer(void*) {}
+extern "C" void EmptyTracer(void*, uintptr_t) {}
 
 //===----------------------------------------------------------------------===//
 // Trace methods for Java objects. There are four types of objects:
@@ -75,23 +75,25 @@
 
 
 /// Method for scanning the root of an object.
-extern "C" void JavaObjectTracer(JavaObject* obj) {
+extern "C" void JavaObjectTracer(JavaObject* obj, uintptr_t closure) {
   CommonClass* cl = obj->getClass();
   assert(cl && "No class");
-  mvm::Collector::markAndTraceRoot(cl->classLoader->getJavaClassLoaderPtr());
+  mvm::Collector::markAndTraceRoot(
+      cl->classLoader->getJavaClassLoaderPtr(), closure);
 }
 
 /// 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) {
+extern "C" void ArrayObjectTracer(ArrayObject* obj, uintptr_t closure) {
   CommonClass* cl = obj->getClass();
   assert(cl && "No class");
-  mvm::Collector::markAndTraceRoot(cl->classLoader->getJavaClassLoaderPtr());
+  mvm::Collector::markAndTraceRoot(
+      cl->classLoader->getJavaClassLoaderPtr(), closure);
   
 
   for (sint32 i = 0; i < obj->size; i++) {
     if (obj->elements[i]) {
-      mvm::Collector::markAndTrace(obj, obj->elements + i);
+      mvm::Collector::markAndTrace(obj, obj->elements + i, closure);
     }
   } 
 }
@@ -99,21 +101,22 @@
 /// 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.
-extern "C" void JavaArrayTracer(JavaArray* obj) {
+extern "C" void JavaArrayTracer(JavaArray* obj, uintptr_t closure) {
 }
 
 /// Method for scanning regular objects.
-extern "C" void RegularObjectTracer(JavaObject* obj) {
+extern "C" void RegularObjectTracer(JavaObject* obj, uintptr_t closure) {
   Class* cl = obj->getClass()->asClass();
   assert(cl && "Not a class in regular tracer");
-  mvm::Collector::markAndTraceRoot(cl->classLoader->getJavaClassLoaderPtr());
+  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.getObjectFieldPtr(obj);
-        mvm::Collector::markAndTrace(obj, ptr);
+        mvm::Collector::markAndTrace(obj, ptr, closure);
       }
     }
     cl = cl->super;
@@ -134,45 +137,47 @@
 //===----------------------------------------------------------------------===//
 
 
-void CommonClass::tracer() {
+void CommonClass::tracer(uintptr_t closure) {
   
   if (super && super->classLoader) {
     JavaObject** Obj = super->classLoader->getJavaClassLoaderPtr();
-    if (*Obj) mvm::Collector::markAndTraceRoot(Obj);
+    if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
   
     for (uint32 i = 0; i < nbInterfaces; ++i) {
       if (interfaces[i]->classLoader) {
         JavaObject** Obj = interfaces[i]->classLoader->getJavaClassLoaderPtr();
-        if (*Obj) mvm::Collector::markAndTraceRoot(Obj);
+        if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
       }
     }
   }
 
   if (classLoader)
-    mvm::Collector::markAndTraceRoot(classLoader->getJavaClassLoaderPtr());
+    mvm::Collector::markAndTraceRoot(
+        classLoader->getJavaClassLoaderPtr(), closure);
 
   for (uint32 i = 0; i < NR_ISOLATES; ++i) {
     // If the delegatee was static allocated, we want to trace its fields.
     if (delegatee[i]) {
-      delegatee[i]->tracer();
-      mvm::Collector::markAndTraceRoot(delegatee + i);
+      delegatee[i]->tracer(closure);
+      mvm::Collector::markAndTraceRoot(delegatee + i, closure);
     }
   }
 }
 
-void Class::tracer() {
-  CommonClass::tracer();
-  if (classLoader != classLoader->bootstrapLoader)
-    mvm::Collector::markAndTraceRoot(&bytes);
+void Class::tracer(uintptr_t closure) {
+  CommonClass::tracer(closure);
+  if (classLoader != classLoader->bootstrapLoader) {
+    mvm::Collector::markAndTraceRoot(&bytes, closure);
+  }
   
-  for (uint32 i =0; i < NR_ISOLATES; ++i) {
+  for (uint32 i = 0; i < NR_ISOLATES; ++i) {
     TaskClassMirror &M = IsolateInfo[i];
     if (M.staticInstance) {
       for (uint32 i = 0; i < nbStaticFields; ++i) {
         JavaField& field = staticFields[i];
         if (field.isReference()) {
           JavaObject** ptr = field.getObjectFieldPtr(M.staticInstance);
-          mvm::Collector::markAndTraceRoot(ptr);
+          mvm::Collector::markAndTraceRoot(ptr, closure);
         }
       }
     }
@@ -196,31 +201,31 @@
 //     referenced by the delegatees.
 //===----------------------------------------------------------------------===//
 
-void JnjvmClassLoader::tracer() {
+void JnjvmClassLoader::tracer(uintptr_t closure) {
   
   for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end();
        i!= e; ++i) {
     CommonClass* cl = i->second;
-    if (cl->isClass()) cl->asClass()->tracer();
-    else cl->tracer();
+    if (cl->isClass()) cl->asClass()->tracer(closure);
+    else cl->tracer(closure);
   }
   
   StringList* end = strings;
   while (end) {
     for (uint32 i = 0; i < end->length; ++i) {
       JavaString** obj = end->strings + i;
-      mvm::Collector::markAndTraceRoot(obj);
+      mvm::Collector::markAndTraceRoot(obj, closure);
     }
     end = end->prev;
   }
 }
 
-void JnjvmBootstrapLoader::tracer() {
+void JnjvmBootstrapLoader::tracer(uintptr_t closure) {
  
-  JnjvmClassLoader::tracer();
+  JnjvmClassLoader::tracer(closure);
 
 #define TRACE_DELEGATEE(prim) \
-  prim->tracer();
+  prim->tracer(closure);
 
   TRACE_DELEGATEE(upcalls->OfVoid);
   TRACE_DELEGATEE(upcalls->OfBool);
@@ -248,19 +253,21 @@
 //===----------------------------------------------------------------------===//
 
 
-void Jnjvm::tracer() {
+void Jnjvm::tracer(uintptr_t closure) {
   
-  VirtualMachine::tracer();
-  bootstrapLoader->tracer();
+  VirtualMachine::tracer(closure);
+  bootstrapLoader->tracer(closure);
   
-  if (appClassLoader) 
-    mvm::Collector::markAndTraceRoot(appClassLoader->getJavaClassLoaderPtr());
+  if (appClassLoader) {
+    mvm::Collector::markAndTraceRoot(
+        appClassLoader->getJavaClassLoaderPtr(), closure);
+  }
   
   JNIGlobalReferences* start = &globalRefs;
   while (start) {
     for (uint32 i = 0; i < start->length; ++i) {
       JavaObject** obj = start->globalReferences + i;
-      mvm::Collector::markAndTraceRoot(obj);
+      mvm::Collector::markAndTraceRoot(obj, closure);
     }
     start = start->next;
   }
@@ -268,30 +275,32 @@
   for (StringMap::iterator i = hashStr.map.begin(), e = hashStr.map.end();
        i!= e; ++i) {
     JavaString** str = &(i->second);
-    mvm::Collector::markAndTraceRoot(str);
+    mvm::Collector::markAndTraceRoot(str, closure);
   }
 
 #if defined(ISOLATE_SHARING)
-  mvm::Collector::markAndTraceRoot(&JnjvmSharedLoader::sharedLoader);
+  mvm::Collector::markAndTraceRoot(&JnjvmSharedLoader::sharedLoader, closure);
 #endif
   
 #ifdef SERVICE
-  parent->tracer();
+  parent->tracer(closure);
 #endif
 }
 
-void JavaThread::tracer() {
-  if (pendingException) mvm::Collector::markAndTraceRoot(&pendingException);
-  mvm::Collector::markAndTraceRoot(&javaThread);
+void JavaThread::tracer(uintptr_t closure) {
+  if (pendingException) {
+    mvm::Collector::markAndTraceRoot(&pendingException, closure);
+  }
+  mvm::Collector::markAndTraceRoot(&javaThread, closure);
 #ifdef SERVICE
-  mvm::Collector::markAndTraceRoot(&ServiceException);
+  mvm::Collector::markAndTraceRoot(&ServiceException, closure);
 #endif
   
   JNILocalReferences* end = localJNIRefs;
   while (end) {
     for (uint32 i = 0; i < end->length; ++i) {
       JavaObject** obj = end->localReferences + i;
-      mvm::Collector::markAndTraceRoot(obj);
+      mvm::Collector::markAndTraceRoot(obj, closure);
     }
     end = end->prev;
   }

Modified: vmkit/trunk/lib/Mvm/Compiler/JIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/JIT.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/JIT.cpp (original)
+++ vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Thu May 27 13:07:44 2010
@@ -453,7 +453,7 @@
   protectEngine.unlock();
 }
 
-void JITMethodInfo::scan(void* TL, void* ip, void* addr) {
+void JITMethodInfo::scan(uintptr_t closure, void* ip, void* addr) {
   if (GCInfo) {
     DEBUG(llvm::errs() << GCInfo->getFunction().getName() << '\n');
     // All safe points have the same informations currently in LLVM.
@@ -464,7 +464,9 @@
          KE = GCInfo->live_end(J); K != KE; ++K) {
       intptr_t obj = *(intptr_t*)(spaddr + K->StackOffset);
       // Verify that obj does not come from a JSR bytecode.
-      if (!(obj & 1)) Collector::scanObject((void**)(spaddr + K->StackOffset));
+      if (!(obj & 1)) {
+        Collector::scanObject((void**)(spaddr + K->StackOffset), closure);
+      }
     }
   }
 }

Modified: vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h Thu May 27 13:07:44 2010
@@ -93,14 +93,14 @@
 
   static int verbose; 
   
-  static bool isLive(void* ptr) {
+  static bool isLive(void* ptr, uintptr_t closure) {
     GCChunkNode *node = o2node(ptr);
     
     if(node && isMarked(node)) return true;
     else return false;
   }
   
-  static void scanObject(void** ptr);
+  static void scanObject(void** ptr, uintptr_t closure);
 
   static void initialise();
   static void destroy();
@@ -294,14 +294,14 @@
 
   static inline void trace(GCChunkNode *node) {
     gcRoot *o = node->chunk();
-    o->tracer();
+    o->tracer(0);
   }
 
-  static inline void markAndTrace(void* source, void *ptr) {
-    markAndTraceRoot(ptr);
+  static inline void markAndTrace(void* source, void *ptr, uintptr_t closure) {
+    markAndTraceRoot(ptr, closure);
   }
   
-  static inline void markAndTraceRoot(void *ptr) {
+  static inline void markAndTraceRoot(void *ptr, uintptr_t closure) {
     void* obj = *(void**)ptr;
     if (obj) {
       GCChunkNode *node = o2node(obj);
@@ -337,25 +337,25 @@
   void setMinMemory(size_t sz){
   }
 
-  static gc* retainForFinalize(gc* val) {
-    markAndTraceRoot(&val);
+  static gc* retainForFinalize(gc* val, uintptr_t closure) {
+    markAndTraceRoot(&val, closure);
     return val;
   }
   
-  static gc* retainReferent(gc* val) {
-    markAndTraceRoot(&val);
+  static gc* retainReferent(gc* val, uintptr_t closure) {
+    markAndTraceRoot(&val, closure);
     return val;
   }
 
-  static gc* getForwardedReference(gc* val) {
+  static gc* getForwardedReference(gc* val, uintptr_t closure) {
     return val;
   }
   
-  static gc* getForwardedReferent(gc* val) {
+  static gc* getForwardedReferent(gc* val, uintptr_t closure) {
     return val;
   }
   
-  static gc* getForwardedFinalizable(gc* val) {
+  static gc* getForwardedFinalizable(gc* val, uintptr_t closure) {
     return val;
   }
 

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gc.cpp Thu May 27 13:07:44 2010
@@ -14,8 +14,8 @@
 using namespace mvm;
 
 
-extern "C" void MarkAndTrace(gc* gc) {
-  Collector::markAndTraceRoot(&gc);
+extern "C" void MarkAndTrace(gc* gc, uintptr_t closure) {
+  Collector::markAndTraceRoot(&gc, closure);
 }
 
 extern "C" void* gcmalloc(size_t sz, VirtualTable* VT) {
@@ -34,7 +34,7 @@
   // This is useless with GCmmap2, as the gcmalloc already did it.
 }
 
-void Collector::scanObject(void** val) {
+void Collector::scanObject(void** val, uintptr_t closure) {
   void* obj = *val;
   if (obj) {
     GCChunkNode *node = o2node(obj);

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp Thu May 27 13:07:44 2010
@@ -53,12 +53,12 @@
   mvm::Thread* tcur = th;
 
   // (1) Trace the VM.
-  th->MyVM->tracer();
+  th->MyVM->tracer(0);
 
   // (2) Trace the threads.
   do {
-    sc->scanStack(tcur);
-    tcur->tracer();
+    sc->scanStack(tcur, 0);
+    tcur->tracer(0);
     tcur = (mvm::Thread*)tcur->next();
   } while (tcur != th);
 
@@ -70,16 +70,16 @@
   cur = cur->prev();
 
   // (4) Trace the weak reference queue.
-  th->MyVM->scanWeakReferencesQueue();
+  th->MyVM->scanWeakReferencesQueue(0);
 
   // (5) Trace the soft reference queue.
-  th->MyVM->scanSoftReferencesQueue();
+  th->MyVM->scanSoftReferencesQueue(0);
   
   // (6) Trace the finalization queue.
-  th->MyVM->scanFinalizationQueue();
+  th->MyVM->scanFinalizationQueue(0);
 
   // (7) Trace the phantom reference queue.
-  th->MyVM->scanPhantomReferencesQueue();
+  th->MyVM->scanPhantomReferencesQueue(0);
 
   // (8) Trace the new objects added by queues.
   for(cur = cur->next(); cur != used_nodes; cur = cur->next())

Modified: vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp (original)
+++ vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp Thu May 27 13:07:44 2010
@@ -67,44 +67,44 @@
   th->realRoutine(_th);
 }
 
-bool Collector::isLive(gc* ptr) {
+bool Collector::isLive(gc* ptr, uintptr_t closure) {
   abort();
   return false;
 }
 
-void Collector::scanObject(void** ptr) {
+void Collector::scanObject(void** ptr, uintptr_t closure) {
   abort();
 }
  
-void Collector::markAndTrace(void* source, void* ptr) {
+void Collector::markAndTrace(void* source, void* ptr, uintptr_t closure) {
   abort();
 }
   
-void Collector::markAndTraceRoot(void* ptr) {
+void Collector::markAndTraceRoot(void* ptr, uintptr_t closure) {
   abort();
 }
 
-gc* Collector::retainForFinalize(gc* val) {
+gc* Collector::retainForFinalize(gc* val, uintptr_t closure) {
   abort();
   return NULL;
 }
   
-gc* Collector::retainReferent(gc* val) {
+gc* Collector::retainReferent(gc* val, uintptr_t closure) {
   abort();
   return NULL;
 }
   
-gc* Collector::getForwardedFinalizable(gc* val) {
+gc* Collector::getForwardedFinalizable(gc* val, uintptr_t closure) {
   abort();
   return NULL;
 }
   
-gc* Collector::getForwardedReference(gc* val) {
+gc* Collector::getForwardedReference(gc* val, uintptr_t closure) {
   abort();
   return NULL;
 }
   
-gc* Collector::getForwardedReferent(gc* val) {
+gc* Collector::getForwardedReferent(gc* val, uintptr_t closure) {
   abort();
   return NULL;
 }

Modified: vmkit/trunk/lib/Mvm/MMTk/MvmGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/MMTk/MvmGC.h?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/MMTk/MvmGC.h (original)
+++ vmkit/trunk/lib/Mvm/MMTk/MvmGC.h Thu May 27 13:07:44 2010
@@ -67,25 +67,15 @@
 public:
   static int verbose;
 
-  static uintptr_t TraceLocal;
-
-  static bool isLive(gc* ptr) __attribute__ ((always_inline));
-  
-  static void scanObject(void** ptr) __attribute__ ((always_inline));
- 
-  static void markAndTrace(void* source, void* ptr) __attribute__ ((always_inline));
-  
-  static void markAndTraceRoot(void* ptr) __attribute__ ((always_inline));
-
-  static gc* retainForFinalize(gc* val) __attribute__ ((always_inline));
-  
-  static gc* retainReferent(gc* val) __attribute__ ((always_inline));
-  
-  static gc* getForwardedFinalizable(gc* val) __attribute__ ((always_inline));
-  
-  static gc* getForwardedReference(gc* val) __attribute__ ((always_inline));
-  
-  static gc* getForwardedReferent(gc* val) __attribute__ ((always_inline));
+  static bool isLive(gc* ptr, uintptr_t closure) __attribute__ ((always_inline)); 
+  static void scanObject(void** ptr, uintptr_t closure) __attribute__ ((always_inline));
+  static void markAndTrace(void* source, void* ptr, uintptr_t closure) __attribute__ ((always_inline));
+  static void markAndTraceRoot(void* ptr, uintptr_t closure) __attribute__ ((always_inline));
+  static gc* retainForFinalize(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+  static gc* retainReferent(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+  static gc* getForwardedFinalizable(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+  static gc* getForwardedReference(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+  static gc* getForwardedReferent(gc* val, uintptr_t closure) __attribute__ ((always_inline));
 
   static void collect();
   

Modified: vmkit/trunk/lib/Mvm/Runtime/MethodInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/MethodInfo.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/MethodInfo.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/MethodInfo.cpp Thu May 27 13:07:44 2010
@@ -23,7 +23,7 @@
 
 using namespace mvm;
 
-void CamlMethodInfo::scan(void* TL, void* ip, void* addr) {
+void CamlMethodInfo::scan(uintptr_t closure, void* ip, void* addr) {
   if (!CF && InstructionPointer) {
     MethodInfo* MI = VirtualMachine::SharedStaticFunctions.IPToMethodInfo(ip);
     if (MI != &DefaultMethodInfo::DM) {
@@ -35,7 +35,7 @@
     //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize + sizeof(void*);
     uintptr_t spaddr = ((uintptr_t*)addr)[0];
     for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-      Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
+      Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]), closure);
     }
   }
 }
@@ -56,7 +56,7 @@
 
 DefaultMethodInfo DefaultMethodInfo::DM;
 
-void DefaultMethodInfo::scan(void* TL, void* ip, void* addr) {
+void DefaultMethodInfo::scan(uintptr_t closure, void* ip, void* addr) {
 }
 
 

Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Thu May 27 13:07:44 2010
@@ -171,13 +171,13 @@
 }
   
 
-void VirtualMachine::scanFinalizationQueue() {
+void VirtualMachine::scanFinalizationQueue(uintptr_t closure) {
   uint32 NewIndex = 0;
   for (uint32 i = 0; i < CurrentIndex; ++i) {
     gc* obj = FinalizationQueue[i];
 
-    if (!Collector::isLive(obj)) {
-      obj = Collector::retainForFinalize(FinalizationQueue[i]);
+    if (!Collector::isLive(obj, closure)) {
+      obj = Collector::retainForFinalize(FinalizationQueue[i], closure);
       
       if (CurrentFinalizedIndex >= ToBeFinalizedLength)
         growToBeFinalizedQueue();
@@ -185,20 +185,22 @@
       /* Add to object table */
       ToBeFinalized[CurrentFinalizedIndex++] = obj;
     } else {
-      FinalizationQueue[NewIndex++] = Collector::getForwardedFinalizable(obj);
+      FinalizationQueue[NewIndex++] =
+        Collector::getForwardedFinalizable(obj, closure);
     }
   }
   CurrentIndex = NewIndex;
 }
 
-void VirtualMachine::tracer() {
+void VirtualMachine::tracer(uintptr_t closure) {
   for (uint32 i = 0; i < CurrentFinalizedIndex; ++i) {
-    Collector::markAndTraceRoot(ToBeFinalized + i);
+    Collector::markAndTraceRoot(ToBeFinalized + i, closure);
   }
 }
 
-gc* ReferenceQueue::processReference(gc* reference, VirtualMachine* vm) {
-  if (!Collector::isLive(reference)) {
+gc* ReferenceQueue::processReference(
+    gc* reference, VirtualMachine* vm, uintptr_t closure) {
+  if (!Collector::isLive(reference, closure)) {
     vm->clearReferent(reference);
     return 0;
   }
@@ -210,15 +212,16 @@
   if (semantics == SOFT) {
     // TODO: are we are out of memory? Consider that we always are for now.
     if (false) {
-      Collector::retainReferent(referent);
+      Collector::retainReferent(referent, closure);
     }
   } else if (semantics == PHANTOM) {
     // Nothing to do.
   }
 
-  if (Collector::isLive(referent)) {
-    gc* newReferent = mvm::Collector::getForwardedReferent(referent);
-    gc* newReference = mvm::Collector::getForwardedReference(reference);
+  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 {
@@ -229,37 +232,37 @@
 }
 
 
-void ReferenceQueue::scan(VirtualMachine* vm) {
+void ReferenceQueue::scan(VirtualMachine* vm, uintptr_t closure) {
   uint32 NewIndex = 0;
 
   for (uint32 i = 0; i < CurrentIndex; ++i) {
     gc* obj = References[i];
-    gc* res = processReference(obj, vm);
+    gc* res = processReference(obj, vm, closure);
     if (res) References[NewIndex++] = res;
   }
 
   CurrentIndex = NewIndex;
 }
 
-void PreciseStackScanner::scanStack(mvm::Thread* th) {
+void PreciseStackScanner::scanStack(mvm::Thread* th, uintptr_t closure) {
   StackWalker Walker(th);
 
   while (MethodInfo* MI = Walker.get()) {
-    MI->scan(0, Walker.ip, Walker.addr);
+    MI->scan(closure, Walker.ip, Walker.addr);
     ++Walker;
   }
 }
 
 
-void UnpreciseStackScanner::scanStack(mvm::Thread* th) {
+void UnpreciseStackScanner::scanStack(mvm::Thread* th, uintptr_t closure) {
   register unsigned int  **max = (unsigned int**)(void*)th->baseSP;
   if (mvm::Thread::get() != th) {
     register unsigned int  **cur = (unsigned int**)th->waitOnSP();
-    for(; cur<max; cur++) Collector::scanObject((void**)cur);
+    for(; cur<max; cur++) Collector::scanObject((void**)cur, closure);
   } else {
     jmp_buf buf;
     setjmp(buf);
     register unsigned int  **cur = (unsigned int**)&buf;
-    for(; cur<max; cur++) Collector::scanObject((void**)cur);
+    for(; cur<max; cur++) Collector::scanObject((void**)cur, closure);
   }
 }

Modified: vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp Thu May 27 13:07:44 2010
@@ -17,7 +17,6 @@
 
 using namespace mvm;
 
-uintptr_t Collector::TraceLocal = 0;
 int Collector::verbose = 0;
 
 extern "C" void* JnJVM_org_mmtk_plan_marksweep_MSMutator_alloc__IIIII(uintptr_t Mutator, int32_t sz, int32_t align, int32_t offset, int32_t allocator, int32_t site) __attribute__((always_inline));
@@ -97,47 +96,40 @@
   JnJVM_org_mmtk_plan_MutatorContext_deinitMutator__(th->MutatorContext);
 }
 
-bool Collector::isLive(gc* ptr) {
-  return JnJVM_org_mmtk_plan_marksweep_MSTraceLocal_isLive__Lorg_vmmagic_unboxed_ObjectReference_2(TraceLocal, ptr);
+bool Collector::isLive(gc* ptr, uintptr_t closure) {
+  return JnJVM_org_mmtk_plan_marksweep_MSTraceLocal_isLive__Lorg_vmmagic_unboxed_ObjectReference_2(closure, ptr);
 }
 
-void Collector::scanObject(void** ptr) {
-  JnJVM_org_mmtk_plan_TraceLocal_reportDelayedRootEdge__Lorg_vmmagic_unboxed_Address_2(TraceLocal, ptr);
+void Collector::scanObject(void** ptr, uintptr_t closure) {
+  JnJVM_org_mmtk_plan_TraceLocal_reportDelayedRootEdge__Lorg_vmmagic_unboxed_Address_2(closure, ptr);
 }
  
-void Collector::markAndTrace(void* source, void* ptr) {
-  assert(TraceLocal && "scanning without a trace local");
-  JnJVM_org_mmtk_plan_TraceLocal_processEdge__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2(TraceLocal, source, ptr);
+void Collector::markAndTrace(void* source, void* ptr, uintptr_t closure) {
+  JnJVM_org_mmtk_plan_TraceLocal_processEdge__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2(closure, source, ptr);
 }
   
-void Collector::markAndTraceRoot(void* ptr) {
-  assert(TraceLocal && "scanning without a trace local");
-  JnJVM_org_mmtk_plan_TraceLocal_processRootEdge__Lorg_vmmagic_unboxed_Address_2Z(TraceLocal, ptr, true);
+void Collector::markAndTraceRoot(void* ptr, uintptr_t closure) {
+  JnJVM_org_mmtk_plan_TraceLocal_processRootEdge__Lorg_vmmagic_unboxed_Address_2Z(closure, ptr, true);
 }
 
-gc* Collector::retainForFinalize(gc* val) {
-  assert(TraceLocal && "scanning without a trace local");
-  return JnJVM_org_mmtk_plan_TraceLocal_retainForFinalize__Lorg_vmmagic_unboxed_ObjectReference_2(TraceLocal, val);
+gc* Collector::retainForFinalize(gc* val, uintptr_t closure) {
+  return JnJVM_org_mmtk_plan_TraceLocal_retainForFinalize__Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
   
-gc* Collector::retainReferent(gc* val) {
-  assert(TraceLocal && "scanning without a trace local");
-  return JnJVM_org_mmtk_plan_TraceLocal_retainReferent__Lorg_vmmagic_unboxed_ObjectReference_2(TraceLocal, val);
+gc* Collector::retainReferent(gc* val, uintptr_t closure) {
+  return JnJVM_org_mmtk_plan_TraceLocal_retainReferent__Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
   
-gc* Collector::getForwardedFinalizable(gc* val) {
-  assert(TraceLocal && "scanning without a trace local");
-  return JnJVM_org_mmtk_plan_TraceLocal_getForwardedFinalizable__Lorg_vmmagic_unboxed_ObjectReference_2(TraceLocal, val);
+gc* Collector::getForwardedFinalizable(gc* val, uintptr_t closure) {
+  return JnJVM_org_mmtk_plan_TraceLocal_getForwardedFinalizable__Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
   
-gc* Collector::getForwardedReference(gc* val) {
-  assert(TraceLocal && "scanning without a trace local");
-  return JnJVM_org_mmtk_plan_TraceLocal_getForwardedReference__Lorg_vmmagic_unboxed_ObjectReference_2(TraceLocal, val);
+gc* Collector::getForwardedReference(gc* val, uintptr_t closure) {
+  return JnJVM_org_mmtk_plan_TraceLocal_getForwardedReference__Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
   
-gc* Collector::getForwardedReferent(gc* val) {
-  assert(TraceLocal && "scanning without a trace local");
-  return JnJVM_org_mmtk_plan_TraceLocal_getForwardedReferent__Lorg_vmmagic_unboxed_ObjectReference_2(TraceLocal, val);
+gc* Collector::getForwardedReferent(gc* val, uintptr_t closure) {
+  return JnJVM_org_mmtk_plan_TraceLocal_getForwardedReferent__Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
 
 void Collector::collect() {

Modified: vmkit/trunk/mmtk/mmtk-j3/FinalizableProcessor.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/FinalizableProcessor.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/FinalizableProcessor.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/FinalizableProcessor.cpp Thu May 27 13:07:44 2010
@@ -26,8 +26,6 @@
 
 extern "C" void
 Java_org_j3_mmtk_FinalizableProcessor_scan__Lorg_mmtk_plan_TraceLocal_2Z (JavaObject* FP, JavaObject* TL, uint8_t nursery) {
-  assert(mvm::Collector::TraceLocal == (uintptr_t)TL && "Mismatch in trace local");
-  
   mvm::Thread* th = mvm::Thread::get();
-  th->MyVM->scanFinalizationQueue();
+  th->MyVM->scanFinalizationQueue(reinterpret_cast<uintptr_t>(TL));
 }

Modified: vmkit/trunk/mmtk/mmtk-j3/ReferenceProcessor.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/ReferenceProcessor.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/ReferenceProcessor.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/ReferenceProcessor.cpp Thu May 27 13:07:44 2010
@@ -22,17 +22,17 @@
 };
 
 extern "C" void Java_org_j3_mmtk_ReferenceProcessor_scan__Lorg_mmtk_plan_TraceLocal_2Z (ReferenceProcessor* RP, JavaObject* TL, uint8_t nursery) {
-  assert(mvm::Collector::TraceLocal == (uintptr_t)TL && "Mismatch in trace local");
-  
   mvm::Thread* th = mvm::Thread::get();
   uint32_t val = RP->ordinal;
 
-  if (val == 0)
-    th->MyVM->scanSoftReferencesQueue();
-  else if (val == 1)
-    th->MyVM->scanWeakReferencesQueue();
-  else if (val == 2)
-    th->MyVM->scanPhantomReferencesQueue();
+  if (val == 0) {
+    th->MyVM->scanSoftReferencesQueue(reinterpret_cast<uintptr_t>(TL));
+  } else if (val == 1) {
+    th->MyVM->scanWeakReferencesQueue(reinterpret_cast<uintptr_t>(TL));
+  } else {
+    assert(val == 2);
+    th->MyVM->scanPhantomReferencesQueue(reinterpret_cast<uintptr_t>(TL));
+  }
 
 }
 

Modified: vmkit/trunk/mmtk/mmtk-j3/Scanning.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/Scanning.cpp?rev=104859&r1=104858&r2=104859&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/Scanning.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/Scanning.cpp Thu May 27 13:07:44 2010
@@ -17,26 +17,24 @@
 extern "C" void Java_org_j3_mmtk_Scanning_computeThreadRoots__Lorg_mmtk_plan_TraceLocal_2 (JavaObject* Scanning, JavaObject* TL) {
   // When entering this function, all threads are waiting on the rendezvous to
   // finish.
-  mvm::Collector::TraceLocal = (uintptr_t)TL;
   mvm::Thread* th = mvm::Thread::get();
   mvm::StackScanner* sc = th->MyVM->getScanner();  
   mvm::Thread* tcur = th;
   
   do {
-    sc->scanStack(tcur);
+    sc->scanStack(tcur, reinterpret_cast<uintptr_t>(TL));
     tcur = (mvm::Thread*)tcur->next();
   } while (tcur != th);
 }
 
 extern "C" void Java_org_j3_mmtk_Scanning_computeGlobalRoots__Lorg_mmtk_plan_TraceLocal_2 (JavaObject* Scanning, JavaObject* TL) { 
-  assert(mvm::Collector::TraceLocal == (uintptr_t)TL && "Mismatch in trace local");
-  mvm::Thread::get()->MyVM->tracer();
+  mvm::Thread::get()->MyVM->tracer(reinterpret_cast<uintptr_t>(TL));
   
 	mvm::Thread* th = mvm::Thread::get();
   mvm::Thread* tcur = th;
   
   do {
-    tcur->tracer();
+    tcur->tracer(reinterpret_cast<uintptr_t>(TL));
     tcur = (mvm::Thread*)tcur->next();
   } while (tcur != th);
 
@@ -53,11 +51,10 @@
 extern "C" void Java_org_j3_mmtk_Scanning_specializedScanObject__ILorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2 (JavaObject* Scanning, uint32_t id, JavaObject* TC, JavaObject* obj) __attribute__ ((always_inline));
 
 extern "C" void Java_org_j3_mmtk_Scanning_specializedScanObject__ILorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2 (JavaObject* Scanning, uint32_t id, JavaObject* TC, JavaObject* obj) {
-  assert(mvm::Collector::TraceLocal == (uintptr_t)TC && "Mismatch in trace local");
   assert(obj && "No object to trace");
   if (obj->getVirtualTable()) {
     assert(obj->getVirtualTable()->tracer && "No tracer in VT");
-    obj->tracer();
+    obj->tracer(reinterpret_cast<uintptr_t>(TC));
   }
 }
 





More information about the vmkit-commits mailing list