in src/csharp/MonoDebugSession.cs [731:777]
public override void Evaluate(Response response, dynamic args)
{
string error = null;
var expression = getString(args, "expression");
if (expression == null) {
error = "expression missing";
} else {
int frameId = getInt(args, "frameId", -1);
var frame = _frameHandles.Get(frameId, null);
if (frame != null) {
if (frame.ValidateExpression(expression)) {
var val = frame.GetExpressionValue(expression, _debuggerSessionOptions.EvaluationOptions);
val.WaitHandle.WaitOne();
var flags = val.Flags;
if (flags.HasFlag(ObjectValueFlags.Error) || flags.HasFlag(ObjectValueFlags.NotSupported)) {
error = val.DisplayValue;
if (error.IndexOf("reference not available in the current evaluation context") > 0) {
error = "not available";
}
}
else if (flags.HasFlag(ObjectValueFlags.Unknown)) {
error = "invalid expression";
}
else if (flags.HasFlag(ObjectValueFlags.Object) && flags.HasFlag(ObjectValueFlags.Namespace)) {
error = "not available";
}
else {
int handle = 0;
if (val.HasChildren) {
handle = _variableHandles.Create(val.GetAllChildren());
}
SendResponse(response, new EvaluateResponseBody(val.DisplayValue, handle));
return;
}
}
else {
error = "invalid expression";
}
}
else {
error = "no active stackframe";
}
}
SendErrorResponse(response, 3014, "Evaluate request failed ({_reason}).", new { _reason = error } );
}