From 53c7f38b2d77cc34d8a202d84c9ed9ab7067ceb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kon=C3=AD=C4=8Dek?= Date: Tue, 23 Jun 2009 18:22:23 +0000 Subject: [PATCH] - Fixed NullReferenceException in DebugType.IsInteger - Added caching of DebugType.PrimitiveType git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4351 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Metadata/DebugType-Helpers.cs | 105 ++++++++++-------- .../Project/Src/Metadata/DebugType.cs | 3 + 2 files changed, 62 insertions(+), 46 deletions(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs index 40ea725863..4c8f84389d 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs @@ -32,9 +32,9 @@ namespace Debugger.MetaData { int hashCode = 0; unchecked { - if (MemberType != null) hashCode += 1000000007 * MemberType.GetHashCode(); + if (MemberType != null) hashCode += 1000000007 * MemberType.GetHashCode(); hashCode += 1000000009 * BindingFlags.GetHashCode(); - if (Name != null) hashCode += 1000000021 * Name.GetHashCode(); + if (Name != null) hashCode += 1000000021 * Name.GetHashCode(); hashCode += 1000000033 * Token.GetHashCode(); } return hashCode; @@ -43,7 +43,7 @@ namespace Debugger.MetaData public override bool Equals(object obj) { Query other = obj as Query; - if (other == null) return false; + if (other == null) return false; return object.Equals(this.MemberType, other.MemberType) && this.BindingFlags == other.BindingFlags && this.Name == other.Name && this.Token == other.Token; } } @@ -128,7 +128,7 @@ namespace Debugger.MetaData if ((bindingFlags & BindingFlags.GetProperty) != 0 && memberInfo is PropertyInfo && ((PropertyInfo)memberInfo).GetMethod != null && - ((PropertyInfo)memberInfo).GetMethod.ParameterCount == 0) + ((PropertyInfo)memberInfo).GetMethod.ParameterCount == 0) { accept = true; } @@ -297,65 +297,78 @@ namespace Debugger.MetaData #endregion + private bool primitiveTypeCached = false; + private System.Type primitiveTypeCache; + /// Returns simple managed type coresponding to the primitive type. [Tests.Ignore] public System.Type PrimitiveType { get { - if (corElementType == CorElementType.VALUETYPE) { - CorElementType corType; - try { - corType = TypeNameToCorElementType(this.FullName); - } catch (DebuggerException) { - return null; - } - return CorElementTypeToManagedType(corType); - } else { - return CorElementTypeToManagedType(corElementType); + if (!this.primitiveTypeCached) { + this.primitiveTypeCache = getPrimitiveType(); + this.primitiveTypeCached = true; } + return this.primitiveTypeCache; + } + } + + /// Returns simple managed type coresponding to the primitive type. + 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; + 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"); + 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"); } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs index 83ef5b685c..ff96a4124c 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs @@ -245,6 +245,9 @@ namespace Debugger.MetaData [Tests.Ignore] public bool IsInteger { get { + if (this.PrimitiveType == null) { + return false; + } switch (this.PrimitiveType.FullName) { case "System.SByte": case "System.Byte":