Пример #1
0
        private uint WriteUnresolvedMethodBody(MethodDefinition method)
        {
            int           code_size;
            MetadataToken local_var_token;
            ByteBuffer    byteBuffer = metadata.module.reader.code.PatchRawMethodBody(method, this, out code_size, out local_var_token);
            bool          num        = (byteBuffer.buffer[0] & 3) == 3;

            if (num)
            {
                Align(4);
            }
            uint result = BeginMethod();

            if (num || !GetOrMapTinyMethodBody(byteBuffer, ref result))
            {
                base.WriteBytes(byteBuffer);
            }
            if (method.debug_info == null)
            {
                return(result);
            }
            ISymbolWriter symbol_writer = metadata.symbol_writer;

            if (symbol_writer != null)
            {
                method.debug_info.code_size       = code_size;
                method.debug_info.local_var_token = local_var_token;
                symbol_writer.Write(method.debug_info);
            }
            return(result);
        }
Пример #2
0
        private RVA WriteUnresolvedMethodBody(MethodDefinition method)
        {
            var code_reader = metadata.module.reader.code;

            var  raw_body   = code_reader.PatchRawMethodBody(method, this, out int code_size, out MetadataToken local_var_token);
            bool fat_header = (raw_body.buffer[0] & 0x3) == 0x3;

            if (fat_header)
            {
                Align(4);
            }

            uint rva = BeginMethod();

            if (fat_header || !GetOrMapTinyMethodBody(raw_body, ref rva))
            {
                WriteBytes(raw_body);
            }

            if (method.debug_info == null)
            {
                return(rva);
            }

            ISymbolWriter symbol_writer = metadata.symbol_writer;

            if (symbol_writer != null)
            {
                method.debug_info.code_size       = code_size;
                method.debug_info.local_var_token = local_var_token;
                symbol_writer.Write(method.debug_info);
            }

            return(rva);
        }
Пример #3
0
        private RVA WriteResolvedMethodBody(MethodDefinition method)
        {
            RVA rva;

            body = method.Body;
            ComputeHeader();
            if (RequiresFatHeader())
            {
                Align(4);
                rva = BeginMethod();
                WriteFatHeader();
                WriteInstructions();

                if (body.HasExceptionHandlers)
                {
                    WriteExceptionHandlers();
                }
            }
            else
            {
                rva = BeginMethod();
                WriteByte((byte)(0x2 | (body.CodeSize << 2))); // tiny
                WriteInstructions();

                int    start_position = (int)(rva - code_base);
                int    body_size      = position - start_position;
                byte[] body_bytes     = new byte[body_size];

                Array.Copy(buffer, start_position, body_bytes, 0, body_size);

                if (GetOrMapTinyMethodBody(new ByteBuffer(body_bytes), ref rva))
                {
                    position = start_position;
                }
            }

            ISymbolWriter symbol_writer = metadata.symbol_writer;

            if (symbol_writer != null && method.debug_info != null)
            {
                method.debug_info.code_size       = body.CodeSize;
                method.debug_info.local_var_token = body.local_var_token;
                symbol_writer.Write(method.debug_info);
            }

            return(rva);
        }
Пример #4
0
        private void WriteUnresolvedMethodBody(MethodDefinition method)
        {
            MethodSymbols symbols;
            ByteBuffer    buffer = this.metadata.module.Read <MethodDefinition, CodeReader>(method, (_, reader) => reader.code).PatchRawMethodBody(method, this, out symbols);

            base.WriteBytes(buffer);
            if (!symbols.instructions.IsNullOrEmpty <InstructionSymbol>())
            {
                symbols.method_token    = method.token;
                symbols.local_var_token = GetLocalVarToken(buffer, symbols);
                ISymbolWriter writer = this.metadata.symbol_writer;
                if (writer != null)
                {
                    writer.Write(symbols);
                }
            }
        }
Пример #5
0
        private void WriteUnresolvedMethodBody(MethodDefinition method)
        {
            MethodSymbols localVarToken;
            ByteBuffer    byteBuffer = this.metadata.module.Read <MethodDefinition, CodeReader>(method, (MethodDefinition _, MetadataReader reader) => reader.code).PatchRawMethodBody(method, this, out localVarToken);

            base.WriteBytes(byteBuffer);
            if (localVarToken.instructions.IsNullOrEmpty <InstructionSymbol>())
            {
                return;
            }
            localVarToken.method_token    = method.token;
            localVarToken.local_var_token = CodeWriter.GetLocalVarToken(byteBuffer, localVarToken);
            ISymbolWriter symbolWriter = this.metadata.symbol_writer;

            if (symbolWriter != null)
            {
                symbolWriter.Write(localVarToken);
            }
        }
Пример #6
0
        private uint WriteResolvedMethodBody(MethodDefinition method)
        {
            body = method.Body;
            ComputeHeader();
            uint num;

            if (RequiresFatHeader())
            {
                Align(4);
                num = BeginMethod();
                WriteFatHeader();
                WriteInstructions();
                if (body.HasExceptionHandlers)
                {
                    WriteExceptionHandlers();
                }
            }
            else
            {
                num = BeginMethod();
                base.WriteByte((byte)(2 | body.CodeSize << 2));
                WriteInstructions();
                int    num2  = (int)(num - code_base);
                int    num3  = base.position - num2;
                byte[] array = new byte[num3];
                Array.Copy(base.buffer, num2, array, 0, num3);
                if (GetOrMapTinyMethodBody(new ByteBuffer(array), ref num))
                {
                    base.position = num2;
                }
            }
            ISymbolWriter symbol_writer = metadata.symbol_writer;

            if (symbol_writer != null && method.debug_info != null)
            {
                method.debug_info.code_size       = body.CodeSize;
                method.debug_info.local_var_token = body.local_var_token;
                symbol_writer.Write(method.debug_info);
            }
            return(num);
        }
Пример #7
0
        private void WriteResolvedMethodBody(MethodDefinition method)
        {
            this.body = method.Body;
            this.ComputeHeader();
            if (this.RequiresFatHeader())
            {
                this.WriteFatHeader();
            }
            else
            {
                base.WriteByte((byte)(2 | (this.body.CodeSize << 2)));
            }
            this.WriteInstructions();
            if (this.body.HasExceptionHandlers)
            {
                this.WriteExceptionHandlers();
            }
            ISymbolWriter writer = this.metadata.symbol_writer;

            if (writer != null)
            {
                writer.Write(this.body);
            }
        }
Пример #8
0
 public void Write(MethodDebugInformation info)
 {
     symbol_writer.Write(info);
 }
Пример #9
0
 public void Write(MethodDebugInformation info) => _symbolWriter.Write(info);