Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5102 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
9 changed files with 144 additions and 194 deletions
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Globalization; |
||||
using System.Reflection; |
||||
using System.Runtime.InteropServices; |
||||
|
||||
using Debugger.Wrappers.CorDebug; |
||||
using Debugger.Wrappers.CorSym; |
||||
using Debugger.Wrappers.MetaData; |
||||
using ICSharpCode.NRefactory.Ast; |
||||
using Mono.Cecil.Signatures; |
||||
|
||||
namespace Debugger.MetaData |
||||
{ |
||||
public class DebugLocalVariableInfo |
||||
{ |
||||
ValueGetter getter; |
||||
|
||||
public string Name { get; internal set; } |
||||
public DebugType Type { get; private set; } |
||||
public bool IsThis { get; internal set; } |
||||
public bool IsCaptured { get; internal set; } |
||||
|
||||
public DebugLocalVariableInfo(string name, DebugType type, ValueGetter getter) |
||||
{ |
||||
this.Name = name; |
||||
this.Type = type; |
||||
this.getter = getter; |
||||
} |
||||
|
||||
public Value GetValue(StackFrame context) |
||||
{ |
||||
return getter(context); |
||||
} |
||||
|
||||
public override string ToString() |
||||
{ |
||||
return this.Type.ToString() + " " + this.Name; |
||||
} |
||||
} |
||||
} |
@ -1,146 +0,0 @@
@@ -1,146 +0,0 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using Debugger.Wrappers.CorDebug; |
||||
using Debugger.Wrappers.MetaData; |
||||
using System.Reflection; |
||||
|
||||
namespace Debugger.MetaData |
||||
{ |
||||
public partial class DebugType |
||||
{ |
||||
private bool primitiveTypeCached; |
||||
private System.Type primitiveType; |
||||
|
||||
/// <summary> Returns simple managed type coresponding to the primitive type. </summary>
|
||||
[Tests.Ignore] |
||||
public System.Type PrimitiveType { |
||||
get { |
||||
if (!primitiveTypeCached) { |
||||
primitiveTypeCached = true; |
||||
primitiveType = GetPrimitiveType(); |
||||
} |
||||
return primitiveType; |
||||
} |
||||
} |
||||
|
||||
/// <summary> Returns simple managed type coresponding to the primitive type. </summary>
|
||||
private System.Type GetPrimitiveType() |
||||
{ |
||||
if (corElementType == CorElementType.VALUETYPE) { |
||||
CorElementType corType; |
||||
try { |
||||
corType = TypeNameToCorElementType(this.FullName); |
||||
} catch (DebuggerException) { |
||||
return null; |
||||
} |
||||
return CorElementTypeToManagedType(corType); |
||||
} else { |
||||
return CorElementTypeToManagedType(corElementType); |
||||
} |
||||
} |
||||
|
||||
internal static Type CorElementTypeToManagedType(CorElementType corElementType) |
||||
{ |
||||
switch(corElementType) { |
||||
case CorElementType.BOOLEAN: return typeof(System.Boolean); |
||||
case CorElementType.CHAR: return typeof(System.Char); |
||||
case CorElementType.I1: return typeof(System.SByte); |
||||
case CorElementType.U1: return typeof(System.Byte); |
||||
case CorElementType.I2: return typeof(System.Int16); |
||||
case CorElementType.U2: return typeof(System.UInt16); |
||||
case CorElementType.I4: return typeof(System.Int32); |
||||
case CorElementType.U4: return typeof(System.UInt32); |
||||
case CorElementType.I8: return typeof(System.Int64); |
||||
case CorElementType.U8: return typeof(System.UInt64); |
||||
case CorElementType.R4: return typeof(System.Single); |
||||
case CorElementType.R8: return typeof(System.Double); |
||||
case CorElementType.I: return typeof(System.IntPtr); |
||||
case CorElementType.U: return typeof(System.UIntPtr); |
||||
case CorElementType.STRING: return typeof(System.String); |
||||
default: return null; |
||||
} |
||||
} |
||||
|
||||
internal static CorElementType TypeNameToCorElementType(string fullname) |
||||
{ |
||||
switch (fullname) { |
||||
case "System.Boolean": return CorElementType.BOOLEAN; |
||||
case "System.Char": return CorElementType.CHAR; |
||||
case "System.SByte": return CorElementType.I1; |
||||
case "System.Byte": return CorElementType.U1; |
||||
case "System.Int16": return CorElementType.I2; |
||||
case "System.UInt16": return CorElementType.U2; |
||||
case "System.Int32": return CorElementType.I4; |
||||
case "System.UInt32": return CorElementType.U4; |
||||
case "System.Int64": return CorElementType.I8; |
||||
case "System.UInt64": return CorElementType.U8; |
||||
case "System.Single": return CorElementType.R4; |
||||
case "System.Double": return CorElementType.R8; |
||||
case "System.IntPtr": return CorElementType.I; |
||||
case "System.UIntPtr": return CorElementType.U; |
||||
case "System.String": return CorElementType.STRING; |
||||
default: throw new DebuggerException("Not a primitive type"); |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* Find the super class manually - unused since we have ICorDebugType.GetBase() in .NET 2.0 |
||||
* |
||||
protected static ICorDebugClass GetSuperClass(Process process, ICorDebugClass currClass) |
||||
{ |
||||
Module currModule = process.GetModule(currClass.Module); |
||||
uint superToken = currModule.MetaData.GetTypeDefProps(currClass.Token).SuperClassToken; |
||||
|
||||
// It has no base class
|
||||
if ((superToken & 0x00FFFFFF) == 0x00000000) return null; |
||||
|
||||
// TypeDef - Localy defined
|
||||
if ((superToken & 0xFF000000) == 0x02000000) { |
||||
return currModule.CorModule.GetClassFromToken(superToken); |
||||
} |
||||
|
||||
// TypeSpec - generic class whith 'which'
|
||||
if ((superToken & 0xFF000000) == 0x1B000000) { |
||||
// Walkaround - fake 'object' type
|
||||
string fullTypeName = "System.Object"; |
||||
|
||||
foreach (Module superModule in process.Modules) { |
||||
try { |
||||
uint token = superModule.MetaData.FindTypeDefByName(fullTypeName, 0).Token; |
||||
return superModule.CorModule.GetClassFromToken(token); |
||||
} catch { |
||||
continue; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// TypeRef - Referencing to external assembly
|
||||
if ((superToken & 0xFF000000) == 0x01000000) { |
||||
string fullTypeName = currModule.MetaData.GetTypeRefProps(superToken).Name; |
||||
|
||||
foreach (Module superModule in process.Modules) { |
||||
// TODO: Does not work for nested
|
||||
// TODO: preservesig
|
||||
try { |
||||
uint token = superModule.MetaData.FindTypeDefByName(fullTypeName, 0).Token; |
||||
return superModule.CorModule.GetClassFromToken(token); |
||||
} catch { |
||||
continue; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// TODO: Can also be TypeSpec = 0x1b000000
|
||||
|
||||
throw new DebuggerException("Superclass not found"); |
||||
} |
||||
*/ |
||||
} |
||||
} |
Loading…
Reference in new issue