2 // symbolwriter.cs: The symbol writer
5 // Martin Baulig (martin@ximian.com)
7 // Copyright 2003 Ximian, Inc.
8 // Copyright 2003-2008 Novell, Inc.
12 using System.Collections;
13 using System.Reflection;
14 using System.Reflection.Emit;
16 using Mono.CompilerServices.SymbolWriter;
18 namespace Mono.CSharp {
19 public static class SymbolWriter
21 public static bool HasSymbolWriter {
22 get { return symwriter != null; }
25 private static SymbolWriterImpl symwriter;
27 class SymbolWriterImpl : MonoSymbolWriter {
28 delegate int GetILOffsetFunc (ILGenerator ig);
29 delegate Guid GetGuidFunc (ModuleBuilder mb);
31 GetILOffsetFunc get_il_offset_func;
32 GetGuidFunc get_guid_func;
34 ModuleBuilder module_builder;
36 public SymbolWriterImpl (ModuleBuilder module_builder, string filename)
39 this.module_builder = module_builder;
42 public int GetILOffset (ILGenerator ig)
44 return get_il_offset_func (ig);
47 public void WriteSymbolFile ()
49 Guid guid = get_guid_func (module_builder);
50 WriteSymbolFile (guid);
53 public bool Initialize ()
55 MethodInfo mi = typeof (ILGenerator).GetMethod (
56 "Mono_GetCurrentOffset",
57 BindingFlags.Static | BindingFlags.NonPublic);
61 get_il_offset_func = (GetILOffsetFunc) System.Delegate.CreateDelegate (
62 typeof (GetILOffsetFunc), mi);
64 mi = typeof (ModuleBuilder).GetMethod (
66 BindingFlags.Static | BindingFlags.NonPublic);
70 get_guid_func = (GetGuidFunc) System.Delegate.CreateDelegate (
71 typeof (GetGuidFunc), mi);
73 Location.DefineSymbolDocuments (this);
79 public static void DefineLocalVariable (string name, LocalBuilder builder)
81 if (symwriter != null) {
82 int index = MonoDebuggerSupport.GetLocalIndex (builder);
83 symwriter.DefineLocalVariable (index, name);
87 public static void OpenMethod (ISourceFile file, ISourceMethod method,
88 int start_row, int start_column,
89 int end_row, int end_column)
91 if (symwriter != null)
92 symwriter.OpenMethod (file, method, start_row, start_column,
96 public static void CloseMethod ()
98 if (symwriter != null)
99 symwriter.CloseMethod ();
102 public static int OpenScope (ILGenerator ig)
104 if (symwriter != null) {
105 int offset = symwriter.GetILOffset (ig);
106 return symwriter.OpenScope (offset);
112 public static void CloseScope (ILGenerator ig)
114 if (symwriter != null) {
115 int offset = symwriter.GetILOffset (ig);
116 symwriter.CloseScope (offset);
120 public static int DefineNamespace (string name, SourceFileEntry source,
121 string[] using_clauses, int parent)
123 if (symwriter != null)
124 return symwriter.DefineNamespace (name, source, using_clauses, parent);
129 #region Terrania additions
130 public static void DefineAnonymousScope (int id)
132 if (symwriter != null)
133 symwriter.DefineAnonymousScope (id);
136 public static void DefineScopeVariable (int scope, LocalBuilder builder)
138 if (symwriter != null) {
139 int index = MonoDebuggerSupport.GetLocalIndex (builder);
140 symwriter.DefineScopeVariable (scope, index);
144 public static void DefineScopeVariable (int scope)
146 if (symwriter != null)
147 symwriter.DefineScopeVariable (scope, -1);
150 public static void DefineCapturedLocal (int scope_id, string name,
151 string captured_name)
153 if (symwriter != null)
154 symwriter.DefineCapturedLocal (scope_id, name, captured_name);
157 public static void DefineCapturedParameter (int scope_id, string name,
158 string captured_name)
160 if (symwriter != null)
161 symwriter.DefineCapturedParameter (scope_id, name, captured_name);
164 public static void DefineCapturedThis (int scope_id, string captured_name)
166 if (symwriter != null)
167 symwriter.DefineCapturedThis (scope_id, captured_name);
170 public static void DefineCapturedScope (int scope_id, int id, string captured_name)
172 if (symwriter != null)
173 symwriter.DefineCapturedScope (scope_id, id, captured_name);
176 public static void SetRealMethodName (string name)
178 if (symwriter != null)
179 symwriter.SetRealMethodName (name);
182 public static void OpenCompilerGeneratedBlock (ILGenerator ig)
184 if (symwriter != null) {
185 int offset = symwriter.GetILOffset (ig);
186 symwriter.OpenCompilerGeneratedBlock (offset);
190 public static void CloseCompilerGeneratedBlock (ILGenerator ig)
192 if (symwriter != null) {
193 int offset = symwriter.GetILOffset (ig);
194 symwriter.CloseCompilerGeneratedBlock (offset);
198 public static void StartIteratorBody (ILGenerator ig)
200 if (symwriter != null) {
201 int offset = symwriter.GetILOffset (ig);
202 symwriter.StartIteratorBody (offset);
206 public static void EndIteratorBody (ILGenerator ig)
208 if (symwriter != null) {
209 int offset = symwriter.GetILOffset (ig);
210 symwriter.EndIteratorBody (offset);
214 public static void StartIteratorDispatcher (ILGenerator ig)
216 if (symwriter != null) {
217 int offset = symwriter.GetILOffset (ig);
218 symwriter.StartIteratorDispatcher (offset);
222 public static void EndIteratorDispatcher (ILGenerator ig)
224 if (symwriter != null) {
225 int offset = symwriter.GetILOffset (ig);
226 symwriter.EndIteratorDispatcher (offset);
231 public static void MarkSequencePoint (ILGenerator ig, int row, int column)
233 if (symwriter != null) {
234 int offset = symwriter.GetILOffset (ig);
235 symwriter.MarkSequencePoint (offset, row, column);
239 public static void WriteSymbolFile ()
241 if (symwriter != null)
242 symwriter.WriteSymbolFile ();
245 public static bool Initialize (ModuleBuilder module, string filename)
247 symwriter = new SymbolWriterImpl (module, filename);
248 if (!symwriter.Initialize ()) {