示例#1
0
 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
     })
示例#2
0
 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));
     }
 }
示例#3
0
        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));
                }
            }
        }
示例#4
0
        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);
        }