[vmkit-commits] [vmkit] r84332 - in /vmkit/trunk/lib/N3: Mono/Mono.cpp Mono/MonoMSCorlib.cpp Mono/MonoString.cpp PNetLib/PNetLib.cpp PNetLib/PNetMSCorlib.cpp PNetLib/PNetString.cpp VMCore/Assembly.cpp VMCore/CLIJitMeta.cpp VMCore/CLIRuntimeJIT.cpp VMCore/N3.cpp VMCore/Opcodes.cpp VMCore/VMClass.cpp VMCore/VMClass.h VMCore/VirtualTables.cpp

Gael Thomas gael.thomas at lip6.fr
Sat Oct 17 06:54:20 PDT 2009


Author: gthomas
Date: Sat Oct 17 08:54:19 2009
New Revision: 84332

URL: http://llvm.org/viewvc/llvm-project?rev=84332&view=rev
Log:
All objects of VMCore are now marked with gcroot


Modified:
    vmkit/trunk/lib/N3/Mono/Mono.cpp
    vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
    vmkit/trunk/lib/N3/Mono/MonoString.cpp
    vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp
    vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp
    vmkit/trunk/lib/N3/PNetLib/PNetString.cpp
    vmkit/trunk/lib/N3/VMCore/Assembly.cpp
    vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp
    vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp
    vmkit/trunk/lib/N3/VMCore/N3.cpp
    vmkit/trunk/lib/N3/VMCore/Opcodes.cpp
    vmkit/trunk/lib/N3/VMCore/VMClass.cpp
    vmkit/trunk/lib/N3/VMCore/VMClass.h
    vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp

Modified: vmkit/trunk/lib/N3/Mono/Mono.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/Mono.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/Mono/Mono.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/Mono.cpp Sat Oct 17 08:54:19 2009
@@ -112,7 +112,9 @@
 	
 	if (want_name && *int_code_page == -1) {
 		N3 *vm = (N3*)VMThread::get()->getVM();
-		return (MonoString*)(vm->arrayToString(vm->asciizToArray(cset)));
+		declare_gcroot(ArrayChar*, array_res) = vm->asciizToArray(cset);
+		declare_gcroot(MonoString*, res) = (MonoString*)(vm->arrayToString(array_res));
+		return res;
 	} else
 		return NULL;
 }
@@ -160,10 +162,13 @@
 {
 	N3 *vm = (N3*)VMThread::get()->getVM();
 #if defined (PLATFORM_WIN32)
-	return (MonoString*)(vm->arrayToString(vm->asciizToArray("\r\n")));
+	declare_gcroot(ArrayChar*, array) = vm->asciizToArray("\r\n");
 #else
-	return (MonoString*)(vm->arrayToString(vm->asciizToArray("\n")));
+	declare_gcroot(ArrayChar*, array) = vm->asciizToArray("\n");
 #endif
+
+	declare_gcroot(MonoString*, res) = (MonoString*)vm->arrayToString(array);
+	return res;
 }
 
 extern "C" void
@@ -262,7 +267,7 @@
 
 extern "C" VMObject* System_Object_MemberwiseClone(VMObject* obj) {
   uint64 size = obj->objectSize();
-  VMObject* res = ((VMClass*)obj->classOf)->doNew();
+  declare_gcroot(VMObject*, res) = ((VMClass*)obj->classOf)->doNew();
   memcpy(res, obj, size);
   res->lockObj = 0;
   return res;
@@ -282,7 +287,7 @@
 extern "C" void
 System_String__ctor(MonoString* str, ArrayChar* array, sint32 startIndex, sint32 count) {
   N3* vm = VMThread::get()->getVM();
-  const ArrayChar* value = vm->bufToArray(&(array->elements[startIndex]), count);
+  declare_gcroot(const ArrayChar*, value) = vm->bufToArray(&(array->elements[startIndex]), count);
   str->length = count;
   str->startChar = array->elements[startIndex];
   str->value = value;
@@ -334,14 +339,15 @@
 	}
   
   N3* vm = (N3*)VMThread::get()->getVM();
-  const ArrayChar* array = vm->bufToArray(dest, length);
-	return (MonoString*)vm->arrayToString(array);
+  declare_gcroot(const ArrayChar*, array) = vm->bufToArray(dest, length);
+	declare_gcroot(MonoString*, res) = (MonoString*)vm->arrayToString(array);
+	return res;
 }
 
 extern "C" MonoString *
 System_String_InternalAllocateStr (sint32 length)
 {
-  MonoString* str = (MonoString*)(MSCorlib::pString->doNew());
+  declare_gcroot(MonoString*, str) = (MonoString*)MSCorlib::pString->doNew();
   str->length = length;
   return str;
 }

Modified: vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Sat Oct 17 08:54:19 2009
@@ -150,7 +150,7 @@
 VMObject* VMCommonClass::getClassDelegatee() {
 	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
   if (!delegatee) {
-    ooo_delegatee = delegatee = (*MSCorlib::clrType)();
+    ooo_delegatee = delegatee = MSCorlib::clrType->doNew();
     MSCorlib::typeClrType->setIntPtr(delegatee, (int*)this);
   }
   return delegatee;
@@ -169,6 +169,6 @@
                                         vm->asciizToUTF8("Thread"),
                                         vm->asciizToUTF8("System.Threading"),
                                         true, true, true, true);
