/// <summary> /// This method is called by the debug engine to retrieve the current local variables. /// The result of this call will be a query containing the names of the local variables /// as well as IL code to retrieve each variable value. /// </summary> /// <param name="inspectionContext">Context of the evaluation. This contains options/flags /// to be used during compilation. It also contains the InspectionSession. The inspection /// session is the object that provides lifetime management for our objects. When the user /// steps or continues the process, the debug engine will dispose of the inspection session</param> /// <param name="instructionAddress">Instruction address or code location to use as the /// reference point for where we need to retrieve the local variables</param> /// <param name="argumentsOnly">True if only arguments are needed</param> /// <returns>A local variables query</returns> DkmCompiledClrLocalsQuery IDkmClrExpressionCompiler.GetClrLocalVariableQuery(DkmInspectionContext inspectionContext, DkmClrInstructionAddress instructionAddress, bool argumentsOnly) { var result = inspectionContext.GetClrLocalVariableQuery(instructionAddress, argumentsOnly); var newlocals = new List <DkmClrLocalVariableInfo>(); bool changed = false; foreach (var loc in result.LocalInfo) { if (loc.VariableName.Contains("$")) { // do not add changed = true; } else if (loc.VariableName == "this") { // rename var selfName = XSharpType.FormatKeyword("SELF"); var newloc = DkmClrLocalVariableInfo.Create(selfName, selfName, loc.MethodName, loc.CompilationFlags, loc.ResultCategory, loc.CustomTypeInfo); newlocals.Add(newloc); changed = true; } else { newlocals.Add(loc); } } if (changed) { result = DkmCompiledClrLocalsQuery.Create(result.RuntimeInstance, result.DataContainer, result.LanguageId, result.Binary, result.TypeName, new ReadOnlyCollection <DkmClrLocalVariableInfo>(newlocals)); } return(result); }
private string TryFormatValue(DkmClrValue value, DkmInspectionContext inspectionContext) { if (value.ValueFlags.HasFlag(DkmClrValueFlags.Error)) { // Error message. Just show the error. return(value.HostObjectValue as string); } Type lmrType = value.Type.GetLmrType(); if (lmrType.IsEnum) { return(value.GetValueString(inspectionContext, null)); } XSharpType xType = Utility.GetXSharpTypeForLmrType(lmrType); if (xType == XSharpType.Invalid) { // We don't know how to format this value return(null); } uint radix = inspectionContext.Radix; object hostObjectValue = value.HostObjectValue; if (hostObjectValue != null) { // If the value can be marshalled into the debugger process, HostObjectValue is the // equivalent value in the debugger process. switch (System.Type.GetTypeCode(hostObjectValue.GetType())) { case TypeCode.Int32: return(FormatInteger((int)hostObjectValue, radix)); case TypeCode.Boolean: return((bool)hostObjectValue ? XSharpType.FormatKeyword("TRUE") : XSharpType.FormatKeyword("FALSE")); case TypeCode.String: return(FormatString(hostObjectValue.ToString(), inspectionContext.EvaluationFlags)); } } return(null); }