Author: lluis
Date: 2005-05-25 05:55:24 -0400 (Wed, 25 May 2005)
New Revision: 44987

Added:
   trunk/mcs/class/Mono.CompilerServices.SymbolWriter/SymbolWriterImpl.cs
Modified:
   trunk/mcs/class/Mono.CompilerServices.SymbolWriter/ChangeLog
   
trunk/mcs/class/Mono.CompilerServices.SymbolWriter/Mono.CompilerServices.SymbolWriter.dll.sources
Log:
2005-05-25  Lluis Sanchez Gual  <[EMAIL PROTECTED]>

        * SymbolWriterImpl.cs: An implementation of ISymbolWriter. It is just a
        wrapper for the MonoSymbolWriter class that mcs is using.



Modified: trunk/mcs/class/Mono.CompilerServices.SymbolWriter/ChangeLog
===================================================================
--- trunk/mcs/class/Mono.CompilerServices.SymbolWriter/ChangeLog        
2005-05-25 09:51:25 UTC (rev 44986)
+++ trunk/mcs/class/Mono.CompilerServices.SymbolWriter/ChangeLog        
2005-05-25 09:55:24 UTC (rev 44987)
@@ -1,3 +1,8 @@
+2005-05-25  Lluis Sanchez Gual  <[EMAIL PROTECTED]>
+
+       * SymbolWriterImpl.cs: An implementation of ISymbolWriter. It is just a
+       wrapper for the MonoSymbolWriter class that mcs is using.
+
 2005-04-04  Marek Safar  <[EMAIL PROTECTED]>
 
        * MonoSymbolFile.cs: Removed unused fields.

Modified: 
trunk/mcs/class/Mono.CompilerServices.SymbolWriter/Mono.CompilerServices.SymbolWriter.dll.sources
===================================================================
--- 
trunk/mcs/class/Mono.CompilerServices.SymbolWriter/Mono.CompilerServices.SymbolWriter.dll.sources
   2005-05-25 09:51:25 UTC (rev 44986)
+++ 
trunk/mcs/class/Mono.CompilerServices.SymbolWriter/Mono.CompilerServices.SymbolWriter.dll.sources
   2005-05-25 09:55:24 UTC (rev 44987)
@@ -3,3 +3,4 @@
 MonoSymbolWriter.cs
 MonoSymbolTable.cs
 MonoSymbolFile.cs
+SymbolWriterImpl.cs