-  declare_gcroot(VMObject*, appThread) = (*cl)();
+  declare_gcroot(VMObject*, appThread) = cl->doNew();
   VMThread::get()->ooo_appThread = appThread;
 }

Modified: vmkit/trunk/lib/N3/Mono/MonoString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoString.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoString.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoString.cpp Sat Oct 17 08:54:19 2009
@@ -26,7 +26,7 @@
 
 
 CLIString* CLIString::stringDup(const ArrayChar*& array, N3* vm) {
-  MonoString* obj = (MonoString*)(*MSCorlib::pString)();
+  declare_gcroot(MonoString*, obj) = (MonoString*)MSCorlib::pString->doNew();
   obj->length = array->size;
   if (array->size == 0) {
     obj->startChar = 0;
@@ -38,7 +38,8 @@
 }
 
 const ArrayChar* CLIString::strToArray(N3* vm) const {
-  return ((MonoString *)this)->value;
+	declare_gcroot(const ArrayChar*, res) = ((MonoString *)this)->value;
+  return res;
 }
 
 GlobalVariable* CLIString::llvmVar() {

Modified: vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp Sat Oct 17 08:54:19 2009
@@ -164,14 +164,16 @@
 extern "C" VMObject* System_Globalization_CultureInfo_InternalCultureName() {
   char* val = ILGetCultureName();
   N3* vm = (N3*)(VMThread::get()->getVM());
+	declare_gcroot(ArrayChar*, array) = 0;
+
   if (val) {
-    VMObject* ret = vm->arrayToString(vm->asciizToArray(val));
+    array = vm->asciizToArray(val);
     free(val);
-    return ret;
   } else {
-    VMObject* ret = vm->arrayToString(vm->asciizToArray("iv"));
-    return ret;
+    array = vm->asciizToArray("iv");
   }
+	declare_gcroot(VMObject*, res) = vm->arrayToString(array);
+	return res;
 }
 
 static const ArrayChar* newBuilder(N3* vm, PNetString* value, uint32 length) {
@@ -191,19 +193,22 @@
     }
   }
 
-  return vm->bufToArray(buf, strLength);
+	declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, strLength);
+  return array_res;
 }
 
 extern "C" VMObject* System_String_NewBuilder(PNetString* value, 
                                                uint32 length) {
   N3* vm = (N3*)(VMThread::get()->getVM());
-  PNetString* str = (PNetString*)vm->arrayToString(newBuilder(vm, value, length));
+  declare_gcroot(PNetString*, str) = (PNetString*)vm->arrayToString(newBuilder(vm, value, length));
   return str;
 }
 
 extern "C" VMObject* Platform_SysCharInfo_GetNewLine() {
   N3* vm = (N3*)(VMThread::get()->getVM());
-  return vm->arrayToString(vm->asciizToArray("\n"));
+	declare_gcroot(ArrayChar*, array) = vm->asciizToArray("\n");
+  declare_gcroot(VMObject*, res) = vm->arrayToString(array);
+	return res;
 }
 
 extern "C" void System_String_CopyToChecked(PNetString* str, sint32 sstart, 
@@ -258,14 +263,14 @@
 }
 
 extern "C" PNetString* System_String_NewString(uint32 size) {
-  PNetString* str = (PNetString*)(MSCorlib::pString->doNew());
+  declare_gcroot(PNetString*, str) = (PNetString*)MSCorlib::pString->doNew();
   str->length = size;
   return str;
 }
 
 extern "C" void System_String_Copy_3(PNetString* dest, sint32 pos, 
                                      PNetString* src) {
-  ArrayChar* arr = (ArrayChar*)MSCorlib::arrayChar->doNew(pos + src->value->size);
+  declare_gcroot(ArrayChar*, arr) = (ArrayChar*)MSCorlib::arrayChar->doNew(pos + src->value->size);
   
   for (sint32 i = 0; i < pos; ++i) {
     arr->elements[i] = dest->value->elements[i];
@@ -303,7 +308,8 @@
 		else
 			dest->length = top;
 
-		dest->value  = VMThread::get()->getVM()->bufToArray(buf, dest->length);
+		declare_gcroot(ArrayChar*, array) = VMThread::get()->getVM()->bufToArray(buf, dest->length);
+		dest->value  = array;
 	}
 	//		printf("---> %s\n", mvm::PrintBuffer(VMThread::get()->getVM()->arrayToUTF8(dest->value)).cString());
 }
@@ -379,7 +385,8 @@
   }
 
   buf[index] = value;
-  PNetString* str = (PNetString*)vm->arrayToString(vm->bufToArray(buf, length));
+	declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, length);
+  declare_gcroot(PNetString*, str) = (PNetString*)vm->arrayToString(array_res);
   obj->buildString = str;
   
   return obj;
@@ -411,7 +418,8 @@
                (buildLength - index) * sizeof(uint16));
   }
 
-  PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, length));
+	declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, length);
+  declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
   obj->buildString = val;
 
   return obj;
