2 // symbolwriter.cs: The symbol writer
5 // Martin Baulig (martin@ximian.com)
7 // (C) 2003 Ximian, Inc.
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)
30 this.module_builder = module_builder;
35 MethodInfo mi = typeof (ILGenerator).GetMethod (
36 "Mono_GetCurrentOffset",
37 BindingFlags.Static | BindingFlags.NonPublic);
41 get_il_offset_func = (GetILOffsetFunc) System.Delegate.CreateDelegate (
42 typeof (GetILOffsetFunc), mi);
44 mi = typeof (ModuleBuilder).GetMethod (
46 BindingFlags.Static | BindingFlags.NonPublic);
50 get_guid_func = (GetGuidFunc) System.Delegate.CreateDelegate (
51 typeof (GetGuidFunc), mi);
53 Location.DefineSymbolDocuments (this);
58 public void DefineLocalVariable (string name, LocalBuilder builder)
60 SignatureHelper sighelper = SignatureHelper.GetLocalVarSigHelper (
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);
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,
97 SymbolWriter writer = new SymbolWriter (module, filename);
98 if (!writer.Initialize ())