[vmkit-commits] [vmkit] r57351 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaInitialise.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h LockedMap.h VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Oct 10 08:40:35 PDT 2008


Author: geoffray
Date: Fri Oct 10 10:40:35 2008
New Revision: 57351

URL: http://llvm.org/viewvc/llvm-project?rev=57351&view=rev
Log:
Make ClassMap non-GC allocated. Classes still need to be GC-allocated
because they may be referenced by things external to the class loader.


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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Oct 10 10:40:35 2008
@@ -90,8 +90,7 @@
 
 
 CommonClass::~CommonClass() {
-  free(display);
-  free(virtualVT);
+  delete display;
   delete lockVar;
   delete condVar;
 }
@@ -107,6 +106,8 @@
   ctpInfo = 0;
   staticVT = 0;
   JInfo = 0;
+  outerClass = 0;
+  innerOuterResolved = false;
 }
 
 Class::~Class() {
@@ -142,6 +143,11 @@
   
   delete ctpInfo;
   free(staticVT);
+
+  // Currently, only regular classes have a heap allocated virtualVT.
+  // Array classes have a C++ allocated virtualVT and primitive classes
+  // do not have a virtualVT.
+  free(virtualVT);
 }
 
 JavaField::~JavaField() {
@@ -257,6 +263,7 @@
 CommonClass::CommonClass(JnjvmClassLoader* loader, const UTF8* n,
                          bool isArray) {
   name = n;
+  this->virtualVT = 0;
   this->lockVar = mvm::Lock::allocRecursive();
   this->condVar = mvm::Cond::allocCond();
   this->status = loaded;
@@ -272,7 +279,7 @@
                                uint32 nb) : 
   CommonClass(loader, n, false) {
  
-  display = (CommonClass**)malloc(sizeof(CommonClass*));
+  display = new CommonClass*[1];
   display[0] = this;
   primitive = true;
   status = ready;
@@ -286,6 +293,9 @@
   super = 0;
   ctpInfo = 0;
   JInfo = 0;
+  outerClass = 0;
+  innerOuterResolved = false;
+  display = 0;
 #if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
   _staticInstance = 0;
 #endif
@@ -298,7 +308,7 @@
   super = ClassArray::SuperArray;
   interfaces = ClassArray::InterfacesArray;
   depth = 1;
-  display = (CommonClass**)malloc(2 * sizeof(CommonClass*));
+  display = new CommonClass*[2];
   display[0] = ClassArray::SuperArray;
   display[1] = this;
   access = ACC_FINAL | ACC_ABSTRACT | ACC_PUBLIC;
@@ -670,12 +680,12 @@
   const UTF8* superUTF8 = getSuperUTF8();
   if (superUTF8 == 0) {
     depth = 0;
-    display = (UserCommonClass**)malloc(sizeof(UserCommonClass*));
+    display = new UserCommonClass*[1];
     display[0] = this;
   } else {
     super = classLoader->loadName(superUTF8, true, true);
     depth = super->depth + 1;
-    display = (UserCommonClass**)malloc((depth + 1) * sizeof(UserCommonClass*));
+    display = new UserCommonClass*[depth + 1];
     memcpy(display, super->display, depth * sizeof(UserCommonClass*));
     display[depth] = this;
   }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Fri Oct 10 10:40:35 2008
@@ -118,8 +118,9 @@
 };
 
 /// CommonClass - This class is the root class of all Java classes. It is
-/// currently GC-allocated in JnJVM, but will be permanently allocated when the
-/// class loader finalizer method will be defined.
+/// GC-allocated because CommonClasses have to be traceable. A java/lang/Class
+/// object that stays in memory has a reference to the class. Same for
+/// super or interfaces.
 ///
 class CommonClass : public mvm::Object {
 #ifdef ISOLATE_SHARING

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Fri Oct 10 10:40:35 2008
@@ -50,7 +50,6 @@
   INIT(ClassArray);
   INIT(JavaThread);
   INIT(Jnjvm);
-  INIT(ClassMap);
   INIT(JnjvmBootstrapLoader);
   INIT(JnjvmClassLoader);
 #ifdef ISOLATE_SHARING

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Oct 10 10:40:35 2008
@@ -47,7 +47,7 @@
   JCL->allocator = new JavaAllocator();
   
   JCL->hashUTF8 = new UTF8Map(JCL->allocator, 0);
-  JCL->classes = allocator_new(allocator, ClassMap)();
+  JCL->classes = new ClassMap();
   JCL->javaTypes = new TypeMap(); 
   JCL->javaSignatures = new SignMap(); 
   
@@ -77,7 +77,7 @@
   allocator = &(isolate->allocator);
 
   hashUTF8 = new UTF8Map(allocator, bootstrapLoader->upcalls->ArrayOfChar);
-  classes = allocator_new(allocator, ClassMap)();
+  classes = new ClassMap();
   javaTypes = new TypeMap();
   javaSignatures = new SignMap();
 
@@ -388,6 +388,7 @@
 }
 
 JnjvmClassLoader::~JnjvmClassLoader() {
+  delete classes;
   delete hashUTF8;
   delete javaTypes;
   delete javaSignatures;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Oct 10 10:40:35 2008
@@ -204,6 +204,7 @@
     TheModule = 0;
     TheModuleProvider = 0;
     isolate = 0;
+    classes = 0;
   }
 
 #ifdef ISOLATE_SHARING

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Fri Oct 10 10:40:35 2008
@@ -40,7 +40,7 @@
 };
 
 template<class Key, class Container, class Compare, class Meta>
