private string PrintArray(int indentLevel, CorArrayValue av, int expandDepth, bool canDoFunceval) { Debug.Assert(expandDepth >= 0); StringBuilder txt = new StringBuilder(); txt.Append("array ["); int[] dims = av.GetDimensions(); Debug.Assert(dims != null); for (int i = 0; i < dims.Length; ++i) { if (i != 0) { txt.Append(","); } txt.Append(dims[i]); } txt.Append("]"); if (expandDepth > 0 && av.Rank == 1 && av.ElementType != CorElementType.ELEMENT_TYPE_VOID) { for (int i = 0; i < dims[0]; i++) { MDbgValue v = new MDbgValue(Process, av.GetElementAtPosition(i)); txt.Append("\n").Append(IndentedString(indentLevel + 1, "[" + i + "] = ")). Append(IndentedBlock(indentLevel + 2, v.GetStringValue(expandDepth - 1, canDoFunceval))); } } return(txt.ToString()); }
/// <summary> Returns an element of an array (treats the array as zero-based and single dimensional) </summary> public Value GetElementAtPosition(int index) { try { return(new Value(this.AppDomain, CorArrayValue.GetElementAtPosition((uint)index))); } catch (ArgumentException) { throw new GetValueException("Invalid array index"); } }
/// <summary> /// Gets Array Items. This function can be called only on one dimensional arrays. /// </summary> /// <returns>An array of the values for the Array Items.</returns> public MDbgValue[] GetArrayItems() { if (!IsArrayType) { throw new MDbgValueException("Type is not array type"); } CorValue value = Dereference(CorValue, null); CorArrayValue av = value.CastToArrayValue(); int[] dims = av.GetDimensions(); Debug.Assert(dims != null); ArrayList al = new ArrayList(); Debug.Assert(av.Rank == 1); for (int i = 0; i < dims[0]; i++) { MDbgValue v = new MDbgValue(Process, "[" + i + "]", av.GetElementAtPosition(i)); al.Add(v); } return((MDbgValue[])al.ToArray(typeof(MDbgValue))); }
private string PrintArray(int indentLevel, CorArrayValue av, int expandDepth, bool canDoFunceval, string variableName, Dictionary <string, int> variablesToLog) { Debug.Assert(expandDepth >= 0); if (variablesToLog == null) { } else if (variablesToLog.Any(variable => variable.Key.StartsWith($@"{variableName}."))) { variablesToLog = variablesToLog .Where(variable => variable.Key.StartsWith($@"{variableName}.")) .ToDictionary(variable => variable.Key, variable => variable.Value); expandDepth = 1; } else if (variablesToLog.Any(variable => variable.Key == variableName)) { var thisVariable = variablesToLog.First(variable => variable.Key == variableName); expandDepth = thisVariable.Value; variablesToLog = null; } else { return("[SKIP]"); } StringBuilder txt = new StringBuilder(); txt.Append("array ["); int[] dims = av.GetDimensions(); Debug.Assert(dims != null); for (int i = 0; i < dims.Length; ++i) { if (i != 0) { txt.Append(","); } txt.Append(dims[i]); } txt.Append("]"); if (expandDepth > 0 && av.Rank == 1 && av.ElementType != CorElementType.ELEMENT_TYPE_VOID) { for (int i = 0; i < dims[0]; i++) { MDbgValue v = new MDbgValue(Process, av.GetElementAtPosition(i)); var newVariableName = $"{variableName}.[{i}]"; var newVariablesToLog = variablesToLog == null ? null : variablesToLog .ToDictionary( variable => $"{newVariableName}{variable.Key.Remove(0, variableName.Length)}", variable => variable.Value); txt .Append("\n") .Append(IndentedString(indentLevel + 1, "[" + i + "] = ")) .Append(IndentedBlock(indentLevel + 2, v.GetStringValue(expandDepth - 1, canDoFunceval, $"{variableName}.[{i}]", newVariablesToLog))); } } return(txt.ToString()); }