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