All pastes #989612 Raw Edit

Mine

public text v1 · immutable
#989612 ·published 2008-04-19 15:25 UTC
rendered paste body
Index: ChangeLog
===================================================================
--- ChangeLog   (revision 100976)
+++ ChangeLog   (working copy)
@@ -1,3 +1,12 @@
+2008-04-19  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * Mono.Cecil.Cil/CodeReader.cs:
+       * Mono.Cecil.Cil/ISymbolReader.cs:
+               Move reading of debugging symbols where it's possible to
+               reuse the existing Hashtable (offset, Instruction) in
+               the debugging libraries. Change interface to allow
+               passing the Hashtable.
+
 2008-04-15  Sebastien Pouliot  <sebastien@ximian.com>

        * Mono.Cecil.csproj
Index: Mono.Cecil.Cil/CodeReader.cs
===================================================================
--- Mono.Cecil.Cil/CodeReader.cs        (revision 100976)
+++ Mono.Cecil.Cil/CodeReader.cs        (working copy)
@@ -77,9 +77,6 @@
                                        ReadSection (methBody, br);
                                break;
                        }
-
-                       if (m_reflectReader.SymbolReader != null)
-                               m_reflectReader.SymbolReader.Read (methBody);
                }

                public static uint GetRid (int token)
@@ -239,6 +236,9 @@
                                        break;
                                }
                        }
+
+                       if (m_reflectReader.SymbolReader != null)
+                               m_reflectReader.SymbolReader.Read (body, m_instructions);
                }

                Instruction GetInstruction (MethodBody body, int offset)
Index: Mono.Cecil.Cil/ISymbolReader.cs
===================================================================
--- Mono.Cecil.Cil/ISymbolReader.cs     (revision 100976)
+++ Mono.Cecil.Cil/ISymbolReader.cs     (working copy)
@@ -26,12 +26,13 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //

+using System;
+using System.Collections;
+
 namespace Mono.Cecil.Cil {

-       using System;
-
        public interface ISymbolReader : IDisposable {

-               void Read (MethodBody body);
+               void Read (MethodBody body, IDictionary instructions);
        }
 }
Index: Mono.Cecil.Mdb/MdbReader.cs
===================================================================
--- Mono.Cecil.Mdb/MdbReader.cs (revision 100976)
+++ Mono.Cecil.Mdb/MdbReader.cs (working copy)
@@ -47,17 +47,8 @@
                        m_scopes = new Hashtable ();
                }

-               Hashtable GetInstructions (MethodBody body)
+               Instruction GetInstruction (MethodBody body, IDictionary instructions, int offset)
                {
-                       Hashtable instructions = new Hashtable (body.Instructions.Count);
-                       foreach (Instruction i in body.Instructions)
-                               instructions.Add (i.Offset, i);
-
-                       return instructions;
-               }
-
-               Instruction GetInstruction (MethodBody body, Hashtable instructions, int offset)
-               {
                        Instruction instr = (Instruction) instructions [offset];
                        if (instr != null)
                                return instr;
@@ -65,13 +56,12 @@
                        return body.Instructions.Outside;
                }

-               public void Read (MethodBody body)
+               public void Read (MethodBody body, IDictionary instructions)
                {
                        MethodEntry entry = m_symFile.GetMethodByToken ((int) body.Method.MetadataToken.ToUInt ());
                        if (entry == null)
                                return;

-                       Hashtable instructions = GetInstructions(body);
                        ReadScopes (entry, body, instructions);
                        ReadLineNumbers (entry, instructions);
                        ReadLocalVariables (entry, body);
@@ -90,7 +80,7 @@
                        }
                }

