1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
using System;
using Mono.Debugger.Backend;
namespace Mono.Debugger.Languages.Mono
{
internal class MonoClassObject : TargetClassObject
{
new MonoClassType type;
MonoClassInfo info;
public MonoClassObject (MonoClassType type, MonoClassInfo info,
TargetLocation location)
: base (type, location)
{
this.type = type;
this.info = info;
}
public override TargetClassObject GetParentObject (Thread target)
{
if (!type.HasParent || !type.IsByRef)
return null;
MonoClassInfo parent_info = (MonoClassInfo) info.GetParent (target);
if (parent_info == null)
return null;
MonoClassType parent_type = parent_info.ClassType;
if (!type.IsByRef && parent_type.IsByRef)
return null;
return new MonoClassObject (parent_type, parent_info, Location);
}
public override TargetClassObject GetCurrentObject (Thread thread)
{
if (!type.IsByRef)
return null;
return (TargetClassObject) thread.ThreadServant.DoTargetAccess (
delegate (TargetMemoryAccess target) {
return type.GetCurrentObject (target, Location);
});
}
internal TargetAddress GetKlassAddress (TargetMemoryAccess target)
{
return info.KlassAddress;
}
internal override long GetDynamicSize (TargetMemoryAccess target, TargetBlob blob,
TargetLocation location,
out TargetLocation dynamic_location)
{
throw new InvalidOperationException ();
}
internal override string Print (TargetMemoryAccess target)
{
if (Location.HasAddress)
return String.Format ("{0}", Location.GetAddress (target));
else
return String.Format ("{0}", Location);
}
}
}
|