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 | |
parent | 64c70936bf0fa2a83ec0c2a85851e0d187fb451e (diff) |
Only create one code reader
-rw-r--r-- | Mono.Cecil.Cil/CodeReader.cs | 24 | ||||
-rw-r--r-- | Mono.Cecil.Cil/CodeWriter.cs | 2 | ||||
-rw-r--r-- | Mono.Cecil/AssemblyReader.cs | 4 | ||||
-rw-r--r-- | rocks/Mono.Cecil.Rocks/ILParser.cs | 3 |
4 files changed, 23 insertions, 10 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; } diff --git a/Mono.Cecil.Cil/CodeWriter.cs b/Mono.Cecil.Cil/CodeWriter.cs index 6659a10..58c9277 100644 --- a/Mono.Cecil.Cil/CodeWriter.cs +++ b/Mono.Cecil.Cil/CodeWriter.cs @@ -75,7 +75,7 @@ namespace Mono.Cecil.Cil { void WriteUnresolvedMethodBody (MethodDefinition method) { - var code_reader = metadata.module.Read (method, (m, reader) => new CodeReader (m, reader)); + var code_reader = metadata.module.Read (method, (_, reader) => reader.code); int code_size; MetadataToken local_var_token; diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index 91d6dae..8211a10 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -443,6 +443,7 @@ namespace Mono.Cecil { readonly internal ModuleDefinition module; readonly internal MetadataSystem metadata; + internal CodeReader code; internal IGenericContext context; readonly MetadataReader metadata_reader; @@ -458,6 +459,7 @@ namespace Mono.Cecil { this.image = module.Image; this.module = module; this.metadata = module.MetadataSystem; + this.code = new CodeReader (this); } public MetadataReader (Image image, ModuleDefinition module, MetadataReader metadata_reader) @@ -2140,7 +2142,7 @@ namespace Mono.Cecil { public MethodBody ReadMethodBody (MethodDefinition method) { - return CodeReader.ReadMethodBody (method, this); + return code.ReadMethodBody (method); } public CallSite ReadCallSite (MetadataToken token) diff --git a/rocks/Mono.Cecil.Rocks/ILParser.cs b/rocks/Mono.Cecil.Rocks/ILParser.cs index a6b9383..8d119eb 100644 --- a/rocks/Mono.Cecil.Rocks/ILParser.cs +++ b/rocks/Mono.Cecil.Rocks/ILParser.cs @@ -79,7 +79,8 @@ namespace Mono.Cecil.Rocks { static ParseContext CreateContext (MethodDefinition method, IILVisitor visitor) { - var code = method.Module.Read (method, (m, reader) => new CodeReader (method, reader)); + var code = method.Module.Read (method, (_, reader) => reader.code); + code.MoveTo (method); return new ParseContext { Code = code, |