@@ -429,7 +437,8 @@
   memcpy(buf, array->elements, length * sizeof(uint16));
 
   buf[length] = value;
-  PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, length + 1));
+	declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, length + 1);
+	declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
   obj->buildString = val;
   return obj;
 }
@@ -450,7 +459,8 @@
   memcpy(buf, buildArray->elements, buildLength * sizeof(uint16));
   memcpy(&(buf[buildLength]), strArray->elements, strLength * sizeof(uint16));
 
-  PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, length));
+	declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, length);
+  declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
   obj->buildString = val;
   return obj;
 }
@@ -530,7 +540,8 @@
   memcpy(buf, a1->elements, len1 * sizeof(uint16));
   memcpy(&(buf[len1]), a2->elements, len2 * sizeof(uint16));
   
-  PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, len1 + len2));
+	declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, len1 + len2);
+  declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
   
   return val;
 }
@@ -549,7 +560,8 @@
   memcpy(&(buf[len1]), a2->elements, len2 * sizeof(uint16));
   memcpy(&(buf[len1 + len2]), a3->elements, len3 * sizeof(uint16));
   
-  PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, len1 + len2 + len3));
+	declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, len1 + len2 + len3);
+  declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
   
   return val;
 }
@@ -578,13 +590,13 @@
     memcpy(&(buf[j]), &(array->elements[index + length]), (strLength - (index + length)) * sizeof(uint16));
   }
 
-  const ArrayChar* res = VMThread::get()->getVM()->bufToArray(buf, j);
+  declare_gcroot(const ArrayChar*, res) = VMThread::get()->getVM()->bufToArray(buf, j);
   str->value = res;
   str->length = j;
 }
 
 extern "C" void System_String__ctor_3(PNetString* str, uint16 ch, sint32 count) {
-  ArrayChar* array = (ArrayChar*)MSCorlib::arrayChar->doNew(count);
+  declare_gcroot(ArrayChar*, array) = (ArrayChar*)MSCorlib::arrayChar->doNew(count);
   for (sint32 i = 0; i < count; ++i) {
     array->elements[i] = ch;
   }
@@ -778,12 +790,12 @@
   
   llvm::GenericValue gv;
   try{
-    gv = (*meth)(gvargs);
+    gv = meth->compileToNative()->invokeGeneric(gvargs);
   }catch(...) {
     assert(0);
   }
   
-  VMObject* res = 0;
+  declare_gcroot(VMObject*, res) = 0;
   VMCommonClass* retType = meth->parameters[0];
 
 #define CONSTRUCT_RES(name, type, gv_extractor)										\
@@ -793,7 +805,7 @@
 	}
 
   if (retType == MSCorlib::pVoid) {
-    res = (*MSCorlib::pVoid)();
+    res = MSCorlib::pVoid->doNew();
   } ON_PRIMITIVES(CONSTRUCT_RES, _F_NTE) else {
     if (retType->super == MSCorlib::pValue || retType->super == MSCorlib::pEnum)
       VMThread::get()->getVM()->error("implement me");
@@ -839,8 +851,8 @@
   length = reader->readU4();
   if (length > (sectionLen - 4)) return 0;
 
-  VMObject* res = (*MSCorlib::resourceStreamType)();
-  (*MSCorlib::ctorResourceStreamType)(res, ass, (uint64)start, (uint64)length);
+  declare_gcroot(VMObject*, res) = MSCorlib::resourceStreamType->doNew();
+  MSCorlib::ctorResourceStreamType->compileToNative()->invokeVoid(res, ass, (uint64)start, (uint64)length);
 
   return res;
 }
@@ -890,8 +902,9 @@
 
   memcpy(buf, array->elements, length * sizeof(uint16));
   ILUnicodeStringToLower((void*)buf, (void*)array->elements, length);
-  const ArrayChar* res = vm->bufToArray(buf, length);
-  return ((N3*)vm)->arrayToString(res);
+  declare_gcroot(const ArrayChar*, res) = vm->bufToArray(buf, length);
+  declare_gcroot(VMObject*, res_str) = vm->arrayToString(res);
+	return res_str;
 }
 
 extern "C" VMObject* System_String_Replace(PNetString* str, uint16 c1, uint16 c2) {
@@ -906,8 +919,9 @@
   }
   
   N3* vm = (N3*)VMThread::get()->getVM();
-  const ArrayChar* res = vm->bufToArray(buf, length);
-  return vm->arrayToString(res);
+  declare_gcroot(const ArrayChar*, res) = vm->bufToArray(buf, length);
+  declare_gcroot(VMObject*, res_str) = vm->arrayToString(res);
+	return res_str;
 }
 
 extern "C" uint32 System_Reflection_ClrResourceStream_ResourceRead(Assembly* assembly, uint64 position, ArrayUInt8* buffer, uint32 offset, uint32 count) {
@@ -966,7 +980,7 @@
   }
   
   N3* vm = VMThread::get()->getVM();
-  const ArrayChar* val = vm->bufToArray(buf, length);
+  declare_gcroot(const ArrayChar*, val) = vm->bufToArray(buf, length);
   str->value = val;
   str->length = length;
 }

