[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