예제 #1
0
 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;
         }
     }
 }
        DbgEngineEEAssignmentResult AssignCore(DbgEvaluationInfo evalInfo, string expression, string valueExpression, DbgEvaluationOptions options)
        {
            var resultFlags = DbgEEAssignmentResultFlags.None;

            try {
                var info       = dbgAliasProvider.GetAliases(evalInfo);
                var refsResult = dbgModuleReferenceProvider.GetModuleReferences(evalInfo.Runtime, evalInfo.Frame, info.typeReferences);
                if (refsResult.ErrorMessage != null)
                {
                    return(new DbgEngineEEAssignmentResult(resultFlags, refsResult.ErrorMessage));
                }

                var compRes = expressionCompiler.CompileAssignment(evalInfo, refsResult.ModuleReferences, info.aliases, expression, valueExpression, options);
                evalInfo.CancellationToken.ThrowIfCancellationRequested();
                if (compRes.IsError)
                {
                    return(new DbgEngineEEAssignmentResult(resultFlags | DbgEEAssignmentResultFlags.CompilerError, compRes.ErrorMessage));
                }

                var state = dnILInterpreter.CreateState(compRes.Assembly);
                Debug.Assert(compRes.CompiledExpressions.Length == 1);
                ref var exprInfo = ref compRes.CompiledExpressions[0];
                if (exprInfo.ErrorMessage != null)
                {
                    return(new DbgEngineEEAssignmentResult(resultFlags | DbgEEAssignmentResultFlags.CompilerError, exprInfo.ErrorMessage));
                }
                resultFlags |= DbgEEAssignmentResultFlags.ExecutedCode;
                var res = dnILInterpreter.Execute(evalInfo, state, exprInfo.TypeName, exprInfo.MethodName, options, out _);
                if (res.HasError)
                {
                    return(new DbgEngineEEAssignmentResult(resultFlags, res.ErrorMessage));
                }
                if (res.ValueIsException)
                {
                    res.Value.Dispose();
                    var error = string.Format(dnSpy_Debugger_DotNet_Resources.Method_X_ThrewAnExceptionOfType_Y, expression, res.Value.Type.FullName);
                    return(new DbgEngineEEAssignmentResult(resultFlags, error));
                }

                res.Value?.Dispose();
                return(new DbgEngineEEAssignmentResult());
            }