X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fsymbolwriter.cs;h=b42b0e2dd72ea647b72bf24743528ff3469ce67d;hb=40eeecd71eb27e371411c6b6c899e43cf4c34ff3;hp=148875711e3eb3ca24de88b305fc4a712be555ab;hpb=7ff8f29ff29fa3f08ef305ac43ef079097323286;p=mono.git diff --git a/mcs/mcs/symbolwriter.cs b/mcs/mcs/symbolwriter.cs index 148875711e3..b42b0e2dd72 100644 --- a/mcs/mcs/symbolwriter.cs +++ b/mcs/mcs/symbolwriter.cs @@ -11,75 +11,90 @@ using System; using System.Collections; using System.Reflection; using System.Reflection.Emit; -using System.Diagnostics.SymbolStore; + +using Mono.CompilerServices.SymbolWriter; namespace Mono.CSharp { - public class SymbolWriter { - ISymbolWriter symwriter; - MethodInfo define_namespace; - MethodInfo open_method; + public class SymbolWriter : MonoSymbolWriter { + delegate int GetILOffsetFunc (ILGenerator ig); + delegate Guid GetGuidFunc (ModuleBuilder mb); + + GetILOffsetFunc get_il_offset_func; + GetGuidFunc get_guid_func; + + ModuleBuilder module_builder; - protected SymbolWriter (ISymbolWriter symwriter) + protected SymbolWriter (ModuleBuilder module_builder, string filename) + : base (filename) { - this.symwriter = symwriter; + this.module_builder = module_builder; } bool Initialize () { - Type type = symwriter.GetType (); - define_namespace = type.GetMethod ("DefineNamespace", new Type[] { - typeof (string), typeof (ISymbolDocumentWriter), - typeof (string []), typeof (int) }); - if (define_namespace == null) + MethodInfo mi = typeof (ILGenerator).GetMethod ( + "Mono_GetCurrentOffset", + BindingFlags.Static | BindingFlags.NonPublic); + if (mi == null) return false; - open_method = type.GetMethod ("OpenMethod", new Type[] { - typeof (ISymbolDocumentWriter), typeof (int), typeof (int), - typeof (int), typeof (int), typeof (MethodBase), typeof (int) }); - if (open_method == null) + get_il_offset_func = (GetILOffsetFunc) System.Delegate.CreateDelegate ( + typeof (GetILOffsetFunc), mi); + + mi = typeof (ModuleBuilder).GetMethod ( + "Mono_GetGuid", + BindingFlags.Static | BindingFlags.NonPublic); + if (mi == null) return false; + get_guid_func = (GetGuidFunc) System.Delegate.CreateDelegate ( + typeof (GetGuidFunc), mi); + Location.DefineSymbolDocuments (this); - Namespace.DefineNamespaces (this); return true; } - public ISymbolDocumentWriter DefineDocument (string path) + public void DefineLocalVariable (string name, LocalBuilder builder) { - return symwriter.DefineDocument ( - path, SymLanguageType.CSharp, SymLanguageVendor.Microsoft, - SymDocumentType.Text); + SignatureHelper sighelper = SignatureHelper.GetLocalVarSigHelper ( + module_builder); + sighelper.AddArgument (builder.LocalType); + byte[] signature = sighelper.GetSignature (); + + int index = MonoDebuggerSupport.GetLocalIndex (builder); + + DefineLocalVariable (index, name, signature); } - public int DefineNamespace (string name, SourceFile file, string[] using_list, int parent) + public int OpenScope (ILGenerator ig) { - if (file.SymbolDocument == null) - return 0; - return (int) define_namespace.Invoke (symwriter, new object[] { - name, file.SymbolDocument, using_list, parent }); + int offset = get_il_offset_func (ig); + return OpenScope (offset); } - public void OpenMethod (TypeContainer parent, MethodBase method, Location start, Location end) + public void CloseScope (ILGenerator ig) { - int ns_id = parent.NamespaceEntry.SymbolFileID; - open_method.Invoke (symwriter, new object[] { - start.SymbolDocument, start.Row, 0, end.Row, 0, method, ns_id }); + int offset = get_il_offset_func (ig); + CloseScope (offset); } - public void CloseMethod () + public void MarkSequencePoint (ILGenerator ig, int row, int column) { - symwriter.CloseMethod (); + int offset = get_il_offset_func (ig); + MarkSequencePoint (offset, row, column); } - public static SymbolWriter GetSymbolWriter (ModuleBuilder module) + public void WriteSymbolFile () { - ISymbolWriter symwriter = module.GetSymWriter (); - - if (symwriter == null) - return null; + Guid guid = get_guid_func (module_builder); + WriteSymbolFile (guid); + } - SymbolWriter writer = new SymbolWriter (symwriter); + public static SymbolWriter GetSymbolWriter (ModuleBuilder module, + string filename) + { + SymbolWriter writer = new SymbolWriter (module, filename); if (!writer.Initialize ()) return null;