| //===-- OptionValue.cpp -----------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "lldb/Interpreter/OptionValue.h" |
| |
| // C Includes |
| // C++ Includes |
| // Other libraries and framework includes |
| // Project includes |
| #include "lldb/Interpreter/OptionValues.h" |
| #include "lldb/Utility/StringList.h" |
| |
| using namespace lldb; |
| using namespace lldb_private; |
| |
| //------------------------------------------------------------------------- |
| // Get this value as a uint64_t value if it is encoded as a boolean, uint64_t |
| // or int64_t. Other types will cause "fail_value" to be returned |
| //------------------------------------------------------------------------- |
| uint64_t OptionValue::GetUInt64Value(uint64_t fail_value, bool *success_ptr) { |
| if (success_ptr) |
| *success_ptr = true; |
| switch (GetType()) { |
| case OptionValue::eTypeBoolean: |
| return static_cast<OptionValueBoolean *>(this)->GetCurrentValue(); |
| case OptionValue::eTypeSInt64: |
| return static_cast<OptionValueSInt64 *>(this)->GetCurrentValue(); |
| case OptionValue::eTypeUInt64: |
| return static_cast<OptionValueUInt64 *>(this)->GetCurrentValue(); |
| default: |
| break; |
| } |
| if (success_ptr) |
| *success_ptr = false; |
| return fail_value; |
| } |
| |
| Status OptionValue::SetSubValue(const ExecutionContext *exe_ctx, |
| VarSetOperationType op, llvm::StringRef name, |
| llvm::StringRef value) { |
| Status error; |
| error.SetErrorStringWithFormat("SetSubValue is not supported"); |
| return error; |
| } |
| |
| OptionValueBoolean *OptionValue::GetAsBoolean() { |
| if (GetType() == OptionValue::eTypeBoolean) |
| return static_cast<OptionValueBoolean *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueBoolean *OptionValue::GetAsBoolean() const { |
| if (GetType() == OptionValue::eTypeBoolean) |
| return static_cast<const OptionValueBoolean *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueChar *OptionValue::GetAsChar() const { |
| if (GetType() == OptionValue::eTypeChar) |
| return static_cast<const OptionValueChar *>(this); |
| return nullptr; |
| } |
| |
| OptionValueChar *OptionValue::GetAsChar() { |
| if (GetType() == OptionValue::eTypeChar) |
| return static_cast<OptionValueChar *>(this); |
| return nullptr; |
| } |
| |
| OptionValueFileSpec *OptionValue::GetAsFileSpec() { |
| if (GetType() == OptionValue::eTypeFileSpec) |
| return static_cast<OptionValueFileSpec *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueFileSpec *OptionValue::GetAsFileSpec() const { |
| if (GetType() == OptionValue::eTypeFileSpec) |
| return static_cast<const OptionValueFileSpec *>(this); |
| return nullptr; |
| } |
| |
| OptionValueFileSpecList *OptionValue::GetAsFileSpecList() { |
| if (GetType() == OptionValue::eTypeFileSpecList) |
| return static_cast<OptionValueFileSpecList *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueFileSpecList *OptionValue::GetAsFileSpecList() const { |
| if (GetType() == OptionValue::eTypeFileSpecList) |
| return static_cast<const OptionValueFileSpecList *>(this); |
| return nullptr; |
| } |
| |
| OptionValueArch *OptionValue::GetAsArch() { |
| if (GetType() == OptionValue::eTypeArch) |
| return static_cast<OptionValueArch *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueArch *OptionValue::GetAsArch() const { |
| if (GetType() == OptionValue::eTypeArch) |
| return static_cast<const OptionValueArch *>(this); |
| return nullptr; |
| } |
| |
| OptionValueArray *OptionValue::GetAsArray() { |
| if (GetType() == OptionValue::eTypeArray) |
| return static_cast<OptionValueArray *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueArray *OptionValue::GetAsArray() const { |
| if (GetType() == OptionValue::eTypeArray) |
| return static_cast<const OptionValueArray *>(this); |
| return nullptr; |
| } |
| |
| OptionValueArgs *OptionValue::GetAsArgs() { |
| if (GetType() == OptionValue::eTypeArgs) |
| return static_cast<OptionValueArgs *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueArgs *OptionValue::GetAsArgs() const { |
| if (GetType() == OptionValue::eTypeArgs) |
| return static_cast<const OptionValueArgs *>(this); |
| return nullptr; |
| } |
| |
| OptionValueDictionary *OptionValue::GetAsDictionary() { |
| if (GetType() == OptionValue::eTypeDictionary) |
| return static_cast<OptionValueDictionary *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueDictionary *OptionValue::GetAsDictionary() const { |
| if (GetType() == OptionValue::eTypeDictionary) |
| return static_cast<const OptionValueDictionary *>(this); |
| return nullptr; |
| } |
| |
| OptionValueEnumeration *OptionValue::GetAsEnumeration() { |
| if (GetType() == OptionValue::eTypeEnum) |
| return static_cast<OptionValueEnumeration *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueEnumeration *OptionValue::GetAsEnumeration() const { |
| if (GetType() == OptionValue::eTypeEnum) |
| return static_cast<const OptionValueEnumeration *>(this); |
| return nullptr; |
| } |
| |
| OptionValueFormat *OptionValue::GetAsFormat() { |
| if (GetType() == OptionValue::eTypeFormat) |
| return static_cast<OptionValueFormat *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueFormat *OptionValue::GetAsFormat() const { |
| if (GetType() == OptionValue::eTypeFormat) |
| return static_cast<const OptionValueFormat *>(this); |
| return nullptr; |
| } |
| |
| OptionValueLanguage *OptionValue::GetAsLanguage() { |
| if (GetType() == OptionValue::eTypeLanguage) |
| return static_cast<OptionValueLanguage *>(this); |
| return NULL; |
| } |
| |
| const OptionValueLanguage *OptionValue::GetAsLanguage() const { |
| if (GetType() == OptionValue::eTypeLanguage) |
| return static_cast<const OptionValueLanguage *>(this); |
| return NULL; |
| } |
| |
| OptionValueFormatEntity *OptionValue::GetAsFormatEntity() { |
| if (GetType() == OptionValue::eTypeFormatEntity) |
| return static_cast<OptionValueFormatEntity *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueFormatEntity *OptionValue::GetAsFormatEntity() const { |
| if (GetType() == OptionValue::eTypeFormatEntity) |
| return static_cast<const OptionValueFormatEntity *>(this); |
| return nullptr; |
| } |
| |
| OptionValuePathMappings *OptionValue::GetAsPathMappings() { |
| if (GetType() == OptionValue::eTypePathMap) |
| return static_cast<OptionValuePathMappings *>(this); |
| return nullptr; |
| } |
| |
| const OptionValuePathMappings *OptionValue::GetAsPathMappings() const { |
| if (GetType() == OptionValue::eTypePathMap) |
| return static_cast<const OptionValuePathMappings *>(this); |
| return nullptr; |
| } |
| |
| OptionValueProperties *OptionValue::GetAsProperties() { |
| if (GetType() == OptionValue::eTypeProperties) |
| return static_cast<OptionValueProperties *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueProperties *OptionValue::GetAsProperties() const { |
| if (GetType() == OptionValue::eTypeProperties) |
| return static_cast<const OptionValueProperties *>(this); |
| return nullptr; |
| } |
| |
| OptionValueRegex *OptionValue::GetAsRegex() { |
| if (GetType() == OptionValue::eTypeRegex) |
| return static_cast<OptionValueRegex *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueRegex *OptionValue::GetAsRegex() const { |
| if (GetType() == OptionValue::eTypeRegex) |
| return static_cast<const OptionValueRegex *>(this); |
| return nullptr; |
| } |
| |
| OptionValueSInt64 *OptionValue::GetAsSInt64() { |
| if (GetType() == OptionValue::eTypeSInt64) |
| return static_cast<OptionValueSInt64 *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueSInt64 *OptionValue::GetAsSInt64() const { |
| if (GetType() == OptionValue::eTypeSInt64) |
| return static_cast<const OptionValueSInt64 *>(this); |
| return nullptr; |
| } |
| |
| OptionValueString *OptionValue::GetAsString() { |
| if (GetType() == OptionValue::eTypeString) |
| return static_cast<OptionValueString *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueString *OptionValue::GetAsString() const { |
| if (GetType() == OptionValue::eTypeString) |
| return static_cast<const OptionValueString *>(this); |
| return nullptr; |
| } |
| |
| OptionValueUInt64 *OptionValue::GetAsUInt64() { |
| if (GetType() == OptionValue::eTypeUInt64) |
| return static_cast<OptionValueUInt64 *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueUInt64 *OptionValue::GetAsUInt64() const { |
| if (GetType() == OptionValue::eTypeUInt64) |
| return static_cast<const OptionValueUInt64 *>(this); |
| return nullptr; |
| } |
| |
| OptionValueUUID *OptionValue::GetAsUUID() { |
| if (GetType() == OptionValue::eTypeUUID) |
| return static_cast<OptionValueUUID *>(this); |
| return nullptr; |
| } |
| |
| const OptionValueUUID *OptionValue::GetAsUUID() const { |
| if (GetType() == OptionValue::eTypeUUID) |
| return static_cast<const OptionValueUUID *>(this); |
| return nullptr; |
| } |
| |
| bool OptionValue::GetBooleanValue(bool fail_value) const { |
| const OptionValueBoolean *option_value = GetAsBoolean(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return fail_value; |
| } |
| |
| bool OptionValue::SetBooleanValue(bool new_value) { |
| OptionValueBoolean *option_value = GetAsBoolean(); |
| if (option_value) { |
| option_value->SetCurrentValue(new_value); |
| return true; |
| } |
| return false; |
| } |
| |
| char OptionValue::GetCharValue(char fail_value) const { |
| const OptionValueChar *option_value = GetAsChar(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return fail_value; |
| } |
| |
| char OptionValue::SetCharValue(char new_value) { |
| OptionValueChar *option_value = GetAsChar(); |
| if (option_value) { |
| option_value->SetCurrentValue(new_value); |
| return true; |
| } |
| return false; |
| } |
| |
| int64_t OptionValue::GetEnumerationValue(int64_t fail_value) const { |
| const OptionValueEnumeration *option_value = GetAsEnumeration(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return fail_value; |
| } |
| |
| bool OptionValue::SetEnumerationValue(int64_t value) { |
| OptionValueEnumeration *option_value = GetAsEnumeration(); |
| if (option_value) { |
| option_value->SetCurrentValue(value); |
| return true; |
| } |
| return false; |
| } |
| |
| FileSpec OptionValue::GetFileSpecValue() const { |
| const OptionValueFileSpec *option_value = GetAsFileSpec(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return FileSpec(); |
| } |
| |
| bool OptionValue::SetFileSpecValue(const FileSpec &file_spec) { |
| OptionValueFileSpec *option_value = GetAsFileSpec(); |
| if (option_value) { |
| option_value->SetCurrentValue(file_spec, false); |
| return true; |
| } |
| return false; |
| } |
| |
| FileSpecList OptionValue::GetFileSpecListValue() const { |
| const OptionValueFileSpecList *option_value = GetAsFileSpecList(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return FileSpecList(); |
| } |
| |
| lldb::Format OptionValue::GetFormatValue(lldb::Format fail_value) const { |
| const OptionValueFormat *option_value = GetAsFormat(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return fail_value; |
| } |
| |
| bool OptionValue::SetFormatValue(lldb::Format new_value) { |
| OptionValueFormat *option_value = GetAsFormat(); |
| if (option_value) { |
| option_value->SetCurrentValue(new_value); |
| return true; |
| } |
| return false; |
| } |
| |
| lldb::LanguageType |
| OptionValue::GetLanguageValue(lldb::LanguageType fail_value) const { |
| const OptionValueLanguage *option_value = GetAsLanguage(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return fail_value; |
| } |
| |
| bool OptionValue::SetLanguageValue(lldb::LanguageType new_language) { |
| OptionValueLanguage *option_value = GetAsLanguage(); |
| if (option_value) { |
| option_value->SetCurrentValue(new_language); |
| return true; |
| } |
| return false; |
| } |
| |
| const FormatEntity::Entry *OptionValue::GetFormatEntity() const { |
| const OptionValueFormatEntity *option_value = GetAsFormatEntity(); |
| if (option_value) |
| return &option_value->GetCurrentValue(); |
| return nullptr; |
| } |
| |
| const RegularExpression *OptionValue::GetRegexValue() const { |
| const OptionValueRegex *option_value = GetAsRegex(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return nullptr; |
| } |
| |
| int64_t OptionValue::GetSInt64Value(int64_t fail_value) const { |
| const OptionValueSInt64 *option_value = GetAsSInt64(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return fail_value; |
| } |
| |
| bool OptionValue::SetSInt64Value(int64_t new_value) { |
| OptionValueSInt64 *option_value = GetAsSInt64(); |
| if (option_value) { |
| option_value->SetCurrentValue(new_value); |
| return true; |
| } |
| return false; |
| } |
| |
| llvm::StringRef OptionValue::GetStringValue(llvm::StringRef fail_value) const { |
| const OptionValueString *option_value = GetAsString(); |
| if (option_value) |
| return option_value->GetCurrentValueAsRef(); |
| return fail_value; |
| } |
| |
| bool OptionValue::SetStringValue(llvm::StringRef new_value) { |
| OptionValueString *option_value = GetAsString(); |
| if (option_value) { |
| option_value->SetCurrentValue(new_value); |
| return true; |
| } |
| return false; |
| } |
| |
| uint64_t OptionValue::GetUInt64Value(uint64_t fail_value) const { |
| const OptionValueUInt64 *option_value = GetAsUInt64(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return fail_value; |
| } |
| |
| bool OptionValue::SetUInt64Value(uint64_t new_value) { |
| OptionValueUInt64 *option_value = GetAsUInt64(); |
| if (option_value) { |
| option_value->SetCurrentValue(new_value); |
| return true; |
| } |
| return false; |
| } |
| |
| UUID OptionValue::GetUUIDValue() const { |
| const OptionValueUUID *option_value = GetAsUUID(); |
| if (option_value) |
| return option_value->GetCurrentValue(); |
| return UUID(); |
| } |
| |
| bool OptionValue::SetUUIDValue(const UUID &uuid) { |
| OptionValueUUID *option_value = GetAsUUID(); |
| if (option_value) { |
| option_value->SetCurrentValue(uuid); |
| return true; |
| } |
| return false; |
| } |
| |
| const char *OptionValue::GetBuiltinTypeAsCString(Type t) { |
| switch (t) { |
| case eTypeInvalid: |
| return "invalid"; |
| case eTypeArch: |
| return "arch"; |
| case eTypeArgs: |
| return "arguments"; |
| case eTypeArray: |
| return "array"; |
| case eTypeBoolean: |
| return "boolean"; |
| case eTypeChar: |
| return "char"; |
| case eTypeDictionary: |
| return "dictionary"; |
| case eTypeEnum: |
| return "enum"; |
| case eTypeFileSpec: |
| return "file"; |
| case eTypeFileSpecList: |
| return "file-list"; |
| case eTypeFormat: |
| return "format"; |
| case eTypeFormatEntity: |
| return "format-string"; |
| case eTypeLanguage: |
| return "language"; |
| case eTypePathMap: |
| return "path-map"; |
| case eTypeProperties: |
| return "properties"; |
| case eTypeRegex: |
| return "regex"; |
| case eTypeSInt64: |
| return "int"; |
| case eTypeString: |
| return "string"; |
| case eTypeUInt64: |
| return "unsigned"; |
| case eTypeUUID: |
| return "uuid"; |
| } |
| return nullptr; |
| } |
| |
| lldb::OptionValueSP OptionValue::CreateValueFromCStringForTypeMask( |
| const char *value_cstr, uint32_t type_mask, Status &error) { |
| // If only 1 bit is set in the type mask for a dictionary or array then we |
| // know how to decode a value from a cstring |
| lldb::OptionValueSP value_sp; |
| switch (type_mask) { |
| case 1u << eTypeArch: |
| value_sp.reset(new OptionValueArch()); |
| break; |
| case 1u << eTypeBoolean: |
| value_sp.reset(new OptionValueBoolean(false)); |
| break; |
| case 1u << eTypeChar: |
| value_sp.reset(new OptionValueChar('\0')); |
| break; |
| case 1u << eTypeFileSpec: |
| value_sp.reset(new OptionValueFileSpec()); |
| break; |
| case 1u << eTypeFormat: |
| value_sp.reset(new OptionValueFormat(eFormatInvalid)); |
| break; |
| case 1u << eTypeFormatEntity: |
| value_sp.reset(new OptionValueFormatEntity(NULL)); |
| break; |
| case 1u << eTypeLanguage: |
| value_sp.reset(new OptionValueLanguage(eLanguageTypeUnknown)); |
| break; |
| case 1u << eTypeSInt64: |
| value_sp.reset(new OptionValueSInt64()); |
| break; |
| case 1u << eTypeString: |
| value_sp.reset(new OptionValueString()); |
| break; |
| case 1u << eTypeUInt64: |
| value_sp.reset(new OptionValueUInt64()); |
| break; |
| case 1u << eTypeUUID: |
| value_sp.reset(new OptionValueUUID()); |
| break; |
| } |
| |
| if (value_sp) |
| error = value_sp->SetValueFromString( |
| llvm::StringRef::withNullAsEmpty(value_cstr), eVarSetOperationAssign); |
| else |
| error.SetErrorString("unsupported type mask"); |
| return value_sp; |
| } |
| |
| bool OptionValue::DumpQualifiedName(Stream &strm) const { |
| bool dumped_something = false; |
| lldb::OptionValueSP m_parent_sp(m_parent_wp.lock()); |
| if (m_parent_sp) { |
| if (m_parent_sp->DumpQualifiedName(strm)) |
| dumped_something = true; |
| } |
| ConstString name(GetName()); |
| if (name) { |
| if (dumped_something) |
| strm.PutChar('.'); |
| else |
| dumped_something = true; |
| strm << name; |
| } |
| return dumped_something; |
| } |
| |
| size_t OptionValue::AutoComplete(CommandInterpreter &interpreter, |
| CompletionRequest &request) { |
| request.SetWordComplete(false); |
| return request.GetNumberOfMatches(); |
| } |
| |
| Status OptionValue::SetValueFromString(llvm::StringRef value, |
| VarSetOperationType op) { |
| Status error; |
| switch (op) { |
| case eVarSetOperationReplace: |
| error.SetErrorStringWithFormat( |
| "%s objects do not support the 'replace' operation", |
| GetTypeAsCString()); |
| break; |
| case eVarSetOperationInsertBefore: |
| error.SetErrorStringWithFormat( |
| "%s objects do not support the 'insert-before' operation", |
| GetTypeAsCString()); |
| break; |
| case eVarSetOperationInsertAfter: |
| error.SetErrorStringWithFormat( |
| "%s objects do not support the 'insert-after' operation", |
| GetTypeAsCString()); |
| break; |
| case eVarSetOperationRemove: |
| error.SetErrorStringWithFormat( |
| "%s objects do not support the 'remove' operation", GetTypeAsCString()); |
| break; |
| case eVarSetOperationAppend: |
| error.SetErrorStringWithFormat( |
| "%s objects do not support the 'append' operation", GetTypeAsCString()); |
| break; |
| case eVarSetOperationClear: |
| error.SetErrorStringWithFormat( |
| "%s objects do not support the 'clear' operation", GetTypeAsCString()); |
| break; |
| case eVarSetOperationAssign: |
| error.SetErrorStringWithFormat( |
| "%s objects do not support the 'assign' operation", GetTypeAsCString()); |
| break; |
| case eVarSetOperationInvalid: |
| error.SetErrorStringWithFormat("invalid operation performed on a %s object", |
| GetTypeAsCString()); |
| break; |
| } |
| return error; |
| } |