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); }
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); }