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()); }
public int[] GetDimensions() { if (array != null) { return(array.GetDimensions()); } else { return(new int[0]); } }
public int[] GetDimensions() { CorArrayValue array = CorObjectAdaptor.GetRealObject(ctx, obj) as CorArrayValue; if (array != null) { return(array.GetDimensions()); } else { return(new int[0]); } }
/// <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))); }
public int[] GetDimensions() { return(array != null?array.GetDimensions() : new int[0]); }
public override string CallToString(EvaluationContext ctx, object objr) { CorValue obj = GetRealObject(ctx, objr); if ((obj is CorReferenceValue) && ((CorReferenceValue)obj).IsNull) { return(string.Empty); } CorStringValue stringVal = obj as CorStringValue; if (stringVal != null) { return(stringVal.String); } CorArrayValue arr = obj as CorArrayValue; if (arr != null) { StringBuilder tn = new StringBuilder(GetDisplayTypeName(ctx, arr.ExactType.FirstTypeParameter)); tn.Append("["); int[] dims = arr.GetDimensions(); for (int n = 0; n < dims.Length; n++) { if (n > 0) { tn.Append(','); } tn.Append(dims[n]); } tn.Append("]"); return(tn.ToString()); } CorEvaluationContext cctx = (CorEvaluationContext)ctx; CorObjectValue co = obj as CorObjectValue; if (co != null) { if (IsEnum(ctx, co.ExactType)) { MetadataType rt = co.ExactType.GetTypeInfo(cctx.Session) as MetadataType; bool isFlags = rt != null && rt.ReallyIsFlagsEnum; string enumName = GetTypeName(ctx, co.ExactType); ValueReference val = GetMember(ctx, null, objr, "value__"); ulong nval = (ulong)System.Convert.ChangeType(val.ObjectValue, typeof(ulong)); ulong remainingFlags = nval; string flags = null; foreach (ValueReference evals in GetMembers(ctx, co.ExactType, null, BindingFlags.Public | BindingFlags.Static)) { ulong nev = (ulong)System.Convert.ChangeType(evals.ObjectValue, typeof(ulong)); if (nval == nev) { return(evals.Name); } if (isFlags && nev != 0 && (nval & nev) == nev) { if (flags == null) { flags = enumName + "." + evals.Name; } else { flags += " | " + enumName + "." + evals.Name; } remainingFlags &= ~nev; } } if (isFlags) { if (remainingFlags == nval) { return(nval.ToString()); } if (remainingFlags != 0) { flags += " | " + remainingFlags; } return(flags); } else { return(nval.ToString()); } } CorType targetType = (CorType)GetValueType(ctx, objr); MethodInfo met = OverloadResolve(cctx, "ToString", targetType, new CorType[0], BindingFlags.Public | BindingFlags.Instance, false); if (met != null && met.DeclaringType.FullName != "System.Object") { object[] args = new object[0]; object ores = RuntimeInvoke(ctx, targetType, objr, "ToString", args, args); CorStringValue res = GetRealObject(ctx, ores) as CorStringValue; if (res != null) { return(res.String); } } return(GetDisplayTypeName(ctx, targetType)); } CorGenericValue genVal = obj as CorGenericValue; if (genVal != null) { return(genVal.GetValue().ToString()); } return(base.CallToString(ctx, obj)); }
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()); }