[vmkit-commits] [vmkit] r53513 - in /vmkit/trunk/lib/N3: Mono/Makefile Mono/Mono.cpp Mono/MonoMSCorlib.cpp PNetLib/PNetLib.cpp VMCore/MSCorlib.cpp VMCore/N3Initialise.cpp VMCore/NativeUtil.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Jul 12 02:47:18 PDT 2008


Author: geoffray
Date: Sat Jul 12 04:47:18 2008
New Revision: 53513

URL: http://llvm.org/viewvc/llvm-project?rev=53513&view=rev
Log:
Improve Mono support (It now prints Hello World!), and move shared
mscorlib functions into VMCore/MSCorlib.cpp. Also remove
initializing NativeUtil for faking the linker, as with the new build
system this is not required anymore.


Added:
    vmkit/trunk/lib/N3/VMCore/MSCorlib.cpp
Modified:
    vmkit/trunk/lib/N3/Mono/Makefile
    vmkit/trunk/lib/N3/Mono/Mono.cpp
    vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
    vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp
    vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp
    vmkit/trunk/lib/N3/VMCore/NativeUtil.h

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

==============================================================================
--- vmkit/trunk/lib/N3/Mono/Makefile (original)
+++ vmkit/trunk/lib/N3/Mono/Makefile Sat Jul 12 04:47:18 2008
@@ -11,3 +11,6 @@
 LIBRARYNAME = Mono
 include $(LEVEL)/Makefile.common
 CXX.Flags += -I../VMCore
+
+CXX.Flags += `pkg-config --cflags glib-2.0 gthread-2.0`
+CXX.Flags += `pkg-config --cflags gmodule-2.0`

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

==============================================================================
--- vmkit/trunk/lib/N3/Mono/Mono.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/Mono.cpp Sat Jul 12 04:47:18 2008
@@ -19,51 +19,234 @@
 #include "VMObject.h"
 #include "VMThread.h"
 
+#include <glib.h>
+
+#include "number-formatter.h"
+
 using namespace n3;
 
