private bool LoadLocalSignature() { EnumerableArrayWrapper <LocalVariableDefinition, ILocalDefinition> localVariables = ILReader.EmptyLocalVariables; uint locVarRID = _methodIL.LocalSignatureToken & TokenTypeIds.RIDMask; if (locVarRID != 0x00000000) { StandAloneSigRow sigRow = this.PEFileToObjectModel.PEFileReader.StandAloneSigTable[locVarRID]; // TODO: error checking offset in range MemoryBlock signatureMemoryBlock = this.PEFileToObjectModel.PEFileReader.BlobStream.GetMemoryBlockAt(sigRow.Signature); // TODO: Error checking enough space in signature memoryBlock. MemoryReader memoryReader = new MemoryReader(signatureMemoryBlock); // TODO: Check if this is really local var signature there. LocalVariableSignatureConverter locVarSigConv = new LocalVariableSignatureConverter(this.PEFileToObjectModel, this.MethodBody, memoryReader); localVariables = locVarSigConv.LocalVariables; } this.MethodBody.SetLocalVariables(localVariables); return(true); }
bool LoadLocalSignature() { uint locVarRID = this.MethodIL.LocalSignatureToken & TokenTypeIds.RIDMask; if (locVarRID != 0x00000000) { StandAloneSigRow sigRow = this.PEFileToObjectModel.PEFileReader.StandAloneSigTable[locVarRID]; // TODO: error checking offset in range MemoryBlock signatureMemoryBlock = this.PEFileToObjectModel.PEFileReader.BlobStream.GetMemoryBlockAt(sigRow.Signature); // TODO: Error checking enough space in signature memoryBlock. MemoryReader memoryReader = new MemoryReader(signatureMemoryBlock); // TODO: Check if this is really local var signature there. LocalVariableSignatureConverter locVarSigConv = new LocalVariableSignatureConverter(this.PEFileToObjectModel, this.MethodBody, memoryReader); this.MethodBody.SetLocalVariables(locVarSigConv.LocalVariables); } return true; }
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; }