Modified: vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp Sat Oct 17 08:54:19 2009
@@ -132,20 +132,26 @@
 }
 
 VMObject* Property::getPropertyDelegatee() {
+	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
+
   if (!delegatee) {
-    delegatee = (*MSCorlib::propertyType)();
-    (*MSCorlib::ctorPropertyType)(delegatee);
+    ooo_delegatee = delegatee = MSCorlib::propertyType->doNew();
+    MSCorlib::ctorPropertyType->compileToNative()->invokeVoid(delegatee);
     MSCorlib::propertyPropertyType->setIntPtr(delegatee, (int*)this);
   }
+
   return delegatee;
 }
 
 VMObject* VMMethod::getMethodDelegatee() {
+	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
+
   if (!delegatee) {
-    delegatee = (*MSCorlib::methodType)();
-    (*MSCorlib::ctorMethodType)(delegatee);
+    ooo_delegatee = delegatee = MSCorlib::methodType->doNew();
+    MSCorlib::ctorMethodType->compileToNative()->invokeVoid(delegatee);
     MSCorlib::methodMethodType->setIntPtr(delegatee, (int*)this);
   }
+
   return delegatee;
 }
 
@@ -153,10 +159,11 @@
 	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
 
   if (!delegatee) {
-    ooo_delegatee = delegatee = (*MSCorlib::clrType)();
-    (*MSCorlib::ctorClrType)(delegatee);
+    ooo_delegatee = delegatee = MSCorlib::clrType->doNew();
+    MSCorlib::ctorClrType->compileToNative()->invokeVoid(delegatee);
     MSCorlib::typeClrType->setIntPtr(delegatee, (int*)this);
   }
+
   return delegatee;
 }
 
@@ -164,10 +171,11 @@
 	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
 
   if (!delegatee) {
-    ooo_delegatee = delegatee = (*MSCorlib::assemblyReflection)();
-    (*MSCorlib::ctorAssemblyReflection)(delegatee);
+    ooo_delegatee = delegatee = MSCorlib::assemblyReflection->doNew();
+    MSCorlib::ctorAssemblyReflection->compileToNative()->invokeVoid(delegatee);
     MSCorlib::assemblyAssemblyReflection->setIntPtr(delegatee, (int*)this);
   }
+
   return delegatee;
 }
 
@@ -176,15 +184,16 @@
                                         vm->asciizToUTF8("Thread"),
                                         vm->asciizToUTF8("System.Threading"),
                                         true, true, true, true);
-	declare_gcroot(VMObject*, appThread) = (*cl)();
+	declare_gcroot(VMObject*, appThread) = cl->doNew();
+
   std::vector<VMCommonClass*> args;
   args.push_back(MSCorlib::pVoid);
   args.push_back(cl);
   args.push_back(MSCorlib::pIntPtr);
-  VMMethod* meth = cl->lookupMethod(vm->asciizToUTF8(".ctor"), args, 
+  VMMethod* ctor = cl->lookupMethod(vm->asciizToUTF8(".ctor"), args, 
                                     false, false);
   VMThread* myth = VMThread::get();
-  (*meth)(appThread, myth);
+  ctor->compileToNative()->invokeVoid(appThread, myth);
   myth->ooo_appThread = appThread;
 }
 

Modified: vmkit/trunk/lib/N3/PNetLib/PNetString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetString.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetString.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetString.cpp Sat Oct 17 08:54:19 2009
@@ -25,7 +25,7 @@
 
 
 CLIString* CLIString::stringDup(const ArrayChar*& array, N3* vm) {
-  PNetString* obj = (PNetString*)(*MSCorlib::pString)();
+  declare_gcroot(PNetString*, obj) = (PNetString*)MSCorlib::pString->doNew();
   obj->capacity = array->size;
   obj->length = array->size;
   if (array->size == 0) {
@@ -38,7 +38,8 @@
 }
 
 const ArrayChar* CLIString::strToArray(N3* vm) const {
-  return ((PNetString*)this)->value;
+  declare_gcroot(const ArrayChar*, res) = ((PNetString*)this)->value;
+	return res;
 }
 
 GlobalVariable* CLIString::llvmVar() {

Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sat Oct 17 08:54:19 2009
@@ -705,7 +705,8 @@
 
 const ArrayChar* Assembly::readUTF16(N3* vm, uint32 len, 
                                 Reader* reader) {
-  return readUTF16(vm, len, reader->bytes, reader->cursor);
+	declare_gcroot(const ArrayChar*, res) = readUTF16(vm, len, reader->bytes, reader->cursor);
+  return res;
 }
 
 const ArrayChar* Assembly::readUTF16(N3* vm, uint32 len, 
@@ -718,7 +719,8 @@
     buf[i] = cur;
     ++i;
   }
-	return vm->bufToArray(buf, realLen); 
+	declare_gcroot(ArrayChar*, res) = vm->bufToArray(buf, realLen); 
+	return res;
 }
 
 const UTF8* Assembly::readUTF8(N3* vm, uint32 len, Reader* reader) {
@@ -1289,7 +1291,7 @@
     if (cl == cons->classDef) {
       uint32 blobOffset = CLIHeader->blobStream->realOffset;
       std::vector<llvm::GenericValue> args;
-      VMObject* obj = (*cons->classDef)();
+      declare_gcroot(VMObject*, obj) = cons->classDef->doNew();
       args.push_back(llvm::GenericValue(obj));
       readCustomAttributes(blobOffset + attrArray[CONSTANT_CUSTOM_ATTRIBUTE_VALUE], args, cons);
 
@@ -1298,7 +1300,7 @@
     }
   }
 
-  ArrayObject* res = (ArrayObject*)MSCorlib::arrayObject->doNew(vec.size());
+  declare_gcroot(ArrayObject*, res) = (ArrayObject*)MSCorlib::arrayObject->doNew(vec.size());
   for (uint32 i = 0; i < vec.size(); ++i)
     res->elements[i] = vec[i];
   
@@ -1897,7 +1899,8 @@
     }
   }
 
