public DbgEngineValueNode CreateValueNode(ref DbgDotNetILInterpreterState?ilInterpreterState, ref DbgDotNetCompiledExpressionResult compExprInfo) { if (compExprInfo.ErrorMessage is not null) { return(valueNodeFactory.CreateError(evalInfo, compExprInfo.Name, compExprInfo.ErrorMessage, compExprInfo.Expression, (compExprInfo.Flags & DbgEvaluationResultFlags.SideEffects) != 0)); } else { if (ilInterpreterState is null) { ilInterpreterState = dnILInterpreter.CreateState(assemblyBytes); } var res = dnILInterpreter.Execute(evalInfo, ilInterpreterState, compExprInfo.TypeName, compExprInfo.MethodName, options, out var expectedType); try { if (res.ErrorMessage is not null) { return(valueNodeFactory.CreateError(evalInfo, compExprInfo.Name, res.ErrorMessage, compExprInfo.Expression, (compExprInfo.Flags & DbgEvaluationResultFlags.SideEffects) != 0)); } //TODO: Pass in compExprInfo.CustomTypeInfo, or attach it to the DbgDotNetValueNode return(valueNodeFactory.Create(evalInfo, compExprInfo.Name, res.Value !, compExprInfo.FormatSpecifiers, nodeOptions, compExprInfo.Expression, compExprInfo.ImageName, (compExprInfo.Flags & DbgEvaluationResultFlags.ReadOnly) != 0, (compExprInfo.Flags & DbgEvaluationResultFlags.SideEffects) != 0, expectedType)); } catch { res.Value?.Dispose(); throw; } } }
DbgEngineValueNode[] CreateCore(DbgEvaluationContext context, DbgStackFrame frame, DbgExpressionEvaluationInfo[] expressions, CancellationToken cancellationToken) { var res = expressions.Length == 0 ? Array.Empty <DbgEngineValueNode>() : new DbgEngineValueNode[expressions.Length]; try { for (int i = 0; i < res.Length; i++) { cancellationToken.ThrowIfCancellationRequested(); ref var info = ref expressions[i]; var evalRes = expressionEvaluator.EvaluateImpl(context, frame, info.Expression, info.Options, info.ExpressionEvaluatorState, cancellationToken); bool causesSideEffects = (evalRes.Flags & DbgEvaluationResultFlags.SideEffects) != 0; DbgEngineValueNode newNode; if (evalRes.Error != null) { newNode = valueNodeFactory.CreateError(context, frame, evalRes.Name, evalRes.Error, info.Expression, causesSideEffects, cancellationToken); } else { bool isReadOnly = (evalRes.Flags & DbgEvaluationResultFlags.ReadOnly) != 0; newNode = valueNodeFactory.Create(context, frame, evalRes.Name, evalRes.Value, info.NodeOptions, info.Expression, evalRes.ImageName, isReadOnly, causesSideEffects, evalRes.Type, cancellationToken); } res[i] = newNode; } }