private void RequestBackendVariables(DAPRequest request, DAPVariablesRequest msg, int dapIndex) { if (!VariableRefs.TryGetValue(dapIndex, out BackendVariableReference varRef)) { throw new RequestFailedException($"Unknown backend variable reference: {dapIndex}"); } var state = DAP.GetThread(varRef.Context); if (!state.Stopped) { throw new RequestFailedException("Cannot fetch variables when thread is not stopped"); } uint seq = DAP.DbgCli.SendGetVariables(varRef); PendingGetVariablesRequests.Add(seq, (uint replySeq, StatusCode status, BkGetVariablesResponse response) => { if (status == StatusCode.Success) { OnVariablesReceived(request, msg, state, response); } else if (status == StatusCode.EvalFailed && response != null) { DAP.Stream.SendReply(request, response.ErrorMessage); } else { DAP.Stream.SendReply(request, $"Backend returned error: {status}"); } }); }
private void OnVariablesReceived(DAPRequest request, DAPVariablesRequest msg, ThreadState state, BkGetVariablesResponse response) { int startIndex = msg.start == null ? 0 : (int)msg.start; int numVars = (msg.count == null || msg.count == 0) ? response.Result.Count : (int)msg.count; int lastIndex = Math.Min(startIndex + numVars, response.Result.Count); // TODO req.filter, format var variables = new List <DAPVariable>(); for (var i = startIndex; i < startIndex + numVars; i++) { var variable = response.Result[i]; var dapVar = new DAPVariable { value = DbgValueToString(variable.Value), type = variable.Value.TypeId.ToString() }; if (variable.Type == MsgChildValue.Types.Type.Numeric) { dapVar.name = variable.Index.ToString(); } else { dapVar.name = variable.Name; } if (variable.Value.Variables != null) { var varsRef = BackendVariableReference.FromDbg(state.Context, variable.Value.Variables); var varsIdx = NextVariableReference++; VariableRefs.Add(varsIdx, varsRef); dapVar.variablesReference = MakeVariableRef(varsIdx); } variables.Add(dapVar); } var reply = new DAPVariablesResponse { variables = variables }; DAP.Stream.SendReply(request, reply); }
private void RequestStackVariables(DAPRequest request, DAPVariablesRequest msg, int threadId, int frameIndex, int scopeIndex) { var state = DAP.GetThread(threadId); if (!state.Stopped) { throw new RequestFailedException("Cannot get scopes when thread is not stopped"); } if (frameIndex < 0 || frameIndex >= state.Stack.Count) { throw new RequestFailedException($"Requested variables for unknown frame {frameIndex}"); } var varRef = new BackendVariableReference(); varRef.Context = state.Context; varRef.VariableRef = -1; varRef.Frame = frameIndex; varRef.Local = -1; uint seq = DAP.DbgCli.SendGetVariables(varRef); PendingGetVariablesRequests.Add(seq, (uint replySeq, StatusCode status, BkGetVariablesResponse response) => { if (status == StatusCode.Success) { // Filter locals/upvalues based on requested scope type var results = response.Result.Where(result => ((result.Index >= 0) == (scopeIndex == 0))).ToList(); response.Result.Clear(); response.Result.AddRange(results); OnVariablesReceived(request, msg, state, response); } else if (status == StatusCode.EvalFailed && response != null) { DAP.Stream.SendReply(request, response.ErrorMessage); } else { DAP.Stream.SendReply(request, $"Backend returned error: {status}"); } }); }
public void OnDAPVariablesRequested(DAPRequest request, DAPVariablesRequest msg) { var variableType = RefToVariableType(msg.variablesReference); if (variableType == 0) { var index = RefToVariableIndex(msg.variablesReference); RequestBackendVariables(request, msg, index); } else if (variableType == 1) { var threadId = RefToThreadId(msg.variablesReference); var frameIndex = RefToFrameIndex(msg.variablesReference); var scopeIndex = RefToScopeIndex(msg.variablesReference); RequestStackVariables(request, msg, threadId, frameIndex, scopeIndex); } else { throw new InvalidOperationException($"Unknown variables reference type: {variableType} (ref: {msg.variablesReference})"); } }