[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