internal ITypeReference/*?*/ GetTypeReferenceFromStandaloneSignatureToken( MethodDefinition owningObject, uint token ) { uint tokenKind = token & TokenTypeIds.TokenTypeMask; uint rowId = token & TokenTypeIds.RIDMask; if (tokenKind != TokenTypeIds.Signature) { //TODO: error return Dummy.TypeReference; } if (rowId == 0 || rowId > this.PEFileReader.StandAloneSigTable.NumberOfRows) { //TODO: error return Dummy.TypeReference; } StandAloneSigRow sigRow = this.PEFileReader.StandAloneSigTable[rowId]; // TODO: error checking offset in range MemoryBlock signatureMemoryBlock = this.PEFileReader.BlobStream.GetMemoryBlockAt(sigRow.Signature); // TODO: Error checking enough space in signature memoryBlock. MemoryReader memoryReader = new MemoryReader(signatureMemoryBlock); byte kind = memoryReader.PeekByte(0); if (SignatureHeader.IsFieldSignature(kind)) { FieldSignatureConverter converter = new FieldSignatureConverter(this, owningObject, memoryReader); return converter.TypeReference; } if (SignatureHeader.IsLocalVarSignature(kind)) { MethodBody.MethodBody/*?*/ body = owningObject.Body as MethodBody.MethodBody; if (body == null) { //TODO: error return Dummy.TypeReference; } LocalVariableSignatureConverter converter = new LocalVariableSignatureConverter(this, body, memoryReader); foreach (var loc in converter.LocalVariables) { return loc.Type; } } //TODO: error return Dummy.TypeReference; }