[vmkit-commits] [vmkit] r53021 - in /vmkit/trunk/lib/N3/VMCore: VMClass.cpp VMClass.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Jul 2 07:40:58 PDT 2008


Author: geoffray
Date: Wed Jul  2 09:40:42 2008
New Revision: 53021

URL: http://llvm.org/viewvc/llvm-project?rev=53021&view=rev
Log:
When resolving types, do not also resolve the VT. It will
be allocated after the whole resolution process with type
unification.

Also, do type unification with PATypeHolders.


Modified:
    vmkit/trunk/lib/N3/VMCore/VMClass.cpp
    vmkit/trunk/lib/N3/VMCore/VMClass.h

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Wed Jul  2 09:40:42 2008
@@ -200,7 +200,7 @@
     int status = cl->status;
     if (status == ready) {
       cl->release();
-    } else if (status == unified) {
+    } else if (status == static_resolved) {
       cl->status = clinitParent;
       cl->release();
       if (cl->super) {
@@ -230,7 +230,7 @@
 
       cl->status = ready;
       cl->broadcastClass();
-    } else if (status < unified) {
+    } else if (status < static_resolved) {
       cl->release();
       VMThread::get()->vm->unknownError("try to clinit a not-readed class...");
     } else {
@@ -276,15 +276,12 @@
 }
 
 void VMClass::unifyTypes() {
+  PATypeHolder PA = naturalType;
   for (std::vector<VMField*>::iterator i = virtualFields.begin(), 
        e = virtualFields.end(); i!= e; ++i) {
-    (*i)->signature->resolveType(false, false);
+    (*i)->signature->resolveVirtual();
   }
-
-  if (naturalType->isAbstract())
-    naturalType = naturalType->getForwardedType();
-  
-  assert(naturalType);
+  naturalType = PA.get();
 }
 
 void VMClass::resolveVirtualFields() {
@@ -339,7 +336,7 @@
   }
   
   unifyTypes();
-
+  
   if (super == MSCorlib::pValue) {
     std::vector<const llvm::Type*> Elts;
     Elts.push_back(VMObject::llvmType->getContainedType(0));
@@ -352,19 +349,6 @@
     virtualType = naturalType;
   }
   
-  if (super != MSCorlib::pEnum) {
-    VirtualTable* VT = CLIJit::makeVT(this, false);
-  
-    uint64 size = mvm::jit::getTypeSize(this->virtualType->getContainedType(0));
-    virtualInstance = (VMObject*)gc::operator new(size, VT);
-    virtualInstance->initialise(this);
-
-    for (std::vector<VMField*>::iterator i = virtualFields.begin(),
-              e = virtualFields.end(); i!= e; ++i) {
-    
-      (*i)->initField(virtualInstance);
-    }
-  }
 
 }
 
@@ -378,7 +362,6 @@
   ((llvm::OpaqueType*)naturalType)->refineAbstractTypeTo(type);
   naturalType = type;
   virtualType = naturalType;
-  arrayVT = CLIJit::makeArrayVT(this);
 }
 
 void VMClassPointer::makeType() {
@@ -388,13 +371,13 @@
   naturalType = pType;
 }
 
