[vmkit-commits] [vmkit] r54126 - in /vmkit/trunk/lib/N3/VMCore: Assembly.cpp Assembly.h CLISignature.cpp

Tilmann Scheller tilmann.scheller at googlemail.com
Sun Jul 27 12:42:11 PDT 2008


Author: tilmann
Date: Sun Jul 27 14:42:11 2008
New Revision: 54126

URL: http://llvm.org/viewvc/llvm-project?rev=54126&view=rev
Log:
add basic support for MethodSpecs

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

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sun Jul 27 14:42:11 2008
@@ -1754,6 +1754,7 @@
 
 VMMethod* Assembly::readMethodSpec(uint32 token) {
   uint32 index = token & 0xffff;
+  uint32 blobOffset = CLIHeader->blobStream->realOffset;
   
   Table* methodTable = CLIHeader->tables[CONSTANT_MethodSpec];
   uint32* methodArray = (uint32*) alloca(sizeof(uint32) * methodTable->rowSize);
@@ -1763,6 +1764,27 @@
   uint32 method = methodArray[CONSTANT_METHOD_SPEC_METHOD];
   uint32 instantiation = methodArray[CONSTANT_METHOD_SPEC_INSTANTIATION];
   
+  uint32 offset = blobOffset + instantiation;
+  
+  std::vector<VMCommonClass*> genArgs;
+  methodSpecSignature(offset, genArgs);
+  
+  uint32 table = method & 1;
+  index = method >> 1;
+  
+  uint32 methodToken;
+  
+  switch (table) {
+    case 0 : {
+      methodToken = index + (CONSTANT_MethodDef << 24);
+      break;
+    }
+    case 1 : {
+      methodToken = index + (CONSTANT_MemberRef << 24);
+      return readMemberRefAsMethod(methodToken);
+    }
+  }
+  
   VMThread::get()->vm->error("MethodSpec");
 //  return NULL;
   return (VMMethod*) (method ^ instantiation);

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Assembly.h (original)
+++ vmkit/trunk/lib/N3/VMCore/Assembly.h Sun Jul 27 14:42:11 2008
@@ -234,6 +234,8 @@
   bool isGenericMethod(uint32& offset);
   void localVarSignature(uint32& offset,
                          std::vector<VMCommonClass*>& locals);
+  void methodSpecSignature(uint32& offset,
+                           std::vector<VMCommonClass*>& genArgs);
   VMCommonClass* extractFieldSignature(uint32& offset);
   VMCommonClass* extractTypeInSignature(uint32& offset);
   VMCommonClass* exploreType(uint32& offset); 

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLISignature.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Sun Jul 27 14:42:11 2008
@@ -394,6 +394,22 @@
   return callingConvention & CONSTANT_Generic ? true : false;
 }
 
+void Assembly::methodSpecSignature(uint32& offset,
+                                   std::vector<VMCommonClass*>& genArgs) {
+  uncompressSignature(offset); // count
+  uint32 genericSig = uncompressSignature(offset);
+
+  if (genericSig != 0x0a) {
+    VMThread::get()->vm->error("unknown methodSpec sig %x", genericSig);
+  }
+
+  uint32 genArgCount = uncompressSignature(offset);
+  
+  for (uint32 i = 0; i < genArgCount; i++) {
+    genArgs.push_back(exploreType(offset));
+  }
+}
+
 void Assembly::localVarSignature(uint32& offset,
                                  std::vector<VMCommonClass*>& locals) {
   //uint32 count      = 





More information about the vmkit-commits mailing list