-extern "C" void System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray(
-                                               VMArray* array, VMField* field) {
-  if (!array || !field) return;
-
-  VMClass* type = field->classDef;
-  VMClassArray* ts = (VMClassArray*)array->classOf;
-  VMCommonClass* bs = ts->baseClass;
-  Assembly* ass = type->assembly;
-
-  uint32 rva = ass->getRVAFromField(field->token);
-  Section* rsrcSection = ass->rsrcSection;
-
-  uint32 size = array->size;
-  uint32 offset = rsrcSection->rawAddress + (rva - rsrcSection->virtualAddress);
-  ArrayUInt8* bytes = ass->bytes;
-
-  if (bs == MSCorlib::pChar) {
-    for (uint32 i = 0; i < size; ++i) {
-      ((ArrayUInt16*)array)->elements[i] = READ_U2(bytes, offset);
-    }
-  } else if (bs == MSCorlib::pSInt32) {
-    for (uint32 i = 0; i < size; ++i) {
-      ((ArraySInt32*)array)->elements[i] = READ_U4(bytes, offset);
-    }
-  } else if (bs == MSCorlib::pDouble) {
-    for (uint32 i = 0; i < size; ++i) {
-      ((ArrayDouble*)array)->elements[i] = READ_U8(bytes, offset);
-    }
-  } else {
-    VMThread::get()->vm->error("implement me");
-  }
+extern "C" int System_Environment_get_Platform (void) {
+#if defined (PLATFORM_WIN32)
+	/* Win32NT */
+	return 2;
+#else
+	/* Unix */
+	return 128;
+#endif
 }
 
-extern "C" VMObject* System_Type_GetTypeFromHandle(VMCommonClass* cl) {
-  return cl->getClassDelegatee();
+static const char *encodings [] = {
+	(char *) 1,
+		"ascii", "us_ascii", "us", "ansi_x3.4_1968",
+		"ansi_x3.4_1986", "cp367", "csascii", "ibm367",
+		"iso_ir_6", "iso646_us", "iso_646.irv:1991",
+	(char *) 2,
+		"utf_7", "csunicode11utf7", "unicode_1_1_utf_7",
+		"unicode_2_0_utf_7", "x_unicode_1_1_utf_7",
+		"x_unicode_2_0_utf_7",
+	(char *) 3,
+		"utf_8", "unicode_1_1_utf_8", "unicode_2_0_utf_8",
+		"x_unicode_1_1_utf_8", "x_unicode_2_0_utf_8",
+	(char *) 4,
+		"utf_16", "UTF_16LE", "ucs_2", "unicode",
+		"iso_10646_ucs2",
+	(char *) 5,
+		"unicodefffe", "utf_16be",
+	(char *) 6,
+		"iso_8859_1",
+	(char *) 0
+};
+
+/*
+ * Returns the internal codepage, if the value of "int_code_page" is
+ * 1 at entry, and we can not compute a suitable code page number,
+ * returns the code page as a string
+ */
+extern "C" MonoString*
+System_Text_Encoding_InternalCodePage (gint32 *int_code_page) 
+{
+	const char *cset;
+	const char *p;
+	char *c;
+	char *codepage = NULL;
+	int code;
+	int want_name = *int_code_page;
+	int i;
+	
+	*int_code_page = -1;
+
+	g_get_charset (&cset);
+	c = codepage = strdup (cset);
+	for (c = codepage; *c; c++){
+		if (isascii (*c) && isalpha (*c))
+			*c = tolower (*c);
+		if (*c == '-')
+			*c = '_';
+	}
+	/* g_print ("charset: %s\n", cset); */
+	
+	/* handle some common aliases */
+	p = encodings [0];
+	code = 0;
+	for (i = 0; p != 0; ){
+		if ((gssize) p < 7){
+			code = (gssize) p;
+			p = encodings [++i];
+			continue;
+		}
+		if (strcmp (p, codepage) == 0){
+			*int_code_page = code;
+			break;
+		}
+		p = encodings [++i];
+	}
+	
+	if (strstr (codepage, "utf_8") != NULL)
+		*int_code_page |= 0x10000000;
+	free (codepage);
+	
+	if (want_name && *int_code_page == -1)
+		return (MonoString*)(((N3*)VMThread::get()->vm)->asciizToStr(cset));
+	else
+		return NULL;
 }
 
-extern "C" int System_Environment_get_Platform (void) {
+extern "C" void System_Threading_Monitor_Monitor_exit(VMObject* obj) {
+  obj->unlock();
+}
+
+extern "C" bool System_Threading_Monitor_Monitor_try_enter(VMObject* obj, int ms) {
+  obj->aquire();
+  return true;
+}
+
+
+extern "C" void* System_IO_MonoIO_get_ConsoleError() {
+  return (void*)stderr;
+}
+
+extern "C" void* System_IO_MonoIO_get_ConsoleOutput() {
+  return (void*)stdout;
+}
+
+extern "C" void* System_IO_MonoIO_get_ConsoleInput() {
+  return (void*)stdin;
+}
+
+enum MonoFileType {
+    Unknown=0x0000,
+    Disk=0x0001,
+    Char=0x0002,
+    Pipe=0x0003,
+    Remote=0x8000
+};  
+
+extern "C" MonoFileType System_IO_MonoIO_GetFileType(void* handle, int* error) {
+  if (handle == (void*)stdin || handle == (void*)stdout || handle == (void*)stderr)
+    return Char;
+  else
+    return Unknown;
+}
+
+extern "C" MonoString *
+System_Environment_get_NewLine (void)
+{
 #if defined (PLATFORM_WIN32)
-  /* Win32NT */
-  return 2;
+	return (MonoString*)((N3*)VMThread::get()->vm)->asciizToStr("\r\n");
 #else
-  /* Unix */
-  return 128; 
+	return (MonoString*)((N3*)VMThread::get()->vm)->asciizToStr("\n");
 #endif
 }
+
+extern "C" void
+System_String_InternalCopyTo(MonoString* str, sint32 sindex, VMArray* dest, sint32 destIndex, sint32 count) {
+  const UTF8* contents = str->value;
+  memcpy(&dest->elements[destIndex], &contents->elements[sindex], count * sizeof(uint16));
+}
+
+extern "C" uint16 System_String_get_Chars(MonoString* str, sint32 offset) {
+  return str->value->elements[offset];
+}
+
+static sint32 byteLength(VMArray* array) {
+  VMClassArray* cl = (VMClassArray*)array->classOf;
+  VMCommonClass* base = cl->baseClass;
+  uint32 size = base->naturalType->getPrimitiveSizeInBits() / 8;  
+  return array->size * size;
+}
+
+extern "C" bool System_Buffer_BlockCopyInternal (VMArray* src, int src_offset, VMArray* dest, int dest_offset, int count) {
+  uint8 *src_buf, *dest_buf;
+
+	/* watch out for integer overflow */
+	if ((src_offset > byteLength(src) - count) || (dest_offset > byteLength(dest) - count))
+		return false;
+
+	src_buf = (uint8 *)src->elements + src_offset;
+	dest_buf = (uint8 *)dest->elements + dest_offset;
+
+	if (src != dest)
+		memcpy (dest_buf, src_buf, count);
+	else
+		memmove (dest_buf, src_buf, count); /* Source and dest are the same array */
+
+	return true;
+
+}
+
+extern "C" sint32 System_Buffer_ByteLengthInternal(VMArray* array) {
+  return byteLength(array);
+}
+
+extern "C" sint32 
+System_IO_MonoIO_Write (void* handle, ArrayUInt8 *src,
+				  sint32 src_offset, sint32 count,
+				  sint32 *error)
+{
+  char* buffer = (char*)alloca( 1024);//(count + 8) * sizeof(uint16));
+	uint32 n = 0;
+
+	*error = 0;
+	
+	if (src_offset + count > src->size)
+		return 0;
+   
+  memcpy(buffer, (char*)&(src->elements[src_offset]), count);
+  buffer[count] = 0;
+	n = fprintf((FILE*)handle, buffer);
+
+	return (sint32)n;
+}
+
+/* These parameters are "readonly" in corlib/System/NumberFormatter.cs */
+extern "C" void
+System_NumberFormatter_GetFormatterTables (guint64 const **mantissas,
+					    gint32 const **exponents,
+					    gunichar2 const **digitLowerTable,
+					    gunichar2 const **digitUpperTable,
+					    gint64 const **tenPowersList,
+					    gint32 const **decHexDigits)
+{
+	*mantissas = Formatter_MantissaBitsTable;
+	*exponents = Formatter_TensExponentTable;
+	*digitLowerTable = Formatter_DigitLowerTable;
+	*digitUpperTable = Formatter_DigitUpperTable;
+	*tenPowersList = Formatter_TenPowersList;
+	*decHexDigits = Formatter_DecHexDigits;
+}
+
+extern "C" VMObject* System_Threading_Thread_CurrentThread_internal() {
+  return VMThread::get()->vmThread;
+}
+
+extern "C" VMObject*
+System_Threading_Thread_GetCachedCurrentCulture (VMObject *obj)
+{
+	return 0;
+}
+
+extern "C" VMObject*
+System_Threading_Thread_GetSerializedCurrentCulture (VMObject *obj)
+{
+	return 0;
+}

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

==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Sat Jul 12 04:47:18 2008
@@ -132,9 +132,6 @@
 
   */
 }
-#include "NativeUtil.h"
-void NativeUtil::initialise() {
-}
 
 VMObject* Property::getPropertyDelegatee() {
   if (!delegatee) {
@@ -166,4 +163,12 @@
 }
 
 void MSCorlib::loadBootstrap(N3* vm) {
+  VMClass* cl = (VMClass*)vm->coreAssembly->loadTypeFromName(
+                                        vm->asciizConstructUTF8("Thread"),
+                                        vm->asciizConstructUTF8("System.Threading"),
+                                        true, true, true, true);
+  VMObject* th = (*cl)();
+  VMThread* myth = VMThread::get();
+  myth->vmThread = th;
+
 }

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

==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp Sat Jul 12 04:47:18 2008
@@ -132,67 +132,10 @@
 
 
 
-extern "C" void System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray(
-                                               VMArray* array, VMField* field) {
-  if (!array || !field) return;
-
-  VMClass* type = field->classDef;
-  VMClassArray* ts = (VMClassArray*)array->classOf;
-  VMCommonClass* bs = ts->baseClass;
-  Assembly* ass = type->assembly;
-
-  uint32 rva = ass->getRVAFromField(field->token);
-  Section* rsrcSection = ass->rsrcSection;
-
-  uint32 size = array->size;
-  uint32 offset = rsrcSection->rawAddress + (rva - rsrcSection->virtualAddress);
-  ArrayUInt8* bytes = ass->bytes;
-
-  if (bs == MSCorlib::pChar) {
-    for (uint32 i = 0; i < size; ++i) {
-      ((ArrayUInt16*)array)->elements[i] = READ_U2(bytes, offset);
-    }
-  } else if (bs == MSCorlib::pSInt32) {
-    for (uint32 i = 0; i < size; ++i) {
-      ((ArraySInt32*)array)->elements[i] = READ_U4(bytes, offset);
-    }
-  } else if (bs == MSCorlib::pDouble) {
-    for (uint32 i = 0; i < size; ++i) {
-      ((ArrayDouble*)array)->elements[i] = READ_U8(bytes, offset);
-    }
-  } else {
-    VMThread::get()->vm->error("implement me");
-  }
-}
-
-extern "C" VMObject* System_Type_GetTypeFromHandle(VMCommonClass* cl) {
-  return cl->getClassDelegatee();
-}
-
-extern "C" void System_Threading_Monitor_Enter(VMObject* obj) {
-  obj->aquire();
-}
-
-extern "C" void System_Threading_Monitor_Exit(VMObject* obj) {
-  obj->unlock();
-}
-
 extern "C" uint32 System_Text_DefaultEncoding_InternalCodePage() {
   return ILGetCodePage();
 }
 
-extern "C" VMObject* System_Reflection_Assembly_GetCallingAssembly() {
-  Assembly* ass = Assembly::getCallingAssembly();
-  assert(ass);
-  return ass->getAssemblyDelegatee();
-}
-
-extern "C" VMObject* System_Reflection_Assembly_GetExecutingAssembly() {
-  Assembly* ass = Assembly::getExecutingAssembly();
-  assert(ass);
-  return ass->getAssemblyDelegatee();
-}
-
 extern "C" uint32 System_Globalization_CultureInfo_InternalCultureID() {
   return ILGetCultureID();
 }
@@ -210,10 +153,6 @@
   }
 }
 
-extern "C" void System_Reflection_Assembly_LoadFromFile() {
-  VMThread::get()->vm->error("implement me");
-}
-
 static const UTF8* newBuilder(N3* vm, PNetString* value, uint32 length) {
   uint32 valueLength = value ? value->length : 0;
   const UTF8* utf8 = value ? value->value : 0;
@@ -287,97 +226,6 @@
   _IL_Stdio_StdFlush(0, fd);
 }
 
-extern "C" void System_Array_InternalCopy(VMArray* src, sint32 sstart, 
-                                          VMArray* dst, sint32 dstart, 
-                                          sint32 len) {
-  N3* vm = (N3*)(VMThread::get()->vm);
-  verifyNull(src);
-  verifyNull(dst);
-  
-  if (!(src->classOf->isArray && dst->classOf->isArray)) {
-    vm->arrayStoreException();
-  }
-  
-  VMClassArray* ts = (VMClassArray*)src->classOf;
-  VMClassArray* td = (VMClassArray*)dst->classOf;
-  VMCommonClass* dstType = td->baseClass;
-  VMCommonClass* srcType = ts->baseClass;
-
-  if (len > src->size) {
-    vm->indexOutOfBounds(src, len);
-  } else if (len > dst->size) {
-    vm->indexOutOfBounds(dst, len);
-  } else if (len + sstart > src->size) {
-    vm->indexOutOfBounds(src, len + sstart);
-  } else if (len + dstart > dst->size) {
-    vm->indexOutOfBounds(dst, len + dstart);
-  } else if (dstart < 0) {
-    vm->indexOutOfBounds(dst, dstart);
-  } else if (sstart < 0) {
-    vm->indexOutOfBounds(src, sstart);
-  } else if (len < 0) {
-    vm->indexOutOfBounds(src, len);
-  } 
-  
-  bool doThrow = false;
-  
-  if (srcType->super == MSCorlib::pValue && srcType != dstType) {
-    vm->arrayStoreException();
-  } else if (srcType->super != MSCorlib::pValue && srcType->super != MSCorlib::pEnum) {
-    sint32 i = sstart;
-    while (i < sstart + len && !doThrow) {
-      VMObject* cur = ((ArrayObject*)src)->at(i);
-      if (cur) {
-        if (!(cur->classOf->isAssignableFrom(dstType))) {
-          doThrow = true;
-          len = i;
-        }
-      }
-      ++i;
-    }
-  }
-  
-  
-  uint32 size = srcType->naturalType->getPrimitiveSizeInBits() / 8;
-  if (size == 0) size = sizeof(void*);
-  void* ptrDst = (void*)((int64_t)(dst->elements) + size * dstart);
-  void* ptrSrc = (void*)((int64_t)(src->elements) + size * sstart);
-  memmove(ptrDst, ptrSrc, size * len);
-
-  if (doThrow)
-    vm->arrayStoreException();
-  
-}
-
-extern "C" sint32 System_Array_GetRank(VMObject* arr) {
-  verifyNull(arr);
-  if (arr->classOf->isArray) {
-    return ((VMClassArray*)(arr->classOf))->dims;
-  } else {
-    VMThread::get()->vm->error("implement me");
-    return 0;
-  }
-}
-
-extern "C" sint32 System_Array_GetLength(VMObject* arr) {
-  verifyNull(arr);
-  if (arr->classOf->isArray) {
-    return ((VMArray*)arr)->size;
-  } else {
-    VMThread::get()->vm->error("implement me");
-    return 0;
-  }
-}
-
-extern "C" sint32 System_Array_GetLowerBound(VMObject* arr, sint32 dim) {
-  return 0;
-}
-
-extern "C" VMObject* System_Object_GetType(VMObject* obj) {
-  verifyNull(obj);
-  return obj->classOf->getClassDelegatee();
-}
-
 extern "C" VMObject* System_Reflection_ClrType_GetElementType(VMObject* Klass) {
   VMCommonClass* cl = (VMCommonClass*)((*Klass)(MSCorlib::typeClrType).PointerVal);
   if (!cl->isArray) {
@@ -436,12 +284,17 @@
   }
 }
 
-extern "C" bool System_String_Equals(PNetString* str1, PNetString* str2) {
-  return str1->value == str2->value;
+extern "C" void System_Threading_Monitor_Enter(VMObject* obj) {
+  obj->aquire();
 }
 
-extern "C" VMObject* System_Threading_Thread_InternalCurrentThread() {
-  return VMThread::get()->vmThread;
+extern "C" void System_Threading_Monitor_Exit(VMObject* obj) {
+  obj->unlock();
+}
+
+
+extern "C" bool System_String_Equals(PNetString* str1, PNetString* str2) {
+  return str1->value == str2->value;
 }
 
 extern "C" sint32 Platform_SysCharInfo_GetUnicodeCategory(char c) {
@@ -481,19 +334,6 @@
   return hash;
 }
 
-extern "C" double System_Decimal_ToDouble(void* ptr) {
-  VMThread::get()->vm->error("implement me");
-  return 0.0;
-}
-
-extern "C" double System_Math_Log10(double val) {
-  return log10(val);
-}
-
-extern "C" double System_Math_Floor(double val) {
-  return floor(val);
-}
-
 extern "C" VMObject* System_Text_StringBuilder_Insert_System_Text_StringBuilder_System_Int32_System_Char(
                                                       StringBuilder* obj,
                                                       sint32 index, 
@@ -1194,17 +1034,6 @@
 	}
 }
 
-extern "C" void System_GC_Collect() {
-#ifdef MULTIPLE_GC
-  mvm::Thread::get()->GC->collect();
-#else
-  Collector::collect();
-#endif
-}
-
-
-
-void NativeUtil::initialise() {
-  intptr_t p;
-  p = (intptr_t)&System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray;
+extern "C" VMObject* System_Threading_Thread_InternalCurrentThread() {
+  return VMThread::get()->vmThread;
 }

Added: vmkit/trunk/lib/N3/VMCore/MSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/MSCorlib.cpp?rev=53513&view=auto

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/MSCorlib.cpp (added)
+++ vmkit/trunk/lib/N3/VMCore/MSCorlib.cpp Sat Jul 12 04:47:18 2008
@@ -0,0 +1,200 @@
+//===------------- MSCorlib.cpp - mscorlib interface ----------------------===//
+//
+//                              N3
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <math.h>
+
+#include <dlfcn.h>
+#include <stdio.h>
+
+#include "mvm/JIT.h"
+
+#include "Assembly.h"
+#include "CLIAccess.h"
+#include "CLIJit.h"
+#include "NativeUtil.h"
+#include "MSCorlib.h"
+#include "N3.h"
+#include "Reader.h"
+#include "VMArray.h"
+#include "VMClass.h"
+#include "VMObject.h"
+#include "VMThread.h"
+
+using namespace n3;
+
+extern "C" void System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray(
+                                               VMArray* array, VMField* field) {
+  if (!array || !field) return;
+
+  VMClass* type = field->classDef;
+  VMClassArray* ts = (VMClassArray*)array->classOf;
+  VMCommonClass* bs = ts->baseClass;
+  Assembly* ass = type->assembly;
+
+  uint32 rva = ass->getRVAFromField(field->token);
+  Section* rsrcSection = ass->rsrcSection;
+
+  uint32 size = array->size;
+  uint32 offset = rsrcSection->rawAddress + (rva - rsrcSection->virtualAddress);
+  ArrayUInt8* bytes = ass->bytes;
+
+  if (bs == MSCorlib::pChar) {
+    for (uint32 i = 0; i < size; ++i) {
+      ((ArrayUInt16*)array)->elements[i] = READ_U2(bytes, offset);
+    }
+  } else if (bs == MSCorlib::pSInt32) {
+    for (uint32 i = 0; i < size; ++i) {
+      ((ArraySInt32*)array)->elements[i] = READ_U4(bytes, offset);
+    }
+  } else if (bs == MSCorlib::pDouble) {
+    for (uint32 i = 0; i < size; ++i) {
+      ((ArrayDouble*)array)->elements[i] = READ_U8(bytes, offset);
+    }
+  } else {
+    VMThread::get()->vm->error("implement me");
+  }
+}
+
+extern "C" VMObject* System_Type_GetTypeFromHandle(VMCommonClass* cl) {
+  return cl->getClassDelegatee();
+}
+
+
+extern "C" VMObject* System_Reflection_Assembly_GetCallingAssembly() {
+  Assembly* ass = Assembly::getCallingAssembly();
+  assert(ass);
+  return ass->getAssemblyDelegatee();
+}
+
+extern "C" VMObject* System_Reflection_Assembly_GetExecutingAssembly() {
+  Assembly* ass = Assembly::getExecutingAssembly();
+  assert(ass);
+  return ass->getAssemblyDelegatee();
+}
+
+extern "C" void System_Reflection_Assembly_LoadFromFile() {
+  VMThread::get()->vm->error("implement me");
+}
+
+extern "C" void System_Array_InternalCopy(VMArray* src, sint32 sstart, 
+                                          VMArray* dst, sint32 dstart, 
+                                          sint32 len) {
+  N3* vm = (N3*)(VMThread::get()->vm);
+  verifyNull(src);
+  verifyNull(dst);
+  
+  if (!(src->classOf->isArray && dst->classOf->isArray)) {
+    vm->arrayStoreException();
+  }
+  
+  VMClassArray* ts = (VMClassArray*)src->classOf;
+  VMClassArray* td = (VMClassArray*)dst->classOf;
+  VMCommonClass* dstType = td->baseClass;
+  VMCommonClass* srcType = ts->baseClass;
+
+  if (len > src->size) {
+    vm->indexOutOfBounds(src, len);
+  } else if (len > dst->size) {
+    vm->indexOutOfBounds(dst, len);
+  } else if (len + sstart > src->size) {
+    vm->indexOutOfBounds(src, len + sstart);
+  } else if (len + dstart > dst->size) {
+    vm->indexOutOfBounds(dst, len + dstart);
+  } else if (dstart < 0) {
+    vm->indexOutOfBounds(dst, dstart);
+  } else if (sstart < 0) {
+    vm->indexOutOfBounds(src, sstart);
+  } else if (len < 0) {
+    vm->indexOutOfBounds(src, len);
+  } 
+  
+  bool doThrow = false;
+  
+  if (srcType->super == MSCorlib::pValue && srcType != dstType) {
+    vm->arrayStoreException();
+  } else if (srcType->super != MSCorlib::pValue && srcType->super != MSCorlib::pEnum) {
+    sint32 i = sstart;
+    while (i < sstart + len && !doThrow) {
+      VMObject* cur = ((ArrayObject*)src)->at(i);
+      if (cur) {
+        if (!(cur->classOf->isAssignableFrom(dstType))) {
+          doThrow = true;
+          len = i;
+        }
+      }
+      ++i;
+    }
+  }
+  
+  
+  uint32 size = srcType->naturalType->getPrimitiveSizeInBits() / 8;
+  if (size == 0) size = sizeof(void*);
+  void* ptrDst = (void*)((int64_t)(dst->elements) + size * dstart);
+  void* ptrSrc = (void*)((int64_t)(src->elements) + size * sstart);
+  memmove(ptrDst, ptrSrc, size * len);
+
+  if (doThrow)
+    vm->arrayStoreException();
+  
+}
+
+extern "C" sint32 System_Array_GetRank(VMObject* arr) {
+  verifyNull(arr);
+  if (arr->classOf->isArray) {
+    return ((VMClassArray*)(arr->classOf))->dims;
+  } else {
+    VMThread::get()->vm->error("implement me");
+    return 0;
+  }
+}
+
+extern "C" sint32 System_Array_GetLength(VMObject* arr) {
+  verifyNull(arr);
+  if (arr->classOf->isArray) {
+    return ((VMArray*)arr)->size;
+  } else {
+    VMThread::get()->vm->error("implement me");
+    return 0;
+  }
+}
+
+extern "C" sint32 System_Array_GetLowerBound(VMObject* arr, sint32 dim) {
+  return 0;
+}
+
+extern "C" VMObject* System_Object_GetType(VMObject* obj) {
+  verifyNull(obj);
+  return obj->classOf->getClassDelegatee();
+}
+
+extern "C" double System_Decimal_ToDouble(void* ptr) {
+  VMThread::get()->vm->error("implement me");
+  return 0.0;
+}
+
+extern "C" double System_Math_Log10(double val) {
+  return log10(val);
+}
+
+extern "C" double System_Math_Floor(double val) {
+  return floor(val);
+}
+
+extern "C" void System_GC_Collect() {
+#ifdef MULTIPLE_GC
+  mvm::Thread::get()->GC->collect();
+#else
+  Collector::collect();
+#endif
+}
+
+extern "C" void System_GC_SuppressFinalize(VMObject* obj) {
+  // TODO: implement me
+}
+

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp Sat Jul 12 04:47:18 2008
@@ -219,7 +219,6 @@
 
 
 static void initialiseStatics() {
-  NativeUtil::initialise();
   CLIJit::initialise();
 
   VMObject::globalLock = mvm::Lock::allocNormal();

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/NativeUtil.h (original)
+++ vmkit/trunk/lib/N3/VMCore/NativeUtil.h Sat Jul 12 04:47:18 2008
@@ -19,7 +19,6 @@
 public:
 
   static void* nativeLookup(VMCommonClass* cl, VMMethod* meth);
-  static void initialise();
 };
 
 }





More information about the vmkit-commits mailing list