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