2007-04-19 Chris Toshok <toshok@ximian.com>
[mcs.git] / mcs / symbolwriter.cs
blobb42b0e2dd72ea647b72bf24743528ff3469ce67d
1 //
2 // symbolwriter.cs: The symbol writer
3 //
4 // Author:
5 // Martin Baulig (martin@ximian.com)
6 //
7 // (C) 2003 Ximian, Inc.
8 //
10 using System;
11 using System.Collections;
12 using System.Reflection;
13 using System.Reflection.Emit;
15 using Mono.CompilerServices.SymbolWriter;
17 namespace Mono.CSharp {
18 public class SymbolWriter : MonoSymbolWriter {
19 delegate int GetILOffsetFunc (ILGenerator ig);
20 delegate Guid GetGuidFunc (ModuleBuilder mb);
22 GetILOffsetFunc get_il_offset_func;
23 GetGuidFunc get_guid_func;
25 ModuleBuilder module_builder;
27 protected SymbolWriter (ModuleBuilder module_builder, string filename)
28 : base (filename)
30 this.module_builder = module_builder;
33 bool Initialize ()
35 MethodInfo mi = typeof (ILGenerator).GetMethod (
36 "Mono_GetCurrentOffset",
37 BindingFlags.Static | BindingFlags.NonPublic);
38 if (mi == null)
39 return false;
41 get_il_offset_func = (GetILOffsetFunc) System.Delegate.CreateDelegate (
42 typeof (GetILOffsetFunc), mi);
44 mi = typeof (ModuleBuilder).GetMethod (
45 "Mono_GetGuid",
46 BindingFlags.Static | BindingFlags.NonPublic);
47 if (mi == null)
48 return false;
50 get_guid_func = (GetGuidFunc) System.Delegate.CreateDelegate (
51 typeof (GetGuidFunc), mi);
53 Location.DefineSymbolDocuments (this);
55 return true;
58 public void DefineLocalVariable (string name, LocalBuilder builder)
60 SignatureHelper sighelper = SignatureHelper.GetLocalVarSigHelper (
61 module_builder);
62 sighelper.AddArgument (builder.LocalType);
63 byte[] signature = sighelper.GetSignature ();
65 int index = MonoDebuggerSupport.GetLocalIndex (builder);
67 DefineLocalVariable (index, name, signature);
70 public int OpenScope (ILGenerator ig)
72 int offset = get_il_offset_func (ig);
73 return OpenScope (offset);
76 public void CloseScope (ILGenerator ig)
78 int offset = get_il_offset_func (ig);
79 CloseScope (offset);
82 public void MarkSequencePoint (ILGenerator ig, int row, int column)
84 int offset = get_il_offset_func (ig);
85 MarkSequencePoint (offset, row, column);
88 public void WriteSymbolFile ()
90 Guid guid = get_guid_func (module_builder);
91 WriteSymbolFile (guid);
94 public static SymbolWriter GetSymbolWriter (ModuleBuilder module,
95 string filename)
97 SymbolWriter writer = new SymbolWriter (module, filename);
98 if (!writer.Initialize ())
99 return null;
101 return writer;