diff options
author | Jb Evain <jb@evain.net> | 2016-07-21 21:55:27 +0300 |
---|---|---|
committer | Jb Evain <jb@evain.net> | 2016-07-21 21:55:27 +0300 |
commit | cee7ad4f697bbdf3eecdafcef6e4e8056b808af2 (patch) | |
tree | 3a4eebf23e6b3728113628e0540cefef6203011f /Mono.Cecil.Cil/CodeReader.cs | |
parent | 64c70936bf0fa2a83ec0c2a85851e0d187fb451e (diff) |
Only create one code reader
Diffstat (limited to 'Mono.Cecil.Cil/CodeReader.cs')
-rw-r--r-- | Mono.Cecil.Cil/CodeReader.cs | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/Mono.Cecil.Cil/CodeReader.cs b/Mono.Cecil.Cil/CodeReader.cs index f102d68..b65e98a 100644 --- a/Mono.Cecil.Cil/CodeReader.cs +++ b/Mono.Cecil.Cil/CodeReader.cs @@ -30,23 +30,29 @@ namespace Mono.Cecil.Cil { get { return Position - start; } } - public CodeReader (MethodDefinition method, MetadataReader reader) + public CodeReader (MetadataReader reader) : base (reader.image.Stream) { this.reader = reader; + } + + public void MoveTo (MethodDefinition method) + { + this.method = method; this.reader.context = method; this.Position = (int) reader.image.ResolveVirtualAddress ((uint) method.RVA); } - public static MethodBody ReadMethodBody (MethodDefinition method, MetadataReader metadata) + public MethodBody ReadMethodBody (MethodDefinition method) { - var reader = new CodeReader (method, metadata); - reader.method = method; - reader.body = new MethodBody (method); + MoveTo (method); + this.body = new MethodBody (method); - reader.ReadMethodBody (); + ReadMethodBody (); - return reader.body; + this.reader.context = null; + + return this.body; } void ReadMethodBody () @@ -435,6 +441,8 @@ namespace Mono.Cecil.Cil { public ByteBuffer PatchRawMethodBody (MethodDefinition method, CodeWriter writer, out int code_size, out MetadataToken local_var_token) { + MoveTo (method); + var buffer = new ByteBuffer (); var flags = ReadByte (); @@ -454,6 +462,8 @@ namespace Mono.Cecil.Cil { throw new NotSupportedException (); } + reader.context = null; + return buffer; } |