[vmkit-commits] [vmkit] r70154 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaInitialise.cpp JavaObject.cpp JavaObject.h JnjvmClassLoader.cpp JnjvmClassLoader.h VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Apr 26 13:17:09 PDT 2009


Author: geoffray
Date: Sun Apr 26 15:17:09 2009
New Revision: 70154

URL: http://llvm.org/viewvc/llvm-project?rev=70154&view=rev
Log:
Control the VTs of native GC objects, namely VMClassLoader and LockObj.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Sun Apr 26 15:17:09 2009
@@ -23,32 +23,8 @@
 using namespace jnjvm;
 
 
-static void initialiseVT() {
-
-# define INIT(X) { \
-  X fake; \
-  X::VT = ((VirtualTable**)(void*)(&fake))[0]; }
-
-  INIT(LockObj);
-  INIT(VMClassLoader);
-
-  LockObj::VT->destructor = 0;
-  LockObj::VT->operatorDelete = 0;
-  VMClassLoader::VT->operatorDelete = VMClassLoader::VT->destructor;
-#ifdef ISOLATE_SHARING
-  INIT(JnjvmSharedLoader);
-  INIT(SharedClassByteMap);
-  INIT(UserClass);
-  INIT(UserClassArray);
-  INIT(UserConstantPool);
-#endif
-#undef INIT
-
-}
-
 #ifdef ISOLATE_SHARING
 JnjvmClassLoader* mvm::VirtualMachine::initialiseJVM(JavaCompiler* Comp) {
-  initialiseVT();
   JnjvmSharedLoader::sharedLoader = JnjvmSharedLoader::createSharedLoader(Comp);
   return JnjvmSharedLoader::sharedLoader;
 }
@@ -65,7 +41,6 @@
   
 JnjvmClassLoader*
 mvm::VirtualMachine::initialiseJVM(JavaCompiler* Comp, bool dlLoad) {
-  initialiseVT();
   mvm::BumpPtrAllocator* A = new mvm::BumpPtrAllocator();
   return new(*A) JnjvmBootstrapLoader(*A, Comp, dlLoad);
 }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Sun Apr 26 15:17:09 2009
@@ -70,7 +70,12 @@
 #ifdef USE_GC_BOEHM
   LockObj* res = new LockObj();
 #else
-  LockObj* res = gc_new(LockObj)();
+  LockObj* res = new(&VT) LockObj();
+  // Set the virtual table to change what C++ did: by using the new operator
+  // C++ after the allocation will set its own VT. Since we want to call
+  // the C++ constructor (because it initializes the native data structures
+  // such as LockRecursive), we have to change the VT of this object.
+  res->setVirtualTable(&VT);
 #endif
   return res;
 }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Sun Apr 26 15:17:09 2009
@@ -107,7 +107,7 @@
 
   /// VT - LockObj is GC-allocated, so we must make the VT explicit.
   ///
-  static VirtualTable* VT;
+  static VirtualTable VT;
 
   ~LockObj() {}
   LockObj() {}

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Apr 26 15:17:09 2009
@@ -777,7 +777,7 @@
     if (!vmdata) {
       mvm::BumpPtrAllocator* A = new mvm::BumpPtrAllocator();    
       JCL = new(*A) JnjvmClassLoader(*A, *vm->bootstrapLoader, loader, vm);
-      vmdata = gc_new(VMClassLoader)(JCL);
+      vmdata = VMClassLoader::allocate(JCL);
       (upcalls->vmdataClassLoader->setObjectField(loader, (JavaObject*)vmdata));
     }
     loader->release();

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Sun Apr 26 15:17:09 2009
@@ -399,24 +399,30 @@
 
 public:
 
+  static VMClassLoader* allocate(JnjvmClassLoader* J) {
+    VMClassLoader* res = 
+      (VMClassLoader*)gc::operator new(sizeof(VMClassLoader), &VT);
+    res->JCL = J;
+    return res;
+  }
+
   /// VT - The VirtualTable for this GC-class.
-  static VirtualTable* VT;
+  static VirtualTable VT;
 
   /// TRACER - Trace the internal class loader.
-  virtual void TRACER {
-    JCL->CALL_TRACER;
+  static void STATIC_TRACER(VMClassLoader) {
+    obj->JCL->CALL_TRACER;
   }
 
   /// ~VMClassLoader - Delete the internal class loader.
   ///
-  ~VMClassLoader() {
-    if (JCL) JCL->~JnjvmClassLoader();
+  static void staticDestructor(VMClassLoader* obj) {
+    if (obj->JCL) obj->JCL->~JnjvmClassLoader();
   }
 
   /// VMClassLoader - Default constructors.
   ///
   VMClassLoader(JnjvmClassLoader* J) : JCL(J) {}
-  VMClassLoader() : JCL(0) {}
 
   /// getClassLoader - Get the internal class loader.
   ///

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Sun Apr 26 15:17:09 2009
@@ -57,12 +57,11 @@
 // Classpath with the vmdata field).
 //===----------------------------------------------------------------------===//
 
-#define INIT(X) VirtualTable* X::VT = 0
+VirtualTable VMClassLoader::VT((uintptr_t)VMClassLoader::staticDestructor,
+                               (uintptr_t)VMClassLoader::staticDestructor,
+                               (uintptr_t)VMClassLoader::staticTracer);
 
-  INIT(LockObj);
-  INIT(VMClassLoader);
-
-#undef INIT
+VirtualTable LockObj::VT(0, 0, (uintptr_t)VirtualTable::emptyTracer);
 
 //===----------------------------------------------------------------------===//
 // Empty tracer for static tracers of classes that do not declare static





More information about the vmkit-commits mailing list