class OptionValueString : public OptionValue
{
public:
+
+ typedef Error (*ValidatorCallback) (const char* string,
+ void* baton);
+
enum Options
{
eOptionEncodeCharacterEscapeSequences = (1u << 0)
OptionValue(),
m_current_value (),
m_default_value (),
- m_options()
+ m_options(),
+ m_validator(),
+ m_validator_baton()
+ {
+ }
+
+ OptionValueString (ValidatorCallback validator,
+ void* baton = NULL) :
+ OptionValue(),
+ m_current_value (),
+ m_default_value (),
+ m_options(),
+ m_validator(validator),
+ m_validator_baton(baton)
{
}
OptionValue(),
m_current_value (),
m_default_value (),
- m_options()
+ m_options(),
+ m_validator(),
+ m_validator_baton()
{
if (value && value[0])
{
OptionValue(),
m_current_value (),
m_default_value (),
- m_options()
+ m_options(),
+ m_validator(),
+ m_validator_baton()
{
if (current_value && current_value[0])
m_current_value.assign (current_value);
m_default_value.assign (default_value);
}
- virtual
+ OptionValueString (const char *value,
+ ValidatorCallback validator,
+ void* baton = NULL) :
+ OptionValue(),
+ m_current_value (),
+ m_default_value (),
+ m_options(),
+ m_validator(validator),
+ m_validator_baton(baton)
+ {
+ if (value && value[0])
+ {
+ m_current_value.assign (value);
+ m_default_value.assign (value);
+ }
+ }
+
+ OptionValueString (const char *current_value,
+ const char *default_value,
+ ValidatorCallback validator,
+ void* baton = NULL) :
+ OptionValue(),
+ m_current_value (),
+ m_default_value (),
+ m_options(),
+ m_validator(validator),
+ m_validator_baton(baton)
+ {
+ if (current_value && current_value[0])
+ m_current_value.assign (current_value);
+ if (default_value && default_value[0])
+ m_default_value.assign (default_value);
+ }
+
+ virtual
~OptionValueString()
{
}
const char *
operator = (const char *value)
{
- if (value && value[0])
- m_current_value.assign (value);
- else
- m_current_value.clear();
+ SetCurrentValue(value);
return m_current_value.c_str();
}
return m_default_value.c_str();
}
- void
- SetCurrentValue (const char *value)
- {
- if (value && value[0])
- m_current_value.assign (value);
- else
- m_current_value.clear();
- }
-
- void
- AppendToCurrentValue (const char *value)
- {
- if (value && value[0])
- m_current_value.append (value);
- }
+ Error
+ SetCurrentValue (const char *value);
+
+ Error
+ AppendToCurrentValue (const char *value);
void
SetDefaultValue (const char *value)
std::string m_current_value;
std::string m_default_value;
Flags m_options;
+ ValidatorCallback m_validator;
+ void* m_validator_baton;
};
} // namespace lldb_private
// C++ Includes
// Other libraries and framework includes
// Project includes
+#include "lldb/Core/DataVisualization.h"
+#include "lldb/Core/Error.h"
#include "lldb/Target/Target.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Utility/Utils.h"
OptionGroupVariable::OptionGroupVariable (bool show_frame_options) :
OptionGroup(),
- include_frame_options (show_frame_options)
+ include_frame_options (show_frame_options),
+ summary([] (const char* str,void*)->Error
+ {
+ if (!str || !str[0])
+ return Error("must specify a valid named summary");
+ TypeSummaryImplSP summary_sp;
+ if (DataVisualization::NamedSummaryFormats::GetSummaryFormat(ConstString(str), summary_sp) == false)
+ return Error("must specify a valid named summary");
+ return Error();
+ }),
+ summary_string([] (const char* str, void*)->Error
+ {
+ if (!str || !str[0])
+ return Error("must specify a non-empty summary string");
+ return Error();
+ })
{
}
show_scope = true;
break;
case 'y':
- summary.SetCurrentValue(option_arg);
+ error = summary.SetCurrentValue(option_arg);
break;
case 'z':
- summary_string.SetCurrentValue(option_arg);
+ error = summary_string.SetCurrentValue(option_arg);
break;
default:
error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option);
case eVarSetOperationInsertBefore:
case eVarSetOperationInsertAfter:
case eVarSetOperationRemove:
+ if (m_validator)
+ {
+ error = m_validator(value_cstr,m_validator_baton);
+ if (error.Fail())
+ return error;
+ }
error = OptionValue::SetValueFromCString (value_cstr, op);
break;
case eVarSetOperationAppend:
+ {
+ std::string new_value(m_current_value);
if (value_cstr && value_cstr[0])
{
if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
{
std::string str;
Args::EncodeEscapeSequences (value_cstr, str);
- m_current_value += str;
+ new_value.append(str);
}
else
- m_current_value += value_cstr;
+ new_value.append(value_cstr);
+ }
+ if (m_validator)
+ {
+ error = m_validator(new_value.c_str(),m_validator_baton);
+ if (error.Fail())
+ return error;
+ }
+ m_current_value.assign(new_value);
}
break;
case eVarSetOperationReplace:
case eVarSetOperationAssign:
+ if (m_validator)
+ {
+ error = m_validator(value_cstr,m_validator_baton);
+ if (error.Fail())
+ return error;
+ }
m_value_was_set = true;
if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
{
{
return OptionValueSP(new OptionValueString(*this));
}
+
+Error
+OptionValueString::SetCurrentValue (const char *value)
+{
+ if (m_validator)
+ {
+ Error error(m_validator(value,m_validator_baton));
+ if (error.Fail())
+ return error;
+ }
+ if (value && value[0])
+ m_current_value.assign (value);
+ else
+ m_current_value.clear();
+ return Error();
+}
+
+Error
+OptionValueString::AppendToCurrentValue (const char *value)
+{
+ if (value && value[0])
+ {
+ if (m_validator)
+ {
+ std::string new_value(m_current_value);
+ new_value.append(value);
+ Error error(m_validator(value,m_validator_baton));
+ if (error.Fail())
+ return error;
+ m_current_value.assign(new_value);
+ }
+ else
+ m_current_value.append (value);
+ }
+ return Error();
+}
substrs = ['Second: x=65',
'y=0x'])
- self.expect("frame variable second --summary NoSuchSummary",
- substrs = ['Second: x=65',
- 'y=0x'])
+ # <rdar://problem/11576143> decided that invalid summaries will raise an error
+ # instead of just defaulting to the base summary
+ self.expect("frame variable second --summary NoSuchSummary",error=True,
+ substrs = ['must specify a valid named summary'])
self.runCmd("thread step-over")