5
// Jb Evain (jbevain@gmail.com)
9
// Permission is hereby granted, free of charge, to any person obtaining
10
// a copy of this software and associated documentation files (the
11
// "Software"), to deal in the Software without restriction, including
12
// without limitation the rights to use, copy, modify, merge, publish,
13
// distribute, sublicense, and/or sell copies of the Software, and to
14
// permit persons to whom the Software is furnished to do so, subject to
15
// the following conditions:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
namespace Mono.Cecil.MdbOld {
31
using System.Collections;
35
using Mono.CompilerServices.SymbolWriterOld;
37
class MdbReader : ISymbolReader {
39
MonoSymbolFile m_symFile;
40
Hashtable m_documents;
43
public MdbReader (MonoSymbolFile symFile)
46
m_documents = new Hashtable ();
47
m_scopes = new Hashtable ();
50
Instruction GetInstruction (MethodBody body, IDictionary instructions, int offset)
52
Instruction instr = (Instruction) instructions [offset];
56
return body.Instructions.Outside;
59
public void Read (MethodBody body, IDictionary instructions)
61
MethodEntry entry = m_symFile.GetMethodByToken ((int) body.Method.MetadataToken.ToUInt ());
65
ReadScopes (entry, body, instructions);
66
ReadLineNumbers (entry, instructions);
67
ReadLocalVariables (entry, body);
70
void ReadLocalVariables (MethodEntry entry, MethodBody body)
72
foreach (LocalVariableEntry loc in entry.Locals) {
73
VariableDefinition var = body.Variables [loc.Index];
76
Scope scope = m_scopes [loc.BlockIndex] as Scope;
79
scope.Variables.Add (var);
83
void ReadLineNumbers (MethodEntry entry, IDictionary instructions)
85
foreach (LineNumberEntry line in entry.LineNumbers) {
86
Instruction instr = instructions [line.Offset] as Instruction;
90
Document doc = GetDocument (entry.SourceFile);
91
instr.SequencePoint = new SequencePoint (doc);
92
instr.SequencePoint.StartLine = line.Row;
93
instr.SequencePoint.EndLine = line.Row;
97
Document GetDocument (SourceFileEntry file)
99
Document doc = m_documents [file.FileName] as Document;
103
doc = new Document (file.FileName);
105
m_documents [file.FileName] = doc;
109
void ReadScopes (MethodEntry entry, MethodBody body, IDictionary instructions)
111
foreach (LexicalBlockEntry scope in entry.LexicalBlocks) {
112
Scope s = new Scope ();
113
s.Start = GetInstruction (body, instructions, scope.StartOffset);
114
s.End = GetInstruction(body, instructions, scope.EndOffset);
115
m_scopes [scope.Index] = s;
117
if (!AddScope (body, s))
122
bool AddScope (IScopeProvider provider, Scope s)
124
foreach (Scope scope in provider.Scopes) {
125
if (AddScope (scope, s))
128
if (s.Start.Offset >= scope.Start.Offset && s.End.Offset <= scope.End.Offset) {
129
scope.Scopes.Add (s);
137
public void Dispose ()
139
m_symFile.Dispose ();