diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.Primitive.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.Primitive.cs index 6c72d88f39..69f0e00fc4 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.Primitive.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.Primitive.cs @@ -17,7 +17,7 @@ namespace Debugger { ICorDebugGenericValue CorGenericValue { get { - if (!this.Type.IsPrimitive) throw new DebuggerException("Value is not a primitive type"); + if (!this.Type.IsPrimitive && !this.Type.IsValueType) throw new DebuggerException("Value is not a 'generic'"); // Dereference and unbox if (this.CorValue.Is()) { @@ -35,6 +35,7 @@ namespace Debugger /// public object PrimitiveValue { get { + if (!this.Type.IsPrimitive) throw new DebuggerException("Value is not a primitive type"); if (this.Type.IsString) { if (this.IsNull) return null; return this.CorValue.CastTo().Dereference().CastTo().String; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.cs index 0dad0b8e62..f1c27313d1 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.cs @@ -86,10 +86,30 @@ namespace Debugger public Value GetPermanentReference() { ICorDebugValue corValue = this.CorValue; - // TODO if (this.Type.IsClass) { corValue = this.CorObjectValue.CastTo().CreateHandle(CorDebugHandleType.HANDLE_STRONG).CastTo(); } + if (this.Type.IsValueType || this.Type.IsPrimitive) { + if (!corValue.Is()) { + // Box the value type + if (this.Type.IsPrimitive) { + // Get value type for the primive type + corValue = Eval.NewObjectNoConstructor(DebugType.Create(process, null, this.Type.FullName)).CorValue; + } else { + corValue = Eval.NewObjectNoConstructor(this.Type).CorValue; + } + // Make the reference to box permanent + corValue = corValue.CastTo().Dereference().CastTo().CreateHandle(CorDebugHandleType.HANDLE_STRONG).CastTo(); + // Create new value + Value newValue = new Value(process, expression, corValue); + // Copy the data inside the box + newValue.CorGenericValue.RawValue = this.CorGenericValue.RawValue; + return newValue; + } else { + // Make the reference to box permanent + corValue = corValue.CastTo().Dereference().CastTo().CreateHandle(CorDebugHandleType.HANDLE_STRONG).CastTo(); + } + } return new Value(process, expression, corValue); } diff --git a/src/Main/StartUp/Project/Resources/StringResources.resources b/src/Main/StartUp/Project/Resources/StringResources.resources index 33709a7915..87e06fcc0b 100644 Binary files a/src/Main/StartUp/Project/Resources/StringResources.resources and b/src/Main/StartUp/Project/Resources/StringResources.resources differ