diff options
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; } |