2003-02-18 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Tue, 18 Feb 2003 19:32:12 +0000 (19:32 -0000)
committerMartin Baulig <martin@novell.com>
Tue, 18 Feb 2003 19:32:12 +0000 (19:32 -0000)
* MonoSymbolTable.cs (MethodIndexEntry): New public struct.

* MonoSymbolFile.cs (MonoSymbolFile.GetMethodByToken): New method.

svn path=/trunk/mcs/; revision=11700

mcs/class/Mono.CSharp.Debugger/ChangeLog
mcs/class/Mono.CSharp.Debugger/MonoSymbolFile.cs
mcs/class/Mono.CSharp.Debugger/MonoSymbolTable.cs

index dc07dbe589e08e611b79679b4d7d78c5e8a32939..8e00105ffd93fb03b2cc95c6486b1db663908944 100644 (file)
@@ -1,3 +1,9 @@
+2003-02-18  Martin Baulig  <martin@ximian.com>
+
+       * MonoSymbolTable.cs (MethodIndexEntry): New public struct.
+
+       * MonoSymbolFile.cs (MonoSymbolFile.GetMethodByToken): New method.
+
 2003-02-18  Martin Baulig  <martin@ximian.com>
 
        * MonoSymbolFile.cs (MonoSymbolFile.Assembly): New public property.
index 7e1e9fe08ce5eb122c7564a1f26ad41545c5f2e7..c6ecfd13bed3aea8cb5050d21ae768e3eef9f2ee 100644 (file)
@@ -321,6 +321,7 @@ namespace Mono.CSharp.Debugger
                Hashtable method_hash;
                Hashtable source_file_hash;
 
+               Hashtable method_token_hash;
                Hashtable method_name_hash;
                Hashtable source_name_hash;
 
@@ -407,6 +408,38 @@ namespace Mono.CSharp.Debugger
                        }
                }
 
