//===-- 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" #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(this)->GetCurrentValue(); case OptionValue::eTypeSInt64: return static_cast(this)->GetCurrentValue(); case OptionValue::eTypeUInt64: return static_cast(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(this); return nullptr; } const OptionValueBoolean *OptionValue::GetAsBoolean() const { if (GetType() == OptionValue::eTypeBoolean) return static_cast(this); return nullptr; } const OptionValueChar *OptionValue::GetAsChar() const { if (GetType() == OptionValue::eTypeChar) return static_cast(this); return nullptr; } OptionValueChar *OptionValue::GetAsChar() { if (GetType() == OptionValue::eTypeChar) return static_cast(this); return nullptr; } OptionValueFileSpec *OptionValue::GetAsFileSpec() { if (GetType() == OptionValue::eTypeFileSpec) return static_cast(this); return nullptr; } const OptionValueFileSpec *OptionValue::GetAsFileSpec() const { if (GetType() == OptionValue::eTypeFileSpec) return static_cast(this); return nullptr; } OptionValueFileSpecList *OptionValue::GetAsFileSpecList() { if (GetType() == OptionValue::eTypeFileSpecList) return static_cast(this); return nullptr; } const OptionValueFileSpecList *OptionValue::GetAsFileSpecList() const { if (GetType() == OptionValue::eTypeFileSpecList) return static_cast(this); return nullptr; } OptionValueArch *OptionValue::GetAsArch() { if (GetType() == OptionValue::eTypeArch) return static_cast(this); return nullptr; } const OptionValueArch *OptionValue::GetAsArch() const { if (GetType() == OptionValue::eTypeArch) return static_cast(this); return nullptr; } OptionValueArray *OptionValue::GetAsArray() { if (GetType() == OptionValue::eTypeArray) return static_cast(this); return nullptr; } const OptionValueArray *OptionValue::GetAsArray() const { if (GetType() == OptionValue::eTypeArray) return static_cast(this); return nullptr; } OptionValueArgs *OptionValue::GetAsArgs() { if (GetType() == OptionValue::eTypeArgs) return static_cast(this); return nullptr; } const OptionValueArgs *OptionValue::GetAsArgs() const { if (GetType() == OptionValue::eTypeArgs) return static_cast(this); return nullptr; } OptionValueDictionary *OptionValue::GetAsDictionary() { if (GetType() == OptionValue::eTypeDictionary) return static_cast(this); return nullptr; } const OptionValueDictionary *OptionValue::GetAsDictionary() const { if (GetType() == OptionValue::eTypeDictionary) return static_cast(this); return nullptr; } OptionValueEnumeration *OptionValue::GetAsEnumeration() { if (GetType() == OptionValue::eTypeEnum) return static_cast(this); return nullptr; } const OptionValueEnumeration *OptionValue::GetAsEnumeration() const { if (GetType() == OptionValue::eTypeEnum) return static_cast(this); return nullptr; } OptionValueFormat *OptionValue::GetAsFormat() { if (GetType() == OptionValue::eTypeFormat) return static_cast(this); return nullptr; } const OptionValueFormat *OptionValue::GetAsFormat() const { if (GetType() == OptionValue::eTypeFormat) return static_cast(this); return nullptr; } OptionValueLanguage *OptionValue::GetAsLanguage() { if (GetType() == OptionValue::eTypeLanguage) return static_cast(this); return NULL; } const OptionValueLanguage *OptionValue::GetAsLanguage() const { if (GetType() == OptionValue::eTypeLanguage) return static_cast(this); return NULL; } OptionValueFormatEntity *OptionValue::GetAsFormatEntity() { if (GetType() == OptionValue::eTypeFormatEntity) return static_cast(this); return nullptr; } const OptionValueFormatEntity *OptionValue::GetAsFormatEntity() const { if (GetType() == OptionValue::eTypeFormatEntity) return static_cast(this); return nullptr; } OptionValuePathMappings *OptionValue::GetAsPathMappings() { if (GetType() == OptionValue::eTypePathMap) return static_cast(this); return nullptr; } const OptionValuePathMappings *OptionValue::GetAsPathMappings() const { if (GetType() == OptionValue::eTypePathMap) return static_cast(this); return nullptr; } OptionValueProperties *OptionValue::GetAsProperties() { if (GetType() == OptionValue::eTypeProperties) return static_cast(this); return nullptr; } const OptionValueProperties *OptionValue::GetAsProperties() const { if (GetType() == OptionValue::eTypeProperties) return static_cast(this); return nullptr; } OptionValueRegex *OptionValue::GetAsRegex() { if (GetType() == OptionValue::eTypeRegex) return static_cast(this); return nullptr; } const OptionValueRegex *OptionValue::GetAsRegex() const { if (GetType() == OptionValue::eTypeRegex) return static_cast(this); return nullptr; } OptionValueSInt64 *OptionValue::GetAsSInt64() { if (GetType() == OptionValue::eTypeSInt64) return static_cast(this); return nullptr; } const OptionValueSInt64 *OptionValue::GetAsSInt64() const { if (GetType() == OptionValue::eTypeSInt64) return static_cast(this); return nullptr; } OptionValueString *OptionValue::GetAsString() { if (GetType() == OptionValue::eTypeString) return static_cast(this); return nullptr; } const OptionValueString *OptionValue::GetAsString() const { if (GetType() == OptionValue::eTypeString) return static_cast(this); return nullptr; } OptionValueUInt64 *OptionValue::GetAsUInt64() { if (GetType() == OptionValue::eTypeUInt64) return static_cast(this); return nullptr; } const OptionValueUInt64 *OptionValue::GetAsUInt64() const { if (GetType() == OptionValue::eTypeUInt64) return static_cast(this); return nullptr; } OptionValueUUID *OptionValue::GetAsUUID() { if (GetType() == OptionValue::eTypeUUID) return static_cast(this); return nullptr; } const OptionValueUUID *OptionValue::GetAsUUID() const { if (GetType() == OptionValue::eTypeUUID) return static_cast(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; }