[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