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;
         }
     }
 }
Exemple #2
0
        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;
                }
            }