-void VMCommonClass::resolveType(bool stat, bool clinit) {
+void VMCommonClass::resolveVirtual() {
   VMCommonClass* cl = this;
   //printf("*** Resolving: %s\n", cl->printString());
-  if (cl->status < resolved) {
+  if (cl->status < virtual_resolved) {
     cl->aquire();
     int status = cl->status;
-    if (status >= resolved) {
+    if (status >= virtual_resolved) {
       cl->release();
     } else if (status <  loaded) {
       cl->release();
@@ -405,13 +388,13 @@
         VMCommonClass* baseClass =  arrayCl->baseClass;
         baseClass->resolveType(false, false);
         arrayCl->makeType();
-        cl->status = resolved;
+        cl->status = virtual_resolved;
       } else if (cl->isPointer) {
         VMClassPointer* pointerCl = (VMClassPointer*)cl;
         VMCommonClass* baseClass =  pointerCl->baseClass;
         baseClass->resolveType(false, false);
         pointerCl->makeType();
-        cl->status = resolved;
+        cl->status = virtual_resolved;
       } else {
         cl->release();
         cl->loadParents();
@@ -420,50 +403,105 @@
         assembly->readClass(cl);
         cl->status = readed;
         ((VMClass*)cl)->resolveVirtualFields();
-        cl->status = resolved;
+        cl->status = virtual_resolved;
+      }
+      cl->release();
+    } else {
+      if (!(cl->ownerClass())) {
+        while (status < virtual_resolved) {
+          cl->waitClass();
+        }
+      }
+      cl->release();
+    }
+  }
+}
+
+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) {
+          VirtualTable* VT = CLIJit::makeVT(cl, false);
+  
+          uint64 size = mvm::jit::getTypeSize(cl->virtualType->getContainedType(0));
+          cl->virtualInstance = (VMObject*)gc::operator new(size, VT);
+          cl->virtualInstance->initialise(cl);
+
+          for (std::vector<VMField*>::iterator i = cl->virtualFields.begin(),
+               e = cl->virtualFields.end(); i!= e; ++i) {
+    
+            (*i)->initField(cl->virtualInstance);
+          }
+        }
+        cl->status = vt_resolved;
       }
       cl->release();
     } else {
       if (!(cl->ownerClass())) {
-        while (status < resolved) {
+        while (status < vt_resolved) {
           cl->waitClass();
         }
       }
       cl->release();
     }
   }
-  if (stat) cl->resolveStatic(clinit);
+}
+
+void VMCommonClass::resolveType(bool stat, bool clinit) {
+  resolveVirtual();
+  resolveVT();
+  if (stat) resolveStatic(clinit);
 }
 
 void VMCommonClass::resolveStatic(bool clinit) {
   VMCommonClass* cl = this;
-  if (cl->status < unified) {
+  if (cl->status < static_resolved) {
     cl->aquire();
     int status = cl->status;
-    if (status >= unified) {
+    if (status >= static_resolved) {
       cl->release();
-    } else if (status < resolved) {
+    } else if (status < vt_resolved) {
       cl->release();
       VMThread::get()->vm->unknownError("try to resolve static of a not virtual-resolved class");
-    } else if (status == resolved) {
+    } else if (status == vt_resolved) {
       if (cl->isArray) {
         VMClassArray* arrayCl = (VMClassArray*)cl;
         VMCommonClass* baseClass =  arrayCl->baseClass;
         baseClass->resolveStatic(false);
-        cl->status = unified;
+        cl->status = static_resolved;
       } else if (cl->isPointer) {
         VMClassPointer* pointerCl = (VMClassPointer*)cl;
         VMCommonClass* baseClass =  pointerCl->baseClass;
         baseClass->resolveStatic(false);
-        cl->status = unified;
+        cl->status = static_resolved;
       } else {
         ((VMClass*)cl)->resolveStaticFields();
-        cl->status = unified;
+        cl->status = static_resolved;
       }
       cl->release();
     } else {
       if (!(cl->ownerClass())) {
-        while (status < unified) {
+        while (status < static_resolved) {
           cl->waitClass();
         }
       }
@@ -577,6 +615,7 @@
 }
 
 VMObject* VMClass::doNew() {
+  if (status < inClinit) resolveType(true, true);
   uint64 size = mvm::jit::getTypeSize(virtualType->getContainedType(0));
   VMObject* res = (VMObject*)
     gc::operator new(size, virtualInstance->getVirtualTable());
@@ -585,6 +624,7 @@
 }
 
 VMObject* VMClassArray::doNew(uint32 nb) {
+  if (status < inClinit) resolveType(true, true);
   uint64 size = mvm::jit::getTypeSize(baseClass->naturalType);
   VMArray* res = (VMArray*)
     gc::operator new(size * nb + sizeof(VMObject) + sizeof(sint32), arrayVT);

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.h Wed Jul  2 09:40:42 2008
@@ -37,7 +37,7 @@
 class VMObject;
 
 typedef enum VMClassState {
-  hashed = 0, loaded, prepared, readed, resolved, unified, clinitParent, inClinit, ready
+  hashed = 0, loaded, prepared, readed, virtual_resolved, vt_resolved, static_resolved, clinitParent, inClinit, ready
 }VMClassState;
 
 
@@ -100,6 +100,8 @@
   void assignType();
   void clinitClass();
   void resolveStatic(bool clinit);
+  void resolveVirtual();
+  void resolveVT();
   void resolveType(bool stat, bool clinit);
   void loadParents();
   





More information about the vmkit-commits mailing list