-  return readUTF16((N3*)(VMThread::get()->getVM()), size, bytes, offset);
+	declare_gcroot(const ArrayChar*, res) = readUTF16((N3*)(VMThread::get()->getVM()), size, bytes, offset);
+  return res;
 }
 
 uint32 Assembly::getRVAFromField(uint32 token) {

Modified: vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp Sat Oct 17 08:54:19 2009
@@ -27,12 +27,6 @@
 using namespace n3;
 using namespace llvm;
 
-VMObject* VMClass::operator()() {
-  if (status < ready) 
-    resolveType(true, true, NULL);
-  return doNew();
-}
-
 // TODO: MUST CHECK the type!
 //		if (llvm::isa<check>(signature->naturalType)) {									 
 //		if (signature->naturalType == Type::getFloatTy(getGlobalContext())) {
@@ -66,13 +60,13 @@
 #undef IMPLEMENTS_VMFIELD_ASSESSORS
 
 GenericValue VMMethod::invokeGeneric(std::vector<llvm::GenericValue>& args) {																		
-	assert(code);																												
+	// at this step, we must not launch the gc because objects arguments are somewhere in the stack a copying collector
+	// can not know where they are
+	assert(code);									// compiling a method can trigger a gc
 	return mvm::MvmModule::executionEngine->runFunction(methPtr, args);
 }
 
 GenericValue VMMethod::invokeGeneric(va_list ap) {																		
-	assert(code);																												
-	
 	Function* func = methPtr;																						
 	std::vector<GenericValue> args;																			
 	for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end();	
@@ -111,6 +105,13 @@
 	return invokeGeneric(args);
 }
 
+GenericValue VMMethod::invokeGeneric(...) {
+	va_list ap;
+	va_start(ap, this);
+	GenericValue res = invokeGeneric(ap);
+	va_end(ap);
+	return res;
+}
 
 #define DEFINE_INVOKE(name, type, extractor)														\
 	type VMMethod::invoke##name(...) {																		\
@@ -138,124 +139,124 @@
 #undef DEFINE_INVOKE_VOID
 
 
-// mettre en param un Function *
-// materializeFunction avant
-GenericValue VMMethod::operator()(va_list ap) {
+// // mettre en param un Function *
+// // materializeFunction avant
+// GenericValue VMMethod::operator()(va_list ap) {
   
-  if (classDef->status < ready) 
-    classDef->resolveType(true, true, NULL);
+//   if (classDef->status < ready) 
+//     classDef->resolveType(true, true, NULL);
   
-  Function* func = compiledPtr(NULL);
+//   Function* func = compiledPtr(NULL);
   
-  std::vector<GenericValue> args;
-  for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end();
-       i != e; ++i) {
-    const Type* type = i->getType();
-    if (type == Type::getInt8Ty(getGlobalContext())) {
-      GenericValue gv;
-      gv.IntVal = APInt(8, va_arg(ap, int));
-      args.push_back(gv);
-    } else if (type == Type::getInt16Ty(getGlobalContext())) {
-      GenericValue gv;
-      gv.IntVal = APInt(16, va_arg(ap, int));
-      args.push_back(gv);
-    } else if (type == Type::getInt32Ty(getGlobalContext())) {
-      GenericValue gv;
-      gv.IntVal = APInt(32, va_arg(ap, int));
-      args.push_back(gv);
-    } else if (type == Type::getInt64Ty(getGlobalContext())) {
-      GenericValue gv1;
-      gv1.IntVal = APInt(64, va_arg(ap, uint64));
-      args.push_back(gv1);
-    } else if (type == Type::getDoubleTy(getGlobalContext())) { 
-      GenericValue gv1;
-      gv1.DoubleVal = va_arg(ap, double);
-      args.push_back(gv1);
-    } else if (type == Type::getFloatTy(getGlobalContext())) {
-      GenericValue gv;
-      gv.FloatVal = (float)(va_arg(ap, double));
-      args.push_back(gv);
-    } else {
-      GenericValue gv(va_arg(ap, VMObject*));
-      args.push_back(gv);
-    }
-  }
+//   std::vector<GenericValue> args;
+//   for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end();
+//        i != e; ++i) {
+//     const Type* type = i->getType();
+//     if (type == Type::getInt8Ty(getGlobalContext())) {
+//       GenericValue gv;
+//       gv.IntVal = APInt(8, va_arg(ap, int));
+//       args.push_back(gv);
+//     } else if (type == Type::getInt16Ty(getGlobalContext())) {
+//       GenericValue gv;
+//       gv.IntVal = APInt(16, va_arg(ap, int));
+//       args.push_back(gv);
+//     } else if (type == Type::getInt32Ty(getGlobalContext())) {
+//       GenericValue gv;
+//       gv.IntVal = APInt(32, va_arg(ap, int));
+//       args.push_back(gv);
+//     } else if (type == Type::getInt64Ty(getGlobalContext())) {
+//       GenericValue gv1;
+//       gv1.IntVal = APInt(64, va_arg(ap, uint64));
+//       args.push_back(gv1);
+//     } else if (type == Type::getDoubleTy(getGlobalContext())) { 
+//       GenericValue gv1;
+//       gv1.DoubleVal = va_arg(ap, double);
+//       args.push_back(gv1);
+//     } else if (type == Type::getFloatTy(getGlobalContext())) {
+//       GenericValue gv;
+//       gv.FloatVal = (float)(va_arg(ap, double));
+//       args.push_back(gv);
+//     } else {
+//       GenericValue gv(va_arg(ap, VMObject*));
+//       args.push_back(gv);
+//     }
+//   }
   
-  return mvm::MvmModule::executionEngine->runFunction(func, args);
-}
+//   return mvm::MvmModule::executionEngine->runFunction(func, args);
+// }
 
