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);
54 Namespace.DefineNamespaces (this);
59 public void DefineLocalVariable (string name, LocalBuilder builder)
61 SignatureHelper sighelper = SignatureHelper.GetLocalVarSigHelper (
63 sighelper.AddArgument (builder.LocalType);
64 byte[] signature = sighelper.GetSignature ();
66 DefineLocalVariable (name, signature);
69 public void MarkSequencePoint (ILGenerator ig, int row, int column)
71 int offset = get_il_offset_func (ig);
72 MarkSequencePoint (offset, row, column);
75 public void WriteSymbolFile ()
77 Guid guid = get_guid_func (module_builder);
78 WriteSymbolFile (guid);
81 public static SymbolWriter GetSymbolWriter (ModuleBuilder module,
84 SymbolWriter writer = new SymbolWriter (module, filename);
85 if (!writer.Initialize ())