-class LockedMap : public mvm::Object {
+class LockedMap {
 public:
   typedef typename std::map<const Key, Container, Compare>::iterator iterator;
   typedef Container (*funcCreate)(Key& V, Meta meta);
@@ -130,7 +130,6 @@
 class ClassMap : 
     public LockedMap<const UTF8*, UserCommonClass*, ltutf8, JnjvmClassLoader* > {
 public:
-  static VirtualTable* VT;
   
   ClassMap() {
     lock = mvm::Lock::allocNormal();
@@ -140,7 +139,6 @@
     delete lock;
   }
   
-  virtual void TRACER;
 };
 
 class StringMap {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Fri Oct 10 10:40:35 2008
@@ -37,7 +37,6 @@
   INIT(JavaObject);
   INIT(JavaThread);
   INIT(Jnjvm);
-  INIT(ClassMap);
   INIT(JnjvmBootstrapLoader);
   INIT(JnjvmClassLoader);
 #if defined(ISOLATE_SHARING)
@@ -68,6 +67,8 @@
     (*i)->MARK_AND_TRACE; }}
 
 void CommonClass::TRACER {
+  super->MARK_AND_TRACE;
+  TRACE_VECTOR(Class*, gc_allocator, interfaces);
   classLoader->MARK_AND_TRACE;
 #if !defined(ISOLATE)
   delegatee->MARK_AND_TRACE;
@@ -76,6 +77,8 @@
 
 void Class::TRACER {
   CommonClass::CALL_TRACER;
+  TRACE_VECTOR(Class*, gc_allocator, innerClasses);
+  outerClass->MARK_AND_TRACE;
   bytes->MARK_AND_TRACE;
 #if !defined(ISOLATE)
   _staticInstance->MARK_AND_TRACE;
@@ -116,20 +119,21 @@
 #endif
 }
 
-void ClassMap::TRACER {
-  for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
+static void traceClassMap(ClassMap* classes) {
+  for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end();
+       i!= e; ++i) {
     i->second->MARK_AND_TRACE;
   }
 }
 
 void JnjvmClassLoader::TRACER {
   javaLoader->MARK_AND_TRACE;
-  classes->MARK_AND_TRACE;
+  traceClassMap(classes);
   isolate->MARK_AND_TRACE;
 }
 
 void JnjvmBootstrapLoader::TRACER {
-  classes->MARK_AND_TRACE;
+  traceClassMap(classes);
   
   for (std::vector<ZipArchive*>::iterator i = bootArchives.begin(),
        e = bootArchives.end(); i != e; ++i) {





More information about the vmkit-commits mailing list