[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