2 // System.Diagnostics.SymbolStore/MonoSymbolTableWriter.cs
5 // Martin Baulig (martin@gnome.org)
7 // (C) 2002 Ximian, Inc. http://www.ximian.com
11 using System.Reflection;
12 using System.Reflection.Emit;
13 using System.Collections;
17 namespace Mono.CSharp.Debugger
19 internal class MonoSymbolTableWriter : IDisposable
23 public MonoSymbolTableWriter (string output_filename)
25 FileStream stream = new FileStream (output_filename, FileMode.Create);
26 bw = new BinaryWriter (stream);
29 public void WriteSymbolTable (MonoSymbolWriter symwriter)
31 // Magic number and file version.
32 bw.Write (OffsetTable.Magic);
33 bw.Write (OffsetTable.Version);
35 OffsetTable ot = new OffsetTable ();
38 // Offsets of file sections; we must write this after we're done
39 // writing the whole file, so we just reserve the space for it here.
41 long offset_table_offset = bw.BaseStream.Position;
45 // Write source file table.
47 Hashtable sources = new Hashtable ();
49 ot.source_table_offset = (int) bw.BaseStream.Position;
50 foreach (ISourceFile source in symwriter.Sources) {
51 if (sources.ContainsKey (source))
54 sources.Add (source, (int) bw.BaseStream.Position);
55 byte[] file_name = Encoding.UTF8.GetBytes (source.FileName);
56 bw.Write ((int) file_name.Length);
59 ot.source_table_size = (int) bw.BaseStream.Position - ot.source_table_offset;
62 // Write line number table
64 Hashtable methods = new Hashtable ();
66 int address_table_size = 0;
68 ot.line_number_table_offset = (int) bw.BaseStream.Position;
69 foreach (ISourceMethod method in symwriter.Methods) {
70 if (method.Start == null || method.Start.Row == 0)
73 int count = method.Lines.Length;
74 LineNumberEntry[] lines = new LineNumberEntry [count];
76 int pos = (int) bw.BaseStream.Position;
78 int address_table_offset = address_table_size;
79 int my_size = (int) (MethodAddress.Size + count * 8);
80 address_table_size += my_size;
82 for (int i = 0; i < count; i++) {
83 lines [i] = new LineNumberEntry (method.Lines [i]);
87 MethodEntry entry = new MethodEntry (
88 (int) method.Token, (int) sources [method.SourceFile],
89 method.SourceFile.FileName, lines, pos, address_table_offset,
90 my_size, (int) method.Start.Row, (int) method.End.Row);
92 methods.Add (method, entry);
95 ot.line_number_table_size = (int) bw.BaseStream.Position -
96 ot.line_number_table_offset;
101 ot.method_count = methods.Count;
102 ot.method_table_offset = (int) bw.BaseStream.Position;
103 foreach (MethodEntry entry in methods.Values)
105 ot.method_table_size = (int) bw.BaseStream.Position - ot.method_table_offset;
108 // Write offset table
110 ot.address_table_size = address_table_size;
111 ot.total_file_size = (int) bw.BaseStream.Position;
112 bw.Seek ((int) offset_table_offset, SeekOrigin.Begin);
114 bw.Seek (0, SeekOrigin.End);
117 void IDisposable.Dispose() {
121 protected virtual void Dispose (bool disposing)