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 ())