static void initialiseStatics() { CLIJit::initialise(); VMObject::globalLock = new mvm::LockNormal(); N3* vm = N3::bootstrapVM = N3::allocateBootstrap(); VMThread::TheThread = new VMThread(0, vm); vm->assemblyPath.push_back(""); vm->assemblyPath.push_back(MSCorlib::libsPath); Assembly* ass = vm->constructAssembly(vm->asciizToUTF8("mscorlib")); if(!ass->resolve(1, "dll")) VMThread::get()->getVM()->error("can not load mscorlib.dll. Abort"); vm->coreAssembly = ass; #define INIT(var, nameSpace, name, type, prim) {\ var = (VMClass*)vm->coreAssembly->loadTypeFromName( \ vm->asciizToUTF8(name), \ vm->asciizToUTF8(nameSpace),\ false, false, false, true); \ var->isPrimitive = prim; \ if (type) { \ var->naturalType = type; \ var->virtualType = type; \ }} assert(VMObject::llvmType); INIT(MSCorlib::pObject, "System", "Object", VMObject::llvmType, false); INIT(MSCorlib::pValue, "System", "ValueType", 0, false); INIT(MSCorlib::pVoid, "System", "Void", llvm::Type::getVoidTy(getGlobalContext()), true); INIT(MSCorlib::pBoolean, "System", "Boolean", llvm::Type::getInt1Ty(getGlobalContext()), true); INIT(MSCorlib::pUInt8, "System", "Byte", llvm::Type::getInt8Ty(getGlobalContext()), true); INIT(MSCorlib::pSInt8, "System", "SByte", llvm::Type::getInt8Ty(getGlobalContext()), true); INIT(MSCorlib::pChar, "System", "Char", llvm::Type::getInt16Ty(getGlobalContext()), true); INIT(MSCorlib::pSInt16, "System", "Int16", llvm::Type::getInt16Ty(getGlobalContext()), true); INIT(MSCorlib::pUInt16, "System", "UInt16", llvm::Type::getInt16Ty(getGlobalContext()), true); INIT(MSCorlib::pSInt32, "System", "Int32", llvm::Type::getInt32Ty(getGlobalContext()), true); INIT(MSCorlib::pUInt32, "System", "UInt32", llvm::Type::getInt32Ty(getGlobalContext()), true); INIT(MSCorlib::pSInt64, "System", "Int64", llvm::Type::getInt64Ty(getGlobalContext()), true); INIT(MSCorlib::pUInt64, "System", "UInt64", llvm::Type::getInt64Ty(getGlobalContext()), true); INIT(MSCorlib::pIntPtr, "System", "IntPtr", llvm::PointerType::getUnqual(llvm::Type::getInt8Ty(getGlobalContext())), true); INIT(MSCorlib::pUIntPtr, "System", "UIntPtr", llvm::PointerType::getUnqual(llvm::Type::getInt8Ty(getGlobalContext())), true); INIT(MSCorlib::pDouble, "System", "Double", llvm::Type::getDoubleTy(getGlobalContext()), true); INIT(MSCorlib::pFloat, "System", "Single", llvm::Type::getFloatTy(getGlobalContext()), true); INIT(MSCorlib::pEnum, "System", "Enum", llvm::Type::getInt32Ty(getGlobalContext()), true); INIT(MSCorlib::pArray, "System", "Array", 0, true); INIT(MSCorlib::pException,"System", "Exception", 0, false); INIT(MSCorlib::pDelegate, "System", "Delegate", 0, false); #undef INIT VMClassArray::SuperArray = MSCorlib::pArray; MSCorlib::loadStringClass(vm); #define BUILD_ARRAY(name, type) \ MSCorlib::array##name = ass->constructArray(MSCorlib::p##name, 1); ON_TYPES(BUILD_ARRAY, _F_NT); ON_STRING(BUILD_ARRAY, _F_NT); N3::clinitName = vm->asciizToUTF8(".cctor"); N3::ctorName = vm->asciizToUTF8(".ctor"); N3::invokeName = vm->asciizToUTF8("Invoke"); N3::math = vm->asciizToUTF8("Math"); N3::system = vm->asciizToUTF8("System"); N3::sqrt = vm->asciizToUTF8("Sqrt"); N3::sin = vm->asciizToUTF8("Sin"); N3::cos = vm->asciizToUTF8("Cos"); N3::exp = vm->asciizToUTF8("Exp"); N3::log = vm->asciizToUTF8("Log"); N3::floor = vm->asciizToUTF8("Floor"); N3::log10 = vm->asciizToUTF8("Log10"); N3::isNan = vm->asciizToUTF8("IsNaN"); N3::pow = vm->asciizToUTF8("Pow"); N3::floatName = vm->asciizToUTF8("Float"); N3::doubleName = vm->asciizToUTF8("Double"); N3::testInfinity = vm->asciizToUTF8("TestInfinity"); MSCorlib::pArray->resolveType(1, 0, 0); MSCorlib::pArray->resolveVT(); MSCorlib::initialise(vm); }