Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJb Evain <jb@evain.net>2016-07-21 21:55:27 +0300
committerJb Evain <jb@evain.net>2016-07-21 21:55:27 +0300
commitcee7ad4f697bbdf3eecdafcef6e4e8056b808af2 (patch)
tree3a4eebf23e6b3728113628e0540cefef6203011f
parent64c70936bf0fa2a83ec0c2a85851e0d187fb451e (diff)
Only create one code reader
-rw-r--r--Mono.Cecil.Cil/CodeReader.cs24
-rw-r--r--Mono.Cecil.Cil/CodeWriter.cs2
-rw-r--r--Mono.Cecil/AssemblyReader.cs4
-rw-r--r--rocks/Mono.Cecil.Rocks/ILParser.cs3
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,