-               void ReadLineNumbers (MethodEntry entry, Hashtable instructions)
+               void ReadLineNumbers (MethodEntry entry, IDictionary instructions)
                {
                        foreach (LineNumberEntry line in entry.LineNumbers) {
                                Instruction instr = instructions [line.Offset] as Instruction;
@@ -116,7 +106,7 @@
                        return doc;
                }

-               void ReadScopes (MethodEntry entry, MethodBody body, Hashtable instructions)
+               void ReadScopes (MethodEntry entry, MethodBody body, IDictionary instructions)
                {
                        foreach (LexicalBlockEntry scope in entry.LexicalBlocks) {
                                Scope s = new Scope ();
Index: ChangeLog
===================================================================
--- ChangeLog   (revision 100976)
+++ ChangeLog   (working copy)
@@ -1,3 +1,9 @@
+2008-04-18  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * Mono.Cecil.Mdb/MdbReader.cs: Update wrt interface change (i.e.
+       Read now provide a Dictionary to reuse the existing Hashtable
+       between offsets and instructions).
+
 2008-04-08  Sebastien Pouliot  <sebastien@ximian.com>

        * Mono.Cecil.Mdb/MdbReader.cs:
+2008-04-18  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * Mono.Cecil.Pdb/PdbFactory.cs: Use the same parameter names as the
+       ISymbolStoreFactory uses (this pleases Gendarme)
+       * Mono.Cecil.Pdb/PdbReader.cs: Update wrt interface change (i.e.
+       Read now provide a Dictionary to reuse the existing Hashtable
+       between offsets and instructions).
+
 2007-11-15     Rodrigo B. de Oliveira <rodrigobamboo@gmail.com>

        * Mono.Cecil.Pdb/default.build: fixed relative paths
Index: Mono.Cecil.Pdb/PdbFactory.cs
===================================================================
--- Mono.Cecil.Pdb/PdbFactory.cs        (revision 100856)
+++ Mono.Cecil.Pdb/PdbFactory.cs        (working copy)
@@ -32,15 +32,15 @@

        public class PdbFactory : ISymbolStoreFactory {

-               public ISymbolReader CreateReader (ModuleDefinition module, string assembly)
+               public ISymbolReader CreateReader (ModuleDefinition module, string assemblyFileName)
                {
-                       return new PdbReader (PdbHelper.CreateReader (assembly));
+                       return new PdbReader (PdbHelper.CreateReader (assemblyFileName));
                }

-               public ISymbolWriter CreateWriter (ModuleDefinition module, string assembly)
+               public ISymbolWriter CreateWriter (ModuleDefinition module, string assemblyFileName)
                {
-                       string pdb = string.Concat(assembly.Substring(0, assembly.LastIndexOf(".")), ".pdb");
-                       return new PdbWriter (PdbHelper.CreateWriter (assembly, pdb), module, pdb);
+                       string pdb = string.Concat (assemblyFileName.Substring (0, assemblyFileName.LastIndexOf (".")), ".pdb");
+                       return new PdbWriter (PdbHelper.CreateWriter (assemblyFileName, pdb), module, pdb);
                }
        }
 }
Index: Mono.Cecil.Pdb/PdbReader.cs
===================================================================
--- Mono.Cecil.Pdb/PdbReader.cs (revision 100856)
+++ Mono.Cecil.Pdb/PdbReader.cs (working copy)
@@ -45,28 +45,18 @@
                        m_documents = new Hashtable ();
                }

-               public void Read (Cil.MethodBody body)
+               public void Read (Cil.MethodBody body, IDictionary instructions)
                {
                        try {
                                ISymbolMethod method = m_reader.GetMethod (new SymbolToken ((int) body.Method.MetadataToken.ToUInt ()));
-                               Hashtable instructions = GetInstructions (body);

                                ReadSequencePoints (method, instructions);
                                ReadScopeAndLocals (method.RootScope, null, body, instructions);
                        } catch (COMException) {}
                }

-               static Hashtable GetInstructions (Cil.MethodBody body)
+               static Cil.Instruction GetInstruction (Cil.MethodBody body, IDictionary instructions, int offset)
                {
-                       Hashtable instructions = new Hashtable (body.Instructions.Count);
-                       foreach (Cil.Instruction i in body.Instructions)
-                               instructions.Add (i.Offset, i);
-
-                       return instructions;
-               }
-
-               static Cil.Instruction GetInstruction (Cil.MethodBody body, Hashtable instructions, int offset)
-               {
                        Cil.Instruction instr = (Cil.Instruction) instructions [offset];
                        if (instr != null)
                                return instr;
@@ -74,7 +64,7 @@
                        return body.Instructions.Outside;
                }

-               static void ReadScopeAndLocals (ISymbolScope scope, Cil.Scope parent, Cil.MethodBody body, Hashtable instructions)
+               static void ReadScopeAndLocals (ISymbolScope scope, Cil.Scope parent, Cil.MethodBody body, IDictionary instructions)
                {
                        Cil.Scope s = new Cil.Scope ();
                        s.Start = GetInstruction (body, instructions, scope.StartOffset);
@@ -96,7 +86,9 @@
                                ReadScopeAndLocals (child, s, body, instructions);
                }

-               void ReadSequencePoints(ISymbolMethod method, Hashtable instructions)
+               // note: sadly it's not possible to cache all the [count] allocations and reuse them.
+               // a NRE is throw if the size of the arrays does not match SequencePointCount :(
+               void ReadSequencePoints (ISymbolMethod method, IDictionary instructions)
                {
                        int count = method.SequencePointCount;
                        int [] offsets = new int [count];