-GenericValue VMMethod::operator()(VMObject* obj, va_list ap) {
+// GenericValue VMMethod::operator()(VMObject* obj, va_list ap) {
   
-  if (classDef->status < ready) 
-    classDef->resolveType(true, true, NULL);
+//   if (classDef->status < ready) 
+//     classDef->resolveType(true, true, NULL);
   
-  Function* func = compiledPtr(NULL);
+//   Function* func = compiledPtr(NULL);
   
-  std::vector<GenericValue> args;
-  GenericValue object(obj);
-  args.push_back(object);
-
-  for (Function::arg_iterator i = ++(func->arg_begin()), e = func->arg_end();
-       i != e; ++i) {
-    const Type* type = i->getType();
-    if (type == Type::getInt8Ty(getGlobalContext())) {
-      GenericValue gv;
-      gv.IntVal = APInt(8, va_arg(ap, int));
-      args.push_back(gv);
-    } else if (type == Type::getInt16Ty(getGlobalContext())) {
-      GenericValue gv;
-      gv.IntVal = APInt(16, va_arg(ap, int));
-      args.push_back(gv);
-    } else if (type == Type::getInt32Ty(getGlobalContext())) {
-      GenericValue gv;
-      gv.IntVal = APInt(32, va_arg(ap, int));
-      args.push_back(gv);
-    } else if (type == Type::getInt64Ty(getGlobalContext())) {
-      GenericValue gv1;
-      gv1.IntVal = APInt(64, va_arg(ap, uint64));
-      args.push_back(gv1);
-    } else if (type == Type::getDoubleTy(getGlobalContext())) { 
-      GenericValue gv1;
-      gv1.DoubleVal = va_arg(ap, double);
-      args.push_back(gv1);
-    } else if (type == Type::getFloatTy(getGlobalContext())) {
-      GenericValue gv;
-      gv.FloatVal = (float)(va_arg(ap, double));
-      args.push_back(gv);
-    } else {
-      GenericValue gv(va_arg(ap, VMObject*));
-      args.push_back(gv);
-    }
-  }
+//   std::vector<GenericValue> args;
+//   GenericValue object(obj);
+//   args.push_back(object);
+
+//   for (Function::arg_iterator i = ++(func->arg_begin()), e = func->arg_end();
+//        i != e; ++i) {
+//     const Type* type = i->getType();
+//     if (type == Type::getInt8Ty(getGlobalContext())) {
+//       GenericValue gv;
+//       gv.IntVal = APInt(8, va_arg(ap, int));
+//       args.push_back(gv);
+//     } else if (type == Type::getInt16Ty(getGlobalContext())) {
+//       GenericValue gv;
+//       gv.IntVal = APInt(16, va_arg(ap, int));
+//       args.push_back(gv);
+//     } else if (type == Type::getInt32Ty(getGlobalContext())) {
+//       GenericValue gv;
+//       gv.IntVal = APInt(32, va_arg(ap, int));
+//       args.push_back(gv);
+//     } else if (type == Type::getInt64Ty(getGlobalContext())) {
+//       GenericValue gv1;
+//       gv1.IntVal = APInt(64, va_arg(ap, uint64));
+//       args.push_back(gv1);
+//     } else if (type == Type::getDoubleTy(getGlobalContext())) { 
+//       GenericValue gv1;
+//       gv1.DoubleVal = va_arg(ap, double);
+//       args.push_back(gv1);
+//     } else if (type == Type::getFloatTy(getGlobalContext())) {
+//       GenericValue gv;
+//       gv.FloatVal = (float)(va_arg(ap, double));
+//       args.push_back(gv);
+//     } else {
+//       GenericValue gv(va_arg(ap, VMObject*));
+//       args.push_back(gv);
+//     }
+//   }
       
-  return mvm::MvmModule::executionEngine->runFunction(func, args);
-}
+//   return mvm::MvmModule::executionEngine->runFunction(func, args);
+// }
 
 
-GenericValue VMMethod::operator()(...) {
-  va_list ap;
-  va_start(ap, this);
-  GenericValue ret = (*this)(ap);
-  va_end(ap);
-  return  ret;
-}
+// GenericValue VMMethod::operator()(...) {
+//   va_list ap;
+//   va_start(ap, this);
+//   GenericValue ret = (*this)(ap);
+//   va_end(ap);
+//   return  ret;
+// }
+
+// GenericValue VMMethod::run(...) {
+//   va_list ap;
+//   va_start(ap, this);
+//   GenericValue ret = (*this)(ap);
+//   va_end(ap);
+//   return  ret;
+// }
 
-GenericValue VMMethod::run(...) {
-  va_list ap;
-  va_start(ap, this);
-  GenericValue ret = (*this)(ap);
-  va_end(ap);
-  return  ret;
-}
-
-GenericValue VMMethod::operator()(std::vector<GenericValue>& args) {
+// GenericValue VMMethod::operator()(std::vector<GenericValue>& args) {
   
-  if (classDef->status < ready) 
-    classDef->resolveType(true, true, NULL);
+//   if (classDef->status < ready) 
+//     classDef->resolveType(true, true, NULL);
   
-  Function* func = compiledPtr(NULL);
-  return mvm::MvmModule::executionEngine->runFunction(func, args);
-}
+//   Function* func = compiledPtr(NULL);
+//   return mvm::MvmModule::executionEngine->runFunction(func, args);
+// }
 
 GlobalVariable* VMCommonClass::llvmVar() {
   if (!_llvmVar) {

Modified: vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp Sat Oct 17 08:54:19 2009
@@ -29,6 +29,8 @@
 #include "VMThread.h"
 #include "Assembly.h"
 
+#include "mvm/GC/GC.h"
+
 #include <cstdarg>
 
 using namespace n3;
@@ -56,7 +58,8 @@
 
 extern "C" VMObject* newString(const ArrayChar* utf8) {
 	N3 *vm = (N3*)VMThread::get()->getVM();
-  return vm->arrayToString(utf8);
+  declare_gcroot(VMObject*, res) = vm->arrayToString(utf8);
+	return res;
 }
 
 extern "C" bool n3InstanceOf(VMObject* obj, VMCommonClass* cl) {
@@ -89,7 +92,7 @@
   sint32 n = buf[0];
   if (n < 0) VMThread::get()->getVM()->negativeArraySizeException(n);
   
-  VMArray* res = (VMArray*)cl->doNew(n);
+  declare_gcroot(VMArray*, res) = (VMArray*)cl->doNew(n);
   if (dim > 1) {
     VMCommonClass* base = cl->baseClass;
     if (n > 0) {
@@ -182,9 +185,11 @@
 }
 
 extern "C" VMObject* newObject(VMClass* cl) {
-  return cl->doNew();
+	declare_gcroot(VMObject*, res) = cl->doNew();
+  return res;
 }
 
 extern "C" VMObject* newArray(VMClassArray* cl, sint32 nb) {
-  return cl->doNew(nb);
+	declare_gcroot(VMObject*, res) = cl->doNew(nb);
+  return res;
 }

Modified: vmkit/trunk/lib/N3/VMCore/N3.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/N3.cpp Sat Oct 17 08:54:19 2009
@@ -291,7 +291,7 @@
       uint32 typeToken = assembly->getTypeDefTokenFromMethod(entryPoint);
       assembly->loadType(this, typeToken, true, true, true ,true, NULL, NULL);
       VMMethod* mainMeth = assembly->lookupMethodFromToken(entryPoint);
-      (*mainMeth)(args);
+      mainMeth->compileToNative()->invokeGeneric(args);
     }
   }
 }
@@ -319,9 +319,11 @@
   MSCorlib::loadBootstrap(vm);
   
   ClArgumentsInfo& info = vm->argumentsInfo;  
-  ArrayObject* args = (ArrayObject*)MSCorlib::arrayString->doNew(info.argc-2);
+  declare_gcroot(ArrayObject*, args) = (ArrayObject*)MSCorlib::arrayString->doNew(info.argc-2);
   for (int i = 2; i < info.argc; ++i) {
-    args->elements[i - 2] = (VMObject*)vm->arrayToString(vm->asciizToArray(info.argv[i]));
+		declare_gcroot(ArrayChar*, arg_array) = vm->asciizToArray(info.argv[i]);
+		declare_gcroot(VMObject*, arg) = vm->arrayToString(arg_array);
+    args->elements[i - 2] = arg;
   }
   
   try{
@@ -342,20 +344,21 @@
 
 ArrayChar* N3::asciizToArray(const char* asciiz) {
 	uint32 len = strlen(asciiz);
-	ArrayChar *res = (ArrayChar*)MSCorlib::arrayChar->doNew(len);
+	declare_gcroot(ArrayChar*, res) = (ArrayChar*)MSCorlib::arrayChar->doNew(len);
 	for(uint32 i=0; i<len; i++)
 		res->elements[i] = asciiz[i];
 	return res;
 }
 
 ArrayChar* N3::bufToArray(const uint16* buf, uint32 size) {
-	ArrayChar *res = (ArrayChar*)MSCorlib::arrayChar->doNew(size);
+	declare_gcroot(ArrayChar*, res) = (ArrayChar*)MSCorlib::arrayChar->doNew(size);
 	memcpy(res->elements, buf, size<<1);
 	return res;
 }
 
 ArrayChar* N3::UTF8ToArray(const UTF8 *utf8) {
-  return bufToArray(utf8->elements, utf8->size);
+	declare_gcroot(ArrayChar*, res) = bufToArray(utf8->elements, utf8->size);
+  return res;
 }
 
 const UTF8* N3::asciizToUTF8(const char* asciiz) {
@@ -371,7 +374,8 @@
 }
 
 CLIString *N3::arrayToString(const ArrayChar *array) {
-  return (CLIString*)CLIString::stringDup(array, this);
+  declare_gcroot(CLIString*, res) = (CLIString*)CLIString::stringDup(array, this);
+	return res;
 }
 
 #include "MSCorlib.inc"

Modified: vmkit/trunk/lib/N3/VMCore/Opcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Opcodes.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Opcodes.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Opcodes.cpp Sat Oct 17 08:54:19 2009
@@ -1573,7 +1573,8 @@
       case LDSTR : {
         uint32 value = readU4(bytecodes, i);
         uint32 index = value & 0xfffffff;
-        const ArrayChar* array = compilingClass->assembly->readUserString(index);
+				// must modify this opcode
+        declare_gcroot(const ArrayChar*, array) = compilingClass->assembly->readUserString(index);
         Value* val = ConstantExpr::getIntToPtr(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), (int64_t)array),
                                                module->ptrType);
         Value* res = CallInst::Create(newStringLLVM, val, "", currentBlock);

Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Sat Oct 17 08:54:19 2009
@@ -642,8 +642,7 @@
 VMObject* VMClass::doNew() {
   if (status < inClinit) resolveType(true, true, NULL);
   uint64 size = mvm::MvmModule::getTypeSize(virtualType->getContainedType(0));
-  VMObject* res = (VMObject*)
-    gc::operator new(size, VMObject::getN3VirtualTable(virtualInstance));
+  declare_gcroot(VMObject*, res) = (VMObject*)gc::operator new(size, VMObject::getN3VirtualTable(virtualInstance));
   memcpy(res, virtualInstance, size);
   return res;
 }
@@ -651,8 +650,7 @@
 VMObject* VMClassArray::doNew(uint32 nb) {
   if (status < inClinit) resolveType(true, true, NULL);
   uint64 size = mvm::MvmModule::getTypeSize(baseClass->naturalType);
-  VMArray* res = (VMArray*)
-    gc::operator new(size * nb + sizeof(VMObject) + sizeof(sint32), arrayVT);
+  declare_gcroot(VMArray*, res) = (VMArray*)gc::operator new(size * nb + sizeof(VMObject) + sizeof(sint32), arrayVT);
   memset(res->elements, 0, size * nb);
 	VMObject::initialise(res, this);
   res->size = nb;

Modified: vmkit/trunk/lib/N3/VMCore/VMClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.h?rev=84332&r1=84331&r2=84332&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.h Sat Oct 17 08:54:19 2009
@@ -151,7 +151,6 @@
   std::vector<VMMethod*> genericMethods;
 	uint32 vtSize; // in number of methods
   
-  VMObject* operator()();
   VMObject* doNew();
   VMObject* initialiseObject(VMObject*);
 
@@ -211,7 +210,7 @@
   uint32 implFlags;
   uint32 token;
 
-  VMObject* delegatee;
+  VMObject* ooo_delegatee;
   VMObject* getMethodDelegatee();
   std::vector<Param*, gc_allocator<Param*> > params;
   std::vector<Enveloppe*, gc_allocator<Enveloppe*> > caches;
@@ -231,6 +230,7 @@
 
 	llvm::GenericValue invokeGeneric(std::vector<llvm::GenericValue>& args);
 	llvm::GenericValue invokeGeneric(va_list ap);
+	llvm::GenericValue invokeGeneric(...);
 
 #define DEFINE_CALLER(name, type) \
   type invoke##name(...);
@@ -307,7 +307,7 @@
   const llvm::FunctionType* getSignature(VMGenericMethod* genMethod);
   bool virt;
   const UTF8* name;
-  VMObject* delegatee;
+  VMObject* ooo_delegatee;
   uint32 flags;
   VMObject* getPropertyDelegatee();
 };

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp Sat Oct 17 08:54:19 2009
@@ -92,7 +92,7 @@
 }
 
 void VMMethod::TRACER {
-  delegatee->MARK_AND_TRACE;
+  ooo_delegatee->MARK_AND_TRACE;
 }
 
 void VMGenericMethod::TRACER {
@@ -100,7 +100,7 @@
 }
 
 void Property::TRACER {
-  delegatee->MARK_AND_TRACE;
+  ooo_delegatee->MARK_AND_TRACE;
 }
 
 // useless (never called or used) but it simplifies the definition of LockedMap





More information about the vmkit-commits mailing list