Copied remotely
[mono.git] / mcs / gmcs / symbolwriter.cs
1 //
2 // symbolwriter.cs: The symbol writer
3 //
4 // Author:
5 //   Martin Baulig (martin@ximian.com)
6 //
7 // (C) 2003 Ximian, Inc.
8 //
9
10 using System;
11 using System.Collections;
12 using System.Reflection;
13 using System.Reflection.Emit;
14
15 using Mono.CompilerServices.SymbolWriter;
16
17 namespace Mono.CSharp {
18         public class SymbolWriter : MonoSymbolWriter {
19                 delegate int GetILOffsetFunc (ILGenerator ig);
20                 delegate Guid GetGuidFunc (ModuleBuilder mb);
21
22                 GetILOffsetFunc get_il_offset_func;
23                 GetGuidFunc get_guid_func;
24
25                 ModuleBuilder module_builder;
26
27                 protected SymbolWriter (ModuleBuilder module_builder, string filename)
28                         : base (filename)
29                 {
30                         this.module_builder = module_builder;
31                 }
32
33                 bool Initialize ()
34                 {
35                         MethodInfo mi = typeof (ILGenerator).GetMethod (
36                                 "Mono_GetCurrentOffset",
37                                 BindingFlags.Static | BindingFlags.NonPublic);
38                         if (mi == null)
39                                 return false;
40
41                         get_il_offset_func = (GetILOffsetFunc) System.Delegate.CreateDelegate (
42                                 typeof (GetILOffsetFunc), mi);
43
44                         mi = typeof (ModuleBuilder).GetMethod (
45                                 "Mono_GetGuid",
46                                 BindingFlags.Static | BindingFlags.NonPublic);
47                         if (mi == null)
48                                 return false;
49
50                         get_guid_func = (GetGuidFunc) System.Delegate.CreateDelegate (
51                                 typeof (GetGuidFunc), mi);
52
53                         Location.DefineSymbolDocuments (this);
54                         Namespace.DefineNamespaces (this);
55
56                         return true;
57                 }
58
59                 public void DefineLocalVariable (string name, LocalBuilder builder)
60                 {
61                         SignatureHelper sighelper = SignatureHelper.GetLocalVarSigHelper (
62                                 module_builder);
63                         sighelper.AddArgument (builder.LocalType);
64                         byte[] signature = sighelper.GetSignature ();
65
66                         DefineLocalVariable (name, signature);
67                 }
68
69                 public void MarkSequencePoint (ILGenerator ig, int row, int column)
70                 {
71                         int offset = get_il_offset_func (ig);
72                         MarkSequencePoint (offset, row, column);
73                 }
74
75                 public void WriteSymbolFile ()
76                 {
77                         Guid guid = get_guid_func (module_builder);
78                         WriteSymbolFile (guid);
79                 }
80
81                 public static SymbolWriter GetSymbolWriter (ModuleBuilder module,
82                                                             string filename)
83                 {
84                         SymbolWriter writer = new SymbolWriter (module, filename);
85                         if (!writer.Initialize ())
86                                 return null;
87
88                         return writer;
89                 }
90         }
91 }