示例#1
0
        public override DbgValueNodeInfo[] GetDefaultNodes()
        {
            var res = new DbgValueNodeInfo[expressions.Count];

            for (int i = 0; i < res.Length; i++)
            {
                var info = expressions[i];
                res[i] = new DbgValueNodeInfo(info.Id, info.Expression, dnSpy_Debugger_Resources.ErrorEvaluatingExpression, causesSideEffects: true);
            }
            return(res);
        }
示例#2
0
        public override ValueNodesProviderResult GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions)
        {
            if (expressions.Count == 0)
            {
                return(new ValueNodesProviderResult(Array.Empty <DbgValueNodeInfo>(), false));
            }

            var infos = new DbgExpressionEvaluationInfo[expressions.Count];

            Debug.Assert((evalOptions & DbgEvaluationOptions.NoSideEffects) == 0);
            for (int i = 0; i < infos.Length; i++)
            {
                var info = expressions[i];
                // Root nodes in watch window can always func-eval
                var realEvalOptions     = evalOptions & ~DbgEvaluationOptions.NoFuncEval;
                var realNodeEvalOptions = nodeEvalOptions & ~DbgValueNodeEvaluationOptions.NoFuncEval;
                if (info.ForceEval)
                {
                    realEvalOptions = evalOptions & ~DbgEvaluationOptions.NoSideEffects;
                }
                else
                {
                    realEvalOptions = evalOptions | DbgEvaluationOptions.NoSideEffects;
                }
                Debug.Assert(((realEvalOptions & DbgEvaluationOptions.NoFuncEval) != 0) == ((realNodeEvalOptions & DbgValueNodeEvaluationOptions.NoFuncEval) != 0));
                info.ForceEval = false;
                if (info.ExpressionEvaluatorState == null)
                {
                    info.ExpressionEvaluatorState = language.ExpressionEvaluator.CreateExpressionEvaluatorState();
                }
                infos[i] = new DbgExpressionEvaluationInfo(info.Expression, realNodeEvalOptions, realEvalOptions, info.ExpressionEvaluatorState);
            }

            var compRes = language.ValueNodeFactory.Create(context, frame, infos);

            Debug.Assert(compRes.Length == infos.Length);

            var res = new DbgValueNodeInfo[compRes.Length];

            for (int i = 0; i < res.Length; i++)
            {
                var info = compRes[i];
                if (info.ValueNode.Expression != expressions[i].Expression)
                {
                    throw new InvalidOperationException();
                }
                res[i] = new DbgValueNodeInfo(info.ValueNode, expressions[i].Id, info.CausesSideEffects);
            }
            return(new ValueNodesProviderResult(res, false));
        }
        public override DbgValueNodeInfo[] GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions)
        {
            var returnValues = language.ReturnValuesProvider.GetNodes(context, frame, nodeEvalOptions);
            var variables    = language.AutosProvider.GetNodes(context, frame, nodeEvalOptions);

            var res = new DbgValueNodeInfo[returnValues.Length + variables.Length];
            int ri  = 0;

            for (int i = 0; i < returnValues.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(returnValues[i], GetNextReturnValueId(), causesSideEffects: false);
            }
            for (int i = 0; i < variables.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(variables[i], causesSideEffects: false);
            }

            return(res);
        }
        public override ValueNodesProviderResult GetNodes(DbgEvaluationInfo evalInfo, DbgLanguage language, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions, DbgValueFormatterOptions nameFormatterOptions)
        {
            var returnValues = language.ReturnValuesProvider.GetNodes(evalInfo, nodeEvalOptions);
            var variables    = language.AutosProvider.GetNodes(evalInfo, nodeEvalOptions);

            var res = new DbgValueNodeInfo[returnValues.Length + variables.Length];
            int ri  = 0;

            for (int i = 0; i < returnValues.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(returnValues[i], GetNextReturnValueId(), causesSideEffects: false);
            }
            for (int i = 0; i < variables.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(variables[i], causesSideEffects: false);
            }

            const bool recreateAllNodes = false;

            return(new ValueNodesProviderResult(res, recreateAllNodes));
        }
        public override ValueNodesProviderResult GetNodes(DbgEvaluationInfo evalInfo, DbgLanguage language, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions, DbgValueFormatterOptions nameFormatterOptions)
        {
            var recreateAllNodes = forceRecreateAllNodes;

            forceRecreateAllNodes = false;

            const CultureInfo?cultureInfo = null;
            var exceptions    = language.ExceptionsProvider.GetNodes(evalInfo, nodeEvalOptions);
            var returnValues  = debuggerSettings.ShowReturnValues ? language.ReturnValuesProvider.GetNodes(evalInfo, nodeEvalOptions) : Array.Empty <DbgValueNode>();
            var variables     = language.LocalsProvider.GetNodes(evalInfo, nodeEvalOptions, GetLocalsValueNodeOptions());
            var typeVariables = language.TypeVariablesProvider.GetNodes(evalInfo, nodeEvalOptions);

            var objectIds = dbgObjectIdService.GetObjectIds(evalInfo.Frame.Runtime);

            Array.Sort(objectIds, DbgObjectIdComparer.Instance);

            int count = exceptions.Length + returnValues.Length + objectIds.Length + variables.Length + typeVariables.Length;

            if (count == 0)
            {
                return(new ValueNodesProviderResult(Array.Empty <DbgValueNodeInfo>(), false));
            }
            var res = new DbgValueNodeInfo[count];
            int ri  = 0;

            for (int i = 0; i < exceptions.Length; i++, ri++)
            {
                ulong id        = (uint)i;
                var   exception = exceptions[i];
                if (exception.ImageName == PredefinedDbgValueNodeImageNames.StowedException)
                {
                    id |= 1UL << 32;
                }
                res[ri] = new DbgValueNodeInfo(exception, GetNextExceptionId(id), causesSideEffects: false);
            }
            for (int i = 0; i < returnValues.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(returnValues[i], GetNextReturnValueId(), causesSideEffects: false);
            }

            var objectIdNodes = language.ValueNodeFactory.Create(evalInfo, objectIds, nodeEvalOptions);

            Debug.Assert(objectIdNodes.Length == objectIds.Length);
            for (int i = 0; i < objectIdNodes.Length; i++, ri++)
            {
                var id = GetObjectIdNodeId(objectIds[i]);
                res[ri] = new DbgValueNodeInfo(objectIdNodes[i], id, causesSideEffects: false);
            }

            variables = GetSortedVariables(evalInfo, variables, nameFormatterOptions, cultureInfo);
            for (int i = 0; i < variables.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(variables[i].ValueNode, causesSideEffects: false);
            }

            for (int i = 0; i < typeVariables.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(typeVariables[i], GetNextTypeVariableId((uint)i), causesSideEffects: false);
            }

            if (res.Length != ri)
            {
                throw new InvalidOperationException();
            }

            return(new ValueNodesProviderResult(res, recreateAllNodes));
        }
        public override DbgValueNodeInfo[] GetNodes(DbgEvaluationContext context, DbgLanguage language, DbgStackFrame frame, DbgEvaluationOptions evalOptions, DbgValueNodeEvaluationOptions nodeEvalOptions)
        {
            var cancellationToken         = CancellationToken.None;
            const CultureInfo cultureInfo = null;
            var exceptions    = language.ExceptionsProvider.GetNodes(context, frame, nodeEvalOptions, cancellationToken);
            var returnValues  = language.ReturnValuesProvider.GetNodes(context, frame, nodeEvalOptions, cancellationToken);
            var variables     = language.LocalsProvider.GetNodes(context, frame, nodeEvalOptions, GetLocalsValueNodeOptions(), cancellationToken);
            var typeVariables = language.TypeVariablesProvider.GetNodes(context, frame, nodeEvalOptions, cancellationToken);

            var objectIds = dbgObjectIdService.GetObjectIds(frame.Runtime);

            Array.Sort(objectIds, DbgObjectIdComparer.Instance);

            int count = exceptions.Length + returnValues.Length + objectIds.Length + variables.Length + typeVariables.Length;

            if (count == 0)
            {
                return(Array.Empty <DbgValueNodeInfo>());
            }
            var res = new DbgValueNodeInfo[count];
            int ri  = 0;

            for (int i = 0; i < exceptions.Length; i++, ri++)
            {
                ulong id        = (uint)i;
                var   exception = exceptions[i];
                if (exception.ImageName == PredefinedDbgValueNodeImageNames.StowedException)
                {
                    id |= 1UL << 32;
                }
                res[ri] = new DbgValueNodeInfo(exception, GetNextExceptionId(id), causesSideEffects: false);
            }
            for (int i = 0; i < returnValues.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(returnValues[i], GetNextReturnValueId(), causesSideEffects: false);
            }

            var objectIdNodes = language.ValueNodeFactory.Create(context, frame, objectIds, nodeEvalOptions);

            Debug.Assert(objectIdNodes.Length == objectIds.Length);
            for (int i = 0; i < objectIdNodes.Length; i++, ri++)
            {
                var id = GetObjectIdNodeId(objectIds[i]);
                res[ri] = new DbgValueNodeInfo(objectIdNodes[i], id, causesSideEffects: false);
            }

            variables = GetSortedVariables(context, frame, variables, cultureInfo, cancellationToken);
            for (int i = 0; i < variables.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(variables[i].ValueNode, causesSideEffects: false);
            }

            for (int i = 0; i < typeVariables.Length; i++, ri++)
            {
                res[ri] = new DbgValueNodeInfo(typeVariables[i], GetNextTypeVariableId((uint)i), causesSideEffects: false);
            }

            if (res.Length != ri)
            {
                throw new InvalidOperationException();
            }
            return(res);
        }