Skip to content

Commit 371da58

Browse files
authored
[lldb-dap] Migrate pause request to structured types (#171096)
This patch migrates `pause` request into structured types and adds test for it.
1 parent 7305ed7 commit 371da58

File tree

5 files changed

+40
-44
lines changed

5 files changed

+40
-44
lines changed

lldb/tools/lldb-dap/Handler/PauseRequestHandler.cpp

Lines changed: 8 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,53 +8,20 @@
88

99
#include "DAP.h"
1010
#include "EventHelper.h"
11-
#include "JSONUtils.h"
11+
#include "LLDBUtils.h"
12+
#include "Protocol/ProtocolRequests.h"
1213
#include "RequestHandler.h"
1314

1415
namespace lldb_dap {
1516

16-
// "PauseRequest": {
17-
// "allOf": [ { "$ref": "#/definitions/Request" }, {
18-
// "type": "object",
19-
// "description": "Pause request; value of command field is 'pause'. The
20-
// request suspenses the debuggee. The debug adapter first sends the
21-
// PauseResponse and then a StoppedEvent (event type 'pause') after the
22-
// thread has been paused successfully.", "properties": {
23-
// "command": {
24-
// "type": "string",
25-
// "enum": [ "pause" ]
26-
// },
27-
// "arguments": {
28-
// "$ref": "#/definitions/PauseArguments"
29-
// }
30-
// },
31-
// "required": [ "command", "arguments" ]
32-
// }]
33-
// },
34-
// "PauseArguments": {
35-
// "type": "object",
36-
// "description": "Arguments for 'pause' request.",
37-
// "properties": {
38-
// "threadId": {
39-
// "type": "integer",
40-
// "description": "Pause execution for this thread."
41-
// }
42-
// },
43-
// "required": [ "threadId" ]
44-
// },
45-
// "PauseResponse": {
46-
// "allOf": [ { "$ref": "#/definitions/Response" }, {
47-
// "type": "object",
48-
// "description": "Response to 'pause' request. This is just an
49-
// acknowledgement, so no body field is required."
50-
// }]
51-
// }
52-
void PauseRequestHandler::operator()(const llvm::json::Object &request) const {
53-
llvm::json::Object response;
54-
FillResponse(request, response);
17+
/// The request suspenses the debuggee. The debug adapter first sends the
18+
/// PauseResponse and then a StoppedEvent (event type 'pause') after the thread
19+
/// has been paused successfully.
20+
llvm::Error
21+
PauseRequestHandler::Run(const protocol::PauseArguments &args) const {
5522
lldb::SBProcess process = dap.target.GetProcess();
5623
lldb::SBError error = process.Stop();
57-
dap.SendJSON(llvm::json::Value(std::move(response)));
24+
return ToError(error);
5825
}
5926

6027
} // namespace lldb_dap

lldb/tools/lldb-dap/Handler/RequestHandler.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -492,11 +492,12 @@ class ModulesRequestHandler final
492492
Run(const std::optional<protocol::ModulesArguments> &args) const override;
493493
};
494494

495-
class PauseRequestHandler : public LegacyRequestHandler {
495+
class PauseRequestHandler
496+
: public RequestHandler<protocol::PauseArguments, protocol::PauseResponse> {
496497
public:
497-
using LegacyRequestHandler::LegacyRequestHandler;
498+
using RequestHandler::RequestHandler;
498499
static llvm::StringLiteral GetCommand() { return "pause"; }
499-
void operator()(const llvm::json::Object &request) const override;
500+
llvm::Error Run(const protocol::PauseArguments &args) const override;
500501
};
501502

502503
class ScopesRequestHandler final

lldb/tools/lldb-dap/Protocol/ProtocolRequests.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,4 +695,10 @@ llvm::json::Value toJSON(const EvaluateResponseBody &Body) {
695695
return result;
696696
}
697697

698+
bool fromJSON(const llvm::json::Value &Params, PauseArguments &Args,
699+
llvm::json::Path Path) {
700+
json::ObjectMapper O(Params, Path);
701+
return O && O.map("threadId", Args.threadId);
702+
}
703+
698704
} // namespace lldb_dap::protocol

lldb/tools/lldb-dap/Protocol/ProtocolRequests.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,6 +1184,17 @@ struct EvaluateResponseBody {
11841184
};
11851185
llvm::json::Value toJSON(const EvaluateResponseBody &);
11861186

1187+
/// Arguments for `pause` request.
1188+
struct PauseArguments {
1189+
/// Pause execution for this thread.
1190+
lldb::tid_t threadId = LLDB_INVALID_THREAD_ID;
1191+
};
1192+
bool fromJSON(const llvm::json::Value &, PauseArguments &, llvm::json::Path);
1193+
1194+
/// Response to `pause` request. This is just an acknowledgement, so no body
1195+
/// field is required.
1196+
using PauseResponse = VoidResponse;
1197+
11871198
} // namespace lldb_dap::protocol
11881199

11891200
#endif

lldb/unittests/DAP/ProtocolRequestsTest.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,14 @@ TEST(ProtocolRequestsTest, InitializeRequestArguments) {
182182
EXPECT_THAT_EXPECTED(parse<InitializeRequestArguments>(R"({})"),
183183
FailedWithMessage("missing value at (root).adapterID"));
184184
}
185+
186+
TEST(ProtocolRequestsTest, PauseRequestArguments) {
187+
llvm::Expected<PauseArguments> expected =
188+
parse<PauseArguments>(R"({"threadId": 123})");
189+
ASSERT_THAT_EXPECTED(expected, llvm::Succeeded());
190+
EXPECT_EQ(expected->threadId, 123U);
191+
192+
// Check required keys.
193+
EXPECT_THAT_EXPECTED(parse<PauseArguments>(R"({})"),
194+
FailedWithMessage("missing value at (root).threadId"));
195+
}

0 commit comments

Comments
 (0)