Fixed formats being able to be applied recursively when using:
target variable -f <format> [args]
frame variable -f <format> [args]
expression -f <format> -- expr
llvm-svn: 149080
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index 989895f..cfc5dcd 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -2979,7 +2979,8 @@
bool scope_already_checked,
bool flat_output,
uint32_t omit_summary_depth,
- bool ignore_cap
+ bool ignore_cap,
+ Format format_override // Normally the format is in the valobj, but we might want to override this
)
{
if (valobj)
@@ -3064,6 +3065,7 @@
}
}
+ std::string value_str;
const char *val_cstr = NULL;
const char *sum_cstr = NULL;
SummaryFormat* entry = valobj->GetSummaryFormat().get();
@@ -3071,9 +3073,26 @@
if (omit_summary_depth > 0)
entry = NULL;
+ Format orig_format = kNumFormats;
if (err_cstr == NULL)
{
+ if (format_override != eFormatDefault)
+ {
+ orig_format = valobj->GetFormat();
+ valobj->SetFormat (format_override);
+ }
val_cstr = valobj->GetValueAsCString();
+ if (val_cstr)
+ {
+ // Cache the value in our own storage as running summaries might
+ // change our value from underneath us
+ value_str = val_cstr;
+ }
+ if (orig_format != kNumFormats && orig_format != format_override)
+ {
+ valobj->SetFormat (orig_format);
+ orig_format = kNumFormats;
+ }
err_cstr = valobj->GetError().AsCString();
}
@@ -3086,13 +3105,13 @@
const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
if (print_valobj)
{
-
- sum_cstr = (omit_summary_depth == 0) ? valobj->GetSummaryAsCString() : NULL;
+ if (omit_summary_depth == 0)
+ sum_cstr = valobj->GetSummaryAsCString();
- // We must calculate this value in realtime because entry might alter this variable's value
- // (e.g. by saying ${var%fmt}) and render precached values useless
- if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr))
- s.Printf(" %s", valobj->GetValueAsCString());
+ // Make sure we have a value and make sure the summary didn't
+ // specify that the value should not be printed
+ if (!value_str.empty() && (entry == NULL || entry->DoesPrintValue() || sum_cstr == NULL))
+ s.Printf(" %s", value_str.c_str());
if (sum_cstr)
{
@@ -3199,7 +3218,8 @@
true,
flat_output,
omit_summary_depth > 1 ? omit_summary_depth - 1 : 0,
- ignore_cap);
+ ignore_cap,
+ format_override);
}
}