Author: martin
Date: 2007-09-26 11:27:45 -0400 (Wed, 26 Sep 2007)
New Revision: 86409

Modified:
   trunk/debugger/ChangeLog
   trunk/debugger/backend/SingleSteppingEngine.cs
   trunk/debugger/languages/mono/MonoClassInfo.cs
   trunk/debugger/languages/mono/MonoClassType.cs
   trunk/debugger/languages/mono/MonoFunctionType.cs
Log:
2007-09-26  Martin Baulig  <[EMAIL PROTECTED]>

        * languages/mono/MonoClassInfo.cs
        (MonoClassInfo): Read field offsets and methods on-the-fly when
        they're needed; this allows us to create a `MonoClassInfo' for
        classes which aren't initialized yet.
        (MonoClassInfo.FieldOffsets): Replaced by GetFieldOffsets().
        (MonoClassInfo.GetMethodAddress): Added `TargetMemoryAccess' arg.



Modified: trunk/debugger/ChangeLog
===================================================================
--- trunk/debugger/ChangeLog    2007-09-26 15:12:22 UTC (rev 86408)
+++ trunk/debugger/ChangeLog    2007-09-26 15:27:45 UTC (rev 86409)
@@ -1,5 +1,14 @@
 2007-09-26  Martin Baulig  <[EMAIL PROTECTED]>
 
+       * languages/mono/MonoClassInfo.cs
+       (MonoClassInfo): Read field offsets and methods on-the-fly when
+       they're needed; this allows us to create a `MonoClassInfo' for
+       classes which aren't initialized yet.
+       (MonoClassInfo.FieldOffsets): Replaced by GetFieldOffsets().
+       (MonoClassInfo.GetMethodAddress): Added `TargetMemoryAccess' arg.
+
+2007-09-26  Martin Baulig  <[EMAIL PROTECTED]>
+
        * languages/TargetFundamentalType.cs
        (TargetFundamentalType): Made this class abstract.
        (TargetFundamentalType.HasClassType): Don't implement this here.

Modified: trunk/debugger/backend/SingleSteppingEngine.cs
===================================================================
--- trunk/debugger/backend/SingleSteppingEngine.cs      2007-09-26 15:12:22 UTC 
(rev 86408)
+++ trunk/debugger/backend/SingleSteppingEngine.cs      2007-09-26 15:27:45 UTC 
(rev 86409)
@@ -2231,7 +2231,7 @@
                        if (!class_resolved) {
                                TargetAddress klass = new TargetAddress 
(inferior.AddressDomain, data1);
                                MonoClassInfo info = 
Function.MonoClass.ClassResolved (sse.Client, klass);
-                               TargetAddress method = info.GetMethodAddress 
(Function.Token);
+                               TargetAddress method = info.GetMethodAddress 
(inferior, Function.Token);
 
                                index = MonoLanguageBackend.GetUniqueID ();
 

Modified: trunk/debugger/languages/mono/MonoClassInfo.cs
===================================================================
--- trunk/debugger/languages/mono/MonoClassInfo.cs      2007-09-26 15:12:22 UTC 
(rev 86408)
+++ trunk/debugger/languages/mono/MonoClassInfo.cs      2007-09-26 15:27:45 UTC 
(rev 86409)
@@ -6,6 +6,7 @@
 {
        internal class MonoClassInfo : DebuggerMarshalByRefObject
        {
+               public readonly MonoSymbolFile SymbolFile;
                public readonly TargetAddress KlassAddress;
                public readonly TargetAddress ParentClass;
                public readonly TargetAddress GenericContainer;
@@ -13,8 +14,8 @@
 
                public readonly Cecil.TypeDefinition CecilType;
 
-               protected readonly int[] field_offsets;
-               protected readonly Hashtable methods;
+               int[] field_offsets;
+               Hashtable methods;
 
                public static MonoClassInfo ReadClassInfo (MonoLanguageBackend 
mono,
                                                           TargetMemoryAccess 
target,
@@ -58,6 +59,7 @@
                                         TargetMemoryAccess target, 
TargetReader reader,
                                         TargetAddress klass)
                {
+                       this.SymbolFile = file;
                        this.KlassAddress = klass;
                        this.CecilType = typedef;
 
@@ -74,22 +76,54 @@
                        GenericClass = reader.PeekAddress 
(info.KlassGenericClassOffset);
                        GenericContainer = reader.PeekAddress 
(info.KlassGenericContainerOffset);
                        ParentClass = reader.PeekAddress 
(info.KlassParentOffset);
+               }
 
-                       TargetAddress field_info = reader.PeekAddress 
(info.KlassFieldOffset);
-                       int field_count = reader.PeekInteger 
(info.KlassFieldCountOffset);
+               public bool IsGenericClass {
+                       get { return !GenericClass.IsNull; }
+               }
 
+               void get_field_offsets (TargetMemoryAccess target)
+               {
+                       if (field_offsets != null)
+                               return;
+
+                       int address_size = target.TargetInfo.TargetAddressSize;
+                       MonoMetadataInfo metadata = 
SymbolFile.MonoLanguage.MonoMetadataInfo;
+
+                       TargetAddress field_info = target.ReadAddress (
+                               KlassAddress + metadata.KlassFieldOffset);
+                       int field_count = target.ReadInteger (
+                               KlassAddress + metadata.KlassFieldCountOffset);
+
                        TargetBinaryReader field_blob = target.ReadMemory (
-                               field_info, field_count * 
info.FieldInfoSize).GetReader ();
+                               field_info, field_count * 
metadata.FieldInfoSize).GetReader ();
 
                        field_offsets = new int [field_count];
                        for (int i = 0; i < field_count; i++) {
-                               field_blob.Position = i * info.FieldInfoSize + 
2 * address_size;
+                               field_blob.Position = i * 
metadata.FieldInfoSize + 2 * address_size;
                                field_offsets [i] = field_blob.ReadInt32 ();
                        }
+               }
 
-                       TargetAddress method_info = reader.PeekAddress 
(info.KlassMethodsOffset);
-                       int method_count = reader.PeekInteger 
(info.KlassMethodCountOffset);
+               public int[] GetFieldOffsets (TargetMemoryAccess target)
+               {
+                       get_field_offsets (target);
+                       return field_offsets;
+               }
 
+               void get_methods (TargetMemoryAccess target)
+               {
+                       if (methods != null)
+                               return;
+
+                       int address_size = target.TargetInfo.TargetAddressSize;
+                       MonoMetadataInfo metadata = 
SymbolFile.MonoLanguage.MonoMetadataInfo;
+
+                       TargetAddress method_info = target.ReadAddress (
+                               KlassAddress + metadata.KlassMethodsOffset);
+                       int method_count = target.ReadInteger (
+                               KlassAddress + metadata.KlassMethodCountOffset);
+
                        TargetBlob blob = target.ReadMemory (method_info, 
method_count * address_size);
 
                        methods = new Hashtable ();
@@ -105,16 +139,9 @@
                        }
                }
 
-               public bool IsGenericClass {
-                       get { return !GenericClass.IsNull; }
-               }
-
-               public int[] FieldOffsets {
-                       get { return field_offsets; }
-               }
-
-               internal TargetAddress GetMethodAddress (int token)
+               public TargetAddress GetMethodAddress (TargetMemoryAccess 
target, int token)
                {
+                       get_methods (target);
                        if (!methods.Contains (token))
                                throw new InternalError ();
                        return (TargetAddress) methods [token];

Modified: trunk/debugger/languages/mono/MonoClassType.cs
===================================================================
--- trunk/debugger/languages/mono/MonoClassType.cs      2007-09-26 15:12:22 UTC 
(rev 86408)
+++ trunk/debugger/languages/mono/MonoClassType.cs      2007-09-26 15:27:45 UTC 
(rev 86409)
@@ -516,20 +516,20 @@
                        return null;
                }
 
-               int GetFieldOffset (TargetFieldInfo field)
+               int GetFieldOffset (TargetMemoryAccess target, TargetFieldInfo 
field)
                {
+                       ResolveClass (target, true);
+
                        if (field.Position < FirstField)
-                               return parent_type.GetFieldOffset (field);
+                               return parent_type.GetFieldOffset (target, 
field);
 
-                       return type_info.FieldOffsets [field.Position - 
FirstField];
+                       return type_info.GetFieldOffsets (target) 
[field.Position - FirstField];
                }
 
                internal TargetObject GetField (Thread target, TargetLocation 
location,
                                                TargetFieldInfo finfo)
                {
-                       ResolveClass (target, true);
-
-                       int offset = GetFieldOffset (finfo);
+                       int offset = GetFieldOffset (target, finfo);
                        if (!IsByRef)
                                offset -= 2 * 
target.TargetInfo.TargetAddressSize;
                        TargetLocation field_loc = location.GetLocationAtOffset 
(offset);
@@ -546,9 +546,7 @@
                internal void SetField (Thread target, TargetLocation location,
                                        TargetFieldInfo finfo, TargetObject obj)
                {
-                       ResolveClass (target, true);
-
-                       int offset = GetFieldOffset (finfo);
+                       int offset = GetFieldOffset (target, finfo);
                        if (!IsByRef)
                                offset -= 2 * 
target.TargetInfo.TargetAddressSize;
                        TargetLocation field_loc = location.GetLocationAtOffset 
(offset);
@@ -561,14 +559,12 @@
 
                public override TargetObject GetStaticField (Thread target, 
TargetFieldInfo finfo)
                {
-                       ResolveClass (target, true);
+                       int offset = GetFieldOffset (target, finfo);
 
                        TargetAddress data_address = target.CallMethod (
                                
File.MonoLanguage.MonoDebuggerInfo.ClassGetStaticFieldData,
                                type_info.KlassAddress, 0);
 
-                       int offset = GetFieldOffset (finfo);
-
                        TargetLocation location = new AbsoluteTargetLocation 
(data_address);
                        TargetLocation field_loc = location.GetLocationAtOffset 
(offset);
 
@@ -581,10 +577,8 @@
                public override void SetStaticField (Thread target, 
TargetFieldInfo finfo,
                                                     TargetObject obj)
                {
-                       ResolveClass (target, true);
+                       int offset = GetFieldOffset (target, finfo);
 
-                       int offset = GetFieldOffset (finfo);
-
                        TargetAddress data_address = target.CallMethod (
                                
File.MonoLanguage.MonoDebuggerInfo.ClassGetStaticFieldData,
                                type_info.KlassAddress, 0);

Modified: trunk/debugger/languages/mono/MonoFunctionType.cs
===================================================================
--- trunk/debugger/languages/mono/MonoFunctionType.cs   2007-09-26 15:12:22 UTC 
(rev 86408)
+++ trunk/debugger/languages/mono/MonoFunctionType.cs   2007-09-26 15:27:45 UTC 
(rev 86409)
@@ -167,7 +167,7 @@
                public override TargetAddress GetMethodAddress (Thread target)
                {
                        MonoClassInfo info = klass.HardResolveClass (target);
-                       return info.GetMethodAddress (Token);
+                       return info.GetMethodAddress (target, Token);
                }
 
                protected override TargetObject DoGetObject (TargetLocation 
location)

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

Reply via email to