[Lldb-commits] [lldb] [lldb-da] Refactoring JSONUtils to not use `g_dap` and instead passing in required arguments. (PR #115561)
John Harrison via lldb-commits
lldb-commits at lists.llvm.org
Fri Nov 8 15:00:32 PST 2024
https://github.com/ashgti created https://github.com/llvm/llvm-project/pull/115561
This is part of a larger refactor to remove the global `g_dap` variable.
>From 3105fc424d4c712d90f10b771d4644c0e97355c4 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Thu, 7 Nov 2024 13:06:01 -0800
Subject: [PATCH] [lldb-da] Refactoring JSONUtils to not use `g_dap` and
instead passing in required arguments.
This is part of a larger refactor to remove the global `g_dap` variable.
---
lldb/tools/lldb-dap/JSONUtils.cpp | 95 ++++++++++++++-----------------
lldb/tools/lldb-dap/JSONUtils.h | 54 +++++++++++++-----
lldb/tools/lldb-dap/lldb-dap.cpp | 30 +++++-----
3 files changed, 102 insertions(+), 77 deletions(-)
diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp
index a7300abae0eac8..6ca4dfb4711a13 100644
--- a/lldb/tools/lldb-dap/JSONUtils.cpp
+++ b/lldb/tools/lldb-dap/JSONUtils.cpp
@@ -154,7 +154,7 @@ DecodeMemoryReference(llvm::StringRef memoryReference) {
std::vector<std::string> GetStrings(const llvm::json::Object *obj,
llvm::StringRef key) {
std::vector<std::string> strs;
- auto json_array = obj->getArray(key);
+ const auto *json_array = obj->getArray(key);
if (!json_array)
return strs;
for (const auto &value : *json_array) {
@@ -210,12 +210,6 @@ static bool IsClassStructOrUnionType(lldb::SBType t) {
/// glance.
static std::optional<std::string>
TryCreateAutoSummaryForContainer(lldb::SBValue &v) {
- // We gate this feature because it performs GetNumChildren(), which can
- // cause performance issues because LLDB needs to complete possibly huge
- // types.
- if (!g_dap.enable_auto_variable_summaries)
- return std::nullopt;
-
if (!v.MightHaveChildren())
return std::nullopt;
/// As this operation can be potentially slow, we limit the total time spent
@@ -271,10 +265,7 @@ TryCreateAutoSummaryForContainer(lldb::SBValue &v) {
/// Try to create a summary string for the given value that doesn't have a
/// summary of its own.
-static std::optional<std::string> TryCreateAutoSummary(lldb::SBValue value) {
- if (!g_dap.enable_auto_variable_summaries)
- return std::nullopt;
-
+static std::optional<std::string> TryCreateAutoSummary(lldb::SBValue &value) {
// We use the dereferenced value for generating the summary.
if (value.GetType().IsPointerType() || value.GetType().IsReferenceType())
value = value.Dereference();
@@ -485,10 +476,12 @@ static std::string ConvertDebugInfoSizeToString(uint64_t debug_info) {
}
return oss.str();
}
-llvm::json::Value CreateModule(lldb::SBModule &module) {
+
+llvm::json::Value CreateModule(lldb::SBTarget &target, lldb::SBModule &module) {
llvm::json::Object object;
- if (!module.IsValid())
+ if (!target.IsValid() || !module.IsValid())
return llvm::json::Value(std::move(object));
+
const char *uuid = module.GetUUIDString();
object.try_emplace("id", uuid ? std::string(uuid) : std::string(""));
object.try_emplace("name", std::string(module.GetFileSpec().GetFilename()));
@@ -514,7 +507,7 @@ llvm::json::Value CreateModule(lldb::SBModule &module) {
object.try_emplace("symbolStatus", "Symbols not found.");
}
std::string loaded_addr = std::to_string(
- module.GetObjectFileHeaderAddress().GetLoadAddress(g_dap.target));
+ module.GetObjectFileHeaderAddress().GetLoadAddress(target));
object.try_emplace("addressRange", loaded_addr);
std::string version_str;
uint32_t version_nums[3];
@@ -705,7 +698,7 @@ llvm::json::Value CreateSource(llvm::StringRef source_path) {
return llvm::json::Value(std::move(source));
}
-std::optional<llvm::json::Value> CreateSource(lldb::SBFrame &frame) {
+static std::optional<llvm::json::Value> CreateSource(lldb::SBFrame &frame) {
auto line_entry = frame.GetLineEntry();
// A line entry of 0 indicates the line is compiler generated i.e. no source
// file is associated with the frame.
@@ -776,15 +769,15 @@ std::optional<llvm::json::Value> CreateSource(lldb::SBFrame &frame) {
// },
// "required": [ "id", "name", "line", "column" ]
// }
-llvm::json::Value CreateStackFrame(lldb::SBFrame &frame) {
+llvm::json::Value CreateStackFrame(lldb::SBFrame &frame,
+ lldb::SBFormat &format) {
llvm::json::Object object;
int64_t frame_id = MakeDAPFrameID(frame);
object.try_emplace("id", frame_id);
std::string frame_name;
lldb::SBStream stream;
- if (g_dap.frame_format &&
- frame.GetDescriptionWithFormat(g_dap.frame_format, stream).Success()) {
+ if (format && frame.GetDescriptionWithFormat(format, stream).Success()) {
frame_name = stream.GetData();
// `function_name` can be a nullptr, which throws an error when assigned to
@@ -801,7 +794,7 @@ llvm::json::Value CreateStackFrame(lldb::SBFrame &frame) {
}
// We only include `[opt]` if a custom frame format is not specified.
- if (!g_dap.frame_format && frame.GetFunction().GetIsOptimized())
+ if (!format && frame.GetFunction().GetIsOptimized())
frame_name += " [opt]";
EmplaceSafeString(object, "name", frame_name);
@@ -835,11 +828,11 @@ llvm::json::Value CreateStackFrame(lldb::SBFrame &frame) {
return llvm::json::Value(std::move(object));
}
-llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread) {
+llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread,
+ lldb::SBFormat &format) {
std::string name;
lldb::SBStream stream;
- if (g_dap.thread_format &&
- thread.GetDescriptionWithFormat(g_dap.thread_format, stream).Success()) {
+ if (format && thread.GetDescriptionWithFormat(format, stream).Success()) {
name = stream.GetData();
} else {
const uint32_t thread_idx = thread.GetExtendedBacktraceOriginatingIndexID();
@@ -872,13 +865,12 @@ llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread) {
// },
// "required": [ "id", "name" ]
// }
-llvm::json::Value CreateThread(lldb::SBThread &thread) {
+llvm::json::Value CreateThread(lldb::SBThread &thread, lldb::SBFormat &format) {
llvm::json::Object object;
object.try_emplace("id", (int64_t)thread.GetThreadID());
std::string thread_str;
lldb::SBStream stream;
- if (g_dap.thread_format &&
- thread.GetDescriptionWithFormat(g_dap.thread_format, stream).Success()) {
+ if (format && thread.GetDescriptionWithFormat(format, stream).Success()) {
thread_str = stream.GetData();
} else {
const char *thread_name = thread.GetName();
@@ -966,7 +958,7 @@ llvm::json::Value CreateThread(lldb::SBThread &thread) {
// "required": [ "event", "body" ]
// }]
// }
-llvm::json::Value CreateThreadStopped(lldb::SBThread &thread,
+llvm::json::Value CreateThreadStopped(DAP &dap, lldb::SBThread &thread,
uint32_t stop_id) {
llvm::json::Object event(CreateEventObject("stopped"));
llvm::json::Object body;
@@ -976,13 +968,13 @@ llvm::json::Value CreateThreadStopped(lldb::SBThread &thread,
body.try_emplace("reason", "step");
break;
case lldb::eStopReasonBreakpoint: {
- ExceptionBreakpoint *exc_bp = g_dap.GetExceptionBPFromStopReason(thread);
+ ExceptionBreakpoint *exc_bp = dap.GetExceptionBPFromStopReason(thread);
if (exc_bp) {
body.try_emplace("reason", "exception");
EmplaceSafeString(body, "description", exc_bp->label);
} else {
InstructionBreakpoint *inst_bp =
- g_dap.GetInstructionBPFromStopReason(thread);
+ dap.GetInstructionBPFromStopReason(thread);
if (inst_bp) {
body.try_emplace("reason", "instruction breakpoint");
} else {
@@ -1042,21 +1034,21 @@ llvm::json::Value CreateThreadStopped(lldb::SBThread &thread,
}
}
// "threadCausedFocus" is used in tests to validate breaking behavior.
- if (tid == g_dap.focus_tid) {
+ if (tid == dap.focus_tid) {
body.try_emplace("threadCausedFocus", true);
}
- body.try_emplace("preserveFocusHint", tid != g_dap.focus_tid);
+ body.try_emplace("preserveFocusHint", tid != dap.focus_tid);
body.try_emplace("allThreadsStopped", true);
event.try_emplace("body", std::move(body));
return llvm::json::Value(std::move(event));
}
-const char *GetNonNullVariableName(lldb::SBValue v) {
+const char *GetNonNullVariableName(lldb::SBValue &v) {
const char *name = v.GetName();
return name ? name : "<null>";
}
-std::string CreateUniqueVariableNameForDisplay(lldb::SBValue v,
+std::string CreateUniqueVariableNameForDisplay(lldb::SBValue &v,
bool is_name_duplicated) {
lldb::SBStream name_builder;
name_builder.Print(GetNonNullVariableName(v));
@@ -1073,7 +1065,9 @@ std::string CreateUniqueVariableNameForDisplay(lldb::SBValue v,
return name_builder.GetData();
}
-VariableDescription::VariableDescription(lldb::SBValue v, bool format_hex,
+VariableDescription::VariableDescription(lldb::SBValue v,
+ bool auto_variable_summaries,
+ bool format_hex,
bool is_name_duplicated,
std::optional<std::string> custom_name)
: v(v) {
@@ -1104,7 +1098,7 @@ VariableDescription::VariableDescription(lldb::SBValue v, bool format_hex,
} else {
value = llvm::StringRef(v.GetValue()).str();
summary = llvm::StringRef(v.GetSummary()).str();
- if (summary.empty())
+ if (summary.empty() && auto_variable_summaries)
auto_summary = TryCreateAutoSummary(v);
std::optional<std::string> effective_summary =
@@ -1188,7 +1182,7 @@ bool ValuePointsToCode(lldb::SBValue v) {
lldb::addr_t addr = v.GetValueAsAddress();
lldb::SBLineEntry line_entry =
- g_dap.target.ResolveLoadAddress(addr).GetLineEntry();
+ v.GetTarget().ResolveLoadAddress(addr).GetLineEntry();
return line_entry.IsValid();
}
@@ -1349,9 +1343,12 @@ std::pair<int64_t, bool> UnpackLocation(int64_t location_id) {
// "required": [ "name", "value", "variablesReference" ]
// }
llvm::json::Value CreateVariable(lldb::SBValue v, int64_t var_ref,
- bool format_hex, bool is_name_duplicated,
+ bool format_hex, bool auto_variable_summaries,
+ bool synthetic_child_debugging,
+ bool is_name_duplicated,
std::optional<std::string> custom_name) {
- VariableDescription desc(v, format_hex, is_name_duplicated, custom_name);
+ VariableDescription desc(v, auto_variable_summaries, format_hex,
+ is_name_duplicated, custom_name);
llvm::json::Object object;
EmplaceSafeString(object, "name", desc.name);
EmplaceSafeString(object, "value", desc.display_value);
@@ -1387,7 +1384,7 @@ llvm::json::Value CreateVariable(lldb::SBValue v, int64_t var_ref,
size_t num_children = v.GetNumChildren();
// If we are creating a "[raw]" fake child for each synthetic type, we
// have to account for it when returning indexed variables.
- if (g_dap.enable_synthetic_child_debugging)
+ if (synthetic_child_debugging)
++num_children;
object.try_emplace("indexedVariables", num_children);
}
@@ -1418,7 +1415,7 @@ llvm::json::Value CreateVariable(lldb::SBValue v, int64_t var_ref,
return llvm::json::Value(std::move(object));
}
-llvm::json::Value CreateCompileUnit(lldb::SBCompileUnit unit) {
+llvm::json::Value CreateCompileUnit(lldb::SBCompileUnit &unit) {
llvm::json::Object object;
char unit_path_arr[PATH_MAX];
unit.GetFileSpec().GetPath(unit_path_arr, sizeof(unit_path_arr));
@@ -1439,7 +1436,7 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request,
// the terminal in a new window.
run_in_terminal_args.try_emplace("kind", "integrated");
- auto launch_request_arguments = launch_request.getObject("arguments");
+ const auto *launch_request_arguments = launch_request.getObject("arguments");
// The program path must be the first entry in the "args" field
std::vector<std::string> args = {debug_adaptor_path.str(), "--comm-file",
comm_file.str()};
@@ -1465,11 +1462,7 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request,
llvm::StringRef key = envs.GetNameAtIndex(index);
llvm::StringRef value = envs.GetValueAtIndex(index);
- if (key.empty())
- g_dap.SendOutput(OutputType::Stderr,
- "empty environment variable for value: \"" +
- value.str() + '\"');
- else
+ if (!key.empty())
env_json.try_emplace(key, value);
}
run_in_terminal_args.try_emplace("env",
@@ -1481,8 +1474,8 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request,
// Keep all the top level items from the statistics dump, except for the
// "modules" array. It can be huge and cause delay
// Array and dictionary value will return as <key, JSON string> pairs
-void FilterAndGetValueForKey(const lldb::SBStructuredData data, const char *key,
- llvm::json::Object &out) {
+static void FilterAndGetValueForKey(const lldb::SBStructuredData data,
+ const char *key, llvm::json::Object &out) {
lldb::SBStructuredData value = data.GetValueForKey(key);
std::string key_utf8 = llvm::json::fixUTF8(key);
if (llvm::StringRef(key) == "modules")
@@ -1524,8 +1517,8 @@ void FilterAndGetValueForKey(const lldb::SBStructuredData data, const char *key,
}
}
-void addStatistic(llvm::json::Object &event) {
- lldb::SBStructuredData statistics = g_dap.target.GetStatistics();
+static void addStatistic(lldb::SBTarget &target, llvm::json::Object &event) {
+ lldb::SBStructuredData statistics = target.GetStatistics();
bool is_dictionary =
statistics.GetType() == lldb::eStructuredDataTypeDictionary;
if (!is_dictionary)
@@ -1542,9 +1535,9 @@ void addStatistic(llvm::json::Object &event) {
event.try_emplace("statistics", std::move(stats_body));
}
-llvm::json::Object CreateTerminatedEventObject() {
+llvm::json::Object CreateTerminatedEventObject(lldb::SBTarget &target) {
llvm::json::Object event(CreateEventObject("terminated"));
- addStatistic(event);
+ addStatistic(target, event);
return event;
}
diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h
index 2e13459c45556f..db56d987773476 100644
--- a/lldb/tools/lldb-dap/JSONUtils.h
+++ b/lldb/tools/lldb-dap/JSONUtils.h
@@ -12,6 +12,7 @@
#include "DAPForward.h"
#include "lldb/API/SBCompileUnit.h"
#include "lldb/API/SBFileSpec.h"
+#include "lldb/API/SBFormat.h"
#include "lldb/API/SBLineEntry.h"
#include "lldb/API/SBType.h"
#include "lldb/API/SBValue.h"
@@ -267,13 +268,16 @@ CreateBreakpoint(BreakpointBase *bp,
/// Converts a LLDB module to a VS Code DAP module for use in "modules" events.
///
+/// \param[in] target
+/// A LLDB target object to convert into a JSON value.
+///
/// \param[in] module
/// A LLDB module object to convert into a JSON value
///
/// \return
/// A "Module" JSON object with that follows the formal JSON
/// definition outlined by Microsoft.
-llvm::json::Value CreateModule(lldb::SBModule &module);
+llvm::json::Value CreateModule(lldb::SBTarget &target, lldb::SBModule &module);
/// Create a "Event" JSON object using \a event_name as the event name
///
@@ -363,10 +367,15 @@ llvm::json::Value CreateSource(llvm::StringRef source_path);
/// The LLDB stack frame to use when populating out the "StackFrame"
/// object.
///
+/// \param[in] format
+/// The LLDB format to use when populating out the "StackFrame"
+/// object.
+///
/// \return
/// A "StackFrame" JSON object with that follows the formal JSON
/// definition outlined by Microsoft.
-llvm::json::Value CreateStackFrame(lldb::SBFrame &frame);
+llvm::json::Value CreateStackFrame(lldb::SBFrame &frame,
+ lldb::SBFormat &format);
/// Create a "StackFrame" label object for a LLDB thread.
///
@@ -382,10 +391,14 @@ llvm::json::Value CreateStackFrame(lldb::SBFrame &frame);
/// The LLDB thread to use when populating out the "Thread"
/// object.
///
+/// \param[in] format
+/// The configured formatter for the DAP session.
+///
/// \return
/// A "StackFrame" JSON object with that follows the formal JSON
/// definition outlined by Microsoft.
-llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread);
+llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread,
+ lldb::SBFormat &format);
/// Create a "Thread" object for a LLDB thread object.
///
@@ -400,10 +413,14 @@ llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread);
/// The LLDB thread to use when populating out the "Thread"
/// object.
///
+/// \param[in] format
+/// The LLDB format to use when populating out the "Thread"
+/// object.
+///
/// \return
/// A "Thread" JSON object with that follows the formal JSON
/// definition outlined by Microsoft.
-llvm::json::Value CreateThread(lldb::SBThread &thread);
+llvm::json::Value CreateThread(lldb::SBThread &thread, lldb::SBFormat &format);
/// Create a "StoppedEvent" object for a LLDB thread object.
///
@@ -419,25 +436,32 @@ llvm::json::Value CreateThread(lldb::SBThread &thread);
/// "allThreadsStopped" - set to True to indicate that all threads
/// stop when any thread stops.
///
+/// \param[in] dap
+/// The DAP session associated with the stopped thread.
+///
/// \param[in] thread
/// The LLDB thread to use when populating out the "StoppedEvent"
/// object.
///
+/// \param[in] stop_id
+/// The stop id for this event.
+///
/// \return
/// A "StoppedEvent" JSON object with that follows the formal JSON
/// definition outlined by Microsoft.
-llvm::json::Value CreateThreadStopped(lldb::SBThread &thread, uint32_t stop_id);
+llvm::json::Value CreateThreadStopped(DAP &dap, lldb::SBThread &thread,
+ uint32_t stop_id);
/// \return
/// The variable name of \a value or a default placeholder.
-const char *GetNonNullVariableName(lldb::SBValue value);
+const char *GetNonNullVariableName(lldb::SBValue &value);
/// VSCode can't display two variables with the same name, so we need to
/// distinguish them by using a suffix.
///
/// If the source and line information is present, we use it as the suffix.
/// Otherwise, we fallback to the variable address or register location.
-std::string CreateUniqueVariableNameForDisplay(lldb::SBValue v,
+std::string CreateUniqueVariableNameForDisplay(lldb::SBValue &v,
bool is_name_duplicated);
/// Helper struct that parses the metadata of an \a lldb::SBValue and produces
@@ -464,8 +488,8 @@ struct VariableDescription {
/// The SBValue for this variable.
lldb::SBValue v;
- VariableDescription(lldb::SBValue v, bool format_hex = false,
- bool is_name_duplicated = false,
+ VariableDescription(lldb::SBValue v, bool auto_variable_summaries,
+ bool format_hex = false, bool is_name_duplicated = false,
std::optional<std::string> custom_name = {});
/// Create a JSON object that represents these extensions to the DAP variable
@@ -514,9 +538,12 @@ std::pair<int64_t, bool> UnpackLocation(int64_t location_id);
/// properties.
///
/// \param[in] format_hex
-/// It set to true the variable will be formatted as hex in
+/// If set to true the variable will be formatted as hex in
/// the "value" key value pair for the value of the variable.
///
+/// \param[in] auto_variable_summaries
+/// IF set to true the variable will create an automatic variable summary.
+///
/// \param[in] is_name_duplicated
/// Whether the same variable name appears multiple times within the same
/// context (e.g. locals). This can happen due to shadowed variables in
@@ -533,11 +560,12 @@ std::pair<int64_t, bool> UnpackLocation(int64_t location_id);
/// A "Variable" JSON object with that follows the formal JSON
/// definition outlined by Microsoft.
llvm::json::Value CreateVariable(lldb::SBValue v, int64_t var_ref,
- bool format_hex,
+ bool format_hex, bool auto_variable_summaries,
+ bool synthetic_child_debugging,
bool is_name_duplicated = false,
std::optional<std::string> custom_name = {});
-llvm::json::Value CreateCompileUnit(lldb::SBCompileUnit unit);
+llvm::json::Value CreateCompileUnit(lldb::SBCompileUnit &unit);
/// Create a runInTerminal reverse request object
///
@@ -570,7 +598,7 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request,
///
/// \return
/// A body JSON object with debug info and breakpoint info
-llvm::json::Object CreateTerminatedEventObject();
+llvm::json::Object CreateTerminatedEventObject(lldb::SBTarget &target);
/// Convert a given JSON object to a string.
std::string JSONToString(const llvm::json::Value &json);
diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp b/lldb/tools/lldb-dap/lldb-dap.cpp
index 94184b78a697f1..c50e7abb32b47b 100644
--- a/lldb/tools/lldb-dap/lldb-dap.cpp
+++ b/lldb/tools/lldb-dap/lldb-dap.cpp
@@ -236,7 +236,7 @@ void SendTerminatedEvent() {
llvm::call_once(g_dap.terminated_event_flag, [&] {
g_dap.RunTerminateCommands();
// Send a "terminated" event
- llvm::json::Object event(CreateTerminatedEventObject());
+ llvm::json::Object event(CreateTerminatedEventObject(g_dap.target));
g_dap.SendJSON(llvm::json::Value(std::move(event)));
});
}
@@ -288,13 +288,13 @@ void SendThreadStoppedEvent() {
if (num_threads_with_reason == 0) {
lldb::SBThread thread = process.GetThreadAtIndex(0);
g_dap.focus_tid = thread.GetThreadID();
- g_dap.SendJSON(CreateThreadStopped(thread, stop_id));
+ g_dap.SendJSON(CreateThreadStopped(g_dap, thread, stop_id));
} else {
for (uint32_t thread_idx = 0; thread_idx < num_threads; ++thread_idx) {
lldb::SBThread thread = process.GetThreadAtIndex(thread_idx);
g_dap.thread_ids.insert(thread.GetThreadID());
if (ThreadHasStopReason(thread)) {
- g_dap.SendJSON(CreateThreadStopped(thread, stop_id));
+ g_dap.SendJSON(CreateThreadStopped(g_dap, thread, stop_id));
}
}
}
@@ -688,7 +688,8 @@ bool FillStackFrames(lldb::SBThread &thread, llvm::json::Array &stack_frames,
for (int64_t i = start_frame;
static_cast<int64_t>(stack_frames.size()) < levels; i++) {
if (i == -1) {
- stack_frames.emplace_back(CreateExtendedStackFrameLabel(thread));
+ stack_frames.emplace_back(
+ CreateExtendedStackFrameLabel(thread, g_dap.frame_format));
continue;
}
@@ -699,7 +700,7 @@ bool FillStackFrames(lldb::SBThread &thread, llvm::json::Array &stack_frames,
break;
}
- stack_frames.emplace_back(CreateStackFrame(frame));
+ stack_frames.emplace_back(CreateStackFrame(frame, g_dap.frame_format));
}
if (g_dap.display_extended_backtrace && reached_end_of_stack) {
@@ -1656,7 +1657,7 @@ void request_evaluate(const llvm::json::Object &request) {
else
EmplaceSafeString(response, "message", "evaluate failed");
} else {
- VariableDescription desc(value);
+ VariableDescription desc(value, g_dap.enable_auto_variable_summaries);
EmplaceSafeString(body, "result", desc.GetResult(context));
EmplaceSafeString(body, "type", desc.display_type_name);
int64_t var_ref = 0;
@@ -1775,7 +1776,7 @@ void request_modules(const llvm::json::Object &request) {
llvm::json::Array modules;
for (size_t i = 0; i < g_dap.target.GetNumModules(); i++) {
lldb::SBModule module = g_dap.target.GetModuleAtIndex(i);
- modules.emplace_back(CreateModule(module));
+ modules.emplace_back(CreateModule(g_dap.target, module));
}
llvm::json::Object body;
@@ -3678,7 +3679,7 @@ void request_threads(const llvm::json::Object &request) {
llvm::json::Array threads;
for (uint32_t thread_idx = 0; thread_idx < num_threads; ++thread_idx) {
lldb::SBThread thread = process.GetThreadAtIndex(thread_idx);
- threads.emplace_back(CreateThread(thread));
+ threads.emplace_back(CreateThread(thread, g_dap.thread_format));
}
if (threads.size() == 0) {
response["success"] = llvm::json::Value(false);
@@ -3819,7 +3820,7 @@ void request_setVariable(const llvm::json::Object &request) {
lldb::SBError error;
bool success = variable.SetValueFromCString(value.data(), error);
if (success) {
- VariableDescription desc(variable);
+ VariableDescription desc(variable, g_dap.enable_auto_variable_summaries);
EmplaceSafeString(body, "result", desc.display_value);
EmplaceSafeString(body, "type", desc.display_type_name);
@@ -3927,13 +3928,13 @@ void request_variables(const llvm::json::Object &request) {
llvm::json::Object response;
FillResponse(request, response);
llvm::json::Array variables;
- auto arguments = request.getObject("arguments");
+ const auto *arguments = request.getObject("arguments");
const auto variablesReference =
GetUnsigned(arguments, "variablesReference", 0);
const int64_t start = GetSigned(arguments, "start", 0);
const int64_t count = GetSigned(arguments, "count", 0);
bool hex = false;
- auto format = arguments->getObject("format");
+ const auto *format = arguments->getObject("format");
if (format)
hex = GetBoolean(format, "hex", false);
@@ -4009,7 +4010,8 @@ void request_variables(const llvm::json::Object &request) {
int64_t var_ref =
g_dap.variables.InsertVariable(variable, /*is_permanent=*/false);
variables.emplace_back(CreateVariable(
- variable, var_ref, hex,
+ variable, var_ref, hex, g_dap.enable_auto_variable_summaries,
+ g_dap.enable_synthetic_child_debugging,
variable_name_counts[GetNonNullVariableName(variable)] > 1));
}
} else {
@@ -4025,7 +4027,9 @@ void request_variables(const llvm::json::Object &request) {
g_dap.variables.IsPermanentVariableReference(variablesReference);
int64_t var_ref = g_dap.variables.InsertVariable(child, is_permanent);
variables.emplace_back(CreateVariable(
- child, var_ref, hex, /*is_name_duplicated=*/false, custom_name));
+ child, var_ref, hex, g_dap.enable_auto_variable_summaries,
+ g_dap.enable_synthetic_child_debugging,
+ /*is_name_duplicated=*/false, custom_name));
};
const int64_t num_children = variable.GetNumChildren();
int64_t end_idx = start + ((count == 0) ? num_children : count);
More information about the lldb-commits
mailing list