summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/DataFormatters/ValueObjectPrinter.h24
-rw-r--r--lldb/include/lldb/Interpreter/OptionGroupValueObjectDisplay.h19
-rw-r--r--lldb/source/DataFormatters/ValueObjectPrinter.cpp45
-rw-r--r--lldb/source/Interpreter/OptionGroupValueObjectDisplay.cpp11
4 files changed, 89 insertions, 10 deletions
diff --git a/lldb/include/lldb/DataFormatters/ValueObjectPrinter.h b/lldb/include/lldb/DataFormatters/ValueObjectPrinter.h
index bfe2d9c402d..327ebd137db 100644
--- a/lldb/include/lldb/DataFormatters/ValueObjectPrinter.h
+++ b/lldb/include/lldb/DataFormatters/ValueObjectPrinter.h
@@ -44,6 +44,7 @@ struct DumpValueObjectOptions
bool m_hide_name;
bool m_hide_value;
bool m_be_raw;
+ bool m_run_validator;
DumpValueObjectOptions() :
m_max_ptr_depth(0),
@@ -63,7 +64,8 @@ struct DumpValueObjectOptions
m_hide_root_type(false), // provide a special compact display for "po"
m_hide_name(false), // provide a special compact display for "po"
m_hide_value(false), // provide a special compact display for "po"
- m_be_raw(false)
+ m_be_raw(false),
+ m_run_validator(false)
{}
static const DumpValueObjectOptions
@@ -92,7 +94,8 @@ struct DumpValueObjectOptions
m_hide_root_type(rhs.m_hide_root_type),
m_hide_name(rhs.m_hide_name),
m_hide_value(rhs.m_hide_value),
- m_be_raw(rhs.m_be_raw)
+ m_be_raw(rhs.m_be_raw),
+ m_run_validator(rhs.m_run_validator)
{}
DumpValueObjectOptions&
@@ -250,6 +253,13 @@ struct DumpValueObjectOptions
m_hide_value = hide_value;
return *this;
}
+
+ DumpValueObjectOptions&
+ SetRunValidator (bool run = true)
+ {
+ m_run_validator = run;
+ return *this;
+ }
};
class ValueObjectPrinter
@@ -297,6 +307,9 @@ protected:
ShouldPrintValueObject ();
bool
+ ShouldPrintValidation ();
+
+ bool
IsNil ();
bool
@@ -309,6 +322,12 @@ protected:
IsAggregate ();
bool
+ PrintValidationMarkerIfNeeded ();
+
+ bool
+ PrintValidationErrorIfNeeded ();
+
+ bool
PrintLocationIfNeeded ();
bool
@@ -385,6 +404,7 @@ private:
std::string m_value;
std::string m_summary;
std::string m_error;
+ std::pair<TypeValidatorResult,std::string> m_validation;
friend struct StringSummaryFormat;
diff --git a/lldb/include/lldb/Interpreter/OptionGroupValueObjectDisplay.h b/lldb/include/lldb/Interpreter/OptionGroupValueObjectDisplay.h
index c09528f9f51..5cce126f89b 100644
--- a/lldb/include/lldb/Interpreter/OptionGroupValueObjectDisplay.h
+++ b/lldb/include/lldb/Interpreter/OptionGroupValueObjectDisplay.h
@@ -59,7 +59,8 @@ public:
ptr_depth != 0 ||
use_synth == false ||
be_raw == true ||
- ignore_cap == true;
+ ignore_cap == true ||
+ run_validator == true;
}
DumpValueObjectOptions
@@ -67,17 +68,19 @@ public:
lldb::Format format = lldb::eFormatDefault,
lldb::TypeSummaryImplSP summary_sp = lldb::TypeSummaryImplSP());
- bool show_types;
+ bool show_types : 1,
+ show_location : 1,
+ flat_output : 1,
+ use_objc : 1,
+ use_synth : 1,
+ be_raw : 1,
+ ignore_cap : 1,
+ run_validator : 1;
+
uint32_t no_summary_depth;
- bool show_location;
- bool flat_output;
- bool use_objc;
uint32_t max_depth;
uint32_t ptr_depth;
lldb::DynamicValueType use_dynamic;
- bool use_synth;
- bool be_raw;
- bool ignore_cap;
};
} // namespace lldb_private
diff --git a/lldb/source/DataFormatters/ValueObjectPrinter.cpp b/lldb/source/DataFormatters/ValueObjectPrinter.cpp
index 65e5e3f4582..3ce5051cc4e 100644
--- a/lldb/source/DataFormatters/ValueObjectPrinter.cpp
+++ b/lldb/source/DataFormatters/ValueObjectPrinter.cpp
@@ -71,6 +71,8 @@ ValueObjectPrinter::PrintValueObject ()
if (ShouldPrintValueObject())
{
+ PrintValidationMarkerIfNeeded();
+
PrintLocationIfNeeded();
m_stream->Indent();
@@ -89,6 +91,8 @@ ValueObjectPrinter::PrintValueObject ()
else
m_stream->EOL();
+ PrintValidationErrorIfNeeded();
+
return true;
}
@@ -624,3 +628,44 @@ ValueObjectPrinter::PrintChildrenIfNeeded (bool value_printed,
else
m_stream->EOL();
}
+
+bool
+ValueObjectPrinter::ShouldPrintValidation ()
+{
+ return options.m_run_validator;
+}
+
+bool
+ValueObjectPrinter::PrintValidationMarkerIfNeeded ()
+{
+ if (!ShouldPrintValidation())
+ return false;
+
+ m_validation = m_valobj->GetValidationStatus();
+
+ if (TypeValidatorResult::Failure == m_validation.first)
+ {
+ m_stream->Printf("! ");
+ return true;
+ }
+
+ return false;
+}
+
+bool
+ValueObjectPrinter::PrintValidationErrorIfNeeded ()
+{
+ if (!ShouldPrintValidation())
+ return false;
+
+ if (TypeValidatorResult::Success == m_validation.first)
+ return false;
+
+ if (m_validation.second.empty())
+ m_validation.second.assign("unknown error");
+
+ m_stream->Printf(" ! validation error: %s", m_validation.second.c_str());
+ m_stream->EOL();
+
+ return true;
+}
diff --git a/lldb/source/Interpreter/OptionGroupValueObjectDisplay.cpp b/lldb/source/Interpreter/OptionGroupValueObjectDisplay.cpp
index 125e5fb0a5d..6571e98bad8 100644
--- a/lldb/source/Interpreter/OptionGroupValueObjectDisplay.cpp
+++ b/lldb/source/Interpreter/OptionGroupValueObjectDisplay.cpp
@@ -45,6 +45,7 @@ g_option_table[] =
{ LLDB_OPT_SET_1, false, "no-summary-depth", 'Y', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeCount, "Set the depth at which omitting summary information stops (default is 1)."},
{ LLDB_OPT_SET_1, false, "raw-output", 'R', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Don't use formatting options."},
{ LLDB_OPT_SET_1, false, "show-all-children", 'A', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Ignore the upper bound on the number of children to show."},
+ { LLDB_OPT_SET_1, false, "validate", 'V', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeBoolean, "Show results of type validators."},
{ 0, false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr }
};
@@ -115,6 +116,13 @@ OptionGroupValueObjectDisplay::SetOptionValue (CommandInterpreter &interpreter,
if (!success)
error.SetErrorStringWithFormat("invalid synthetic-type '%s'", option_arg);
break;
+
+ case 'V':
+ run_validator = Args::StringToBoolean(option_arg, true, &success);
+ if (!success)
+ error.SetErrorStringWithFormat("invalid validate '%s'", option_arg);
+ break;
+
default:
error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
break;
@@ -137,6 +145,7 @@ OptionGroupValueObjectDisplay::OptionParsingStarting (CommandInterpreter &interp
use_synth = true;
be_raw = false;
ignore_cap = false;
+ run_validator = false;
Target *target = interpreter.GetExecutionContext().GetTargetPtr();
if (target != nullptr)
@@ -177,6 +186,8 @@ OptionGroupValueObjectDisplay::GetAsDumpOptions (LanguageRuntimeDescriptionDispl
if (be_raw)
options.SetRawDisplay(true);
+
+ options.SetRunValidator(run_validator);
return options;
}
OpenPOWER on IntegriCloud