[llvm-commits] [vmkit] r52324 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JnjvmModule.cpp JnjvmModule.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Jun 16 07:10:19 PDT 2008


Author: geoffray
Date: Mon Jun 16 09:10:19 2008
New Revision: 52324

URL: http://llvm.org/viewvc/llvm-project?rev=52324&view=rev
Log:
When a class is unloaded, remove it from the jnjvm module.
Also, add a couple of asserts.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Mon Jun 16 09:10:19 2008
@@ -82,6 +82,7 @@
 
 void CommonClass::destroyer(size_t sz) {
   free(display);
+  isolate->TheModule->removeClass(this);
 }
 
 void Class::destroyer(size_t sz) {
@@ -290,7 +291,7 @@
     buf->write("static ");
   else
     buf->write("virtual ");
-  ((JavaMethod*)this)->getSignature()->tPrintBuf(buf);
+  ((JavaField*)this)->getSignature()->tPrintBuf(buf);
   buf->write(" ");
   classDef->print(buf);
   buf->write("::");

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jun 16 09:10:19 2008
@@ -15,6 +15,7 @@
 #include "mvm/JIT.h"
 
 #include "JavaJIT.h"
+#include "JavaThread.h"
 #include "JavaTypes.h"
 #include "Jnjvm.h"
 #include "JnjvmModule.h"
@@ -177,8 +178,12 @@
   if (meths == cl->virtualMethods.end()) {
     uint64 size = cl->virtualTableSize;
     VirtualTable* VT = (VirtualTable*)malloc(size * sizeof(void*));
+    if (!VT) JavaThread::get()->isolate->outOfMemoryError(size * sizeof(void*));
     if (cl->super) {
       Class* super = (Class*)cl->super;
+      assert(cl->virtualTableSize >= cl->super->virtualTableSize &&
+        "Super VT bigger than own VT");
+      assert(super->virtualVT && "Super does not have a VT!");
       memcpy(VT, super->virtualVT, cl->super->virtualTableSize * sizeof(void*));
     } else {
       memcpy(VT, JavaObject::VT, VT_SIZE);
@@ -827,6 +832,38 @@
   LCI->getStaticType();
 }
 
+void JnjvmModule::removeClass(CommonClass* cl) {
+  // Lock here because we may be called by a finalizer
+  // (even if currently single threaded).
+  llvm::MutexGuard locked(mvm::jit::executionEngine->lock);
+  classMap.erase(cl);
+
+  for (CommonClass::field_iterator i = cl->virtualFields.begin(),
+       e = cl->virtualFields.end(); i!= e; ++i) {
+    JavaField* field = i->second;
+    fieldMap.erase(field);
+  }
+  
+  for (CommonClass::field_iterator i = cl->staticFields.begin(),
+       e = cl->staticFields.end(); i!= e; ++i) {
+    JavaField* field = i->second;
+    fieldMap.erase(field);
+  }
+  
+  for (CommonClass::method_iterator i = cl->virtualMethods.begin(),
+       e = cl->virtualMethods.end(); i!= e; ++i) {
+    JavaMethod* meth = i->second;
+    methodMap.erase(meth);
+  }
+  
+  for (CommonClass::method_iterator i = cl->staticMethods.begin(),
+       e = cl->staticMethods.end(); i!= e; ++i) {
+    JavaMethod* meth = i->second;
+    methodMap.erase(meth);
+  }
+  
+}
+
 LLVMCommonClassInfo* JnjvmModule::getClassInfo(CommonClass* cl) {
   class_iterator CI = classMap.find(cl);
   if (CI != classMap.end()) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Mon Jun 16 09:10:19 2008
@@ -376,6 +376,8 @@
 #ifdef SERVICE_VM
   LLVMServiceInfo* getServiceInfo(ServiceDomain*);
 #endif
+  
+  void removeClass(CommonClass*);
 
   explicit JnjvmModule(const std::string &ModuleID);
   void initialise();





More information about the llvm-commits mailing list