private static void ReadLocalVariables( ModuleDefinition module, CilMethodBody result, CilRawFatMethodBody fatBody) { if (fatBody.LocalVarSigToken != MetadataToken.Zero && module.TryLookupMember(fatBody.LocalVarSigToken, out var member) && member is StandAloneSignature { Signature : LocalVariablesSignature localVariablesSignature })
private static void ReadLocalVariables(ModuleDefinition module, CilMethodBody result, CilRawFatMethodBody fatBody) { if (fatBody.LocalVarSigToken != MetadataToken.Zero && module.TryLookupMember(fatBody.LocalVarSigToken, out var member) && member is StandAloneSignature signature && signature.Signature is LocalVariablesSignature localVariablesSignature) { foreach (var type in localVariablesSignature.VariableTypes) result.LocalVariables.Add(new CilLocalVariable(type)); } }
private static void ReadExceptionHandlers(CilRawFatMethodBody fatBody, CilMethodBody result) { foreach (var section in fatBody.ExtraSections) { if (section.IsEHTable) { var reader = new ByteArrayReader(section.Data); int size = section.IsFat ? CilExceptionHandler.FatExceptionHandlerSize : CilExceptionHandler.TinyExceptionHandlerSize; while (reader.CanRead(size)) result.ExceptionHandlers.Add(CilExceptionHandler.FromReader(result, reader, section.IsFat)); } } }
private CilRawMethodBody BuildFatMethodBody(MethodBodySerializationContext context, CilMethodBody body, byte[] code) { // Serialize local variables. MetadataToken token; if (body.LocalVariables.Count == 0) { token = MetadataToken.Zero; } else { var localVarSig = new LocalVariablesSignature(body.LocalVariables.Select(v => v.VariableType)); var standAloneSig = new StandAloneSignature(localVarSig); token = context.TokenProvider.GetStandAloneSignatureToken(standAloneSig); } var fatBody = new CilRawFatMethodBody(CilMethodBodyAttributes.Fat, (ushort)body.MaxStack, token, code); fatBody.InitLocals = body.InitializeLocals; // Build up EH table section. if (body.ExceptionHandlers.Count > 0) { fatBody.HasSections = true; bool needsFatFormat = body.ExceptionHandlers.Any(e => e.IsFat); var attributes = CilExtraSectionAttributes.EHTable; if (needsFatFormat) { attributes |= CilExtraSectionAttributes.FatFormat; } var rawSectionData = SerializeExceptionHandlers(context, body.ExceptionHandlers, needsFatFormat); var section = new CilExtraSection(attributes, rawSectionData); fatBody.ExtraSections.Add(section); } return(fatBody); }