+               public MethodIndexEntry GetMethodIndexEntry (int index)
+               {
+                       int old_pos = (int) reader.BaseStream.Position;
+                       reader.BaseStream.Position = ot.MethodTableOffset +
+                               MethodIndexEntry.Size * (index - 1);
+                       MethodIndexEntry ie = new MethodIndexEntry (reader);
+                       reader.BaseStream.Position = old_pos;
+                       return ie;
+               }
+
+               public MethodEntry GetMethodByToken (int token)
+               {
+                       if (reader == null)
+                               throw new InvalidOperationException ();
+
+                       if (method_token_hash == null) {
+                               method_token_hash = new Hashtable ();
+
+                               for (int i = 0; i < MethodCount; i++) {
+                                       MethodIndexEntry ie = GetMethodIndexEntry (i);
+
+                                       method_token_hash.Add (ie.Token, i);
+                               }
+                       }
+
+                       object value = method_token_hash [token];
+                       if (value == null)
+                               return null;
+
+                       return GetMethod ((int) value);
+               }
+
                public MethodEntry GetMethod (int index)
                {
                        if ((index < 1) || (index > ot.MethodCount))
@@ -418,8 +451,8 @@ namespace Mono.CSharp.Debugger
                        if (entry != null)
                                return entry;
 
-                       reader.BaseStream.Position = ot.MethodTableOffset + 8 * (index - 1);
-                       reader.BaseStream.Position = reader.ReadInt32 ();
+                       MethodIndexEntry ie = GetMethodIndexEntry (index);
+                       reader.BaseStream.Position = ie.FileOffset;
 
                        entry = new MethodEntry (this, reader, index);
                        method_hash.Add (index, entry);
@@ -469,11 +502,8 @@ namespace Mono.CSharp.Debugger
                                method_name_hash = new Hashtable ();
 
                                for (int i = 0; i < ot.MethodCount; i++) {
-                                       reader.BaseStream.Position = ot.MethodTableOffset + 8 * i;
-
-                                       int offset = reader.ReadInt32 ();
-                                       int name_offset = reader.ReadInt32 ();
-                                       string name = ReadString (name_offset);
+                                       MethodIndexEntry ie = GetMethodIndexEntry (i);
+                                       string name = ReadString (ie.FullNameOffset);
 
                                        method_name_hash.Add (name, i + 1);
                                }
index 58cb80bc34a9b9bb3c47139e98d1319c00ea6314..d77f022b1c440fb03a7bb539525c1b726150ee14 100644 (file)
@@ -18,7 +18,7 @@ namespace Mono.CSharp.Debugger
 {
        public struct OffsetTable
        {
-               public const int  Version = 31;
+               public const int  Version = 32;
                public const long Magic   = 0x45e82623fd7fa614;
 
                public int TotalFileSize;
@@ -183,7 +183,7 @@ namespace Mono.CSharp.Debugger
                int namespace_count, nstable_offset;
                bool creating;
 
-               internal static int Size {
+               public static int Size {
                        get { return 24; }
                }
 
@@ -324,11 +324,8 @@ namespace Mono.CSharp.Debugger
                        EndRow = reader.ReadInt32 ();
                }
 
-               public static int Size
-               {
-                       get {
-                               return 16;
-                       }
+               public static int Size {
+                       get { return 16; }
                }
 
                internal void Write (BinaryWriter bw)
@@ -358,6 +355,44 @@ namespace Mono.CSharp.Debugger
                }
        }
 
+       public struct MethodIndexEntry
+       {
+               public readonly int FileOffset;
+               public readonly int FullNameOffset;
+               public readonly int Token;
+
+               public static int Size {
+                       get { return 12; }
+               }
+
+               public MethodIndexEntry (int offset, int name_offset, int token)
+               {
+                       this.FileOffset = offset;
+                       this.FullNameOffset = name_offset;
+                       this.Token = token;
+               }
+
+               internal MethodIndexEntry (BinaryReader reader)
+               {
+                       FileOffset = reader.ReadInt32 ();
+                       FullNameOffset = reader.ReadInt32 ();
+                       Token = reader.ReadInt32 ();
+               }
+
+               internal void Write (BinaryWriter bw)
+               {
+                       bw.Write (FileOffset);
+                       bw.Write (FullNameOffset);
+                       bw.Write (Token);
+               }
+
+               public override string ToString ()
+               {
+                       return String.Format ("MethodIndexEntry ({0}:{1}:{2:x})",
+                                             FileOffset, FullNameOffset, Token);
+               }
+       }
+
        public class MethodEntry
        {
                #region This is actually written to the symbol file
@@ -382,6 +417,7 @@ namespace Mono.CSharp.Debugger
                int file_offset;
                string name;
                string full_name;
+               MethodIndexEntry index_entry;
 
                public readonly SourceFileEntry SourceFile;
                public readonly LineNumberEntry[] LineNumbers;
@@ -392,11 +428,8 @@ namespace Mono.CSharp.Debugger
 
                public readonly MonoSymbolFile SymbolFile;
 
-               public static int Size
-               {
-                       get {
-                               return 52;
-                       }
+               public static int Size {
+                       get { return 52; }
                }
 
                public string Name {
@@ -589,6 +622,8 @@ namespace Mono.CSharp.Debugger
 
                        file_offset = (int) bw.BaseStream.Position;
 
+                       index_entry = new MethodIndexEntry (file_offset, FullNameOffset, Token);
+
                        bw.Write (SourceFileIndex);
                        bw.Write (Token);
                        bw.Write (StartRow);
@@ -609,8 +644,7 @@ namespace Mono.CSharp.Debugger
 
                internal void WriteIndex (BinaryWriter bw)
                {
-                       bw.Write (file_offset);
-                       bw.Write (FullNameOffset);
+                       index_entry.Write (bw);
                }
 
                public override string ToString ()