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

Loading…
Cancel
Save