diff options
Diffstat (limited to 'source/Interpreter/OptionValueProperties.cpp')
-rw-r--r-- | source/Interpreter/OptionValueProperties.cpp | 1260 |
1 files changed, 563 insertions, 697 deletions
diff --git a/source/Interpreter/OptionValueProperties.cpp b/source/Interpreter/OptionValueProperties.cpp index 7024c3601d9f..9a621bea8355 100644 --- a/source/Interpreter/OptionValueProperties.cpp +++ b/source/Interpreter/OptionValueProperties.cpp @@ -1,4 +1,4 @@ -//===-- OptionValueProperties.cpp ---------------------------------*- C++ -*-===// +//===-- OptionValueProperties.cpp --------------------------------*- C++-*-===// // // The LLVM Compiler Infrastructure // @@ -24,89 +24,67 @@ using namespace lldb; using namespace lldb_private; - -OptionValueProperties::OptionValueProperties (const ConstString &name) : - OptionValue (), - m_name (name), - m_properties (), - m_name_to_index () -{ -} - -OptionValueProperties::OptionValueProperties (const OptionValueProperties &global_properties) : - OptionValue (global_properties), - std::enable_shared_from_this<OptionValueProperties> (), - m_name (global_properties.m_name), - m_properties (global_properties.m_properties), - m_name_to_index (global_properties.m_name_to_index) -{ - // We now have an exact copy of "global_properties". We need to now - // find all non-global settings and copy the property values so that - // all non-global settings get new OptionValue instances created for - // them. - const size_t num_properties = m_properties.size(); - for (size_t i=0; i<num_properties; ++i) - { - // Duplicate any values that are not global when constructing properties from - // a global copy - if (m_properties[i].IsGlobal() == false) - { - lldb::OptionValueSP new_value_sp (m_properties[i].GetValue()->DeepCopy()); - m_properties[i].SetOptionValue(new_value_sp); - } +OptionValueProperties::OptionValueProperties(const ConstString &name) + : OptionValue(), m_name(name), m_properties(), m_name_to_index() {} + +OptionValueProperties::OptionValueProperties( + const OptionValueProperties &global_properties) + : OptionValue(global_properties), + std::enable_shared_from_this<OptionValueProperties>(), + m_name(global_properties.m_name), + m_properties(global_properties.m_properties), + m_name_to_index(global_properties.m_name_to_index) { + // We now have an exact copy of "global_properties". We need to now + // find all non-global settings and copy the property values so that + // all non-global settings get new OptionValue instances created for + // them. + const size_t num_properties = m_properties.size(); + for (size_t i = 0; i < num_properties; ++i) { + // Duplicate any values that are not global when constructing properties + // from + // a global copy + if (m_properties[i].IsGlobal() == false) { + lldb::OptionValueSP new_value_sp(m_properties[i].GetValue()->DeepCopy()); + m_properties[i].SetOptionValue(new_value_sp); } + } } - - -size_t -OptionValueProperties::GetNumProperties() const -{ - return m_properties.size(); +size_t OptionValueProperties::GetNumProperties() const { + return m_properties.size(); } - -void -OptionValueProperties::Initialize (const PropertyDefinition *defs) -{ - for (size_t i=0; defs[i].name; ++i) - { - Property property(defs[i]); - assert(property.IsValid()); - m_name_to_index.Append(property.GetName().GetCString(),m_properties.size()); - property.GetValue()->SetParent(shared_from_this()); - m_properties.push_back(property); - } - m_name_to_index.Sort(); +void OptionValueProperties::Initialize(const PropertyDefinition *defs) { + for (size_t i = 0; defs[i].name; ++i) { + Property property(defs[i]); + assert(property.IsValid()); + m_name_to_index.Append(property.GetName(), m_properties.size()); + property.GetValue()->SetParent(shared_from_this()); + m_properties.push_back(property); + } + m_name_to_index.Sort(); } -void -OptionValueProperties::SetValueChangedCallback (uint32_t property_idx, - OptionValueChangedCallback callback, - void *baton) -{ - Property *property = ProtectedGetPropertyAtIndex (property_idx); - if (property) - property->SetValueChangedCallback (callback, baton); +void OptionValueProperties::SetValueChangedCallback( + uint32_t property_idx, OptionValueChangedCallback callback, void *baton) { + Property *property = ProtectedGetPropertyAtIndex(property_idx); + if (property) + property->SetValueChangedCallback(callback, baton); } -void -OptionValueProperties::AppendProperty(const ConstString &name, - const ConstString &desc, - bool is_global, - const OptionValueSP &value_sp) -{ - Property property(name, desc, is_global, value_sp); - m_name_to_index.Append(name.GetCString(),m_properties.size()); - m_properties.push_back(property); - value_sp->SetParent (shared_from_this()); - m_name_to_index.Sort(); +void OptionValueProperties::AppendProperty(const ConstString &name, + const ConstString &desc, + bool is_global, + const OptionValueSP &value_sp) { + Property property(name, desc, is_global, value_sp); + m_name_to_index.Append(name.GetStringRef(), m_properties.size()); + m_properties.push_back(property); + value_sp->SetParent(shared_from_this()); + m_name_to_index.Sort(); } - - -//bool -//OptionValueProperties::GetQualifiedName (Stream &strm) +// bool +// OptionValueProperties::GetQualifiedName (Stream &strm) //{ // bool dumped_something = false; //// lldb::OptionValuePropertiesSP parent_sp(GetParent ()); @@ -125,686 +103,574 @@ OptionValueProperties::AppendProperty(const ConstString &name, //} // lldb::OptionValueSP -OptionValueProperties::GetValueForKey (const ExecutionContext *exe_ctx, - const ConstString &key, - bool will_modify) const -{ - lldb::OptionValueSP value_sp; - size_t idx = m_name_to_index.Find (key.GetCString(), SIZE_MAX); - if (idx < m_properties.size()) - value_sp = GetPropertyAtIndex(exe_ctx, will_modify, idx)->GetValue(); - return value_sp; +OptionValueProperties::GetValueForKey(const ExecutionContext *exe_ctx, + const ConstString &key, + bool will_modify) const { + lldb::OptionValueSP value_sp; + size_t idx = m_name_to_index.Find(key.GetStringRef(), SIZE_MAX); + if (idx < m_properties.size()) + value_sp = GetPropertyAtIndex(exe_ctx, will_modify, idx)->GetValue(); + return value_sp; } lldb::OptionValueSP -OptionValueProperties::GetSubValue (const ExecutionContext *exe_ctx, - const char *name, - bool will_modify, - Error &error) const -{ - lldb::OptionValueSP value_sp; - - if (name && name[0]) - { - const char *sub_name = nullptr; - ConstString key; - size_t key_len = ::strcspn (name, ".[{"); - - if (name[key_len]) - { - key.SetCStringWithLength (name, key_len); - sub_name = name + key_len; - } - else - key.SetCString (name); - - value_sp = GetValueForKey (exe_ctx, key, will_modify); - if (sub_name && value_sp) - { - switch (sub_name[0]) - { - case '.': - { - lldb::OptionValueSP return_val_sp; - return_val_sp = value_sp->GetSubValue (exe_ctx, sub_name + 1, will_modify, error); - if (!return_val_sp) - { - if (Properties::IsSettingExperimental(sub_name + 1)) - { - size_t experimental_len = strlen(Properties::GetExperimentalSettingsName()); - if (*(sub_name + experimental_len + 1) == '.') - return_val_sp = value_sp->GetSubValue(exe_ctx, sub_name + experimental_len + 2, will_modify, error); - // It isn't an error if an experimental setting is not present. - if (!return_val_sp) - error.Clear(); - } - } - return return_val_sp; - } - case '{': - // Predicate matching for predicates like - // "<setting-name>{<predicate>}" - // strings are parsed by the current OptionValueProperties subclass - // to mean whatever they want to. For instance a subclass of - // OptionValueProperties for a lldb_private::Target might implement: - // "target.run-args{arch==i386}" -- only set run args if the arch is i386 - // "target.run-args{path=/tmp/a/b/c/a.out}" -- only set run args if the path matches - // "target.run-args{basename==test&&arch==x86_64}" -- only set run args if executable basename is "test" and arch is "x86_64" - if (sub_name[1]) - { - const char *predicate_start = sub_name + 1; - const char *predicate_end = strchr(predicate_start, '}'); - if (predicate_end) - { - std::string predicate(predicate_start, predicate_end); - if (PredicateMatches(exe_ctx, predicate.c_str())) - { - if (predicate_end[1]) - { - // Still more subvalue string to evaluate - return value_sp->GetSubValue (exe_ctx, predicate_end + 1, will_modify, error); - } - else - { - // We have a match! - break; - } - } - } - } - // Predicate didn't match or wasn't correctly formed - value_sp.reset(); - break; - - case '[': - // Array or dictionary access for subvalues like: - // "[12]" -- access 12th array element - // "['hello']" -- dictionary access of key named hello - return value_sp->GetSubValue (exe_ctx, sub_name, will_modify, error); - - default: - value_sp.reset(); - break; - } - } - } +OptionValueProperties::GetSubValue(const ExecutionContext *exe_ctx, + llvm::StringRef name, bool will_modify, + Error &error) const { + lldb::OptionValueSP value_sp; + if (name.empty()) + return OptionValueSP(); + + llvm::StringRef sub_name; + ConstString key; + size_t key_len = name.find_first_of(".[{"); + if (key_len != llvm::StringRef::npos) { + key.SetString(name.take_front(key_len)); + sub_name = name.drop_front(key_len); + } else + key.SetString(name); + + value_sp = GetValueForKey(exe_ctx, key, will_modify); + if (sub_name.empty() || !value_sp) return value_sp; -} -Error -OptionValueProperties::SetSubValue (const ExecutionContext *exe_ctx, - VarSetOperationType op, - const char *name, - const char *value) -{ - Error error; - const bool will_modify = true; - lldb::OptionValueSP value_sp (GetSubValue (exe_ctx, name, will_modify, error)); - if (value_sp) - error = value_sp->SetValueFromString(value ? llvm::StringRef(value) : llvm::StringRef(), op); - else - { - if (error.AsCString() == nullptr) - error.SetErrorStringWithFormat("invalid value path '%s'", name); + switch (sub_name[0]) { + case '.': { + lldb::OptionValueSP return_val_sp; + return_val_sp = + value_sp->GetSubValue(exe_ctx, sub_name.drop_front(), will_modify, error); + if (!return_val_sp) { + if (Properties::IsSettingExperimental(sub_name.drop_front())) { + size_t experimental_len = + strlen(Properties::GetExperimentalSettingsName()); + if (sub_name[experimental_len + 1] == '.') + return_val_sp = value_sp->GetSubValue( + exe_ctx, sub_name.drop_front(experimental_len + 2), will_modify, error); + // It isn't an error if an experimental setting is not present. + if (!return_val_sp) + error.Clear(); + } } - return error; -} - - -ConstString -OptionValueProperties::GetPropertyNameAtIndex (uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex(nullptr, false, idx); - if (property) - return property->GetName(); - return ConstString(); - -} - -const char * -OptionValueProperties::GetPropertyDescriptionAtIndex (uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex(nullptr, false, idx); - if (property) - return property->GetDescription(); - return nullptr; + return return_val_sp; + } + case '{': + // Predicate matching for predicates like + // "<setting-name>{<predicate>}" + // strings are parsed by the current OptionValueProperties subclass + // to mean whatever they want to. For instance a subclass of + // OptionValueProperties for a lldb_private::Target might implement: + // "target.run-args{arch==i386}" -- only set run args if the arch is + // i386 + // "target.run-args{path=/tmp/a/b/c/a.out}" -- only set run args if the + // path matches + // "target.run-args{basename==test&&arch==x86_64}" -- only set run args + // if executable basename is "test" and arch is "x86_64" + if (sub_name[1]) { + llvm::StringRef predicate_start = sub_name.drop_front(); + size_t pos = predicate_start.find_first_of('}'); + if (pos != llvm::StringRef::npos) { + auto predicate = predicate_start.take_front(pos); + auto rest = predicate_start.drop_front(pos); + if (PredicateMatches(exe_ctx, predicate)) { + if (!rest.empty()) { + // Still more subvalue string to evaluate + return value_sp->GetSubValue(exe_ctx, rest, + will_modify, error); + } else { + // We have a match! + break; + } + } + } + } + // Predicate didn't match or wasn't correctly formed + value_sp.reset(); + break; + + case '[': + // Array or dictionary access for subvalues like: + // "[12]" -- access 12th array element + // "['hello']" -- dictionary access of key named hello + return value_sp->GetSubValue(exe_ctx, sub_name, will_modify, error); + + default: + value_sp.reset(); + break; + } + return value_sp; +} + +Error OptionValueProperties::SetSubValue(const ExecutionContext *exe_ctx, + VarSetOperationType op, + llvm::StringRef name, llvm::StringRef value) { + Error error; + const bool will_modify = true; + lldb::OptionValueSP value_sp(GetSubValue(exe_ctx, name, will_modify, error)); + if (value_sp) + error = value_sp->SetValueFromString(value, op); + else { + if (error.AsCString() == nullptr) + error.SetErrorStringWithFormat("invalid value path '%s'", name.str().c_str()); + } + return error; } uint32_t -OptionValueProperties::GetPropertyIndex (const ConstString &name) const -{ - return m_name_to_index.Find (name.GetCString(), SIZE_MAX); +OptionValueProperties::GetPropertyIndex(const ConstString &name) const { + return m_name_to_index.Find(name.GetStringRef(), SIZE_MAX); } const Property * -OptionValueProperties::GetProperty (const ExecutionContext *exe_ctx, bool will_modify, const ConstString &name) const -{ - return GetPropertyAtIndex (exe_ctx, will_modify, m_name_to_index.Find (name.GetCString(), SIZE_MAX)); +OptionValueProperties::GetProperty(const ExecutionContext *exe_ctx, + bool will_modify, + const ConstString &name) const { + return GetPropertyAtIndex( + exe_ctx, will_modify, + m_name_to_index.Find(name.GetStringRef(), SIZE_MAX)); } -const Property * -OptionValueProperties::GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const -{ - return ProtectedGetPropertyAtIndex (idx); +const Property *OptionValueProperties::GetPropertyAtIndex( + const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const { + return ProtectedGetPropertyAtIndex(idx); } -lldb::OptionValueSP -OptionValueProperties::GetPropertyValueAtIndex (const ExecutionContext *exe_ctx, - bool will_modify, - uint32_t idx) const -{ - const Property *setting = GetPropertyAtIndex (exe_ctx, will_modify, idx); - if (setting) - return setting->GetValue(); - return OptionValueSP(); +lldb::OptionValueSP OptionValueProperties::GetPropertyValueAtIndex( + const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const { + const Property *setting = GetPropertyAtIndex(exe_ctx, will_modify, idx); + if (setting) + return setting->GetValue(); + return OptionValueSP(); } OptionValuePathMappings * -OptionValueProperties::GetPropertyAtIndexAsOptionValuePathMappings (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const -{ - OptionValueSP value_sp(GetPropertyValueAtIndex (exe_ctx, will_modify, idx)); - if (value_sp) - return value_sp->GetAsPathMappings(); - return nullptr; +OptionValueProperties::GetPropertyAtIndexAsOptionValuePathMappings( + const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const { + OptionValueSP value_sp(GetPropertyValueAtIndex(exe_ctx, will_modify, idx)); + if (value_sp) + return value_sp->GetAsPathMappings(); + return nullptr; } OptionValueFileSpecList * -OptionValueProperties::GetPropertyAtIndexAsOptionValueFileSpecList (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const -{ - OptionValueSP value_sp(GetPropertyValueAtIndex (exe_ctx, will_modify, idx)); - if (value_sp) - return value_sp->GetAsFileSpecList(); - return nullptr; +OptionValueProperties::GetPropertyAtIndexAsOptionValueFileSpecList( + const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const { + OptionValueSP value_sp(GetPropertyValueAtIndex(exe_ctx, will_modify, idx)); + if (value_sp) + return value_sp->GetAsFileSpecList(); + return nullptr; } -OptionValueArch * -OptionValueProperties::GetPropertyAtIndexAsOptionValueArch (const ExecutionContext *exe_ctx, uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - return property->GetValue()->GetAsArch(); - return nullptr; +OptionValueArch *OptionValueProperties::GetPropertyAtIndexAsOptionValueArch( + const ExecutionContext *exe_ctx, uint32_t idx) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) + return property->GetValue()->GetAsArch(); + return nullptr; } OptionValueLanguage * -OptionValueProperties::GetPropertyAtIndexAsOptionValueLanguage (const ExecutionContext *exe_ctx, uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - return property->GetValue()->GetAsLanguage(); - return nullptr; -} - -bool -OptionValueProperties::GetPropertyAtIndexAsArgs (const ExecutionContext *exe_ctx, uint32_t idx, Args &args) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - { - const OptionValueArray *array = value->GetAsArray(); - if (array) - return array->GetArgs(args); - else - { - const OptionValueDictionary *dict = value->GetAsDictionary(); - if (dict) - return dict->GetArgs(args); - } - } +OptionValueProperties::GetPropertyAtIndexAsOptionValueLanguage( + const ExecutionContext *exe_ctx, uint32_t idx) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) + return property->GetValue()->GetAsLanguage(); + return nullptr; +} + +bool OptionValueProperties::GetPropertyAtIndexAsArgs( + const ExecutionContext *exe_ctx, uint32_t idx, Args &args) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) { + const OptionValueArray *array = value->GetAsArray(); + if (array) + return array->GetArgs(args); + else { + const OptionValueDictionary *dict = value->GetAsDictionary(); + if (dict) + return dict->GetArgs(args); + } } - return false; -} - -bool -OptionValueProperties::SetPropertyAtIndexFromArgs (const ExecutionContext *exe_ctx, uint32_t idx, const Args &args) -{ - const Property *property = GetPropertyAtIndex (exe_ctx, true, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - { - OptionValueArray *array = value->GetAsArray(); - if (array) - return array->SetArgs(args, eVarSetOperationAssign).Success(); - else - { - OptionValueDictionary *dict = value->GetAsDictionary(); - if (dict) - return dict->SetArgs(args, eVarSetOperationAssign).Success(); - } - } - } - return false; -} - -bool -OptionValueProperties::GetPropertyAtIndexAsBoolean (const ExecutionContext *exe_ctx, uint32_t idx, bool fail_value) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetBooleanValue(fail_value); + } + return false; +} + +bool OptionValueProperties::SetPropertyAtIndexFromArgs( + const ExecutionContext *exe_ctx, uint32_t idx, const Args &args) { + const Property *property = GetPropertyAtIndex(exe_ctx, true, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) { + OptionValueArray *array = value->GetAsArray(); + if (array) + return array->SetArgs(args, eVarSetOperationAssign).Success(); + else { + OptionValueDictionary *dict = value->GetAsDictionary(); + if (dict) + return dict->SetArgs(args, eVarSetOperationAssign).Success(); + } } - return fail_value; -} - -bool -OptionValueProperties::SetPropertyAtIndexAsBoolean (const ExecutionContext *exe_ctx, uint32_t idx, bool new_value) -{ - const Property *property = GetPropertyAtIndex (exe_ctx, true, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - { - value->SetBooleanValue(new_value); - return true; - } + } + return false; +} + +bool OptionValueProperties::GetPropertyAtIndexAsBoolean( + const ExecutionContext *exe_ctx, uint32_t idx, bool fail_value) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetBooleanValue(fail_value); + } + return fail_value; +} + +bool OptionValueProperties::SetPropertyAtIndexAsBoolean( + const ExecutionContext *exe_ctx, uint32_t idx, bool new_value) { + const Property *property = GetPropertyAtIndex(exe_ctx, true, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) { + value->SetBooleanValue(new_value); + return true; } - return false; + } + return false; } OptionValueDictionary * -OptionValueProperties::GetPropertyAtIndexAsOptionValueDictionary (const ExecutionContext *exe_ctx, uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - return property->GetValue()->GetAsDictionary(); - return nullptr; -} - -int64_t -OptionValueProperties::GetPropertyAtIndexAsEnumeration (const ExecutionContext *exe_ctx, uint32_t idx, int64_t fail_value) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetEnumerationValue(fail_value); - } - return fail_value; -} - -bool -OptionValueProperties::SetPropertyAtIndexAsEnumeration (const ExecutionContext *exe_ctx, uint32_t idx, int64_t new_value) -{ - const Property *property = GetPropertyAtIndex (exe_ctx, true, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->SetEnumerationValue(new_value); - } - return false; +OptionValueProperties::GetPropertyAtIndexAsOptionValueDictionary( + const ExecutionContext *exe_ctx, uint32_t idx) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) + return property->GetValue()->GetAsDictionary(); + return nullptr; +} + +int64_t OptionValueProperties::GetPropertyAtIndexAsEnumeration( + const ExecutionContext *exe_ctx, uint32_t idx, int64_t fail_value) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetEnumerationValue(fail_value); + } + return fail_value; +} + +bool OptionValueProperties::SetPropertyAtIndexAsEnumeration( + const ExecutionContext *exe_ctx, uint32_t idx, int64_t new_value) { + const Property *property = GetPropertyAtIndex(exe_ctx, true, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->SetEnumerationValue(new_value); + } + return false; } const FormatEntity::Entry * -OptionValueProperties::GetPropertyAtIndexAsFormatEntity (const ExecutionContext *exe_ctx, uint32_t idx) -{ - const Property *property = GetPropertyAtIndex (exe_ctx, true, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetFormatEntity(); - } - return nullptr; +OptionValueProperties::GetPropertyAtIndexAsFormatEntity( + const ExecutionContext *exe_ctx, uint32_t idx) { + const Property *property = GetPropertyAtIndex(exe_ctx, true, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetFormatEntity(); + } + return nullptr; } OptionValueFileSpec * -OptionValueProperties::GetPropertyAtIndexAsOptionValueFileSpec (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetAsFileSpec(); - } - return nullptr; -} - - -FileSpec -OptionValueProperties::GetPropertyAtIndexAsFileSpec (const ExecutionContext *exe_ctx, uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetFileSpecValue(); - } - return FileSpec(); -} - - -bool -OptionValueProperties::SetPropertyAtIndexAsFileSpec (const ExecutionContext *exe_ctx, uint32_t idx, const FileSpec &new_file_spec) -{ - const Property *property = GetPropertyAtIndex (exe_ctx, true, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->SetFileSpecValue(new_file_spec); - } - return false; +OptionValueProperties::GetPropertyAtIndexAsOptionValueFileSpec( + const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetAsFileSpec(); + } + return nullptr; +} + +FileSpec OptionValueProperties::GetPropertyAtIndexAsFileSpec( + const ExecutionContext *exe_ctx, uint32_t idx) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetFileSpecValue(); + } + return FileSpec(); +} + +bool OptionValueProperties::SetPropertyAtIndexAsFileSpec( + const ExecutionContext *exe_ctx, uint32_t idx, + const FileSpec &new_file_spec) { + const Property *property = GetPropertyAtIndex(exe_ctx, true, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->SetFileSpecValue(new_file_spec); + } + return false; } const RegularExpression * -OptionValueProperties::GetPropertyAtIndexAsOptionValueRegex (const ExecutionContext *exe_ctx, uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetRegexValue(); - } - return nullptr; -} - -OptionValueSInt64 * -OptionValueProperties::GetPropertyAtIndexAsOptionValueSInt64 (const ExecutionContext *exe_ctx, uint32_t idx) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetAsSInt64(); +OptionValueProperties::GetPropertyAtIndexAsOptionValueRegex( + const ExecutionContext *exe_ctx, uint32_t idx) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetRegexValue(); + } + return nullptr; +} + +OptionValueSInt64 *OptionValueProperties::GetPropertyAtIndexAsOptionValueSInt64( + const ExecutionContext *exe_ctx, uint32_t idx) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetAsSInt64(); + } + return nullptr; +} + +int64_t OptionValueProperties::GetPropertyAtIndexAsSInt64( + const ExecutionContext *exe_ctx, uint32_t idx, int64_t fail_value) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetSInt64Value(fail_value); + } + return fail_value; +} + +bool OptionValueProperties::SetPropertyAtIndexAsSInt64( + const ExecutionContext *exe_ctx, uint32_t idx, int64_t new_value) { + const Property *property = GetPropertyAtIndex(exe_ctx, true, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->SetSInt64Value(new_value); + } + return false; +} + +llvm::StringRef OptionValueProperties::GetPropertyAtIndexAsString( + const ExecutionContext *exe_ctx, uint32_t idx, + llvm::StringRef fail_value) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetStringValue(fail_value); + } + return fail_value; +} + +bool OptionValueProperties::SetPropertyAtIndexAsString( + const ExecutionContext *exe_ctx, uint32_t idx, llvm::StringRef new_value) { + const Property *property = GetPropertyAtIndex(exe_ctx, true, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->SetStringValue(new_value); + } + return false; +} + +OptionValueString *OptionValueProperties::GetPropertyAtIndexAsOptionValueString( + const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const { + OptionValueSP value_sp(GetPropertyValueAtIndex(exe_ctx, will_modify, idx)); + if (value_sp) + return value_sp->GetAsString(); + return nullptr; +} + +uint64_t OptionValueProperties::GetPropertyAtIndexAsUInt64( + const ExecutionContext *exe_ctx, uint32_t idx, uint64_t fail_value) const { + const Property *property = GetPropertyAtIndex(exe_ctx, false, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->GetUInt64Value(fail_value); + } + return fail_value; +} + +bool OptionValueProperties::SetPropertyAtIndexAsUInt64( + const ExecutionContext *exe_ctx, uint32_t idx, uint64_t new_value) { + const Property *property = GetPropertyAtIndex(exe_ctx, true, idx); + if (property) { + OptionValue *value = property->GetValue().get(); + if (value) + return value->SetUInt64Value(new_value); + } + return false; +} + +bool OptionValueProperties::Clear() { + const size_t num_properties = m_properties.size(); + for (size_t i = 0; i < num_properties; ++i) + m_properties[i].GetValue()->Clear(); + return true; +} + +Error OptionValueProperties::SetValueFromString(llvm::StringRef value, + VarSetOperationType op) { + Error error; + + // Args args(value_cstr); + // const size_t argc = args.GetArgumentCount(); + switch (op) { + case eVarSetOperationClear: + Clear(); + break; + + case eVarSetOperationReplace: + case eVarSetOperationAssign: + case eVarSetOperationRemove: + case eVarSetOperationInsertBefore: + case eVarSetOperationInsertAfter: + case eVarSetOperationAppend: + case eVarSetOperationInvalid: + error = OptionValue::SetValueFromString(value, op); + break; + } + + return error; +} + +void OptionValueProperties::DumpValue(const ExecutionContext *exe_ctx, + Stream &strm, uint32_t dump_mask) { + const size_t num_properties = m_properties.size(); + for (size_t i = 0; i < num_properties; ++i) { + const Property *property = GetPropertyAtIndex(exe_ctx, false, i); + if (property) { + OptionValue *option_value = property->GetValue().get(); + assert(option_value); + const bool transparent_value = option_value->ValueIsTransparent(); + property->Dump(exe_ctx, strm, dump_mask); + if (!transparent_value) + strm.EOL(); } - return nullptr; -} - -int64_t -OptionValueProperties::GetPropertyAtIndexAsSInt64 (const ExecutionContext *exe_ctx, uint32_t idx, int64_t fail_value) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetSInt64Value(fail_value); + } +} + +Error OptionValueProperties::DumpPropertyValue(const ExecutionContext *exe_ctx, + Stream &strm, + llvm::StringRef property_path, + uint32_t dump_mask) { + Error error; + const bool will_modify = false; + lldb::OptionValueSP value_sp( + GetSubValue(exe_ctx, property_path, will_modify, error)); + if (value_sp) { + if (!value_sp->ValueIsTransparent()) { + if (dump_mask & eDumpOptionName) + strm.PutCString(property_path); + if (dump_mask & ~eDumpOptionName) + strm.PutChar(' '); } - return fail_value; + value_sp->DumpValue(exe_ctx, strm, dump_mask); + } + return error; } -bool -OptionValueProperties::SetPropertyAtIndexAsSInt64 (const ExecutionContext *exe_ctx, uint32_t idx, int64_t new_value) -{ - const Property *property = GetPropertyAtIndex (exe_ctx, true, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->SetSInt64Value(new_value); - } - return false; +lldb::OptionValueSP OptionValueProperties::DeepCopy() const { + assert(!"this shouldn't happen"); + return lldb::OptionValueSP(); } -const char * -OptionValueProperties::GetPropertyAtIndexAsString (const ExecutionContext *exe_ctx, uint32_t idx, const char *fail_value) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetStringValue(fail_value); - } - return fail_value; -} - -bool -OptionValueProperties::SetPropertyAtIndexAsString (const ExecutionContext *exe_ctx, uint32_t idx, const char *new_value) -{ - const Property *property = GetPropertyAtIndex (exe_ctx, true, idx); - if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->SetStringValue(new_value); - } - return false; -} - -OptionValueString * -OptionValueProperties::GetPropertyAtIndexAsOptionValueString (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const -{ - OptionValueSP value_sp(GetPropertyValueAtIndex (exe_ctx, will_modify, idx)); - if (value_sp) - return value_sp->GetAsString(); +const Property *OptionValueProperties::GetPropertyAtPath( + const ExecutionContext *exe_ctx, bool will_modify, llvm::StringRef name) const { + const Property *property = nullptr; + if (name.empty()) return nullptr; -} - + llvm::StringRef sub_name; + ConstString key; + size_t key_len = name.find_first_of(".[{"); + + if (key_len != llvm::StringRef::npos) { + key.SetString(name.take_front(key_len)); + sub_name = name.drop_front(key_len); + } else + key.SetString(name); + + property = GetProperty(exe_ctx, will_modify, key); + if (sub_name.empty() || !property) + return property; -uint64_t -OptionValueProperties::GetPropertyAtIndexAsUInt64 (const ExecutionContext *exe_ctx, uint32_t idx, uint64_t fail_value) const -{ - const Property *property = GetPropertyAtIndex (exe_ctx, false, idx); + if (sub_name[0] == '.') { + OptionValueProperties *sub_properties = + property->GetValue()->GetAsProperties(); + if (sub_properties) + return sub_properties->GetPropertyAtPath(exe_ctx, will_modify, + sub_name.drop_front()); + } + return nullptr; +} + +void OptionValueProperties::DumpAllDescriptions(CommandInterpreter &interpreter, + Stream &strm) const { + size_t max_name_len = 0; + const size_t num_properties = m_properties.size(); + for (size_t i = 0; i < num_properties; ++i) { + const Property *property = ProtectedGetPropertyAtIndex(i); if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->GetUInt64Value(fail_value); - } - return fail_value; -} - -bool -OptionValueProperties::SetPropertyAtIndexAsUInt64 (const ExecutionContext *exe_ctx, uint32_t idx, uint64_t new_value) -{ - const Property *property = GetPropertyAtIndex (exe_ctx, true, idx); + max_name_len = std::max<size_t>(property->GetName().size(), max_name_len); + } + for (size_t i = 0; i < num_properties; ++i) { + const Property *property = ProtectedGetPropertyAtIndex(i); if (property) - { - OptionValue *value = property->GetValue().get(); - if (value) - return value->SetUInt64Value(new_value); - } - return false; -} - -bool -OptionValueProperties::Clear () -{ - const size_t num_properties = m_properties.size(); - for (size_t i=0; i<num_properties; ++i) - m_properties[i].GetValue()->Clear(); - return true; -} - - -Error -OptionValueProperties::SetValueFromString (llvm::StringRef value, VarSetOperationType op) -{ - Error error; - -// Args args(value_cstr); -// const size_t argc = args.GetArgumentCount(); - switch (op) - { - case eVarSetOperationClear: - Clear (); - break; - - case eVarSetOperationReplace: - case eVarSetOperationAssign: - case eVarSetOperationRemove: - case eVarSetOperationInsertBefore: - case eVarSetOperationInsertAfter: - case eVarSetOperationAppend: - case eVarSetOperationInvalid: - error = OptionValue::SetValueFromString (value, op); - break; - } - - return error; -} - -void -OptionValueProperties::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) -{ - const size_t num_properties = m_properties.size(); - for (size_t i=0; i<num_properties; ++i) - { - const Property *property = GetPropertyAtIndex(exe_ctx, false, i); - if (property) - { - OptionValue *option_value = property->GetValue().get(); - assert (option_value); - const bool transparent_value = option_value->ValueIsTransparent (); - property->Dump (exe_ctx, - strm, - dump_mask); - if (!transparent_value) - strm.EOL(); + property->DumpDescription(interpreter, strm, max_name_len, false); + } +} + +void OptionValueProperties::Apropos( + llvm::StringRef keyword, + std::vector<const Property *> &matching_properties) const { + const size_t num_properties = m_properties.size(); + StreamString strm; + for (size_t i = 0; i < num_properties; ++i) { + const Property *property = ProtectedGetPropertyAtIndex(i); + if (property) { + const OptionValueProperties *properties = + property->GetValue()->GetAsProperties(); + if (properties) { + properties->Apropos(keyword, matching_properties); + } else { + bool match = false; + llvm::StringRef name = property->GetName(); + if (name.contains_lower(keyword)) + match = true; + else { + llvm::StringRef desc = property->GetDescription(); + if (desc.contains_lower(keyword)) + match = true; } - } -} - -Error -OptionValueProperties::DumpPropertyValue (const ExecutionContext *exe_ctx, - Stream &strm, - const char *property_path, - uint32_t dump_mask) -{ - Error error; - const bool will_modify = false; - lldb::OptionValueSP value_sp (GetSubValue (exe_ctx, property_path, will_modify, error)); - if (value_sp) - { - if (!value_sp->ValueIsTransparent ()) - { - if (dump_mask & eDumpOptionName) - strm.PutCString (property_path); - if (dump_mask & ~eDumpOptionName) - strm.PutChar (' '); - } - value_sp->DumpValue (exe_ctx, strm, dump_mask); - } - return error; -} - -lldb::OptionValueSP -OptionValueProperties::DeepCopy () const -{ - assert(!"this shouldn't happen"); - return lldb::OptionValueSP(); -} - -const Property * -OptionValueProperties::GetPropertyAtPath (const ExecutionContext *exe_ctx, - bool will_modify, - const char *name) const -{ - const Property *property = nullptr; - if (name && name[0]) - { - const char *sub_name = nullptr; - ConstString key; - size_t key_len = ::strcspn (name, ".[{"); - - if (name[key_len]) - { - key.SetCStringWithLength (name, key_len); - sub_name = name + key_len; - } - else - key.SetCString (name); - - property = GetProperty (exe_ctx, will_modify, key); - if (sub_name && property) - { - if (sub_name[0] == '.') - { - OptionValueProperties *sub_properties = property->GetValue()->GetAsProperties(); - if (sub_properties) - return sub_properties->GetPropertyAtPath(exe_ctx, will_modify, sub_name + 1); - } - property = nullptr; - } - } - return property; -} - -void -OptionValueProperties::DumpAllDescriptions (CommandInterpreter &interpreter, - Stream &strm) const -{ - size_t max_name_len = 0; - const size_t num_properties = m_properties.size(); - for (size_t i=0; i<num_properties; ++i) - { - const Property *property = ProtectedGetPropertyAtIndex(i); - if (property) - max_name_len = std::max<size_t>(property->GetName().GetLength(), max_name_len); - } - for (size_t i=0; i<num_properties; ++i) - { - const Property *property = ProtectedGetPropertyAtIndex(i); - if (property) - property->DumpDescription (interpreter, strm, max_name_len, false); - } -} - -void -OptionValueProperties::Apropos (const char *keyword, std::vector<const Property *> &matching_properties) const -{ - const size_t num_properties = m_properties.size(); - StreamString strm; - for (size_t i=0; i<num_properties; ++i) - { - const Property *property = ProtectedGetPropertyAtIndex(i); - if (property) - { - const OptionValueProperties *properties = property->GetValue()->GetAsProperties(); - if (properties) - { - properties->Apropos (keyword, matching_properties); - } - else - { - bool match = false; - const char *name = property->GetName().GetCString(); - if (name && ::strcasestr(name, keyword)) - match = true; - else - { - const char *desc = property->GetDescription(); - if (desc && ::strcasestr(desc, keyword)) - match = true; - } - if (match) - { - matching_properties.push_back (property); - } - } + if (match) { + matching_properties.push_back(property); } + } } + } } lldb::OptionValuePropertiesSP -OptionValueProperties::GetSubProperty (const ExecutionContext *exe_ctx, - const ConstString &name) -{ - lldb::OptionValueSP option_value_sp(GetValueForKey(exe_ctx, name, false)); - if (option_value_sp) - { - OptionValueProperties *ov_properties = option_value_sp->GetAsProperties (); - if (ov_properties) - return ov_properties->shared_from_this(); - } - return lldb::OptionValuePropertiesSP(); +OptionValueProperties::GetSubProperty(const ExecutionContext *exe_ctx, + const ConstString &name) { + lldb::OptionValueSP option_value_sp(GetValueForKey(exe_ctx, name, false)); + if (option_value_sp) { + OptionValueProperties *ov_properties = option_value_sp->GetAsProperties(); + if (ov_properties) + return ov_properties->shared_from_this(); + } + return lldb::OptionValuePropertiesSP(); } - - - |