https://github.com/Da-Viper created https://github.com/llvm/llvm-project/pull/129919
Completion of #129818 Did not want to put `llvm::StringRef()` as the default value instead it was `""` >From 14bd9a79299f2637dc400fa2bf718770674c38b0 Mon Sep 17 00:00:00 2001 From: Ezike Ebuka <yerimy...@gmail.com> Date: Wed, 5 Mar 2025 11:15:35 +0000 Subject: [PATCH 1/3] [lldb] [lldb-dap] Return optional values for unsigned json values. --- lldb/tools/lldb-dap/DAP.cpp | 3 ++- .../lldb-dap/Handler/AttachRequestHandler.cpp | 7 ++++--- .../Handler/BreakpointLocationsHandler.cpp | 12 +++++++----- .../DataBreakpointInfoRequestHandler.cpp | 2 +- .../Handler/DisassembleRequestHandler.cpp | 3 ++- .../Handler/LocationsRequestHandler.cpp | 3 ++- .../Handler/ReadMemoryRequestHandler.cpp | 2 +- lldb/tools/lldb-dap/Handler/RequestHandler.cpp | 3 ++- .../Handler/SetVariableRequestHandler.cpp | 4 ++-- .../lldb-dap/Handler/SourceRequestHandler.cpp | 5 +++-- .../Handler/StackTraceRequestHandler.cpp | 4 ++-- .../lldb-dap/Handler/StepInRequestHandler.cpp | 2 +- .../Handler/VariablesRequestHandler.cpp | 2 +- lldb/tools/lldb-dap/JSONUtils.cpp | 17 ++++++++--------- lldb/tools/lldb-dap/JSONUtils.h | 10 +++++----- lldb/tools/lldb-dap/SourceBreakpoint.cpp | 4 ++-- 16 files changed, 45 insertions(+), 38 deletions(-) diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp index c4790414f64f9..e908e4d7115f7 100644 --- a/lldb/tools/lldb-dap/DAP.cpp +++ b/lldb/tools/lldb-dap/DAP.cpp @@ -531,7 +531,8 @@ lldb::SBThread DAP::GetLLDBThread(const llvm::json::Object &arguments) { } lldb::SBFrame DAP::GetLLDBFrame(const llvm::json::Object &arguments) { - const uint64_t frame_id = GetUnsigned(arguments, "frameId", UINT64_MAX); + const uint64_t frame_id = + GetUnsigned(arguments, "frameId").value_or(UINT64_MAX); lldb::SBProcess process = target.GetProcess(); // Upper 32 bits is the thread index ID lldb::SBThread thread = diff --git a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp index 2733f58b74683..b2556f7ddff1c 100644 --- a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp @@ -54,9 +54,9 @@ void AttachRequestHandler::operator()(const llvm::json::Object &request) const { const int invalid_port = 0; const auto *arguments = request.getObject("arguments"); const lldb::pid_t pid = - GetUnsigned(arguments, "pid", LLDB_INVALID_PROCESS_ID); + GetUnsigned(arguments, "pid").value_or(LLDB_INVALID_PROCESS_ID); const auto gdb_remote_port = - GetUnsigned(arguments, "gdb-remote-port", invalid_port); + GetUnsigned(arguments, "gdb-remote-port").value_or(invalid_port); const auto gdb_remote_hostname = GetString(arguments, "gdb-remote-hostname", "localhost"); if (pid != LLDB_INVALID_PROCESS_ID) @@ -70,7 +70,8 @@ void AttachRequestHandler::operator()(const llvm::json::Object &request) const { dap.terminate_commands = GetStrings(arguments, "terminateCommands"); auto attachCommands = GetStrings(arguments, "attachCommands"); llvm::StringRef core_file = GetString(arguments, "coreFile"); - const uint64_t timeout_seconds = GetUnsigned(arguments, "timeout", 30); + const uint64_t timeout_seconds = + GetUnsigned(arguments, "timeout").value_or(30); dap.stop_at_entry = core_file.empty() ? GetBoolean(arguments, "stopOnEntry").value_or(false) : true; diff --git a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp index 1b5c8ba307dcb..50b530349d0e4 100644 --- a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp @@ -131,11 +131,13 @@ void BreakpointLocationsRequestHandler::operator()( auto *arguments = request.getObject("arguments"); auto *source = arguments->getObject("source"); std::string path = GetString(source, "path").str(); - uint64_t start_line = GetUnsigned(arguments, "line", 0); - uint64_t start_column = GetUnsigned(arguments, "column", 0); - uint64_t end_line = GetUnsigned(arguments, "endLine", start_line); - uint64_t end_column = - GetUnsigned(arguments, "endColumn", std::numeric_limits<uint64_t>::max()); + const uint64_t start_line = GetUnsigned(arguments, "line").value_or(0); + const uint64_t start_column = GetUnsigned(arguments, "column").value_or(0); + const uint64_t end_line = + GetUnsigned(arguments, "endLine").value_or(start_line); + const uint64_t end_column = + GetUnsigned(arguments, "endColumn") + .value_or(std::numeric_limits<uint64_t>::max()); lldb::SBFileSpec file_spec(path.c_str(), true); lldb::SBSymbolContextList compile_units = diff --git a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp index 64829b93c783d..15c083fb5c14d 100644 --- a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp @@ -116,7 +116,7 @@ void DataBreakpointInfoRequestHandler::operator()( llvm::json::Array accessTypes{"read", "write", "readWrite"}; const auto *arguments = request.getObject("arguments"); const auto variablesReference = - GetUnsigned(arguments, "variablesReference", 0); + GetUnsigned(arguments, "variablesReference").value_or(0); llvm::StringRef name = GetString(arguments, "name"); lldb::SBFrame frame = dap.GetLLDBFrame(*arguments); lldb::SBValue variable = dap.variables.FindVariable(variablesReference, name); diff --git a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp index d6ff2a7fd8880..2df22357c5a45 100644 --- a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp @@ -113,7 +113,8 @@ void DisassembleRequestHandler::operator()( return; } - const auto inst_count = GetUnsigned(arguments, "instructionCount", 0); + const auto inst_count = + GetUnsigned(arguments, "instructionCount").value_or(0); lldb::SBInstructionList insts = dap.target.ReadInstructions(addr, inst_count); if (!insts.IsValid()) { diff --git a/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp index fa763f3ffe931..3a2fecf350b9b 100644 --- a/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp @@ -97,7 +97,8 @@ void LocationsRequestHandler::operator()( FillResponse(request, response); auto *arguments = request.getObject("arguments"); - uint64_t location_id = GetUnsigned(arguments, "locationReference", 0); + uint64_t location_id = + GetUnsigned(arguments, "locationReference").value_or(0); // We use the lowest bit to distinguish between value location and declaration // location auto [var_ref, is_value_location] = UnpackLocation(location_id); diff --git a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp index bc8158f9d3079..36be1fed33ccd 100644 --- a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp @@ -109,7 +109,7 @@ void ReadMemoryRequestHandler::operator()( } lldb::addr_t addr_int = *addr_opt; addr_int += GetSigned(arguments, "offset", 0); - const uint64_t count_requested = GetUnsigned(arguments, "count", 0); + const uint64_t count_requested = GetUnsigned(arguments, "count").value_or(0); // We also need support reading 0 bytes // VS Code sends those requests to check if a `memoryReference` diff --git a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp index d4030965869a1..0efc63efee5f8 100644 --- a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp @@ -184,7 +184,8 @@ RequestHandler::LaunchProcess(const llvm::json::Object &request) const { launch_info.SetDetachOnError(detachOnError); launch_info.SetLaunchFlags(flags | lldb::eLaunchFlagDebug | lldb::eLaunchFlagStopAtEntry); - const uint64_t timeout_seconds = GetUnsigned(arguments, "timeout", 30); + const uint64_t timeout_seconds = + GetUnsigned(arguments, "timeout").value_or(30); if (GetBoolean(arguments, "runInTerminal").value_or(false)) { if (llvm::Error err = RunInTerminal(dap, request, timeout_seconds)) diff --git a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp index 3a271bc1a1db5..752a15d09534d 100644 --- a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp @@ -115,7 +115,7 @@ void SetVariableRequestHandler::operator()( const auto *arguments = request.getObject("arguments"); // This is a reference to the containing variable/scope const auto variablesReference = - GetUnsigned(arguments, "variablesReference", 0); + GetUnsigned(arguments, "variablesReference").value_or(0); llvm::StringRef name = GetString(arguments, "name"); const auto value = GetString(arguments, "value"); @@ -133,7 +133,7 @@ void SetVariableRequestHandler::operator()( // the name of the variable. We could have two shadowed variables with the // same name in "Locals" or "Globals". In our case the "id" absolute index // of the variable within the dap.variables list. - const auto id_value = GetUnsigned(arguments, "id", UINT64_MAX); + const auto id_value = GetUnsigned(arguments, "id").value_or(UINT64_MAX); if (id_value != UINT64_MAX) { variable = dap.variables.GetVariable(id_value); } else { diff --git a/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp index 6b587b19aa6f2..7f82aec8daf3a 100644 --- a/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp @@ -85,8 +85,9 @@ void SourceRequestHandler::operator()(const llvm::json::Object &request) const { const auto *arguments = request.getObject("arguments"); const auto *source = arguments->getObject("source"); llvm::json::Object body; - int64_t source_ref = GetUnsigned( - source, "sourceReference", GetUnsigned(arguments, "sourceReference", 0)); + int64_t source_ref = + GetUnsigned(source, "sourceReference") + .value_or(GetUnsigned(arguments, "sourceReference").value_or(0)); if (source_ref) { lldb::SBProcess process = dap.target.GetProcess(); diff --git a/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp index e5ba939134d25..4147b41ac16b2 100644 --- a/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp @@ -179,8 +179,8 @@ void StackTraceRequestHandler::operator()( llvm::json::Object body; if (thread.IsValid()) { - const auto start_frame = GetUnsigned(arguments, "startFrame", 0); - const auto levels = GetUnsigned(arguments, "levels", 0); + const auto start_frame = GetUnsigned(arguments, "startFrame").value_or(0); + const auto levels = GetUnsigned(arguments, "levels").value_or(0); int64_t offset = 0; bool reached_end_of_stack = FillStackFrames(dap, thread, stack_frames, offset, start_frame, diff --git a/lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp index c2653322b8898..c28ba098f2091 100644 --- a/lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp @@ -69,7 +69,7 @@ void StepInRequestHandler::operator()(const llvm::json::Object &request) const { const auto *arguments = request.getObject("arguments"); std::string step_in_target; - uint64_t target_id = GetUnsigned(arguments, "targetId", 0); + uint64_t target_id = GetUnsigned(arguments, "targetId").value_or(0); auto it = dap.step_in_targets.find(target_id); if (it != dap.step_in_targets.end()) step_in_target = it->second; diff --git a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp index 05131c0dae276..356b427f4cfbe 100644 --- a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp @@ -93,7 +93,7 @@ void VariablesRequestHandler::operator()( llvm::json::Array variables; const auto *arguments = request.getObject("arguments"); const auto variablesReference = - GetUnsigned(arguments, "variablesReference", 0); + GetUnsigned(arguments, "variablesReference").value_or(0); const int64_t start = GetSigned(arguments, "start", 0); const int64_t count = GetSigned(arguments, "count", 0); bool hex = false; diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp index dac2346020454..1d011e3c284fc 100644 --- a/lldb/tools/lldb-dap/JSONUtils.cpp +++ b/lldb/tools/lldb-dap/JSONUtils.cpp @@ -86,18 +86,17 @@ llvm::StringRef GetString(const llvm::json::Object *obj, llvm::StringRef key, // Gets an unsigned integer from a JSON object using the key, or returns the // specified fail value. -uint64_t GetUnsigned(const llvm::json::Object &obj, llvm::StringRef key, - uint64_t fail_value) { - if (auto value = obj.getInteger(key)) - return (uint64_t)*value; - return fail_value; +std::optional<uint64_t> GetUnsigned(const llvm::json::Object &obj, + llvm::StringRef key) { + return obj.getInteger(key); } -uint64_t GetUnsigned(const llvm::json::Object *obj, llvm::StringRef key, - uint64_t fail_value) { +std::optional<uint64_t> GetUnsigned(const llvm::json::Object *obj, + llvm::StringRef key) { if (obj == nullptr) - return fail_value; - return GetUnsigned(*obj, key, fail_value); + return std::nullopt; + + return GetUnsigned(*obj, key); } std::optional<bool> GetBoolean(const llvm::json::Object &obj, diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h index d212108ce6958..99d9ab90a2c49 100644 --- a/lldb/tools/lldb-dap/JSONUtils.h +++ b/lldb/tools/lldb-dap/JSONUtils.h @@ -85,12 +85,12 @@ llvm::StringRef GetString(const llvm::json::Object *obj, llvm::StringRef key, /// /// \return /// The unsigned integer value for the specified \a key, or -/// \a fail_value if there is no key that matches or if the +/// std::nullopt if there is no key that matches or if the /// value is not an integer. -uint64_t GetUnsigned(const llvm::json::Object &obj, llvm::StringRef key, - uint64_t fail_value); -uint64_t GetUnsigned(const llvm::json::Object *obj, llvm::StringRef key, - uint64_t fail_value); +std::optional<uint64_t> GetUnsigned(const llvm::json::Object &obj, + llvm::StringRef key); +std::optional<uint64_t> GetUnsigned(const llvm::json::Object *obj, + llvm::StringRef key); /// Extract the boolean value for the specified key from the /// specified object. diff --git a/lldb/tools/lldb-dap/SourceBreakpoint.cpp b/lldb/tools/lldb-dap/SourceBreakpoint.cpp index 418e205312c9f..f2425f4b6aba7 100644 --- a/lldb/tools/lldb-dap/SourceBreakpoint.cpp +++ b/lldb/tools/lldb-dap/SourceBreakpoint.cpp @@ -27,8 +27,8 @@ namespace lldb_dap { SourceBreakpoint::SourceBreakpoint(DAP &dap, const llvm::json::Object &obj) : Breakpoint(dap, obj), logMessage(std::string(GetString(obj, "logMessage"))), - line(GetUnsigned(obj, "line", 0)), column(GetUnsigned(obj, "column", 0)) { -} + line(GetUnsigned(obj, "line").value_or(0)), + column(GetUnsigned(obj, "column").value_or(0)) {} void SourceBreakpoint::SetBreakpoint(const llvm::StringRef source_path) { lldb::SBFileSpecList module_list; >From a3fe301ac1fc9744c6a2b0d0994cf78cb29d0445 Mon Sep 17 00:00:00 2001 From: Ezike Ebuka <yerimy...@gmail.com> Date: Wed, 5 Mar 2025 11:39:58 +0000 Subject: [PATCH 2/3] [lldb] [lldb-dap] Return optional values for signed json values. --- lldb/tools/lldb-dap/DAP.cpp | 4 ++-- .../lldb-dap/Handler/CompletionsHandler.cpp | 5 +++-- .../Handler/DisassembleRequestHandler.cpp | 2 +- .../Handler/ReadMemoryRequestHandler.cpp | 2 +- .../Handler/VariablesRequestHandler.cpp | 4 ++-- lldb/tools/lldb-dap/InstructionBreakpoint.cpp | 2 +- lldb/tools/lldb-dap/JSONUtils.cpp | 19 +++++++++---------- lldb/tools/lldb-dap/JSONUtils.h | 14 +++++++------- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp index e908e4d7115f7..3502579cde0a6 100644 --- a/lldb/tools/lldb-dap/DAP.cpp +++ b/lldb/tools/lldb-dap/DAP.cpp @@ -526,7 +526,7 @@ ExceptionBreakpoint *DAP::GetExceptionBPFromStopReason(lldb::SBThread &thread) { } lldb::SBThread DAP::GetLLDBThread(const llvm::json::Object &arguments) { - auto tid = GetSigned(arguments, "threadId", LLDB_INVALID_THREAD_ID); + auto tid = GetSigned(arguments, "threadId").value_or(LLDB_INVALID_THREAD_ID); return target.GetProcess().GetThreadByID(tid); } @@ -772,7 +772,7 @@ bool DAP::HandleObject(const llvm::json::Object &object) { } if (packet_type == "response") { - auto id = GetSigned(object, "request_seq", 0); + auto id = GetSigned(object, "request_seq").value_or(0); std::unique_ptr<ResponseHandler> response_handler; { diff --git a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp index 09b73054ca62f..fc9b72b5b4f00 100644 --- a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp @@ -143,8 +143,9 @@ void CompletionsRequestHandler::operator()( } std::string text = GetString(arguments, "text").str(); - auto original_column = GetSigned(arguments, "column", text.size()); - auto original_line = GetSigned(arguments, "line", 1); + const auto original_column = + GetSigned(arguments, "column").value_or(text.size()); + const auto original_line = GetSigned(arguments, "line").value_or(1); auto offset = original_column - 1; if (original_line > 1) { llvm::SmallVector<::llvm::StringRef, 2> lines; diff --git a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp index 2df22357c5a45..e40e7084ce279 100644 --- a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp @@ -104,7 +104,7 @@ void DisassembleRequestHandler::operator()( } lldb::addr_t addr_ptr = *addr_opt; - addr_ptr += GetSigned(arguments, "instructionOffset", 0); + addr_ptr += GetSigned(arguments, "instructionOffset").value_or(0); lldb::SBAddress addr(addr_ptr, dap.target); if (!addr.IsValid()) { response["success"] = false; diff --git a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp index 36be1fed33ccd..a2ea0a6217264 100644 --- a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp @@ -108,7 +108,7 @@ void ReadMemoryRequestHandler::operator()( return; } lldb::addr_t addr_int = *addr_opt; - addr_int += GetSigned(arguments, "offset", 0); + addr_int += GetSigned(arguments, "offset").value_or(0); const uint64_t count_requested = GetUnsigned(arguments, "count").value_or(0); // We also need support reading 0 bytes diff --git a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp index 356b427f4cfbe..a4f04dd06fe5e 100644 --- a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp @@ -94,8 +94,8 @@ void VariablesRequestHandler::operator()( const auto *arguments = request.getObject("arguments"); const auto variablesReference = GetUnsigned(arguments, "variablesReference").value_or(0); - const int64_t start = GetSigned(arguments, "start", 0); - const int64_t count = GetSigned(arguments, "count", 0); + const int64_t start = GetSigned(arguments, "start").value_or(0); + const int64_t count = GetSigned(arguments, "count").value_or(0); bool hex = false; const auto *format = arguments->getObject("format"); if (format) diff --git a/lldb/tools/lldb-dap/InstructionBreakpoint.cpp b/lldb/tools/lldb-dap/InstructionBreakpoint.cpp index 37daa8f0bdd5f..d9d5a0b3e745b 100644 --- a/lldb/tools/lldb-dap/InstructionBreakpoint.cpp +++ b/lldb/tools/lldb-dap/InstructionBreakpoint.cpp @@ -20,7 +20,7 @@ namespace lldb_dap { InstructionBreakpoint::InstructionBreakpoint(DAP &d, const llvm::json::Object &obj) : Breakpoint(d, obj), instructionAddressReference(LLDB_INVALID_ADDRESS), - offset(GetSigned(obj, "offset", 0)) { + offset(GetSigned(obj, "offset").value_or(0)) { GetString(obj, "instructionReference") .getAsInteger(0, instructionAddressReference); instructionAddressReference += offset; diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp index 1d011e3c284fc..c3684b027045a 100644 --- a/lldb/tools/lldb-dap/JSONUtils.cpp +++ b/lldb/tools/lldb-dap/JSONUtils.cpp @@ -115,18 +115,17 @@ std::optional<bool> GetBoolean(const llvm::json::Object *obj, return std::nullopt; } -int64_t GetSigned(const llvm::json::Object &obj, llvm::StringRef key, - int64_t fail_value) { - if (auto value = obj.getInteger(key)) - return *value; - return fail_value; +std::optional<int64_t> GetSigned(const llvm::json::Object &obj, + llvm::StringRef key) { + return obj.getInteger(key); } -int64_t GetSigned(const llvm::json::Object *obj, llvm::StringRef key, - int64_t fail_value) { +std::optional<int64_t> GetSigned(const llvm::json::Object *obj, + llvm::StringRef key) { if (obj == nullptr) - return fail_value; - return GetSigned(*obj, key, fail_value); + return std::nullopt; + + return GetSigned(*obj, key); } bool ObjectContainsKey(const llvm::json::Object &obj, llvm::StringRef key) { @@ -279,7 +278,7 @@ void FillResponse(const llvm::json::Object &request, response.try_emplace("type", "response"); response.try_emplace("seq", (int64_t)0); EmplaceSafeString(response, "command", GetString(request, "command")); - const int64_t seq = GetSigned(request, "seq", 0); + const int64_t seq = GetSigned(request, "seq").value_or(0); response.try_emplace("request_seq", seq); response.try_emplace("success", true); } diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h index 99d9ab90a2c49..8e231406c2ef0 100644 --- a/lldb/tools/lldb-dap/JSONUtils.h +++ b/lldb/tools/lldb-dap/JSONUtils.h @@ -85,7 +85,7 @@ llvm::StringRef GetString(const llvm::json::Object *obj, llvm::StringRef key, /// /// \return /// The unsigned integer value for the specified \a key, or -/// std::nullopt if there is no key that matches or if the +/// \a std::nullopt if there is no key that matches or if the /// value is not an integer. std::optional<uint64_t> GetUnsigned(const llvm::json::Object &obj, llvm::StringRef key); @@ -102,7 +102,7 @@ std::optional<uint64_t> GetUnsigned(const llvm::json::Object *obj, /// The key to use when extracting the value /// /// \return -/// The boolean value for the specified \a key, or std::nullopt +/// The boolean value for the specified \a key, or \a std::nullopt /// if there is no key that matches or if the value is not a /// boolean value of an integer. /// @{ @@ -123,12 +123,12 @@ std::optional<bool> GetBoolean(const llvm::json::Object *obj, /// /// \return /// The signed integer value for the specified \a key, or -/// \a fail_value if there is no key that matches or if the +/// \a std::nullopt if there is no key that matches or if the /// value is not an integer. -int64_t GetSigned(const llvm::json::Object &obj, llvm::StringRef key, - int64_t fail_value); -int64_t GetSigned(const llvm::json::Object *obj, llvm::StringRef key, - int64_t fail_value); +std::optional<int64_t> GetSigned(const llvm::json::Object &obj, + llvm::StringRef key); +std::optional<int64_t> GetSigned(const llvm::json::Object *obj, + llvm::StringRef key); /// Check if the specified key exists in the specified object. /// >From 9094e74dc7fabb86f0d694f46896e25b05d0d5e6 Mon Sep 17 00:00:00 2001 From: Ezike Ebuka <yerimy...@gmail.com> Date: Wed, 5 Mar 2025 16:04:11 +0000 Subject: [PATCH 3/3] [lldb] [lldb-dap] Return optional values for string json values. --- lldb/tools/lldb-dap/BreakpointBase.cpp | 4 +-- lldb/tools/lldb-dap/DAP.cpp | 14 ++++++----- lldb/tools/lldb-dap/FunctionBreakpoint.cpp | 3 ++- .../lldb-dap/Handler/AttachRequestHandler.cpp | 14 ++++++----- .../Handler/BreakpointLocationsHandler.cpp | 2 +- .../Handler/CompileUnitsRequestHandler.cpp | 3 ++- .../lldb-dap/Handler/CompletionsHandler.cpp | 2 +- .../DataBreakpointInfoRequestHandler.cpp | 2 +- .../Handler/DisassembleRequestHandler.cpp | 3 ++- .../Handler/EvaluateRequestHandler.cpp | 5 ++-- .../lldb-dap/Handler/LaunchRequestHandler.cpp | 10 +++++--- .../Handler/ReadMemoryRequestHandler.cpp | 3 ++- .../tools/lldb-dap/Handler/RequestHandler.cpp | 4 +-- .../Handler/SetBreakpointsRequestHandler.cpp | 2 +- .../Handler/SetVariableRequestHandler.cpp | 4 +-- lldb/tools/lldb-dap/InstructionBreakpoint.cpp | 1 + lldb/tools/lldb-dap/JSONUtils.cpp | 25 ++++++++++--------- lldb/tools/lldb-dap/JSONUtils.h | 13 ++++------ lldb/tools/lldb-dap/SourceBreakpoint.cpp | 2 +- lldb/tools/lldb-dap/Watchpoint.cpp | 4 +-- 20 files changed, 65 insertions(+), 55 deletions(-) diff --git a/lldb/tools/lldb-dap/BreakpointBase.cpp b/lldb/tools/lldb-dap/BreakpointBase.cpp index 1e28c29082a9f..7979bac098766 100644 --- a/lldb/tools/lldb-dap/BreakpointBase.cpp +++ b/lldb/tools/lldb-dap/BreakpointBase.cpp @@ -13,8 +13,8 @@ using namespace lldb_dap; BreakpointBase::BreakpointBase(DAP &d, const llvm::json::Object &obj) - : dap(d), condition(std::string(GetString(obj, "condition"))), - hitCondition(std::string(GetString(obj, "hitCondition"))) {} + : dap(d), condition(std::string(GetString(obj, "condition").value_or(""))), + hitCondition(std::string(GetString(obj, "hitCondition").value_or(""))) {} void BreakpointBase::UpdateBreakpoint(const BreakpointBase &request_bp) { if (condition != request_bp.condition) { diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp index 3502579cde0a6..435cd0f188d75 100644 --- a/lldb/tools/lldb-dap/DAP.cpp +++ b/lldb/tools/lldb-dap/DAP.cpp @@ -689,9 +689,11 @@ DAP::CreateTargetFromArguments(const llvm::json::Object &arguments, // enough information to determine correct arch and platform (or ELF can be // omitted at all), so it is good to leave the user an apportunity to specify // those. Any of those three can be left empty. - llvm::StringRef target_triple = GetString(arguments, "targetTriple"); - llvm::StringRef platform_name = GetString(arguments, "platformName"); - llvm::StringRef program = GetString(arguments, "program"); + const llvm::StringRef target_triple = + GetString(arguments, "targetTriple").value_or(""); + const llvm::StringRef platform_name = + GetString(arguments, "platformName").value_or(""); + const llvm::StringRef program = GetString(arguments, "program").value_or(""); auto target = this->debugger.CreateTarget( program.data(), target_triple.data(), platform_name.data(), true, // Add dependent modules. @@ -755,9 +757,9 @@ PacketStatus DAP::GetNextObject(llvm::json::Object &object) { } bool DAP::HandleObject(const llvm::json::Object &object) { - const auto packet_type = GetString(object, "type"); + const auto packet_type = GetString(object, "type").value_or(""); if (packet_type == "request") { - const auto command = GetString(object, "command"); + const auto command = GetString(object, "command").value_or(""); auto new_handler_pos = request_handlers.find(command); if (new_handler_pos != request_handlers.end()) { @@ -795,7 +797,7 @@ bool DAP::HandleObject(const llvm::json::Object &object) { } (*response_handler)(Result); } else { - llvm::StringRef message = GetString(object, "message"); + llvm::StringRef message = GetString(object, "message").value_or(""); if (message.empty()) { message = "Unknown error, response failed"; } diff --git a/lldb/tools/lldb-dap/FunctionBreakpoint.cpp b/lldb/tools/lldb-dap/FunctionBreakpoint.cpp index f266d751833c7..cafae32b662f2 100644 --- a/lldb/tools/lldb-dap/FunctionBreakpoint.cpp +++ b/lldb/tools/lldb-dap/FunctionBreakpoint.cpp @@ -13,7 +13,8 @@ namespace lldb_dap { FunctionBreakpoint::FunctionBreakpoint(DAP &d, const llvm::json::Object &obj) - : Breakpoint(d, obj), functionName(std::string(GetString(obj, "name"))) {} + : Breakpoint(d, obj), + functionName(std::string(GetString(obj, "name").value_or(""))) {} void FunctionBreakpoint::SetBreakpoint() { if (functionName.empty()) diff --git a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp index b2556f7ddff1c..5d45dc4fe0b34 100644 --- a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp @@ -58,7 +58,7 @@ void AttachRequestHandler::operator()(const llvm::json::Object &request) const { const auto gdb_remote_port = GetUnsigned(arguments, "gdb-remote-port").value_or(invalid_port); const auto gdb_remote_hostname = - GetString(arguments, "gdb-remote-hostname", "localhost"); + GetString(arguments, "gdb-remote-hostname").value_or("localhost"); if (pid != LLDB_INVALID_PROCESS_ID) attach_info.SetProcessID(pid); const auto wait_for = GetBoolean(arguments, "waitFor").value_or(false); @@ -69,23 +69,25 @@ void AttachRequestHandler::operator()(const llvm::json::Object &request) const { dap.exit_commands = GetStrings(arguments, "exitCommands"); dap.terminate_commands = GetStrings(arguments, "terminateCommands"); auto attachCommands = GetStrings(arguments, "attachCommands"); - llvm::StringRef core_file = GetString(arguments, "coreFile"); + llvm::StringRef core_file = GetString(arguments, "coreFile").value_or(""); const uint64_t timeout_seconds = GetUnsigned(arguments, "timeout").value_or(30); dap.stop_at_entry = core_file.empty() ? GetBoolean(arguments, "stopOnEntry").value_or(false) : true; dap.post_run_commands = GetStrings(arguments, "postRunCommands"); - const llvm::StringRef debuggerRoot = GetString(arguments, "debuggerRoot"); + const llvm::StringRef debuggerRoot = + GetString(arguments, "debuggerRoot").value_or(""); dap.enable_auto_variable_summaries = GetBoolean(arguments, "enableAutoVariableSummaries").value_or(false); dap.enable_synthetic_child_debugging = GetBoolean(arguments, "enableSyntheticChildDebugging").value_or(false); dap.display_extended_backtrace = GetBoolean(arguments, "displayExtendedBacktrace").value_or(false); - dap.command_escape_prefix = GetString(arguments, "commandEscapePrefix", "`"); - dap.SetFrameFormat(GetString(arguments, "customFrameFormat")); - dap.SetThreadFormat(GetString(arguments, "customThreadFormat")); + dap.command_escape_prefix = + GetString(arguments, "commandEscapePrefix").value_or("`"); + dap.SetFrameFormat(GetString(arguments, "customFrameFormat").value_or("")); + dap.SetThreadFormat(GetString(arguments, "customThreadFormat").value_or("")); PrintWelcomeMessage(); diff --git a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp index 50b530349d0e4..66195fd5fb5bd 100644 --- a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp @@ -130,7 +130,7 @@ void BreakpointLocationsRequestHandler::operator()( FillResponse(request, response); auto *arguments = request.getObject("arguments"); auto *source = arguments->getObject("source"); - std::string path = GetString(source, "path").str(); + std::string path = GetString(source, "path").value_or("").str(); const uint64_t start_line = GetUnsigned(arguments, "line").value_or(0); const uint64_t start_column = GetUnsigned(arguments, "column").value_or(0); const uint64_t end_line = diff --git a/lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp index 51ae44a0def9d..cd937116f7380 100644 --- a/lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp @@ -60,7 +60,8 @@ void CompileUnitsRequestHandler::operator()( llvm::json::Object body; llvm::json::Array units; const auto *arguments = request.getObject("arguments"); - std::string module_id = std::string(GetString(arguments, "moduleId")); + const std::string module_id = + GetString(arguments, "moduleId").value_or("").str(); int num_modules = dap.target.GetNumModules(); for (int i = 0; i < num_modules; i++) { auto curr_module = dap.target.GetModuleAtIndex(i); diff --git a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp index fc9b72b5b4f00..96d573c48513c 100644 --- a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp @@ -142,7 +142,7 @@ void CompletionsRequestHandler::operator()( frame.GetThread().SetSelectedFrame(frame.GetFrameID()); } - std::string text = GetString(arguments, "text").str(); + std::string text = GetString(arguments, "text").value_or("").str(); const auto original_column = GetSigned(arguments, "column").value_or(text.size()); const auto original_line = GetSigned(arguments, "line").value_or(1); diff --git a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp index 15c083fb5c14d..2926ede0c3f7a 100644 --- a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp @@ -117,7 +117,7 @@ void DataBreakpointInfoRequestHandler::operator()( const auto *arguments = request.getObject("arguments"); const auto variablesReference = GetUnsigned(arguments, "variablesReference").value_or(0); - llvm::StringRef name = GetString(arguments, "name"); + const llvm::StringRef name = GetString(arguments, "name").value_or(""); lldb::SBFrame frame = dap.GetLLDBFrame(*arguments); lldb::SBValue variable = dap.variables.FindVariable(variablesReference, name); std::string addr, size; diff --git a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp index e40e7084ce279..f401b52d2c5dd 100644 --- a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp @@ -93,7 +93,8 @@ void DisassembleRequestHandler::operator()( FillResponse(request, response); auto *arguments = request.getObject("arguments"); - llvm::StringRef memoryReference = GetString(arguments, "memoryReference"); + llvm::StringRef memoryReference = + GetString(arguments, "memoryReference").value_or(""); auto addr_opt = DecodeMemoryReference(memoryReference); if (!addr_opt.has_value()) { response["success"] = false; diff --git a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp index 36a9d9bff5db9..e9f08a1017abc 100644 --- a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp @@ -145,8 +145,9 @@ void EvaluateRequestHandler::operator()( llvm::json::Object body; const auto *arguments = request.getObject("arguments"); lldb::SBFrame frame = dap.GetLLDBFrame(*arguments); - std::string expression = GetString(arguments, "expression").str(); - llvm::StringRef context = GetString(arguments, "context"); + std::string expression = + GetString(arguments, "expression").value_or("").str(); + const llvm::StringRef context = GetString(arguments, "context").value_or(""); bool repeat_last_command = expression.empty() && dap.last_nonempty_var_expression.empty(); diff --git a/lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp index 9fa1ddd4e848c..f64c186376a36 100644 --- a/lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp @@ -61,16 +61,18 @@ void LaunchRequestHandler::operator()(const llvm::json::Object &request) const { dap.terminate_commands = GetStrings(arguments, "terminateCommands"); dap.post_run_commands = GetStrings(arguments, "postRunCommands"); dap.stop_at_entry = GetBoolean(arguments, "stopOnEntry").value_or(false); - const llvm::StringRef debuggerRoot = GetString(arguments, "debuggerRoot"); + const llvm::StringRef debuggerRoot = + GetString(arguments, "debuggerRoot").value_or(""); dap.enable_auto_variable_summaries = GetBoolean(arguments, "enableAutoVariableSummaries").value_or(false); dap.enable_synthetic_child_debugging = GetBoolean(arguments, "enableSyntheticChildDebugging").value_or(false); dap.display_extended_backtrace = GetBoolean(arguments, "displayExtendedBacktrace").value_or(false); - dap.command_escape_prefix = GetString(arguments, "commandEscapePrefix", "`"); - dap.SetFrameFormat(GetString(arguments, "customFrameFormat")); - dap.SetThreadFormat(GetString(arguments, "customThreadFormat")); + dap.command_escape_prefix = + GetString(arguments, "commandEscapePrefix").value_or("`"); + dap.SetFrameFormat(GetString(arguments, "customFrameFormat").value_or("")); + dap.SetThreadFormat(GetString(arguments, "customThreadFormat").value_or("")); PrintWelcomeMessage(); diff --git a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp index a2ea0a6217264..590bcd69912f5 100644 --- a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp @@ -98,7 +98,8 @@ void ReadMemoryRequestHandler::operator()( FillResponse(request, response); auto *arguments = request.getObject("arguments"); - llvm::StringRef memoryReference = GetString(arguments, "memoryReference"); + llvm::StringRef memoryReference = + GetString(arguments, "memoryReference").value_or(""); auto addr_opt = DecodeMemoryReference(memoryReference); if (!addr_opt.has_value()) { response["success"] = false; diff --git a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp index 0efc63efee5f8..c1450ce2fc687 100644 --- a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp @@ -42,7 +42,7 @@ void RequestHandler::SetSourceMapFromArguments( std::string sourceMapCommand; llvm::raw_string_ostream strm(sourceMapCommand); strm << "settings set target.source-map "; - const auto sourcePath = GetString(arguments, "sourcePath"); + const auto sourcePath = GetString(arguments, "sourcePath").value_or(""); // sourceMap is the new, more general form of sourcePath and overrides it. constexpr llvm::StringRef sourceMapKey = "sourceMap"; @@ -157,7 +157,7 @@ RequestHandler::LaunchProcess(const llvm::json::Object &request) const { // Grab the current working directory if there is one and set it in the // launch info. - const auto cwd = GetString(arguments, "cwd"); + const auto cwd = GetString(arguments, "cwd").value_or(""); if (!cwd.empty()) launch_info.SetWorkingDirectory(cwd.data()); diff --git a/lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp index 413db38733ffa..5ca2c9c01965e 100644 --- a/lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp @@ -130,7 +130,7 @@ void SetBreakpointsRequestHandler::operator()( FillResponse(request, response); const auto *arguments = request.getObject("arguments"); const auto *source = arguments->getObject("source"); - const auto path = GetString(source, "path"); + const auto path = GetString(source, "path").value_or(""); const auto *breakpoints = arguments->getArray("breakpoints"); llvm::json::Array response_breakpoints; diff --git a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp index 752a15d09534d..6274100446dcc 100644 --- a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp @@ -116,9 +116,9 @@ void SetVariableRequestHandler::operator()( // This is a reference to the containing variable/scope const auto variablesReference = GetUnsigned(arguments, "variablesReference").value_or(0); - llvm::StringRef name = GetString(arguments, "name"); + llvm::StringRef name = GetString(arguments, "name").value_or(""); - const auto value = GetString(arguments, "value"); + const auto value = GetString(arguments, "value").value_or(""); // Set success to false just in case we don't find the variable by name response.try_emplace("success", false); diff --git a/lldb/tools/lldb-dap/InstructionBreakpoint.cpp b/lldb/tools/lldb-dap/InstructionBreakpoint.cpp index d9d5a0b3e745b..faa6c982b0fd1 100644 --- a/lldb/tools/lldb-dap/InstructionBreakpoint.cpp +++ b/lldb/tools/lldb-dap/InstructionBreakpoint.cpp @@ -22,6 +22,7 @@ InstructionBreakpoint::InstructionBreakpoint(DAP &d, : Breakpoint(d, obj), instructionAddressReference(LLDB_INVALID_ADDRESS), offset(GetSigned(obj, "offset").value_or(0)) { GetString(obj, "instructionReference") + .value_or("") .getAsInteger(0, instructionAddressReference); instructionAddressReference += offset; } diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp index c3684b027045a..fbb6ba91c876e 100644 --- a/lldb/tools/lldb-dap/JSONUtils.cpp +++ b/lldb/tools/lldb-dap/JSONUtils.cpp @@ -70,18 +70,17 @@ llvm::StringRef GetAsString(const llvm::json::Value &value) { } // Gets a string from a JSON object using the key, or returns an empty string. -llvm::StringRef GetString(const llvm::json::Object &obj, llvm::StringRef key, - llvm::StringRef defaultValue) { - if (std::optional<llvm::StringRef> value = obj.getString(key)) - return *value; - return defaultValue; +std::optional<llvm::StringRef> GetString(const llvm::json::Object &obj, + llvm::StringRef key) { + return obj.getString(key); } -llvm::StringRef GetString(const llvm::json::Object *obj, llvm::StringRef key, - llvm::StringRef defaultValue) { +std::optional<llvm::StringRef> GetString(const llvm::json::Object *obj, + llvm::StringRef key) { if (obj == nullptr) - return defaultValue; - return GetString(*obj, key, defaultValue); + return std::nullopt; + + return GetString(*obj, key); } // Gets an unsigned integer from a JSON object using the key, or returns the @@ -277,7 +276,8 @@ void FillResponse(const llvm::json::Object &request, // to true by default. response.try_emplace("type", "response"); response.try_emplace("seq", (int64_t)0); - EmplaceSafeString(response, "command", GetString(request, "command")); + EmplaceSafeString(response, "command", + GetString(request, "command").value_or("")); const int64_t seq = GetSigned(request, "seq").value_or(0); response.try_emplace("request_seq", seq); response.try_emplace("success", true); @@ -1451,13 +1451,14 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request, args.push_back(std::to_string(debugger_pid)); } args.push_back("--launch-target"); - args.push_back(GetString(launch_request_arguments, "program").str()); + args.push_back( + GetString(launch_request_arguments, "program").value_or("").str()); std::vector<std::string> target_args = GetStrings(launch_request_arguments, "args"); args.insert(args.end(), target_args.begin(), target_args.end()); run_in_terminal_args.try_emplace("args", args); - const auto cwd = GetString(launch_request_arguments, "cwd"); + const auto cwd = GetString(launch_request_arguments, "cwd").value_or(""); if (!cwd.empty()) run_in_terminal_args.try_emplace("cwd", cwd); diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h index 8e231406c2ef0..613a6fae7f5bf 100644 --- a/lldb/tools/lldb-dap/JSONUtils.h +++ b/lldb/tools/lldb-dap/JSONUtils.h @@ -62,17 +62,14 @@ llvm::StringRef GetAsString(const llvm::json::Value &value); /// \param[in] key /// The key to use when extracting the value /// -/// \param[in] defaultValue -/// The default value to return if the key is not present -/// /// \return /// A llvm::StringRef that contains the string value for the -/// specified \a key, or the default value if there is no key that +/// specified \a key, or \a std::nullopt if there is no key that /// matches or if the value is not a string. -llvm::StringRef GetString(const llvm::json::Object &obj, llvm::StringRef key, - llvm::StringRef defaultValue = {}); -llvm::StringRef GetString(const llvm::json::Object *obj, llvm::StringRef key, - llvm::StringRef defaultValue = {}); +std::optional<llvm::StringRef> GetString(const llvm::json::Object &obj, + llvm::StringRef key); +std::optional<llvm::StringRef> GetString(const llvm::json::Object *obj, + llvm::StringRef key); /// Extract the unsigned integer value for the specified key from /// the specified object. diff --git a/lldb/tools/lldb-dap/SourceBreakpoint.cpp b/lldb/tools/lldb-dap/SourceBreakpoint.cpp index f2425f4b6aba7..e44e95e486496 100644 --- a/lldb/tools/lldb-dap/SourceBreakpoint.cpp +++ b/lldb/tools/lldb-dap/SourceBreakpoint.cpp @@ -26,7 +26,7 @@ namespace lldb_dap { SourceBreakpoint::SourceBreakpoint(DAP &dap, const llvm::json::Object &obj) : Breakpoint(dap, obj), - logMessage(std::string(GetString(obj, "logMessage"))), + logMessage(GetString(obj, "logMessage").value_or("").str()), line(GetUnsigned(obj, "line").value_or(0)), column(GetUnsigned(obj, "column").value_or(0)) {} diff --git a/lldb/tools/lldb-dap/Watchpoint.cpp b/lldb/tools/lldb-dap/Watchpoint.cpp index 0e68a35877c66..8681057c8d3f2 100644 --- a/lldb/tools/lldb-dap/Watchpoint.cpp +++ b/lldb/tools/lldb-dap/Watchpoint.cpp @@ -20,8 +20,8 @@ namespace lldb_dap { Watchpoint::Watchpoint(DAP &d, const llvm::json::Object &obj) : BreakpointBase(d, obj) { - llvm::StringRef dataId = GetString(obj, "dataId"); - std::string accessType = GetString(obj, "accessType").str(); + llvm::StringRef dataId = GetString(obj, "dataId").value_or(""); + std::string accessType = GetString(obj, "accessType").value_or("").str(); auto [addr_str, size_str] = dataId.split('/'); llvm::to_integer(addr_str, addr, 16); llvm::to_integer(size_str, size); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits