[vmkit-commits] [vmkit] r84333 - in /vmkit/trunk/lib/N3: Mono/Mono.cpp Mono/MonoMSCorlib.cpp Mono/MonoString.cpp PNetLib/PNetLib.cpp PNetLib/PNetString.cpp VMCore/CLIString.h

Gael Thomas gael.thomas at lip6.fr
Sat Oct 17 07:37:47 PDT 2009


Author: gthomas
Date: Sat Oct 17 09:37:44 2009
New Revision: 84333

URL: http://llvm.org/viewvc/llvm-project?rev=84333&view=rev
Log:
Add llvm_gcroot for all managed objects. I hope that everything is ok :)


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/PNetString.cpp
    vmkit/trunk/lib/N3/VMCore/CLIString.h

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

==============================================================================
--- vmkit/trunk/lib/N3/Mono/Mono.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/Mono.cpp Sat Oct 17 09:37:44 2009
@@ -121,10 +121,12 @@
 
 extern "C" void System_Threading_Monitor_Monitor_exit(VMObject* obj) {
   // TODO: There's a bug in the bootstrap, see why
+	llvm_gcroot(obj, 0);
   if (LockObj::owner(obj->lockObj)) VMObject::unlock(obj);
 }
 
 extern "C" bool System_Threading_Monitor_Monitor_try_enter(VMObject* obj, int ms) {
+	llvm_gcroot(obj, 0);
 	VMObject::aquire(obj);
   return true;
 }
@@ -173,15 +175,19 @@
 
 extern "C" void
 System_String_InternalCopyTo(MonoString* str, sint32 sindex, VMArray* dest, sint32 destIndex, sint32 count) {
-  const ArrayChar* contents = str->value;
+	llvm_gcroot(str, 0);
+	llvm_gcroot(dest, 0);
+  declare_gcroot(const ArrayChar*, contents) = str->value;
   memcpy(&dest->elements[destIndex], &contents->elements[sindex], count * sizeof(uint16));
 }
 
 extern "C" uint16 System_String_get_Chars(MonoString* str, sint32 offset) {
+	llvm_gcroot(str, 0);
   return str->value->elements[offset];
 }
 
 static sint32 byteLength(VMArray* array) {
+	llvm_gcroot(array, 0);
   VMClassArray* cl = (VMClassArray*)array->classOf;
   VMCommonClass* base = cl->baseClass;
   uint32 size = base->naturalType->getPrimitiveSizeInBits() / 8;  
@@ -189,6 +195,8 @@
 }
 
 extern "C" bool System_Buffer_BlockCopyInternal (VMArray* src, int src_offset, VMArray* dest, int dest_offset, int count) {
+	llvm_gcroot(src, 0);
+	llvm_gcroot(dest, 0);
   uint8 *src_buf, *dest_buf;
 
 	/* watch out for integer overflow */
@@ -208,6 +216,7 @@
 }
 
 extern "C" sint32 System_Buffer_ByteLengthInternal(VMArray* array) {
+	llvm_gcroot(array, 0);
   return byteLength(array);
 }
 
@@ -216,6 +225,7 @@
 				  sint32 src_offset, sint32 count,
 				  sint32 *error)
 {
+	llvm_gcroot(src, 0);
   char* buffer = (char*)alloca( 1024);//(count + 8) * sizeof(uint16));
 	uint32 n = 0;
 
@@ -256,16 +266,19 @@
 extern "C" VMObject*
 System_Threading_Thread_GetCachedCurrentCulture (VMObject *obj)
 {
+	llvm_gcroot(obj, 0);
 	return 0;
 }
 
 extern "C" VMObject*
 System_Threading_Thread_GetSerializedCurrentCulture (VMObject *obj)
 {
+	llvm_gcroot(obj, 0);
 	return 0;
 }
 
 extern "C" VMObject* System_Object_MemberwiseClone(VMObject* obj) {
+	llvm_gcroot(obj, 0);
   uint64 size = obj->objectSize();
   declare_gcroot(VMObject*, res) = ((VMClass*)obj->classOf)->doNew();
   memcpy(res, obj, size);
@@ -276,16 +289,21 @@
 extern "C" bool
 System_Globalization_CultureInfo_construct_internal_locale_from_current_locale (VMObject *ci)
 {
+	llvm_gcroot(ci, 0);
 	return false;
 }
 
 extern "C" void
 System_Threading_Thread_SetCachedCurrentCulture (VMObject* thread, VMObject *culture)
 {
+	llvm_gcroot(thread, 0);
+	llvm_gcroot(culture, 0);
 }
 
 extern "C" void
 System_String__ctor(MonoString* str, ArrayChar* array, sint32 startIndex, sint32 count) {
+	llvm_gcroot(str, 0);
+	llvm_gcroot(array, 0);
   N3* vm = VMThread::get()->getVM();
   declare_gcroot(const ArrayChar*, value) = vm->bufToArray(&(array->elements[startIndex]), count);
   str->length = count;
@@ -296,7 +314,9 @@
 extern "C" MonoString * 
 System_String_InternalJoin (MonoString *separator, VMArray * value, sint32 sindex, sint32 count)
 {
-	MonoString *current;
+	llvm_gcroot(separator, 0);
+	llvm_gcroot(value, 0);
+	declare_gcroot(MonoString*, current) = 0;
 	sint32 length;
 	sint32 pos;
 	sint32 insertlen;

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

==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Sat Oct 17 09:37:44 2009
@@ -134,33 +134,43 @@
 }
 
 VMObject* Property::getPropertyDelegatee() {
+	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
+
   if (!delegatee) {
     VMThread::get()->getVM()->error("implement me");  
   }
+
   return delegatee;
 }
 
 VMObject* VMMethod::getMethodDelegatee() {
+	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
+
   if (!delegatee) {
     VMThread::get()->getVM()->error("implement me");  
   }
+
   return delegatee;
 }
 
 VMObject* VMCommonClass::getClassDelegatee() {
 	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
+
   if (!delegatee) {
     ooo_delegatee = delegatee = MSCorlib::clrType->doNew();
     MSCorlib::typeClrType->setIntPtr(delegatee, (int*)this);
   }
+
   return delegatee;
 }
 
 VMObject* Assembly::getAssemblyDelegatee() {
 	declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
+
   if (!delegatee) {
     VMThread::get()->getVM()->error("implement me");  
   }
+
   return delegatee;
 }
 

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

==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoString.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoString.cpp Sat Oct 17 09:37:44 2009
@@ -25,7 +25,8 @@
 using namespace llvm;
 
 
-CLIString* CLIString::stringDup(const ArrayChar*& array, N3* vm) {
+CLIString* CLIString::stringDup(const ArrayChar* array, N3* vm) {
+	llvm_gcroot(array, 0);
   declare_gcroot(MonoString*, obj) = (MonoString*)MSCorlib::pString->doNew();
   obj->length = array->size;
   if (array->size == 0) {
@@ -37,20 +38,16 @@
   return obj;
 }
 
-const ArrayChar* CLIString::strToArray(N3* vm) const {
-	declare_gcroot(const ArrayChar*, res) = ((MonoString *)this)->value;
-  return res;
-}
-
-GlobalVariable* CLIString::llvmVar() {
-  MonoString* str = (MonoString*)this;
+GlobalVariable* CLIString::llvmVar(CLIString *self) {
+	llvm_gcroot(self, 0);
+  declare_gcroot(MonoString*, str) = (MonoString*)self;
   if (!str->_llvmVar) {
     N3* vm = VMThread::get()->getVM();
     if (!str->_llvmVar) {
       const Type* pty = mvm::MvmModule::ptrType;
       Module* Mod = vm->getLLVMModule();
       Constant* cons = 
-        ConstantExpr::getIntToPtr(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), uint64_t (this)),
+        ConstantExpr::getIntToPtr(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), uint64_t (self)),
                                   pty);
       str->_llvmVar = new GlobalVariable(*Mod, pty, true,
                                     GlobalValue::ExternalLinkage,

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

==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp Sat Oct 17 09:37:44 2009
@@ -177,8 +177,9 @@
 }
 
 static const ArrayChar* newBuilder(N3* vm, PNetString* value, uint32 length) {
+	llvm_gcroot(value, 0);
   uint32 valueLength = value ? value->length : 0;
-  const ArrayChar* array = value ? value->value : 0;
+  declare_gcroot(const ArrayChar*, array) = value ? value->value : 0;
   uint32 roundLength = (7 + length) & 0xfffffff8;
   uint16* buf = (uint16*)alloca(roundLength * sizeof(uint16));
   uint32 strLength = 0;
@@ -199,6 +200,7 @@
 
 extern "C" VMObject* System_String_NewBuilder(PNetString* value, 
                                                uint32 length) {
+	llvm_gcroot(value, 0);
   N3* vm = (N3*)(VMThread::get()->getVM());
   declare_gcroot(PNetString*, str) = (PNetString*)vm->arrayToString(newBuilder(vm, value, length));
   return str;
@@ -214,7 +216,9 @@
 extern "C" void System_String_CopyToChecked(PNetString* str, sint32 sstart, 
                                             ArrayChar* dest, sint32 dstart,
                                             sint32 count) {
-  const ArrayChar* value = str->value;
+	llvm_gcroot(str, 0);
+	llvm_gcroot(dest, 0);
+  declare_gcroot(const ArrayChar*, value) = str->value;
   memcpy(&dest->elements[dstart], &value->elements[sstart], count << 1);
 }
 
@@ -224,6 +228,7 @@
 
 extern "C" void Platform_Stdio_StdWrite(sint32 fd, ArrayUInt8* value, 
                                         sint32 index, sint32 count) {
+	llvm_gcroot(value, 0);
   if (fd == 1) {
     if (ILConsoleGetMode() == IL_CONSOLE_NORMAL) {
       fwrite(&value->elements[index], 1, count, stdout);
@@ -243,7 +248,8 @@
 
 extern "C" sint32 System_Text_DefaultEncoding_InternalGetBytes(ArrayChar* chars,
             sint32 charIndex, sint32 charCount, ArrayUInt8* bytes, sint32 byteIndex) {
-  
+  llvm_gcroot(chars, 0);
+	llvm_gcroot(bytes, 0);
   return ILAnsiGetBytes(&chars->elements[charIndex], charCount, &bytes->elements[byteIndex], bytes->size - byteIndex);
 }
 
@@ -252,6 +258,7 @@
 }
 
 extern "C" VMObject* System_Reflection_ClrType_GetElementType(VMObject* Klass) {
+	llvm_gcroot(Klass, 0);
   VMCommonClass* cl = (VMCommonClass*)MSCorlib::typeClrType->getIntPtr(Klass);
   if (!cl->isArray) {
     VMThread::get()->getVM()->error("implement me");
@@ -270,6 +277,8 @@
 
 extern "C" void System_String_Copy_3(PNetString* dest, sint32 pos, 
                                      PNetString* src) {
+	llvm_gcroot(dest, 0);
+	llvm_gcroot(src, 0);
   declare_gcroot(ArrayChar*, arr) = (ArrayChar*)MSCorlib::arrayChar->doNew(pos + src->value->size);
   
   for (sint32 i = 0; i < pos; ++i) {
@@ -287,7 +296,9 @@
 extern "C" void System_String_Copy_5(PNetString* dest, sint32 destPos, 
                                      PNetString* src, sint32 srcPos, 
                                      sint32 length) {
-	const ArrayChar *arraySrc = src->value;
+	llvm_gcroot(dest, 0);
+	llvm_gcroot(src, 0);
+	declare_gcroot(const ArrayChar*, arraySrc) = src->value;
 
 	//	printf("Copy %p %p %d %d %d (%p %d)\n", (void *)dest, (void *)src, destPos, srcPos, length, (void *)dest->value, dest->length);
 
@@ -315,16 +326,22 @@
 }
 
 extern "C" void System_Threading_Monitor_Enter(VMObject* obj) {
+	llvm_gcroot(obj, 0);
 	//	obj->aquire();
 }
 
 extern "C" void System_Threading_Monitor_Exit(VMObject* obj) {
+	llvm_gcroot(obj, 0);
 	//	obj->unlock();
 }
 
 
 extern "C" bool System_String_Equals(PNetString* str1, PNetString* str2) {
-  return str1->value == str2->value;
+	llvm_gcroot(str1, 0);
+	llvm_gcroot(str2, 0);
+	declare_gcroot(const ArrayChar*, a1) = str1->value;
+	declare_gcroot(const ArrayChar*, a2) = str2->value;
+  return a1 == a2;
 }
 
 extern "C" sint32 Platform_SysCharInfo_GetUnicodeCategory(char c) {
@@ -332,11 +349,13 @@
 }
 
 extern "C" uint16 System_String_GetChar(PNetString* str, sint32 index) {
+	llvm_gcroot(str, 0);
   return str->value->elements[index];
 }
 
 extern "C" sint32 System_String_IndexOf(PNetString* str, uint16 value, 
                                         sint32 startIndex, sint32 count) {
+	llvm_gcroot(str, 0);
   if (startIndex < 0) {
     VMThread::get()->getVM()->error("shoud throw arg range");
   }
@@ -346,7 +365,7 @@
   }
 
   sint32 i = startIndex;
-  const ArrayChar* array = str->value;
+  declare_gcroot(const ArrayChar*, array) = str->value;
   while (i < startIndex + count) {
     if (array->elements[i] == value) return i;
     else ++i;
@@ -356,8 +375,9 @@
 }
 
 extern "C" sint32 System_String_GetHashCode(PNetString* str) {
+	llvm_gcroot(str, 0);
   sint32 hash = 0;
-  const ArrayChar* array = str->value;
+  declare_gcroot(const ArrayChar*, array) = str->value;
   for (sint32 i = 0; i < array->size; ++i) {
     hash += ((hash << 5) + array->elements[i]);
   }
@@ -368,9 +388,10 @@
                                                       StringBuilder* obj,
                                                       sint32 index, 
                                                       uint16 value) {
+	llvm_gcroot(obj, 0);
   N3* vm = (N3*)(VMThread::get()->getVM());
-  PNetString* buildString = obj->buildString;
-  const ArrayChar* array = buildString->value;
+  declare_gcroot(PNetString*, buildString) = obj->buildString;
+  declare_gcroot(const ArrayChar*, array) = buildString->value;
   sint32 strLength = buildString->length;
   sint32 length = (index + 1) > strLength ? index + 1 : strLength + 1;
   uint16* buf = (uint16*)alloca(length * sizeof(uint16));
@@ -396,10 +417,12 @@
                                                       StringBuilder* obj,
                                                       sint32 index, 
                                                       PNetString* str) {
+	llvm_gcroot(obj, 0);
+	llvm_gcroot(str, 0);
   N3* vm = (N3*)(VMThread::get()->getVM());
-  PNetString* buildString = obj->buildString;
-  const ArrayChar* strArray = str->value;
-  const ArrayChar* buildArray = buildString->value;
+  declare_gcroot(PNetString*, buildString) = obj->buildString;
+  declare_gcroot(const ArrayChar*, strArray) = str->value;
+  declare_gcroot(const ArrayChar*, buildArray) = buildString->value;
   sint32 strLength = str->length;
   sint32 buildLength = buildString->length;
   sint32 length = strLength + buildLength;
@@ -428,9 +451,10 @@
 extern "C" VMObject* System_Text_StringBuilder_Append_System_Text_StringBuilder_System_Char(
                                                 StringBuilder* obj,
                                                 uint16 value) {
+	llvm_gcroot(obj, 0);
   N3* vm = (N3*)(VMThread::get()->getVM());
-  PNetString* buildString = obj->buildString;
-  const ArrayChar* array = buildString->value;
+  declare_gcroot(PNetString*, buildString) = obj->buildString;
+  declare_gcroot(const ArrayChar*, array) = buildString->value;
   sint32 length = buildString->length;
   uint16* buf = (uint16*)alloca((length + 1) * sizeof(uint16));
 
@@ -447,10 +471,12 @@
 extern "C" VMObject* System_Text_StringBuilder_Append_System_Text_StringBuilder_System_String(
                                                 StringBuilder* obj,
                                                 PNetString* str) {
+	llvm_gcroot(obj, 0);
+	llvm_gcroot(str, 0);
   N3* vm = (N3*)(VMThread::get()->getVM());
-  PNetString* buildString = obj->buildString;
-  const ArrayChar* buildArray = buildString->value;
-  const ArrayChar* strArray = str->value;
+  declare_gcroot(PNetString*, buildString) = obj->buildString;
+  declare_gcroot(const ArrayChar*, buildArray) = buildString->value;
+  declare_gcroot(const ArrayChar*, strArray) = str->value;
   sint32 buildLength = buildString->length;
   sint32 strLength = str->length;
   sint32 length = buildLength + strLength;
@@ -468,6 +494,8 @@
 extern "C" sint32 System_String_FindInRange(PNetString* obj, sint32 srcFirst, 
                                             sint32 srcLast, sint32 step,
                                             PNetString* dest) {
+	llvm_gcroot(obj, 0);
+	llvm_gcroot(dest, 0);
   uint16* buf1 = (uint16*)&(obj->value->elements[srcFirst]);
   uint16* buf2 = (uint16*)(dest->value->elements);
   sint32 destLength = dest->length;
@@ -518,11 +546,14 @@
 }
 
 extern "C" VMObject* System_Reflection_Assembly_LoadFromName(PNetString* str, sint32 & error, VMObject* parent) {
+	llvm_gcroot(str, 0);
+	llvm_gcroot(parent, 0);
   N3* vm = (N3*)(VMThread::get()->getVM());
-  Assembly* ass = vm->constructAssembly(vm->arrayToUTF8(str->value));
+	declare_gcroot(const ArrayChar*, value) = str->value;
+  Assembly* ass = vm->constructAssembly(vm->arrayToUTF8(value));
 
 	if(!ass->resolve(1, "dll"))
-		vm->error("unfound assembly %s\n", mvm::PrintBuffer(str->value).cString());
+		vm->error("unfound assembly %s\n", mvm::PrintBuffer(value).cString());
 
   error = 0;
 	declare_gcroot(VMObject*, delegatee) = ass->getAssemblyDelegatee();
@@ -530,9 +561,11 @@
 }
 
 extern "C" PNetString* System_String_Concat_2(PNetString* str1, PNetString* str2) {
+	llvm_gcroot(str1, 0);
+	llvm_gcroot(str2, 0);
   N3* vm = (N3*)(VMThread::get()->getVM());
-  const ArrayChar* a1 = str1->value;
-  const ArrayChar* a2 = str2->value;
+  declare_gcroot(const ArrayChar*, a1) = str1->value;
+  declare_gcroot(const ArrayChar*, a2) = str2->value;
   sint32 len1 = str1->length;
   sint32 len2 = str2->length;
   uint16* buf = (uint16*)alloca((len1 + len2) * sizeof(uint16));
@@ -547,10 +580,13 @@
 }
 
 extern "C" PNetString* System_String_Concat_3(PNetString* str1, PNetString* str2, PNetString* str3) {
-  N3* vm = (N3*)(VMThread::get()->getVM());
-  const ArrayChar* a1 = str1->value;
-  const ArrayChar* a2 = str2->value;
-  const ArrayChar* a3 = str3->value;
+	llvm_gcroot(str1, 0);
+	llvm_gcroot(str2, 0);
+	llvm_gcroot(str3, 0);
+  N3* vm = (N3*)(VMThread::get()->getVM());
+  declare_gcroot(const ArrayChar*, a1) = str1->value;
+  declare_gcroot(const ArrayChar*, a2) = str2->value;
+  declare_gcroot(const ArrayChar*, a3) = str3->value;
   sint32 len1 = str1->length;
   sint32 len2 = str2->length;
   sint32 len3 = str3->length;
@@ -567,7 +603,8 @@
 }
 
 extern "C" void System_String_RemoveSpace(PNetString* str, sint32 index, sint32 length) {
-  const ArrayChar* array = str->value;
+	llvm_gcroot(str, 0);
+  declare_gcroot(const ArrayChar*, array) = str->value;
   sint32 strLength = str->length;
   uint16* buf = (uint16*)alloca(strLength * sizeof(uint16));
   sint32 j = index;
@@ -596,6 +633,7 @@
 }
 
 extern "C" void System_String__ctor_3(PNetString* str, uint16 ch, sint32 count) {
+	llvm_gcroot(str, 0);
   declare_gcroot(ArrayChar*, array) = (ArrayChar*)MSCorlib::arrayChar->doNew(count);
   for (sint32 i = 0; i < count; ++i) {
     array->elements[i] = ch;
@@ -621,8 +659,10 @@
 }
 
 extern "C" VMObject* System_Reflection_Assembly_GetType(VMObject* obj, PNetString* str, bool onError, bool ignoreCase) {
+	llvm_gcroot(obj, 0);
+	llvm_gcroot(str, 0);
   Assembly* ass = ASSEMBLY_VALUE(obj);
-  const ArrayChar* array = str->value;
+  declare_gcroot(const ArrayChar*, array) = str->value;
 	mvm::PrintBuffer pb(array);
   char* asciiz = pb.cString();
   char* index = (char*)sys_memrchr(asciiz, '.', strlen(asciiz));
@@ -637,6 +677,7 @@
 }
 
 static bool parameterMatch(std::vector<VMCommonClass*> params, ArrayObject* types, bool virt) {
+	llvm_gcroot(types, 0);
   uint32 v = virt ? 1 : 0;
   if (types->size + v + 1 != params.size()) return false;
   for (sint32 i = 0; i < types->size; ++i) {
@@ -648,6 +689,11 @@
 
 extern "C" VMObject* System_Reflection_ClrType_GetMemberImpl(VMObject* Type, PNetString* str, sint32 memberTypes, sint32 bindingFlags, VMObject* binder, 
                                                    sint32 callingConventions, ArrayObject* types, VMObject* modifiers) {
+	llvm_gcroot(Type, 0);
+	llvm_gcroot(str, 0);
+	llvm_gcroot(binder, 0);
+	llvm_gcroot(types, 0);
+	llvm_gcroot(modifiers, 0);
   VMCommonClass* type = (VMCommonClass*)MSCorlib::typeClrType->getIntPtr(Type);
   N3* vm = (N3*)(VMThread::get()->getVM());
   const UTF8* name = vm->arrayToUTF8(str->value);
@@ -663,7 +709,8 @@
       }
     }
     if (res == 0) VMThread::get()->getVM()->error("implement me");
-    return res->getPropertyDelegatee();
+		declare_gcroot(VMObject*, prop_res) = res->getPropertyDelegatee();
+    return prop_res;
   } else if (memberTypes == MEMBER_TYPES_METHOD) {
     std::vector<VMMethod*> virtualMethods = type->virtualMethods;
     std::vector<VMMethod*> staticMethods = type->staticMethods;
@@ -673,7 +720,8 @@
       VMMethod* meth = *i;
       if (meth->name == name) {
         if (parameterMatch(meth->parameters, types, true)) {
-          return meth->getMethodDelegatee();
+					declare_gcroot(VMObject*, meth_res) = meth->getMethodDelegatee();
+          return meth_res;
         }
       }
     }
@@ -683,7 +731,8 @@
       VMMethod* meth = *i;
       if (meth->name == name) {
         if (parameterMatch(meth->parameters, types, false)) {
-          return meth->getMethodDelegatee();
+					declare_gcroot(VMObject*, meth_res) = meth->getMethodDelegatee();
+          return meth_res;
         }
       }
     }
@@ -704,7 +753,8 @@
 		N3* vm = VMThread::get()->getVM();
 		VMMethod* meth = prop->type->lookupMethod(vm->asciizToUTF8(buf), prop->parameters, true, false);
 		assert(meth);
-		return meth->getMethodDelegatee();
+		declare_gcroot(VMObject*, res) = meth->getMethodDelegatee();
+		return res;
 	} else {
 		VMThread::get()->getVM()->error("implement me: GetSemantics: %d", attributes);
 		return 0;
@@ -712,6 +762,8 @@
 }
 
 static void decapsulePrimitive(VMObject* arg, const llvm::Type* type, std::vector<llvm::GenericValue>& args) {
+	llvm_gcroot(arg, 0);
+
   if (type == llvm::Type::getInt1Ty(llvm::getGlobalContext())) {
     llvm::GenericValue gv;
     gv.IntVal = llvm::APInt(1, (bool)((uint32*)arg)[VALUE_OFFSET]);
@@ -752,6 +804,12 @@
 }
 
 extern "C" VMObject* System_Reflection_ClrMethod_Invoke(VMObject* Method, VMObject* obj, sint32 invokeAttr, VMObject* binder, ArrayObject* args, VMObject* culture) {
+	llvm_gcroot(Method, 0);
+	llvm_gcroot(obj, 0);
+	llvm_gcroot(binder, 0);
+	llvm_gcroot(args, 0);
+	llvm_gcroot(culture, 0);
+
   VMMethod* meth = (VMMethod*)MSCorlib::methodMethodType->getIntPtr(Method);
   meth->getSignature(NULL);
   meth->compiledPtr(NULL);
@@ -858,9 +916,12 @@
 }
       
 extern "C" VMObject* System_Reflection_Assembly_GetManifestResourceStream(VMObject* Ass, PNetString* str) {
+	llvm_gcroot(Ass, 0);
+	llvm_gcroot(str, 0);
   Assembly* ass = (Assembly*)MSCorlib::assemblyAssemblyReflection->getIntPtr(Ass);
   N3* vm = (N3*)(VMThread::get()->getVM());
-  const UTF8* id = vm->arrayToUTF8(str->value);
+	declare_gcroot(const ArrayChar*, array) = str->value;
+  const UTF8* id = vm->arrayToUTF8(array);
   Header* header = ass->CLIHeader;
   uint32 stringOffset = header->stringStream->realOffset;
   Table* manTable  = header->tables[CONSTANT_ManifestResource];
@@ -880,7 +941,8 @@
   }
 
   if (pos != -1) {
-    return createResourceStream(ass, pos);
+		declare_gcroot(VMObject*, res) = createResourceStream(ass, pos);
+    return res;
   } else {
     return 0;
   }
@@ -888,12 +950,15 @@
 
 
 extern "C" ArrayObject* System_Reflection_ClrHelpers_GetCustomAttributes(Assembly* ass, VMCommonClass* clrTypePrivate, bool inherit) {
-  return ass->getCustomAttributes(clrTypePrivate->token, clrTypePrivate);
+	declare_gcroot(ArrayObject*, res) = ass->getCustomAttributes(clrTypePrivate->token, clrTypePrivate);
+  return res;
 }
 
 extern "C" VMObject* System_Globalization_TextInfo_ToLower(VMObject* obj, PNetString* str) {
+	llvm_gcroot(obj, 0);
+	llvm_gcroot(str, 0);
   verifyNull(str);
-  const ArrayChar* array = str->value;
+  declare_gcroot(const ArrayChar*, array) = str->value;
   uint32 length = str->length;
 
   uint16* buf = (uint16*)alloca(length * sizeof(uint16));
@@ -908,7 +973,8 @@
 }
 
 extern "C" VMObject* System_String_Replace(PNetString* str, uint16 c1, uint16 c2) {
-  const ArrayChar* array = str->value;
+	llvm_gcroot(str, 0);
+  declare_gcroot(const ArrayChar*, array) = str->value;
   uint32 length = str->length;
   if ((c1 == c2) || length == 0) return str;
 
@@ -925,6 +991,7 @@
 }
 
 extern "C" uint32 System_Reflection_ClrResourceStream_ResourceRead(Assembly* assembly, uint64 position, ArrayUInt8* buffer, uint32 offset, uint32 count) {
+	llvm_gcroot(buffer, 0);
   uint32 resRva = assembly->resRva;
   ByteCode* bytes = assembly->bytes;
   Section* textSection = assembly->textSection;
@@ -937,6 +1004,9 @@
 }
 
 extern "C" sint32 System_String_CompareInternal(PNetString* strA, sint32 indexA, sint32 lengthA, PNetString* strB, sint32 indexB, sint32 lengthB, bool ignoreCase) {
+	llvm_gcroot(strA, 0);
+	llvm_gcroot(strB, 0);
+
   if (strA == 0) {
     if (strB == 0) {
       return 0;
@@ -970,7 +1040,8 @@
 }
 
 extern "C" void System_String_CharFill(PNetString* str, sint32 start, sint32 count, char ch) {
-  const ArrayChar* array = str->value;
+	llvm_gcroot(str, 0);
+  declare_gcroot(const ArrayChar*, array) = str->value;
   sint32 length = start + count;
   uint16* buf = (uint16*)alloca(length * sizeof(uint16));
 
@@ -988,6 +1059,8 @@
 
 extern "C" sint32 System_String_InternalOrdinal(PNetString *strA, sint32 indexA, sint32 lengthA,
 						PNetString *strB, sint32 indexB, sint32 lengthB) {
+	llvm_gcroot(strA, 0);
+	llvm_gcroot(strB, 0);
 	const uint16 *bufA;
 	const uint16 *bufB;
 

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

==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetString.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetString.cpp Sat Oct 17 09:37:44 2009
@@ -24,7 +24,8 @@
 using namespace llvm;
 
 
-CLIString* CLIString::stringDup(const ArrayChar*& array, N3* vm) {
+CLIString* CLIString::stringDup(const ArrayChar* array, N3* vm) {
+	llvm_gcroot(array, 0);
   declare_gcroot(PNetString*, obj) = (PNetString*)MSCorlib::pString->doNew();
   obj->capacity = array->size;
   obj->length = array->size;
@@ -37,19 +38,15 @@
   return obj;
 }
 
-const ArrayChar* CLIString::strToArray(N3* vm) const {
-  declare_gcroot(const ArrayChar*, res) = ((PNetString*)this)->value;
-	return res;
-}
-
-GlobalVariable* CLIString::llvmVar() {
-  PNetString* str = (PNetString*)this;
+GlobalVariable* CLIString::llvmVar(CLIString *self) {
+	llvm_gcroot(self, 0);
+  declare_gcroot(PNetString*, str) = (PNetString*)self;
   if (!str->_llvmVar) {
     N3* vm = VMThread::get()->getVM();
     if (!str->_llvmVar) {
       const Type* pty = mvm::MvmModule::ptrType;
       Constant* cons = 
-        ConstantExpr::getIntToPtr(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), uint64_t (this)),
+        ConstantExpr::getIntToPtr(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), uint64_t (self)),
                                   pty);
       str->_llvmVar = new GlobalVariable(*(vm->getLLVMModule()), pty, true,
                                     GlobalValue::ExternalLinkage,

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIString.h (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIString.h Sat Oct 17 09:37:44 2009
@@ -29,11 +29,10 @@
     buf->write("CLI string");
   }
   
-  llvm::GlobalVariable* llvmVar();
+  static llvm::GlobalVariable* llvmVar(CLIString *self);
 
   
-  static CLIString* stringDup(const ArrayChar*& array, N3* vm);
-	const ArrayChar *strToArray(N3 *vm) const;
+  static CLIString* stringDup(const ArrayChar* array, N3* vm);
 };
 
 } // end namespace jnjvm





More information about the vmkit-commits mailing list