[vmkit-commits] [vmkit] r54883 - in /vmkit/trunk/lib/N3/VMCore: Assembly.cpp CLIJit.cpp CLISignature.cpp VMClass.cpp

Tilmann Scheller tilmann.scheller at googlemail.com
Sun Aug 17 06:27:07 PDT 2008


Author: tilmann
Date: Sun Aug 17 08:27:07 2008
New Revision: 54883

URL: http://llvm.org/viewvc/llvm-project?rev=54883&view=rev
Log:
fix bugs in generics implementation of N3

Modified:
    vmkit/trunk/lib/N3/VMCore/Assembly.cpp
    vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
    vmkit/trunk/lib/N3/VMCore/CLISignature.cpp
    vmkit/trunk/lib/N3/VMCore/VMClass.cpp

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sun Aug 17 08:27:07 2008
@@ -1780,16 +1780,28 @@
     case 3: VMThread::get()->vm->error("implement me %d", table); break;
     case 4: {
       VMClass* type = (VMClass*) readTypeSpec(vm, index);
-      type->resolveType(false, false);
-  
+        
       VMGenericClass* genClass = dynamic_cast<VMGenericClass*> (type);
   
       if (genClass) {
+        // temporarily store the current generic class, in case it's generic arguments
+        // are referenced in the current method
+        VMGenericClass* old = VMThread::get()->currGenericClass;
+        VMThread::get()->currGenericClass = genClass;
+        
+        type->resolveType(false, false);
+        
         bool virt = extractMethodSignature(offset, type, args);
         VMMethod* meth = instantiateGenericMethod(genArgs, type, name, args,
             token, virt);
+        
+        // restore previous generic class
+        VMThread::get()->currGenericClass = old;
+        
         return meth;
       } else {
+        type->resolveType(false, false);
+        
         VMMethod* meth = gc_new(VMMethod)() ;
         bool virt = extractMethodSignature(offset, type, args);
         bool structReturn = false;

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Sun Aug 17 08:27:07 2008
@@ -2237,7 +2237,7 @@
   addPass(PM, llvm::createInstructionCombiningPass()); // Clean up after the unroller
   //addPass(PM, mvm::createArrayChecksPass()); 
   addPass(PM, llvm::createGVNPass());                  // GVN for load instructions
-  addPass(PM, llvm::createGCSEPass());                 // Remove common subexprs
+  //addPass(PM, llvm::createGCSEPass());                 // Remove common subexprs
   addPass(PM, llvm::createSCCPPass());                 // Constant prop with SCCP
   addPass(PM, llvm::createPredicateSimplifierPass());                
   

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLISignature.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Sun Aug 17 08:27:07 2008
@@ -142,6 +142,8 @@
 static VMCommonClass* METHOD_ElementTypeVar(uint32 op, Assembly* ass, uint32& offset) {
   uint32 number = ass->uncompressSignature(offset);
   
+  assert(VMThread::get()->currGenericClass != NULL && "Current Generic Class not set!");
+  
   return VMThread::get()->currGenericClass->genericParams[number];
 }
 
@@ -257,6 +259,10 @@
     VMClass* cl = gc_new(VMClass)();
     cl->token = number;
     cl->assembly = NULL;
+    cl->nameSpace = UTF8::asciizConstruct(VMThread::get()->vm, "");
+    char *tmp = (char *) alloca(100);
+    snprintf(tmp, 100, "!!%d", number);
+    cl->name = UTF8::asciizConstruct(VMThread::get()->vm, tmp);
     return cl;
   } else {
     return VMThread::get()->currGenericMethod->genericParams[number];

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Sun Aug 17 08:27:07 2008
@@ -474,8 +474,16 @@
 }
 
 void VMCommonClass::resolveType(bool stat, bool clinit) {
+  // save previous current generic class to restore it later
+  VMGenericClass* old = VMThread::get()->currGenericClass;
+  // temporarily store the class being compiled in case it is a generic class
+  VMThread::get()->currGenericClass = dynamic_cast<VMGenericClass*>(this);
+  
   resolveVirtual();
   if (stat) resolveStatic(clinit);
+  
+  // restore saved class
+  VMThread::get()->currGenericClass = old;
 }
 
 void VMCommonClass::resolveStatic(bool clinit) {





More information about the vmkit-commits mailing list