2 // Mono.ILASM.DebuggingInfo.cs
5 // Martin Baulig (martin@ximian.com)
7 // Copyright (C) 2004 Novell, Inc.
13 using System.Collections;
14 using Mono.CompilerServices.SymbolWriter;
16 namespace Mono.ILASM {
18 public class SymbolWriter : MonoSymbolWriter
21 Mono.ILASM.SourceMethod current_method;
22 SourceFile current_source;
24 public SymbolWriter (string filename)
27 sources = new ArrayList ();
30 public Mono.ILASM.SourceMethod BeginMethod (MethodDef method, Location location)
32 current_method = new Mono.ILASM.SourceMethod (method, location);
33 current_source.AddMethod (current_method);
34 return current_method;
37 public void EndMethod (Location location)
39 current_method.EndLine = location.line;
40 current_method = null;
43 public void BeginSourceFile (string filename)
45 current_source = new SourceFile (file, filename);
46 sources.Add (current_source);
49 public void EndSourceFile ()
51 current_source = null;
54 public void Write (Guid guid)
56 foreach (SourceFile source in sources)
59 WriteSymbolFile (guid);
63 public class SourceFile : SourceFileEntry
65 private ArrayList methods = new ArrayList ();
67 public SourceFile (MonoSymbolFile file, string filename)
68 : base (file, filename)
71 public void AddMethod (SourceMethod method)
78 foreach (SourceMethod method in methods)
83 public class SourceMethod
87 public int StartLine, EndLine;
89 public SourceMethod (MethodDef method, Location start)
92 this.StartLine = start.line;
94 lines = new ArrayList ();
95 MarkLocation (start.line, 0);
98 public void MarkLocation (int line, uint offset)
100 lines.Add (new LineNumberEntry (line, (int) offset));
103 public void Write (SourceFile file)
105 PEAPI.MethodDef pemethod = method.PeapiMethodDef;
107 LineNumberEntry[] lne = new LineNumberEntry [lines.Count];
110 uint token = ((uint) PEAPI.MDTable.Method << 24) | pemethod.Row;
113 method.Name, (int) token, null, lne, null,
114 StartLine, EndLine, 0);