2 // System.Diagnostics.SymbolStore/MonoSymbolTable.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 public struct OffsetTable
21 public const int Version = 28;
22 public const long Magic = 0x45e82623fd7fa614;
24 public int total_file_size;
25 public int source_table_offset;
26 public int source_table_size;
27 public int method_count;
28 public int method_table_offset;
29 public int method_table_size;
30 public int line_number_table_offset;
31 public int line_number_table_size;
32 public int local_variable_table_offset;
33 public int local_variable_table_size;
34 public int source_file_table_offset;
35 public int source_file_table_size;
36 public int source_file_count;
37 public int type_count;
38 public int type_index_table_offset;
39 public int type_index_table_size;
41 public OffsetTable (IMonoBinaryReader reader)
43 total_file_size = reader.ReadInt32 ();
44 source_table_offset = reader.ReadInt32 ();
45 source_table_size = reader.ReadInt32 ();
46 method_count = reader.ReadInt32 ();
47 method_table_offset = reader.ReadInt32 ();
48 method_table_size = reader.ReadInt32 ();
49 line_number_table_offset = reader.ReadInt32 ();
50 line_number_table_size = reader.ReadInt32 ();
51 local_variable_table_offset = reader.ReadInt32 ();
52 local_variable_table_size = reader.ReadInt32 ();
53 source_file_table_offset = reader.ReadInt32 ();
54 source_file_table_size = reader.ReadInt32 ();
55 source_file_count = reader.ReadInt32 ();
56 type_count = reader.ReadInt32 ();
57 type_index_table_offset = reader.ReadInt32 ();
58 type_index_table_size = reader.ReadInt32 ();
61 public void Write (BinaryWriter bw)
63 bw.Write (total_file_size);
64 bw.Write (source_table_offset);
65 bw.Write (source_table_size);
66 bw.Write (method_count);
67 bw.Write (method_table_offset);
68 bw.Write (method_table_size);
69 bw.Write (line_number_table_offset);
70 bw.Write (line_number_table_size);
71 bw.Write (local_variable_table_offset);
72 bw.Write (local_variable_table_size);
73 bw.Write (source_file_table_offset);
74 bw.Write (source_file_table_size);
75 bw.Write (source_file_count);
76 bw.Write (type_count);
77 bw.Write (type_index_table_offset);
78 bw.Write (type_index_table_size);
82 public struct LineNumberEntry
84 public readonly int Row;
85 public readonly int Offset;
87 public LineNumberEntry (int row, int offset)
93 internal LineNumberEntry (SourceLine line)
94 : this (line.Row, line.Offset)
97 public LineNumberEntry (IMonoBinaryReader reader)
99 Row = reader.ReadInt32 ();
100 Offset = reader.ReadInt32 ();
103 internal void Write (BinaryWriter bw)
109 public override string ToString ()
111 return String.Format ("[Line {0}:{1}]", Row, Offset);
115 public struct LocalVariableEntry
117 public readonly string Name;
118 public readonly FieldAttributes Attributes;
119 public readonly byte[] Signature;
121 public LocalVariableEntry (string Name, FieldAttributes Attributes, byte[] Signature)
124 this.Attributes = Attributes;
125 this.Signature = Signature;
128 public LocalVariableEntry (IMonoBinaryReader reader)
130 int name_length = reader.ReadInt32 ();
131 byte[] name = reader.ReadBuffer (name_length);
132 Name = Encoding.UTF8.GetString (name);
133 Attributes = (FieldAttributes) reader.ReadInt32 ();
134 int sig_length = reader.ReadInt32 ();
135 Signature = reader.ReadBuffer (sig_length);
138 internal void Write (BinaryWriter bw)
140 byte[] name = Encoding.UTF8.GetBytes (Name);
141 bw.Write ((int) name.Length);
143 bw.Write ((int) Attributes);
144 bw.Write ((int) Signature.Length);
145 bw.Write (Signature);
148 public override string ToString ()
150 return String.Format ("[LocalVariable {0}:{1}]", Name, Attributes);
154 public class SourceFileEntry
156 public readonly string SourceFile;
158 IMonoBinaryReader reader;
159 long method_position;
163 internal SourceFileEntry (string source_file)
165 this.SourceFile = source_file;
166 this.methods = new ArrayList ();
170 internal void AddMethod (MethodSourceEntry method)
172 methods.Add (method);
176 internal void Write (BinaryWriter bw)
178 byte[] name = Encoding.UTF8.GetBytes (SourceFile);
179 bw.Write ((int) name.Length);
183 bw.Write (methods.Count);
184 foreach (MethodSourceEntry method in methods)
188 public SourceFileEntry (IMonoBinaryReader reader)
190 int name_length = reader.ReadInt32 ();
191 byte[] name = reader.ReadBuffer (name_length);
192 SourceFile = Encoding.UTF8.GetString (name);
194 count = reader.ReadInt32 ();
195 this.reader = reader;
196 this.method_position = reader.Position;
198 reader.Position += count * MethodSourceEntry.Size;
201 public MethodSourceEntry[] Methods {
204 MethodSourceEntry[] retval = new MethodSourceEntry [methods.Count];
205 methods.CopyTo (retval, 0);
215 reader.Position = method_position;
216 methods = new ArrayList ();
217 for (int i = 0; i < count; i++)
218 methods.Add (new MethodSourceEntry (reader));
221 public override string ToString ()
223 return String.Format ("SourceFileEntry ({0}:{1})", SourceFile, count);
227 public struct MethodSourceEntry : IComparable
229 public readonly int Index;
230 public readonly int FileOffset;
231 public readonly int StartRow;
232 public readonly int EndRow;
234 public MethodSourceEntry (int index, int file_offset, int start, int end)
237 this.FileOffset = file_offset;
238 this.StartRow = start;
242 public MethodSourceEntry (IMonoBinaryReader reader)
244 Index = reader.ReadInt32 ();
245 FileOffset = reader.ReadInt32 ();
246 StartRow = reader.ReadInt32 ();
247 EndRow = reader.ReadInt32 ();
250 public static int Size
257 internal void Write (BinaryWriter bw)
260 bw.Write (FileOffset);
265 public int CompareTo (object obj)
267 MethodSourceEntry method = (MethodSourceEntry) obj;
269 if (method.StartRow < StartRow)
271 else if (method.StartRow > StartRow)
277 public override string ToString ()
279 return String.Format ("MethodSourceEntry ({0}:{1}:{2}:{3})",
280 Index, FileOffset, StartRow, EndRow);
284 public class MethodEntry
286 public readonly int Token;
287 public readonly int StartRow;
288 public readonly int EndRow;
289 public readonly int NumLineNumbers;
290 public readonly int ThisTypeIndex;
291 public readonly int NumParameters;
292 public readonly int NumLocals;
294 public int TypeIndexTableOffset;
295 public int LocalVariableTableOffset;
296 public readonly int SourceFileOffset;
297 public readonly int LineNumberTableOffset;
299 public readonly string SourceFile = null;
300 public readonly LineNumberEntry[] LineNumbers = null;
301 public readonly int[] ParamTypeIndices = null;
302 public readonly int[] LocalTypeIndices = null;
303 public readonly LocalVariableEntry[] Locals = null;
305 public static int Size
312 public MethodEntry (IMonoBinaryReader reader)
314 Token = reader.ReadInt32 ();
315 StartRow = reader.ReadInt32 ();
316 EndRow = reader.ReadInt32 ();
317 ThisTypeIndex = reader.ReadInt32 ();
318 NumParameters = reader.ReadInt32 ();
319 NumLocals = reader.ReadInt32 ();
320 NumLineNumbers = reader.ReadInt32 ();
321 TypeIndexTableOffset = reader.ReadInt32 ();
322 LocalVariableTableOffset = reader.ReadInt32 ();
323 SourceFileOffset = reader.ReadInt32 ();
324 LineNumberTableOffset = reader.ReadInt32 ();
326 if (SourceFileOffset != 0) {
327 long old_pos = reader.Position;
328 reader.Position = SourceFileOffset;
329 int source_file_length = reader.ReadInt32 ();
330 byte[] source_file = reader.ReadBuffer (source_file_length);
331 SourceFile = Encoding.UTF8.GetString (source_file);
332 reader.Position = old_pos;
335 if (LineNumberTableOffset != 0) {
336 long old_pos = reader.Position;
337 reader.Position = LineNumberTableOffset;
339 LineNumbers = new LineNumberEntry [NumLineNumbers];
341 for (int i = 0; i < NumLineNumbers; i++)
342 LineNumbers [i] = new LineNumberEntry (reader);
344 reader.Position = old_pos;
347 if (LocalVariableTableOffset != 0) {
348 long old_pos = reader.Position;
349 reader.Position = LocalVariableTableOffset;
351 Locals = new LocalVariableEntry [NumLocals];
353 for (int i = 0; i < NumLocals; i++)
354 Locals [i] = new LocalVariableEntry (reader);
356 reader.Position = old_pos;
359 if (TypeIndexTableOffset != 0) {
360 long old_pos = reader.Position;
361 reader.Position = TypeIndexTableOffset;
363 ParamTypeIndices = new int [NumParameters];
364 LocalTypeIndices = new int [NumLocals];
366 for (int i = 0; i < NumParameters; i++)
367 ParamTypeIndices [i] = reader.ReadInt32 ();
368 for (int i = 0; i < NumLocals; i++)
369 LocalTypeIndices [i] = reader.ReadInt32 ();
371 reader.Position = old_pos;
375 internal MethodEntry (int token, int sf_offset, string source_file,
376 int this_type_index, int[] param_type_indices,
377 int[] local_type_indices, LocalVariableEntry[] locals,
378 LineNumberEntry[] lines, int lnt_offset,
379 int start_row, int end_row)
382 this.StartRow = start_row;
383 this.EndRow = end_row;
384 this.NumLineNumbers = lines.Length;
385 this.ThisTypeIndex = this_type_index;
386 this.NumParameters = param_type_indices.Length;
387 this.NumLocals = local_type_indices.Length;
388 this.ParamTypeIndices = param_type_indices;
389 this.LocalTypeIndices = local_type_indices;
390 this.Locals = locals;
391 this.SourceFileOffset = sf_offset;
392 this.LineNumberTableOffset = lnt_offset;
393 this.SourceFile = source_file;
394 this.LineNumbers = lines;
397 internal void Write (BinaryWriter bw)
402 bw.Write (ThisTypeIndex);
403 bw.Write (NumParameters);
404 bw.Write (NumLocals);
405 bw.Write (NumLineNumbers);
406 bw.Write (TypeIndexTableOffset);
407 bw.Write (LocalVariableTableOffset);
408 bw.Write (SourceFileOffset);
409 bw.Write (LineNumberTableOffset);
412 public override string ToString ()
414 return String.Format ("[Method {0}:{1}:{2}:{3}:{4} - {5}:{6}]",
415 Token, SourceFile, StartRow, EndRow,
416 NumLineNumbers, SourceFileOffset, LineNumberTableOffset);