2005-06-27 Geoff Norton <gnorton@customerdna.com>
[mono-project.git] / mcs / bmcs / symbolwriter.cs
blobcebbe40157076535725b0f3d7cc7722107a09a3a
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);
54 Namespace.DefineNamespaces (this);
56 return true;
59 public void DefineLocalVariable (string name, LocalBuilder builder)
61 SignatureHelper sighelper = SignatureHelper.GetLocalVarSigHelper (
62 module_builder);
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,
82 string filename)
84 SymbolWriter writer = new SymbolWriter (module, filename);
85 if (!writer.Initialize ())
86 return null;
88 return writer;