[Lldb-commits] [lldb] [lldb-vscode] Display a more descriptive summary for containers and pointers (PR #65514)
Walter Erquinigo via lldb-commits
lldb-commits at lists.llvm.org
Wed Sep 6 14:10:00 PDT 2023
================
@@ -132,6 +132,84 @@ std::vector<std::string> GetStrings(const llvm::json::Object *obj,
return strs;
}
+/// Create a short summary for a container that contains the summary of its
+/// first children, so that the user can get a glimpse of its contents at a
+/// glance.
+static std::optional<std::string>
+GetSyntheticSummaryForContainer(lldb::SBValue &v) {
+ if (v.TypeIsPointerType() || !v.MightHaveChildren())
+ return std::nullopt;
+ /// As this operation can be potentially slow, we limit the total time spent
+ /// fetching children to a few ms.
+ const auto max_evaluation_time = std::chrono::milliseconds(10);
+ /// We don't want to generate a extremely long summary string, so we limit its
+ /// length.
+ const size_t max_length = 32;
+
+ auto start = std::chrono::steady_clock::now();
+ std::string summary;
+ llvm::raw_string_ostream os(summary);
+ os << "{";
+
+ llvm::StringRef separator = "";
+
+ for (size_t i = 0, e = v.GetNumChildren(); i < e; ++i) {
+ // If we reached the time limit or exceeded the number of characters, we
+ // dump `...` to signal that there are more elements in the collection.
+ if (summary.size() > max_length ||
+ (std::chrono::steady_clock::now() - start) > max_evaluation_time) {
+ os << separator << "...";
+ break;
+ }
+ lldb::SBValue child = v.GetChildAtIndex(i);
+
+ if (llvm::StringRef name = child.GetName(); !name.empty()) {
+ llvm::StringRef value;
+ if (llvm::StringRef summary = child.GetSummary(); !summary.empty())
+ value = summary;
+ else
+ value = child.GetValue();
+
+ if (!value.empty()) {
+ // If the child is an indexed entry, we don't show its index to save
+ // characters.
+ if (name.starts_with("["))
+ os << separator << value;
+ else
+ os << separator << name << ":" << value;
+ separator = ", ";
+ }
+ }
+ }
+ os << "}";
+
+ if (summary == "{...}" || summary == "{}")
+ return std::nullopt;
+ return summary;
+}
+
+/// Return whether we should dereference an SBValue in order to generate a more
+/// meaningful summary string.
+static bool ShouldBeDereferencedForSummary(lldb::SBValue &v) {
+ if (!v.GetType().IsPointerType() && !v.GetType().IsReferenceType())
----------------
walter-erquinigo wrote:
Yep, there's a test that includes a char**.
https://github.com/llvm/llvm-project/pull/65514
More information about the lldb-commits
mailing list