Beispiel #1
0
        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());
        }
Beispiel #2
0
 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]);
            }
        }
Beispiel #4
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]);
 }
Beispiel #6
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));
        }
Beispiel #7
0
        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());
        }