Browse Source

Add IMethod.GetVariableType() extension method to debugger type system.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
253a5a6d2c
  1. 25
      src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs

25
src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs

@ -28,16 +28,18 @@ namespace Debugger @@ -28,16 +28,18 @@ namespace Debugger
{
public readonly Module Module;
public Dictionary<IUnresolvedEntity, uint> MetadataTokens = new Dictionary<IUnresolvedEntity, uint>();
public Dictionary<IUnresolvedMember, ITypeReference[]> LocalVariableTypes = new Dictionary<IUnresolvedMember, ITypeReference[]>();
public ModuleMetadataInfo(Module module)
{
this.Module = module;
}
public void AddMetadataToken(IUnresolvedMethod method, CecilLoader loader)
public void AddMethod(IUnresolvedMethod method, CecilLoader loader)
{
var cecilMethod = loader.GetCecilObject(method);
this.MetadataTokens[method] = cecilMethod.MetadataToken.ToUInt32();
this.LocalVariableTypes[method] = cecilMethod.Body.Variables.Select(v => loader.ReadTypeReference(v.VariableType)).ToArray();
}
}
@ -65,21 +67,21 @@ namespace Debugger @@ -65,21 +67,21 @@ namespace Debugger
moduleMetadataInfo.MetadataTokens[member] = cecilMember.MetadataToken.ToUInt32();
}
foreach (var member in typeDef.Methods) {
moduleMetadataInfo.AddMetadataToken(member, loader);
moduleMetadataInfo.AddMethod(member, loader);
}
foreach (var member in typeDef.Properties) {
if (member.CanGet)
moduleMetadataInfo.AddMetadataToken(member.Getter, loader);
moduleMetadataInfo.AddMethod(member.Getter, loader);
if (member.CanSet)
moduleMetadataInfo.AddMetadataToken(member.Setter, loader);
moduleMetadataInfo.AddMethod(member.Setter, loader);
}
foreach (var member in typeDef.Events) {
if (member.CanAdd)
moduleMetadataInfo.AddMetadataToken(member.AddAccessor, loader);
moduleMetadataInfo.AddMethod(member.AddAccessor, loader);
if (member.CanRemove)
moduleMetadataInfo.AddMetadataToken(member.RemoveAccessor, loader);
moduleMetadataInfo.AddMethod(member.RemoveAccessor, loader);
if (member.CanInvoke)
moduleMetadataInfo.AddMetadataToken(member.InvokeAccessor, loader);
moduleMetadataInfo.AddMethod(member.InvokeAccessor, loader);
}
}
weakTable.Add(asm, moduleMetadataInfo);
@ -93,7 +95,9 @@ namespace Debugger @@ -93,7 +95,9 @@ namespace Debugger
throw new ArgumentException("The assembly was not from the debugger type system");
return info;
}
#endregion
#region GetModule / GetMetadataToken / GetVariableType
public static Module GetModule(this IAssembly assembly)
{
return GetInfo(assembly).Module;
@ -116,6 +120,13 @@ namespace Debugger @@ -116,6 +120,13 @@ namespace Debugger
var info = GetInfo(method.ParentAssembly);
return info.MetadataTokens[method.UnresolvedMember];
}
public static IType GetVariableType(this IMethod method, int index)
{
var info = GetInfo(method.ParentAssembly);
var variableTypes = info.LocalVariableTypes[method.UnresolvedMember];
return variableTypes[index].Resolve(method.Compilation);
}
#endregion
#region IType -> ICorDebugType

Loading…
Cancel
Save