diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
index be34163e33..71e08ddd8f 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
@@ -363,6 +363,9 @@
+
+
+
@@ -375,4 +378,4 @@
-
+
\ No newline at end of file
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/Module.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/Module.cs
index b2e6fdb635..33a4d5a0af 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/Module.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/Module.cs
@@ -127,18 +127,7 @@ namespace Debugger
metaData = new MetaData(pModule);
- uint pStringLenght = 0; // Terminating character included in pStringLenght
- IntPtr pString = IntPtr.Zero;
- pModule.GetName(pStringLenght,
- out pStringLenght, // real string lenght
- pString);
- // Allocate string buffer
- pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
- pModule.GetName(pStringLenght,
- out pStringLenght, // real string lenght
- pString);
- fullPath = Marshal.PtrToStringUni(pString);
- Marshal.FreeHGlobal(pString);
+ fullPath = pModule.Name;
symReader = metaData.GetSymReader(fullPath, null);
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs
index ab33908dd9..e8956ddcd7 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs
@@ -25,55 +25,12 @@ namespace Debugger
}
}
- public unsafe object Primitive {
+ public object Primitive {
get {
if (CorType == CorElementType.STRING) {
- uint pStringLenght = 1; // Terminating character NOT included in pStringLenght
- IntPtr pString = Marshal.AllocHGlobal(2);
-
- // For some reason this function does not accept IntPtr.Zero
- (corValue.CastTo()).GetString(pStringLenght,
- out pStringLenght,
- pString);
- // Re-allocate string buffer
- Marshal.FreeHGlobal(pString);
- // Termination null is not included in pStringLenght
- pStringLenght++;
- pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
-
- (corValue.CastTo()).GetString(pStringLenght,
- out pStringLenght,
- pString);
-
- string text = Marshal.PtrToStringUni(pString);
- Marshal.FreeHGlobal(pString);
-
- return text;
+ return (corValue.CastTo()).String;
} else {
-
- object retValue;
- IntPtr pValue = Marshal.AllocHGlobal(8);
- (corValue.CastTo()).GetValue(pValue);
- switch(CorType)
- {
- case CorElementType.BOOLEAN: retValue = *((System.Boolean*)pValue); break;
- case CorElementType.CHAR: retValue = *((System.Char*)pValue); break;
- case CorElementType.I1: retValue = *((System.SByte*)pValue); break;
- case CorElementType.U1: retValue = *((System.Byte*)pValue); break;
- case CorElementType.I2: retValue = *((System.Int16*)pValue); break;
- case CorElementType.U2: retValue = *((System.UInt16*)pValue); break;
- case CorElementType.I4: retValue = *((System.Int32*)pValue); break;
- case CorElementType.U4: retValue = *((System.UInt32*)pValue); break;
- case CorElementType.I8: retValue = *((System.Int64*)pValue); break;
- case CorElementType.U8: retValue = *((System.UInt64*)pValue); break;
- case CorElementType.R4: retValue = *((System.Single*)pValue); break;
- case CorElementType.R8: retValue = *((System.Double*)pValue); break;
- case CorElementType.I: retValue = *((int*)pValue); break;
- case CorElementType.U: retValue = *((uint*)pValue); break;
- default: retValue = null; break;
- }
- Marshal.FreeHGlobal(pValue);
- return retValue;
+ return (corValue.CastTo()).Value;
}
}
set {
@@ -88,27 +45,7 @@ namespace Debugger
if (CorType == CorElementType.STRING) {
throw new NotSupportedException();
} else {
- IntPtr pValue = Marshal.AllocHGlobal(8);
- switch(CorType)
- {
- case CorElementType.BOOLEAN: *((System.Boolean*)pValue) = (System.Boolean)newValue; break;
- case CorElementType.CHAR: *((System.Char*)pValue) = (System.Char)newValue; break;
- case CorElementType.I1: *((System.SByte*)pValue) = (System.SByte)newValue; break;
- case CorElementType.U1: *((System.Byte*)pValue) = (System.Byte)newValue; break;
- case CorElementType.I2: *((System.Int16*)pValue) = (System.Int16)newValue; break;
- case CorElementType.U2: *((System.UInt16*)pValue) = (System.UInt16)newValue; break;
- case CorElementType.I4: *((System.Int32*)pValue) = (System.Int32)newValue; break;
- case CorElementType.U4: *((System.UInt32*)pValue) = (System.UInt32)newValue; break;
- case CorElementType.I8: *((System.Int64*)pValue) = (System.Int64)newValue; break;
- case CorElementType.U8: *((System.UInt64*)pValue) = (System.UInt64)newValue; break;
- case CorElementType.R4: *((System.Single*)pValue) = (System.Single)newValue; break;
- case CorElementType.R8: *((System.Double*)pValue) = (System.Double)newValue; break;
- case CorElementType.I: *((int*)pValue) = (int)newValue; break;
- case CorElementType.U: *((uint*)pValue) = (uint)newValue; break;
- default: throw new NotSupportedException();
- }
- (corValue.CastTo()).SetValue(pValue);
- Marshal.FreeHGlobal(pValue);
+ (corValue.CastTo()).Value = newValue;
}
OnValueChanged();
}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugGenericValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugGenericValue.cs
new file mode 100644
index 0000000000..6c40aa2325
--- /dev/null
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugGenericValue.cs
@@ -0,0 +1,66 @@
+//
+//
+//
+//
+// $Revision$
+//
+
+namespace Debugger.Wrappers.CorDebug
+{
+ using System;
+ using System.Runtime.InteropServices;
+
+ public partial class ICorDebugGenericValue
+ {
+ public unsafe object Value {
+ get {
+ object retValue;
+ IntPtr pValue = Marshal.AllocHGlobal((int)Size);
+ GetValue(pValue);
+ switch((CorElementType)Type)
+ {
+ case CorElementType.BOOLEAN: retValue = *((System.Boolean*)pValue); break;
+ case CorElementType.CHAR: retValue = *((System.Char*) pValue); break;
+ case CorElementType.I1: retValue = *((System.SByte*) pValue); break;
+ case CorElementType.U1: retValue = *((System.Byte*) pValue); break;
+ case CorElementType.I2: retValue = *((System.Int16*) pValue); break;
+ case CorElementType.U2: retValue = *((System.UInt16*) pValue); break;
+ case CorElementType.I4: retValue = *((System.Int32*) pValue); break;
+ case CorElementType.U4: retValue = *((System.UInt32*) pValue); break;
+ case CorElementType.I8: retValue = *((System.Int64*) pValue); break;
+ case CorElementType.U8: retValue = *((System.UInt64*) pValue); break;
+ case CorElementType.R4: retValue = *((System.Single*) pValue); break;
+ case CorElementType.R8: retValue = *((System.Double*) pValue); break;
+ case CorElementType.I: retValue = *((int*) pValue); break;
+ case CorElementType.U: retValue = *((uint*) pValue); break;
+ default: throw new NotSupportedException();
+ }
+ Marshal.FreeHGlobal(pValue);
+ return retValue;
+ }
+ set {
+ IntPtr pValue = Marshal.AllocHGlobal((int)Size);
+ switch((CorElementType)Type)
+ {
+ case CorElementType.BOOLEAN: *((System.Boolean*)pValue) = (System.Boolean)value; break;
+ case CorElementType.CHAR: *((System.Char*) pValue) = (System.Char) value; break;
+ case CorElementType.I1: *((System.SByte*) pValue) = (System.SByte) value; break;
+ case CorElementType.U1: *((System.Byte*) pValue) = (System.Byte) value; break;
+ case CorElementType.I2: *((System.Int16*) pValue) = (System.Int16) value; break;
+ case CorElementType.U2: *((System.UInt16*) pValue) = (System.UInt16) value; break;
+ case CorElementType.I4: *((System.Int32*) pValue) = (System.Int32) value; break;
+ case CorElementType.U4: *((System.UInt32*) pValue) = (System.UInt32) value; break;
+ case CorElementType.I8: *((System.Int64*) pValue) = (System.Int64) value; break;
+ case CorElementType.U8: *((System.UInt64*) pValue) = (System.UInt64) value; break;
+ case CorElementType.R4: *((System.Single*) pValue) = (System.Single) value; break;
+ case CorElementType.R8: *((System.Double*) pValue) = (System.Double) value; break;
+ case CorElementType.I: *((int*) pValue) = (int) value; break;
+ case CorElementType.U: *((uint*) pValue) = (uint) value; break;
+ default: throw new NotSupportedException();
+ }
+ SetValue(pValue);
+ Marshal.FreeHGlobal(pValue);
+ }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugModule.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugModule.cs
new file mode 100644
index 0000000000..0e74a0c190
--- /dev/null
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugModule.cs
@@ -0,0 +1,21 @@
+//
+//
+//
+//
+// $Revision$
+//
+
+namespace Debugger.Wrappers.CorDebug
+{
+ using System;
+
+
+ public partial class ICorDebugModule
+ {
+ public string Name {
+ get {
+ return Util.GetString(GetName);
+ }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStringValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStringValue.cs
new file mode 100644
index 0000000000..03d75c65b8
--- /dev/null
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStringValue.cs
@@ -0,0 +1,21 @@
+//
+//
+//
+//
+// $Revision$
+//
+
+namespace Debugger.Wrappers.CorDebug
+{
+ using System;
+
+
+ public partial class ICorDebugStringValue
+ {
+ public string String {
+ get {
+ return Util.GetString(GetString);
+ }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorSym/ISymUnmanagedDocument.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorSym/ISymUnmanagedDocument.cs
index 73c1ce6dae..e97645296e 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorSym/ISymUnmanagedDocument.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorSym/ISymUnmanagedDocument.cs
@@ -14,7 +14,7 @@ namespace Debugger.Wrappers.CorSym
{
public string URL {
get {
- return Util.GetString(GetURL);
+ return Util.GetString(GetURL, 0);
}
}
}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs
index 488073d463..ddfd2f774a 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs
@@ -49,64 +49,33 @@ namespace Debugger.Wrappers.MetaData
public TypeDefProps GetTypeDefProps(uint typeToken)
{
- TypeDefProps typeDefProps;
+ TypeDefProps typeDefProps = new TypeDefProps();
typeDefProps.Token = typeToken;
-
- uint pStringLenght = 0; // Terminating character included in pStringLenght
- IntPtr pString = IntPtr.Zero;
-
- // Get length of string
- metaData.GetTypeDefProps(typeDefProps.Token,
- pString,
- pStringLenght,
- out pStringLenght,
- out typeDefProps.Flags,
- out typeDefProps.SuperClassToken);
-
- // Allocate string buffer
- pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
-
- // Get properties
- metaData.GetTypeDefProps(typeDefProps.Token,
- pString,
- pStringLenght,
- out pStringLenght,
- out typeDefProps.Flags,
- out typeDefProps.SuperClassToken);
-
- typeDefProps.Name = Marshal.PtrToStringUni(pString);
- Marshal.FreeHGlobal(pString);
+ typeDefProps.Name =
+ Util.GetString(delegate(uint pStringLenght, out uint stringLenght, System.IntPtr pString) {
+ metaData.GetTypeDefProps(typeDefProps.Token,
+ pString, pStringLenght, out stringLenght, // The string to get
+ out typeDefProps.Flags,
+ out typeDefProps.SuperClassToken);
+ });
return typeDefProps;
}
public TypeRefProps GetTypeRefProps(uint typeToken)
{
- TypeRefProps typeRefProps;
+ TypeRefProps typeRefProps = new TypeRefProps();
typeRefProps.Token = typeToken;
-
- uint unused;
- uint pStringLenght = 0; // Terminating character included in pStringLenght
- IntPtr pString = IntPtr.Zero;
- metaData.GetTypeRefProps(typeRefProps.Token,
- out unused,
- pString,
- pStringLenght,
- out pStringLenght); // real string lenght
-
- // Allocate string buffer
- pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
-
- metaData.GetTypeRefProps(typeRefProps.Token,
- out unused,
- pString,
- pStringLenght,
- out pStringLenght); // real string lenght
-
- typeRefProps.Name = Marshal.PtrToStringUni(pString);
- Marshal.FreeHGlobal(pString);
+ typeRefProps.Name =
+ Util.GetString(delegate(uint pStringLenght, out uint stringLenght, System.IntPtr pString) {
+ uint unused;
+ metaData.GetTypeRefProps(typeRefProps.Token,
+ out unused,
+ pString, pStringLenght,out stringLenght // The string to get
+ );
+ });
return typeRefProps;
}
@@ -128,43 +97,23 @@ namespace Debugger.Wrappers.MetaData
public FieldProps GetFieldProps(uint fieldToken)
{
- FieldProps fieldProps;
+ FieldProps fieldProps = new FieldProps();
fieldProps.Token = fieldToken;
-
- uint unused;
- IntPtr unusedPtr = IntPtr.Zero;
- uint pStringLenght = 0; // Terminating character included in pStringLenght
- IntPtr pString = IntPtr.Zero;
- metaData.GetFieldProps(fieldProps.Token,
- out fieldProps.ClassToken,
- pString,
- pStringLenght,
- out pStringLenght, // real string lenght
- out fieldProps.Flags,
- IntPtr.Zero,
- out unused,
- out unused,
- out unusedPtr,
- out unused);
-
- // Allocate string buffer
- pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
-
- metaData.GetFieldProps(fieldProps.Token,
- out fieldProps.ClassToken,
- pString,
- pStringLenght,
- out pStringLenght, // real string lenght
- out fieldProps.Flags,
- IntPtr.Zero,
- out unused,
- out unused,
- out unusedPtr,
- out unused);
-
- fieldProps.Name = Marshal.PtrToStringUni(pString);
- Marshal.FreeHGlobal(pString);
+ fieldProps.Name =
+ Util.GetString(delegate(uint pStringLenght, out uint stringLenght, System.IntPtr pString) {
+ uint unused;
+ IntPtr unusedPtr = IntPtr.Zero;
+ metaData.GetFieldProps(fieldProps.Token,
+ out fieldProps.ClassToken,
+ pString, pStringLenght, out stringLenght, // The string to get
+ out fieldProps.Flags,
+ IntPtr.Zero,
+ out unused,
+ out unused,
+ out unusedPtr,
+ out unused);
+ });
return fieldProps;
}
@@ -186,45 +135,24 @@ namespace Debugger.Wrappers.MetaData
public unsafe MethodProps GetMethodProps(uint methodToken)
{
- MethodProps methodProps;
+ MethodProps methodProps = new MethodProps();
methodProps.Token = methodToken;
-
- uint pStringLenght = 0; // Terminating character included in pStringLenght
- IntPtr pString = IntPtr.Zero;
- //IntPtr pSigBlob;
- uint sigBlobSize;
- metaData.GetMethodProps(methodProps.Token,
- out methodProps.ClassToken,
- pString,
- pStringLenght,
- out pStringLenght, // real string lenght
- out methodProps.Flags,
- IntPtr.Zero,//new IntPtr(&pSigBlob),
- out sigBlobSize,
- out methodProps.CodeRVA,
- out methodProps.ImplFlags);
-
- // Allocate string buffer
- pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
-
- metaData.GetMethodProps(methodProps.Token,
- out methodProps.ClassToken,
- pString,
- pStringLenght,
- out pStringLenght, // real string lenght
- out methodProps.Flags,
- IntPtr.Zero,//new IntPtr(&pSigBlob),
- out sigBlobSize,
- out methodProps.CodeRVA,
- out methodProps.ImplFlags);
-
- methodProps.Name = Marshal.PtrToStringUni(pString);
- Marshal.FreeHGlobal(pString);
+ methodProps.Name =
+ Util.GetString(delegate(uint pStringLenght, out uint stringLenght, System.IntPtr pString) {
+ uint sigBlobSize;
+ metaData.GetMethodProps(methodProps.Token,
+ out methodProps.ClassToken,
+ pString, pStringLenght, out stringLenght, // The string to get
+ out methodProps.Flags,
+ IntPtr.Zero,//new IntPtr(&pSigBlob),
+ out sigBlobSize,
+ out methodProps.CodeRVA,
+ out methodProps.ImplFlags);
+ });
methodProps.Signature = null;
//methodProps.Signature = new SignatureStream(pSigBlob, sigBlobSize);
-
//Marshal.FreeCoTaskMem(pSigBlob);
return methodProps;
@@ -239,40 +167,21 @@ namespace Debugger.Wrappers.MetaData
public ParamProps GetParamProps(uint paramToken)
{
- ParamProps paramProps;
+ ParamProps paramProps = new ParamProps();
paramProps.Token = paramToken;
-
- uint unused;
- uint pStringLenght = 0; // Terminating character included in pStringLenght
- IntPtr pString = IntPtr.Zero;
- metaData.GetParamProps(paramProps.Token,
- out paramProps.MethodToken,
- out paramProps.ParameterSequence,
- pString,
- pStringLenght,
- out pStringLenght, // real string lenght
- out paramProps.Flags,
- out unused,
- IntPtr.Zero,
- out unused);
-
- // Allocate string buffer
- pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
-
- metaData.GetParamProps(paramProps.Token,
- out paramProps.MethodToken,
- out paramProps.ParameterSequence,
- pString,
- pStringLenght,
- out pStringLenght, // real string lenght
- out paramProps.Flags,
- out unused,
- IntPtr.Zero,
- out unused);
-
- paramProps.Name = Marshal.PtrToStringUni(pString);
- Marshal.FreeHGlobal(pString);
+ paramProps.Name =
+ Util.GetString(delegate(uint pStringLenght, out uint stringLenght, System.IntPtr pString) {
+ uint unused;
+ metaData.GetParamProps(paramProps.Token,
+ out paramProps.MethodToken,
+ out paramProps.ParameterSequence,
+ pString, pStringLenght, out stringLenght, // The string to get
+ out paramProps.Flags,
+ out unused,
+ IntPtr.Zero,
+ out unused);
+ });
return paramProps;
}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/Util.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/Util.cs
index 49a50c1715..e54da450ac 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/Util.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/Util.cs
@@ -11,22 +11,36 @@ using System.Runtime.InteropServices;
namespace Debugger.Wrappers
{
- public delegate void UnmanagedStringGetter(uint bufferSize, out uint returnedSize, System.IntPtr pString);
+ public delegate void UnmanagedStringGetter(uint pStringLenght, out uint stringLenght, System.IntPtr pString);
public static class Util
{
public static string GetString(UnmanagedStringGetter getter)
{
- uint pStringLenght = 0;
- IntPtr pString = IntPtr.Zero;
- getter(pStringLenght, out pStringLenght, pString);
- // Allocate string buffer
- pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
- getter(pStringLenght, out pStringLenght, pString);
- string str = Marshal.PtrToStringUni(pString);
- // Release buffer
- Marshal.FreeHGlobal(pString);
- return str;
+ return GetString(getter, 64);
+ }
+
+ public static string GetString(UnmanagedStringGetter getter, uint defaultLenght)
+ {
+ string managedString;
+ IntPtr unmanagedString;
+ uint exactLenght;
+
+ // First attempt
+ unmanagedString = Marshal.AllocHGlobal((int)defaultLenght * 2 + 2); // + 2 for terminating zero
+ getter(defaultLenght, out exactLenght, defaultLenght > 0 ? unmanagedString : IntPtr.Zero);
+
+ if(exactLenght > defaultLenght) {
+ // Second attempt
+ Marshal.FreeHGlobal(unmanagedString);
+ unmanagedString = Marshal.AllocHGlobal((int)exactLenght * 2 + 2); // + 2 for terminating zero
+ getter(exactLenght, out exactLenght, unmanagedString);
+ }
+
+ // Return managed string and free unmanaged memory
+ managedString = Marshal.PtrToStringUni(unmanagedString);
+ Marshal.FreeHGlobal(unmanagedString);
+ return managedString;
}
}
}