[vmkit-commits] [vmkit] r84116 - in /vmkit/trunk/lib/N3: Mono/Mono.cpp Mono/MonoMSCorlib.cpp PNetLib/PNetMSCorlib.cpp VMCore/CLIJit.cpp VMCore/CLIRuntimeJIT.cpp VMCore/VMClass.cpp VMCore/VMObject.cpp VMCore/VMObject.h
Gael Thomas
gael.thomas at lip6.fr
Wed Oct 14 10:12:50 PDT 2009
Author: gthomas
Date: Wed Oct 14 12:12:49 2009
New Revision: 84116
URL: http://llvm.org/viewvc/llvm-project?rev=84116&view=rev
Log:
All access to VMObject are safe (use llvm_gcroot)
Modified:
vmkit/trunk/lib/N3/Mono/Mono.cpp
vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp
vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.cpp
vmkit/trunk/lib/N3/VMCore/VMObject.cpp
vmkit/trunk/lib/N3/VMCore/VMObject.h
Modified: vmkit/trunk/lib/N3/Mono/Mono.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/Mono.cpp?rev=84116&r1=84115&r2=84116&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/Mono/Mono.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/Mono.cpp Wed Oct 14 12:12:49 2009
@@ -119,11 +119,11 @@
extern "C" void System_Threading_Monitor_Monitor_exit(VMObject* obj) {
// TODO: There's a bug in the bootstrap, see why
- if (LockObj::owner(obj->lockObj)) obj->unlock();
+ if (LockObj::owner(obj->lockObj)) VMObject::unlock(obj);
}
extern "C" bool System_Threading_Monitor_Monitor_try_enter(VMObject* obj, int ms) {
- obj->aquire();
+ VMObject::aquire(obj);
return true;
}
@@ -262,7 +262,7 @@
extern "C" VMObject* System_Object_MemberwiseClone(VMObject* obj) {
uint64 size = obj->objectSize();
- VMObject* res = (VMObject*)gc::operator new(size, obj->getVirtualTable());
+ VMObject* res = ((VMClass*)obj->classOf)->doNew();
memcpy(res, obj, size);
res->lockObj = 0;
return res;
Modified: vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp?rev=84116&r1=84115&r2=84116&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Wed Oct 14 12:12:49 2009
@@ -32,8 +32,8 @@
uint64 size = mvm::MvmModule::getTypeSize(type->virtualType->getContainedType(0)) + sizeof(const UTF8*) + sizeof(llvm::GlobalVariable*);
type->virtualInstance =
- (VMObject*)gc::operator new(size, type->virtualInstance->getVirtualTable());
- type->virtualInstance->initialise(type);
+ (VMObject*)gc::operator new(size, VMObject::getN3VirtualTable(type->virtualInstance));
+ VMObject::initialise(type->virtualInstance, type);
}
Modified: vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp?rev=84116&r1=84115&r2=84116&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp Wed Oct 14 12:12:49 2009
@@ -32,8 +32,8 @@
uint64 size = mvm::MvmModule::getTypeSize(type->virtualType->getContainedType(0)) + sizeof(const UTF8*) + sizeof(llvm::GlobalVariable*);
type->virtualInstance =
- (VMObject*)gc::operator new(size, type->virtualInstance->getVirtualTable());
- type->virtualInstance->initialise(type);
+ (VMObject*)gc::operator new(size, VMObject::getN3VirtualTable(type->virtualInstance));
+ VMObject::initialise(type->virtualInstance, type);
}
Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=84116&r1=84115&r2=84116&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Wed Oct 14 12:12:49 2009
@@ -144,7 +144,7 @@
N3VirtualTable* CLIJit::makeArrayVT(VMClassArray* cl) {
VMClass *super = (VMClass*)cl->super;
N3VirtualTable * res =
- new(cl->assembly->allocator, super->vtSize) N3VirtualTable(super->virtualInstance->getN3VirtualTable(), super->vtSize);
+ new(cl->assembly->allocator, super->vtSize) N3VirtualTable(VMObject::getN3VirtualTable(super->virtualInstance), super->vtSize);
#ifdef WITH_TRACER
Function* func = Function::Create(markAndTraceLLVMType,
@@ -254,19 +254,21 @@
N3VirtualTable* CLIJit::makeVT(VMClass* cl, bool stat) {
int n = N3VirtualTable::baseVtSize();
N3VirtualTable * res =
- stat ? new(cl->assembly->allocator, n) N3VirtualTable((uintptr_t)0,
- (uintptr_t)0,
- (uintptr_t)VMObject::_trace,
- (uintptr_t)VMObject::_print,
- (uintptr_t)mvm::Object::default_hashCode) : (
- cl->super ? new(cl->assembly->allocator, cl->vtSize) N3VirtualTable(((VMClass *)cl->super)->virtualInstance->getN3VirtualTable(),
- n,
- cl->vtSize) :
- new(cl->assembly->allocator, cl->vtSize) N3VirtualTable((uintptr_t)0,
- (uintptr_t)0,
- (uintptr_t)VMObject::_trace,
- (uintptr_t)VMObject::_print,
- (uintptr_t)mvm::Object::default_hashCode));
+ stat ?
+ new(cl->assembly->allocator, n) N3VirtualTable((uintptr_t)0,
+ (uintptr_t)0,
+ (uintptr_t)VMObject::_trace,
+ (uintptr_t)VMObject::_print,
+ (uintptr_t)mvm::Object::default_hashCode) :
+ (cl->super ?
+ new(cl->assembly->allocator, cl->vtSize) N3VirtualTable(VMObject::getN3VirtualTable(((VMClass *)cl->super)->virtualInstance),
+ n,
+ cl->vtSize) :
+ new(cl->assembly->allocator, cl->vtSize) N3VirtualTable((uintptr_t)0,
+ (uintptr_t)0,
+ (uintptr_t)VMObject::_trace,
+ (uintptr_t)VMObject::_print,
+ (uintptr_t)mvm::Object::default_hashCode));
#ifdef WITH_TRACER
Modified: vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp?rev=84116&r1=84115&r2=84116&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp Wed Oct 14 12:12:49 2009
@@ -60,7 +60,7 @@
}
extern "C" bool n3InstanceOf(VMObject* obj, VMCommonClass* cl) {
- return obj->instanceOf(cl);
+ return VMObject::instanceOf(obj, cl);
}
extern "C" void* GetCppException() {
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=84116&r1=84115&r2=84116&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Wed Oct 14 12:12:49 2009
@@ -296,7 +296,7 @@
uint64 size = mvm::MvmModule::getTypeSize(cl->staticType->getContainedType(0));
cl->staticInstance = (VMObject*)gc::operator new(size, VT);
- cl->staticInstance->initialise(cl);
+ VMObject::initialise(cl->staticInstance, cl);
for (std::vector<VMField*>::iterator i = cl->staticFields.begin(),
e = cl->staticFields.end(); i!= e; ++i) {
@@ -478,7 +478,7 @@
uint64 size = mvm::MvmModule::getTypeSize(cl->virtualType->getContainedType(0));
cl->virtualInstance = (VMObject*)gc::operator new(size, VT);
- cl->virtualInstance->initialise(cl);
+ VMObject::initialise(cl->virtualInstance, cl);
for (std::vector<VMField*>::iterator i = cl->virtualFields.begin(),
e = cl->virtualFields.end(); i!= e; ++i) {
@@ -643,7 +643,7 @@
if (status < inClinit) resolveType(true, true, NULL);
uint64 size = mvm::MvmModule::getTypeSize(virtualType->getContainedType(0));
VMObject* res = (VMObject*)
- gc::operator new(size, virtualInstance->getVirtualTable());
+ gc::operator new(size, VMObject::getN3VirtualTable(virtualInstance));
memcpy(res, virtualInstance, size);
return res;
}
@@ -654,7 +654,7 @@
VMArray* res = (VMArray*)
gc::operator new(size * nb + sizeof(VMObject) + sizeof(sint32), arrayVT);
memset(res->elements, 0, size * nb);
- res->initialise(this);
+ VMObject::initialise(res, this);
res->size = nb;
return res;
}
Modified: vmkit/trunk/lib/N3/VMCore/VMObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.cpp?rev=84116&r1=84115&r2=84116&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.cpp Wed Oct 14 12:12:49 2009
@@ -130,20 +130,6 @@
return self->lock->selfOwner();
}
-void VMObject::initialise(VMCommonClass* cl) {
- this->classOf = cl;
- this->lockObj = 0;
-}
-
-void VMObject::_print(const VMObject *self, mvm::PrintBuffer* buf) {
- llvm_gcroot(self, 0);
- buf->write("VMObject<");
- self->classOf->print(buf);
- buf->write("@0x");
- buf->writePtr((void*)self->hashCode());
- buf->write(">");
-}
-
static LockObj* myLock(VMObject* obj) {
llvm_gcroot(obj, 0);
verifyNull(obj);
@@ -160,19 +146,37 @@
return lock;
}
-void VMObject::aquire() {
- declare_gcroot(LockObj*, lock) = myLock(this);
+void VMObject::initialise(VMObject* self, VMCommonClass* cl) {
+ llvm_gcroot(self, 0);
+ self->classOf = cl;
+ self->lockObj = 0;
+}
+
+void VMObject::_print(const VMObject *self, mvm::PrintBuffer* buf) {
+ llvm_gcroot(self, 0);
+ buf->write("VMObject<");
+ self->classOf->print(buf);
+ buf->write("@0x");
+ buf->writePtr((void*)self->hashCode());
+ buf->write(">");
+}
+
+void VMObject::aquire(VMObject* self) {
+ llvm_gcroot(self, 0);
+ declare_gcroot(LockObj*, lock) = myLock(self);
LockObj::aquire(lock);
}
-void VMObject::unlock() {
- verifyNull(this);
- declare_gcroot(LockObj*, lock) = myLock(this);
+void VMObject::unlock(VMObject* self) {
+ llvm_gcroot(self, 0);
+ verifyNull(self);
+ declare_gcroot(LockObj*, lock) = myLock(self);
LockObj::release(lock);
}
-void VMObject::waitIntern(struct timeval* info, bool timed) {
- declare_gcroot(LockObj *, l) = myLock(this);
+void VMObject::waitIntern(VMObject* self, struct timeval* info, bool timed) {
+ llvm_gcroot(self, 0);
+ declare_gcroot(LockObj *, l) = myLock(self);
bool owner = LockObj::owner(l);
if (owner) {
@@ -184,7 +188,7 @@
if (thread->interruptFlag != 0) {
mutexThread->unlock();
thread->interruptFlag = 0;
- thread->getVM()->interruptedException(this);
+ thread->getVM()->interruptedException(self);
} else {
unsigned int recur = l->lock->recursionCount();
bool timeout = false;
@@ -210,41 +214,46 @@
if (interrupted) {
thread->interruptFlag = 0;
- thread->getVM()->interruptedException(this);
+ thread->getVM()->interruptedException(self);
}
}
} else {
- VMThread::get()->getVM()->illegalMonitorStateException(this);
+ VMThread::get()->getVM()->illegalMonitorStateException(self);
}
}
-void VMObject::wait() {
- waitIntern(0, false);
+void VMObject::wait(VMObject* self) {
+ llvm_gcroot(self, 0);
+ waitIntern(self, 0, false);
}
-void VMObject::timedWait(struct timeval& info) {
- waitIntern(&info, false);
+void VMObject::timedWait(VMObject* self, struct timeval& info) {
+ llvm_gcroot(self, 0);
+ waitIntern(self, &info, false);
}
-void VMObject::notify() {
- declare_gcroot(LockObj*, l) = myLock(this);
+void VMObject::notify(VMObject* self) {
+ llvm_gcroot(self, 0);
+ declare_gcroot(LockObj*, l) = myLock(self);
if (LockObj::owner(l)) {
LockObj::notify(l);
} else {
- VMThread::get()->getVM()->illegalMonitorStateException(this);
+ VMThread::get()->getVM()->illegalMonitorStateException(self);
}
}
-void VMObject::notifyAll() {
- declare_gcroot(LockObj*, l) = myLock(this);
+void VMObject::notifyAll(VMObject* self) {
+ llvm_gcroot(self, 0);
+ declare_gcroot(LockObj*, l) = myLock(self);
if (LockObj::owner(l)) {
LockObj::notifyAll(l);
} else {
- VMThread::get()->getVM()->illegalMonitorStateException(this);
+ VMThread::get()->getVM()->illegalMonitorStateException(self);
}
}
-bool VMObject::instanceOf(VMCommonClass* cl) {
- if (!this) return false;
- else return this->classOf->isAssignableFrom(cl);
+bool VMObject::instanceOf(VMObject* self, VMCommonClass* cl) {
+ llvm_gcroot(self, 0);
+ if (!self) return false;
+ else return self->classOf->isAssignableFrom(cl);
}
Modified: vmkit/trunk/lib/N3/VMCore/VMObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.h?rev=84116&r1=84115&r2=84116&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.h Wed Oct 14 12:12:49 2009
@@ -70,27 +70,27 @@
VMCommonClass* classOf;
LockObj* lockObj;
- static mvm::Lock* globalLock;
+ static mvm::Lock* globalLock;
static const llvm::Type* llvmType;
static void _print(const VMObject *, mvm::PrintBuffer *);
static void _trace(VMObject *);
- void aquire();
- void unlock();
- void waitIntern(struct timeval *info, bool timed);
- void wait();
- void timedWait(struct timeval &info);
- void notify();
- void notifyAll();
- void initialise(VMCommonClass* cl);
+ static void aquire(VMObject *self);
+ static void unlock(VMObject *self);
+ static void waitIntern(VMObject *self, struct timeval *info, bool timed);
+ static void wait(VMObject *self);
+ static void timedWait(VMObject *self, struct timeval &info);
+ static void notify(VMObject *self);
+ static void notifyAll(VMObject *self);
+ static void initialise(VMObject *self, VMCommonClass* cl);
static llvm::Constant* classOffset();
- bool instanceOf(VMCommonClass* cl);
+ static bool instanceOf(VMObject *self, VMCommonClass* cl);
- N3VirtualTable *getN3VirtualTable() { return (N3VirtualTable*)getVirtualTable(); }
+ static N3VirtualTable *getN3VirtualTable(VMObject *self) { llvm_gcroot(self, 0); return *((N3VirtualTable**)self); }
#ifdef SIGSEGV_THROW_NULL
#define verifyNull(obj) {}
More information about the vmkit-commits
mailing list