Added: trunk/mcs/class/Mono.CompilerServices.SymbolWriter/SymbolWriterImpl.cs
===================================================================
--- trunk/mcs/class/Mono.CompilerServices.SymbolWriter/SymbolWriterImpl.cs      
2005-05-25 09:51:25 UTC (rev 44986)
+++ trunk/mcs/class/Mono.CompilerServices.SymbolWriter/SymbolWriterImpl.cs      
2005-05-25 09:55:24 UTC (rev 44987)
@@ -0,0 +1,322 @@
+//
+// SymbolWriterImpl.cs
+//
+// Author:
+//   Lluis Sanchez Gual ([EMAIL PROTECTED])
+//
+// (C) 2005 Novell, Inc.  http://www.novell.com
+//
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.CompilerServices;
+using System.Collections;
+using System.IO;
+using System.Diagnostics.SymbolStore;
+       
+namespace Mono.CompilerServices.SymbolWriter
+{
+       public class SymbolWriterImpl: ISymbolWriter
+       {
+               MonoSymbolWriter msw;
+               ModuleBuilder mb;
+
+               delegate Guid GetGuidFunc (ModuleBuilder mb);
+               GetGuidFunc get_guid_func;
+               
+               int currentToken;
+               string methodName;
+               Stack namespaceStack = new Stack ();
+               bool methodOpened;
+               
+               Hashtable documents = new Hashtable ();
+               
+               public SymbolWriterImpl (ModuleBuilder mb)
+               {
+                       this.mb = mb;
+               }
+               
+               public void Close ()
+               {
+                       MethodInfo mi = typeof (ModuleBuilder).GetMethod (
+                               "Mono_GetGuid",
+                               BindingFlags.Static | BindingFlags.NonPublic);
+                       if (mi == null)
+                               return;
+
+                       get_guid_func = (GetGuidFunc) 
System.Delegate.CreateDelegate (
+                               typeof (GetGuidFunc), mi);
+                       
+                       msw.WriteSymbolFile (get_guid_func (mb));
+               }
+               
+               public void CloseMethod ()
+               {
+                       if (methodOpened) {
+                               methodOpened = false;
+                               msw.CloseMethod ();
+                       }
+               }
+               
+               public void CloseNamespace ()
+               {
+                       namespaceStack.Pop ();
+                       msw.CloseNamespace ();
+               }
+               
+               public void CloseScope (int endOffset)
+               {
+                       msw.CloseScope (endOffset);
+               }
+               
+               public ISymbolDocumentWriter DefineDocument (
+                       string url,
+                       Guid language,
+                       Guid languageVendor,
+                       Guid documentType)
+               {
+                       SymbolDocumentWriterImpl doc = 
(SymbolDocumentWriterImpl) documents [url];
+                       if (doc == null) {
+                               doc = new SymbolDocumentWriterImpl 
(msw.DefineDocument (url));
+                               documents [url] = doc;
+                       }
+                       return doc;
+               }
+                       
+               public void DefineField (
+                       SymbolToken parent,
+                       string name,
+                       FieldAttributes attributes,
+                       byte[] signature,
+                       SymAddressKind addrKind,
+                       int addr1,
+                       int addr2,
+                       int addr3)
+               {
+               }
+               
+               public void DefineGlobalVariable (
+                       string name,
+                       FieldAttributes attributes,
+                       byte[] signature,
+                       SymAddressKind addrKind,
+                       int addr1,
+                       int addr2,
+                       int addr3)
+               {
+               }
+               
+               public void DefineLocalVariable (
+                       string name,
+                       FieldAttributes attributes,
+                       byte[] signature,
+                       SymAddressKind addrKind,
+                       int addr1,
+                       int addr2,
+                       int addr3,
+                       int startOffset,
+                       int endOffset)
+               {
+                       msw.DefineLocalVariable (name, signature);
+               }
+               
+               public void DefineParameter (
+                       string name,
+                       ParameterAttributes attributes,
+                       int sequence,
+                       SymAddressKind addrKind,
+                       int addr1,
+                       int addr2,
+                       int addr3)
+               {
+               }
+
+               public void DefineSequencePoints (
+                       ISymbolDocumentWriter document,
+                       int[] offsets,
+                       int[] lines,
+                       int[] columns,
+                       int[] endLines,
+                       int[] endColumns)
+               {
+                       for (int n=0; n<offsets.Length; n++) {
+                               if (n > 0 && offsets[n] == offsets[n-1] && 
lines[n] == lines[n-1] && columns[n] == columns[n-1])
+                                       continue;
+                               msw.MarkSequencePoint (offsets[n], lines[n], 
columns[n]);
+                       }
+               }
+               
+               public void Initialize (IntPtr emitter, string filename, bool 
fFullBuild)
+               {
+                       msw = new MonoSymbolWriter (filename);
+               }
+               
+               public void OpenMethod (SymbolToken method)
+               {
+                       currentToken = method.GetToken ();
+               }
+               
+               public void OpenNamespace (string name)
+               {
+                       NamespaceInfo n = new NamespaceInfo ();
+                       n.NamespaceID = -1;
+                       n.Name = name;
+                       namespaceStack.Push (n);
+               }
+               
+               public int OpenScope (int startOffset)
+               {
+                       return msw.OpenScope (startOffset);
+               }
+               
+               public void SetMethodSourceRange (
+                       ISymbolDocumentWriter startDoc,
+                       int startLine,
+                       int startColumn,
+                       ISymbolDocumentWriter endDoc,
+                       int endLine,
+                       int endColumn)
+               {
+                       SourceMethodImpl sm = new SourceMethodImpl (methodName, 
currentToken, GetCurrentNamespace (startDoc));
+                       msw.OpenMethod (startDoc as ISourceFile, sm, startLine, 
startColumn, endLine, endColumn);
+                       methodOpened = true;
+               }
+               
+               public void SetScopeRange (int scopeID, int startOffset, int 
endOffset)
+               {
+               }
+               
+               public void SetSymAttribute (SymbolToken parent, string name, 
byte[] data)
+               {
+                       // This is a hack! but MonoSymbolWriter needs the 
method name
+                       // and ISymbolWriter does not have any method for 
providing it
+                       if (name == "__name")
+                               methodName = 
System.Text.Encoding.UTF8.GetString (data);
+               }
+               
+               public void SetUnderlyingWriter (IntPtr underlyingWriter)
+               {
+               }
+               
+               public void SetUserEntryPoint (SymbolToken entryMethod)
+               {
+               }
+
+               public void UsingNamespace (string fullName)
+               {
+                       if (namespaceStack.Count == 0) {
+                               OpenNamespace ("");
+                       }
+                       
+                       NamespaceInfo ni = (NamespaceInfo) namespaceStack.Peek 
();
+                       if (ni.NamespaceID != -1) {
+                               NamespaceInfo old = ni;
+                               CloseNamespace ();
+                               OpenNamespace (old.Name);
+                               ni = (NamespaceInfo) namespaceStack.Peek ();
+                               ni.UsingClauses = old.UsingClauses;
+                       }
+                       ni.UsingClauses.Add (fullName);
+               }
+               
+               int GetCurrentNamespace (ISymbolDocumentWriter doc)
+               {
+                       if (namespaceStack.Count == 0) {
+                               OpenNamespace ("");
+                       }
+
+                       NamespaceInfo ni = (NamespaceInfo) namespaceStack.Peek 
();
+                       if (ni.NamespaceID == -1)
+                       {
+                               string[] usings = (string[]) 
ni.UsingClauses.ToArray (typeof(string));
+                               
+                               int parentId = 0;
+                               if (namespaceStack.Count > 1) {
+                                       namespaceStack.Pop ();
+                                       parentId = ((NamespaceInfo) 
namespaceStack.Peek ()).NamespaceID;
+                                       namespaceStack.Push (ni);
+                               }
+                                       
+                               ni.NamespaceID = msw.DefineNamespace (ni.Name, 
((ISourceFile)doc).Entry, usings, parentId);
+                       }
+                       return ni.NamespaceID;
+               }
+       }
+       
+       class SymbolDocumentWriterImpl: ISymbolDocumentWriter, ISourceFile
+       {
+               SourceFileEntry entry;
+               
+               public SymbolDocumentWriterImpl (SourceFileEntry e)
+               {
+                       entry = e;
+               }
+               
+               public void SetCheckSum (Guid algorithmId, byte[] checkSum)
+               {
+               }
+               
+               public void SetSource (byte[] source)
+               {
+               }
+               
+               public SourceFileEntry Entry {
+                       get { return entry; }
+               }
+       }
+       
+       class SourceMethodImpl: ISourceMethod
+       {
+               string name;
+               int token;
+               int namespaceID;
+               
+               public SourceMethodImpl (string name, int token, int 
namespaceID)
+               {
+                       this.name = name;
+                       this.token = token;
+                       this.namespaceID = namespaceID;
+               }
+               
+               public string Name {
+                       get { return name; }
+               }
+
+               public int NamespaceID {
+                       get { return namespaceID; }
+               }
+
+               public int Token {
+                       get { return token; }
+               }
+       }
+       
+       class NamespaceInfo
+       {
+               public string Name;
+               public int NamespaceID;
+               public ArrayList UsingClauses = new ArrayList ();
+       }
+}

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to