Skip to content

Commit cd708b9

Browse files
committed
Introduce EncodeMemoryReference & DecodeMemoryReference
1 parent 05f4a3b commit cd708b9

File tree

3 files changed

+36
-11
lines changed

3 files changed

+36
-11
lines changed

lldb/tools/lldb-dap/JSONUtils.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,22 @@ bool ObjectContainsKey(const llvm::json::Object &obj, llvm::StringRef key) {
112112
return obj.find(key) != obj.end();
113113
}
114114

115+
std::string EncodeMemoryReference(lldb::addr_t addr) {
116+
return "0x" + llvm::utohexstr(addr);
117+
}
118+
119+
std::optional<lldb::addr_t>
120+
DecodeMemoryReference(llvm::StringRef memoryReference) {
121+
if (!memoryReference.starts_with("0x"))
122+
return std::nullopt;
123+
124+
lldb::addr_t addr;
125+
if (memoryReference.consumeInteger(0, addr))
126+
return std::nullopt;
127+
128+
return addr;
129+
}
130+
115131
std::vector<std::string> GetStrings(const llvm::json::Object *obj,
116132
llvm::StringRef key) {
117133
std::vector<std::string> strs;
@@ -1367,7 +1383,7 @@ llvm::json::Value CreateVariable(lldb::SBValue v, int64_t variablesReference,
13671383
object.try_emplace("variablesReference", (int64_t)0);
13681384

13691385
if (std::optional<lldb::addr_t> addr = GetMemoryReference(v))
1370-
object.try_emplace("memoryReference", "0x" + llvm::utohexstr(*addr));
1386+
object.try_emplace("memoryReference", EncodeMemoryReference(*addr));
13711387

13721388
object.try_emplace("$__lldb_extensions", desc.GetVariableExtensionsJSON());
13731389
return llvm::json::Value(std::move(object));

lldb/tools/lldb-dap/JSONUtils.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ int64_t GetSigned(const llvm::json::Object *obj, llvm::StringRef key,
131131
/// \b True if the key exists in the \a obj, \b False otherwise.
132132
bool ObjectContainsKey(const llvm::json::Object &obj, llvm::StringRef key);
133133

134+
/// Encodes a memory reference
135+
std::string EncodeMemoryReference(lldb::addr_t addr);
136+
137+
/// Decodes a memory reference
138+
std::optional<lldb::addr_t>
139+
DecodeMemoryReference(llvm::StringRef memoryReference);
140+
134141
/// Extract an array of strings for the specified key from an object.
135142
///
136143
/// String values in the array will be extracted without any quotes

lldb/tools/lldb-dap/lldb-dap.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,7 +1618,7 @@ void request_evaluate(const llvm::json::Object &request) {
16181618
body.try_emplace("variablesReference", (int64_t)0);
16191619
}
16201620
if (std::optional<lldb::addr_t> addr = GetMemoryReference(value))
1621-
body.try_emplace("memoryReference", "0x" + llvm::utohexstr(*addr));
1621+
body.try_emplace("memoryReference", EncodeMemoryReference(*addr));
16221622
}
16231623
}
16241624
response.try_emplace("body", std::move(body));
@@ -3793,7 +3793,7 @@ void request_setVariable(const llvm::json::Object &request) {
37933793
body.try_emplace("variablesReference", newVariablesReference);
37943794

37953795
if (std::optional<lldb::addr_t> addr = GetMemoryReference(variable))
3796-
body.try_emplace("memoryReference", "0x" + llvm::utohexstr(*addr));
3796+
body.try_emplace("memoryReference", EncodeMemoryReference(*addr));
37973797
} else {
37983798
EmplaceSafeString(body, "message", std::string(error.GetCString()));
37993799
}
@@ -4090,17 +4090,18 @@ void request_variables(const llvm::json::Object &request) {
40904090
void request_disassemble(const llvm::json::Object &request) {
40914091
llvm::json::Object response;
40924092
FillResponse(request, response);
4093-
auto arguments = request.getObject("arguments");
4093+
auto *arguments = request.getObject("arguments");
40944094

4095-
auto memoryReference = GetString(arguments, "memoryReference");
4096-
lldb::addr_t addr_ptr;
4097-
if (memoryReference.consumeInteger(0, addr_ptr)) {
4095+
llvm::StringRef memoryReference = GetString(arguments, "memoryReference");
4096+
auto addr_opt = DecodeMemoryReference(memoryReference);
4097+
if (!addr_opt.has_value()) {
40984098
response["success"] = false;
40994099
response["message"] =
41004100
"Malformed memory reference: " + memoryReference.str();
41014101
g_dap.SendJSON(llvm::json::Value(std::move(response)));
41024102
return;
41034103
}
4104+
lldb::addr_t addr_ptr = *addr_opt;
41044105

41054106
addr_ptr += GetSigned(arguments, "instructionOffset", 0);
41064107
lldb::SBAddress addr(addr_ptr, g_dap.target);
@@ -4299,7 +4300,7 @@ void request_disassemble(const llvm::json::Object &request) {
42994300
void request_readMemory(const llvm::json::Object &request) {
43004301
llvm::json::Object response;
43014302
FillResponse(request, response);
4302-
auto arguments = request.getObject("arguments");
4303+
auto* arguments = request.getObject("arguments");
43034304

43044305
lldb::SBProcess process = g_dap.target.GetProcess();
43054306
if (!process.IsValid()) {
@@ -4309,15 +4310,16 @@ void request_readMemory(const llvm::json::Object &request) {
43094310
return;
43104311
}
43114312

4312-
auto memoryReference = GetString(arguments, "memoryReference");
4313-
lldb::addr_t addr;
4314-
if (memoryReference.consumeInteger(0, addr)) {
4313+
llvm::StringRef memoryReference = GetString(arguments, "memoryReference");
4314+
auto addr_opt = DecodeMemoryReference(memoryReference);
4315+
if (!addr_opt.has_value()) {
43154316
response["success"] = false;
43164317
response["message"] =
43174318
"Malformed memory reference: " + memoryReference.str();
43184319
g_dap.SendJSON(llvm::json::Value(std::move(response)));
43194320
return;
43204321
}
4322+
lldb::addr_t addr = *addr_opt;
43214323

43224324
addr += GetSigned(arguments, "offset", 0);
43234325
const uint64_t requested_count = GetUnsigned(arguments, "count", 0);

0 commit comments

Comments
 (0)