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 (ICompileUnit file, ISourceMethod method)
89 if (symwriter != null)
90 symwriter.OpenMethod (file, method);
93 public static void CloseMethod ()
95 if (symwriter != null)
96 symwriter.CloseMethod ();
99 public static int OpenScope (ILGenerator ig)
101 if (symwriter != null) {
102 int offset = symwriter.GetILOffset (ig);
103 return symwriter.OpenScope (offset);
109 public static void CloseScope (ILGenerator ig)
111 if (symwriter != null) {
112 int offset = symwriter.GetILOffset (ig);
113 symwriter.CloseScope (offset);
117 public static int DefineNamespace (string name, CompileUnitEntry source,
118 string[] using_clauses, int parent)
120 if (symwriter != null)
121 return symwriter.DefineNamespace (name, source, using_clauses, parent);
126 #region Terrania additions
127 public static void DefineAnonymousScope (int id)
129 if (symwriter != null)
130 symwriter.DefineAnonymousScope (id);
133 public static void DefineScopeVariable (int scope, LocalBuilder builder)
135 if (symwriter != null) {
136 int index = MonoDebuggerSupport.GetLocalIndex (builder);
137 symwriter.DefineScopeVariable (scope, index);
141 public static void DefineScopeVariable (int scope)
143 if (symwriter != null)
144 symwriter.DefineScopeVariable (scope, -1);
147 public static void DefineCapturedLocal (int scope_id, string name,
148 string captured_name)
150 if (symwriter != null)
151 symwriter.DefineCapturedLocal (scope_id, name, captured_name);
154 public static void DefineCapturedParameter (int scope_id, string name,
155 string captured_name)
157 if (symwriter != null)
158 symwriter.DefineCapturedParameter (scope_id, name, captured_name);
161 public static void DefineCapturedThis (int scope_id, string captured_name)
163 if (symwriter != null)
164 symwriter.DefineCapturedThis (scope_id, captured_name);
167 public static void DefineCapturedScope (int scope_id, int id, string captured_name)
169 if (symwriter != null)
170 symwriter.DefineCapturedScope (scope_id, id, captured_name);
173 public static void SetRealMethodName (string name)
175 if (symwriter != null)
176 symwriter.SetRealMethodName (name);
179 [Obsolete ("Duplicates corlib infrastructure")]
180 public static void SetCompilerGenerated ()
182 if (symwriter != null)
183 symwriter.SetCompilerGenerated ();
186 public static void OpenCompilerGeneratedBlock (ILGenerator ig)
188 if (symwriter != null) {
189 int offset = symwriter.GetILOffset (ig);
190 symwriter.OpenCompilerGeneratedBlock (offset);
194 public static void CloseCompilerGeneratedBlock (ILGenerator ig)
196 if (symwriter != null) {
197 int offset = symwriter.GetILOffset (ig);
198 symwriter.CloseCompilerGeneratedBlock (offset);
202 public static void StartIteratorBody (ILGenerator ig)
204 if (symwriter != null) {
205 int offset = symwriter.GetILOffset (ig);
206 symwriter.StartIteratorBody (offset);
210 public static void EndIteratorBody (ILGenerator ig)
212 if (symwriter != null) {
213 int offset = symwriter.GetILOffset (ig);
214 symwriter.EndIteratorBody (offset);
218 public static void StartIteratorDispatcher (ILGenerator ig)
220 if (symwriter != null) {
221 int offset = symwriter.GetILOffset (ig);
222 symwriter.StartIteratorDispatcher (offset);
226 public static void EndIteratorDispatcher (ILGenerator ig)
228 if (symwriter != null) {
229 int offset = symwriter.GetILOffset (ig);
230 symwriter.EndIteratorDispatcher (offset);
235 public static void MarkSequencePoint (ILGenerator ig, Location loc)
237 if (symwriter != null) {
238 int offset = symwriter.GetILOffset (ig);
239 symwriter.MarkSequencePoint (
240 offset, loc.File, loc.Row, loc.Column, loc.Hidden);
244 public static void WriteSymbolFile ()
246 if (symwriter != null)
247 symwriter.WriteSymbolFile ();
250 public static bool Initialize (ModuleBuilder module, string filename)
252 symwriter = new SymbolWriterImpl (module, filename);
253 if (!symwriter.Initialize ()) {