[vmkit-commits] [vmkit] r53232 - in /vmkit/trunk/lib/N3: Mono/Mono.cpp Mono/MonoMSCorlib.cpp PNetLib/PNetMSCorlib.cpp VMCore/VMClass.cpp VMCore/VMClass.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue Jul 8 03:51:32 PDT 2008
Author: geoffray
Date: Tue Jul 8 05:51:32 2008
New Revision: 53232
URL: http://llvm.org/viewvc/llvm-project?rev=53232&view=rev
Log:
Fix tye resolution. A virtual table is only allocated during
clinit. This makes the string hack trickier.
Modified:
vmkit/trunk/lib/N3/Mono/Mono.cpp
vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.h
Modified: vmkit/trunk/lib/N3/Mono/Mono.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/Mono.cpp?rev=53232&r1=53231&r2=53232&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/Mono/Mono.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/Mono.cpp Tue Jul 8 05:51:32 2008
@@ -7,10 +7,10 @@
//
//===----------------------------------------------------------------------===//
-
#include "mvm/JIT.h"
#include "Assembly.h"
+#include "MonoString.h"
#include "MSCorlib.h"
#include "N3.h"
#include "Reader.h"
@@ -57,3 +57,13 @@
extern "C" VMObject* System_Type_GetTypeFromHandle(VMCommonClass* cl) {
return cl->getClassDelegatee();
}
+
+extern "C" int System_Environment_get_Platform (void) {
+#if defined (PLATFORM_WIN32)
+ /* Win32NT */
+ return 2;
+#else
+ /* Unix */
+ return 128;
+#endif
+}
Modified: vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp?rev=53232&r1=53231&r2=53232&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Tue Jul 8 05:51:32 2008
@@ -25,7 +25,10 @@
vm->asciizConstructUTF8("System"),
false, false, false, true);
MSCorlib::pString = type;
- type->resolveType(false, false);
+ MSCorlib::pObject->resolveType(true, false);
+ MSCorlib::pObject->resolveVT();
+ type->resolveType(true, false);
+ type->resolveVT();
uint64 size = mvm::jit::getTypeSize(type->virtualType->getContainedType(0)) + sizeof(const UTF8*) + sizeof(llvm::GlobalVariable*);
type->virtualInstance =
Modified: vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp?rev=53232&r1=53231&r2=53232&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp Tue Jul 8 05:51:32 2008
@@ -25,7 +25,10 @@
vm->asciizConstructUTF8("System"),
false, false, false, true);
MSCorlib::pString = type;
- type->resolveType(false, false);
+ MSCorlib::pObject->resolveType(true, false);
+ MSCorlib::pObject->resolveVT();
+ type->resolveType(true, false);
+ type->resolveVT();
uint64 size = mvm::jit::getTypeSize(type->virtualType->getContainedType(0)) + sizeof(const UTF8*) + sizeof(llvm::GlobalVariable*);
type->virtualInstance =
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=53232&r1=53231&r2=53232&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Tue Jul 8 05:51:32 2008
@@ -211,6 +211,7 @@
}
cl->status = inClinit;
+ resolveVT();
std::vector<VMCommonClass*> args;
args.push_back(MSCorlib::pVoid);
VMMethod* meth = cl->lookupMethodDontThrow(N3::clinitName, args,
@@ -419,28 +420,18 @@
void VMCommonClass::resolveVT() {
VMCommonClass* cl = this;
- //printf("*** Resolving: %s\n", cl->printString());
- if (cl->status < vt_resolved) {
- cl->aquire();
- int status = cl->status;
- if (status >= vt_resolved) {
- cl->release();
- } else if (status < loaded) {
- cl->release();
- VMThread::get()->vm->unknownError("try to vt-resolve a not-resolved class");
- } else if (status == virtual_resolved) {
if (cl->isArray) {
VMClassArray* arrayCl = (VMClassArray*)cl;
arrayCl->baseClass->resolveVT();
arrayCl->arrayVT = CLIJit::makeArrayVT(arrayCl);
- cl->status = vt_resolved;
} else if (cl->isPointer) {
- cl->status = vt_resolved;
} else {
VMClass* cl = (VMClass*)this;
if (super) super->resolveVT();
- if (super != MSCorlib::pEnum) {
+ // We check for virtual instance because the string class has a
+ // bigger size than the class declares.
+ if (super != MSCorlib::pEnum && !cl->virtualInstance) {
VirtualTable* VT = CLIJit::makeVT(cl, false);
uint64 size = mvm::jit::getTypeSize(cl->virtualType->getContainedType(0));
@@ -453,23 +444,11 @@
(*i)->initField(cl->virtualInstance);
}
}
- cl->status = vt_resolved;
}
- cl->release();
- } else {
- if (!(cl->ownerClass())) {
- while (status < vt_resolved) {
- cl->waitClass();
- }
- }
- cl->release();
- }
- }
}
void VMCommonClass::resolveType(bool stat, bool clinit) {
resolveVirtual();
- resolveVT();
if (stat) resolveStatic(clinit);
}
@@ -480,10 +459,10 @@
int status = cl->status;
if (status >= static_resolved) {
cl->release();
- } else if (status < vt_resolved) {
+ } else if (status < virtual_resolved) {
cl->release();
VMThread::get()->vm->unknownError("try to resolve static of a not virtual-resolved class");
- } else if (status == vt_resolved) {
+ } else if (status == virtual_resolved) {
if (cl->isArray) {
VMClassArray* arrayCl = (VMClassArray*)cl;
VMCommonClass* baseClass = arrayCl->baseClass;
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.h?rev=53232&r1=53231&r2=53232&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.h Tue Jul 8 05:51:32 2008
@@ -37,7 +37,7 @@
class VMObject;
typedef enum VMClassState {
- hashed = 0, loaded, prepared, readed, virtual_resolved, vt_resolved, static_resolved, clinitParent, inClinit, ready
+ hashed = 0, loaded, prepared, readed, virtual_resolved, static_resolved, clinitParent, inClinit, ready
}VMClassState;
More information about the vmkit-commits
mailing list