Home | History | Annotate | Download | only in Interpreter
      1 //===-- OptionValue.cpp -----------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "lldb/Interpreter/OptionValue.h"
     11 
     12 // C Includes
     13 // C++ Includes
     14 // Other libraries and framework includes
     15 // Project includes
     16 #include "lldb/Core/StringList.h"
     17 #include "lldb/Interpreter/OptionValues.h"
     18 
     19 using namespace lldb;
     20 using namespace lldb_private;
     21 
     22 
     23 //-------------------------------------------------------------------------
     24 // Get this value as a uint64_t value if it is encoded as a boolean,
     25 // uint64_t or int64_t. Other types will cause "fail_value" to be
     26 // returned
     27 //-------------------------------------------------------------------------
     28 uint64_t
     29 OptionValue::GetUInt64Value (uint64_t fail_value, bool *success_ptr)
     30 {
     31     if (success_ptr)
     32         *success_ptr = true;
     33     switch (GetType())
     34     {
     35     case OptionValue::eTypeBoolean: return static_cast<OptionValueBoolean *>(this)->GetCurrentValue();
     36     case OptionValue::eTypeSInt64:  return static_cast<OptionValueSInt64 *>(this)->GetCurrentValue();
     37     case OptionValue::eTypeUInt64:  return static_cast<OptionValueUInt64 *>(this)->GetCurrentValue();
     38     default:
     39         break;
     40     }
     41     if (success_ptr)
     42         *success_ptr = false;
     43     return fail_value;
     44 }
     45 
     46 Error
     47 OptionValue::SetSubValue (const ExecutionContext *exe_ctx,
     48                           VarSetOperationType op,
     49                           const char *name,
     50                           const char *value)
     51 {
     52     Error error;
     53     error.SetErrorStringWithFormat("SetSubValue is not supported");
     54     return error;
     55 }
     56 
     57 
     58 OptionValueBoolean *
     59 OptionValue::GetAsBoolean ()
     60 {
     61     if (GetType () == OptionValue::eTypeBoolean)
     62         return static_cast<OptionValueBoolean *>(this);
     63     return NULL;
     64 }
     65 
     66 const OptionValueBoolean *
     67 OptionValue::GetAsBoolean () const
     68 {
     69     if (GetType () == OptionValue::eTypeBoolean)
     70         return static_cast<const OptionValueBoolean *>(this);
     71     return NULL;
     72 }
     73 
     74 
     75 OptionValueFileSpec *
     76 OptionValue::GetAsFileSpec ()
     77 {
     78     if (GetType () == OptionValue::eTypeFileSpec)
     79         return static_cast<OptionValueFileSpec *>(this);
     80     return NULL;
     81 
     82 }
     83 
     84 const OptionValueFileSpec *
     85 OptionValue::GetAsFileSpec () const
     86 {
     87     if (GetType () == OptionValue::eTypeFileSpec)
     88         return static_cast<const OptionValueFileSpec *>(this);
     89     return NULL;
     90 
     91 }
     92 
     93 OptionValueFileSpecList *
     94 OptionValue::GetAsFileSpecList ()
     95 {
     96     if (GetType () == OptionValue::eTypeFileSpecList)
     97         return static_cast<OptionValueFileSpecList *>(this);
     98     return NULL;
     99 
    100 }
    101 
    102 const OptionValueFileSpecList *
    103 OptionValue::GetAsFileSpecList () const
    104 {
    105     if (GetType () == OptionValue::eTypeFileSpecList)
    106         return static_cast<const OptionValueFileSpecList *>(this);
    107     return NULL;
    108 
    109 }
    110 
    111 OptionValueArch *
    112 OptionValue::GetAsArch ()
    113 {
    114     if (GetType () == OptionValue::eTypeArch)
    115         return static_cast<OptionValueArch *>(this);
    116     return NULL;
    117 }
    118 
    119 
    120 const OptionValueArch *
    121 OptionValue::GetAsArch () const
    122 {
    123     if (GetType () == OptionValue::eTypeArch)
    124         return static_cast<const OptionValueArch *>(this);
    125     return NULL;
    126 }
    127 
    128 OptionValueArray *
    129 OptionValue::GetAsArray ()
    130 {
    131     if (GetType () == OptionValue::eTypeArray)
    132         return static_cast<OptionValueArray *>(this);
    133     return NULL;
    134 }
    135 
    136 
    137 const OptionValueArray *
    138 OptionValue::GetAsArray () const
    139 {
    140     if (GetType () == OptionValue::eTypeArray)
    141         return static_cast<const OptionValueArray *>(this);
    142     return NULL;
    143 }
    144 
    145 OptionValueArgs *
    146 OptionValue::GetAsArgs ()
    147 {
    148     if (GetType () == OptionValue::eTypeArgs)
    149         return static_cast<OptionValueArgs *>(this);
    150     return NULL;
    151 }
    152 
    153 
    154 const OptionValueArgs *
    155 OptionValue::GetAsArgs () const
    156 {
    157     if (GetType () == OptionValue::eTypeArgs)
    158         return static_cast<const OptionValueArgs *>(this);
    159     return NULL;
    160 }
    161 
    162 OptionValueDictionary *
    163 OptionValue::GetAsDictionary ()
    164 {
    165     if (GetType () == OptionValue::eTypeDictionary)
    166         return static_cast<OptionValueDictionary *>(this);
    167     return NULL;
    168 }
    169 
    170 const OptionValueDictionary *
    171 OptionValue::GetAsDictionary () const
    172 {
    173     if (GetType () == OptionValue::eTypeDictionary)
    174         return static_cast<const OptionValueDictionary *>(this);
    175     return NULL;
    176 }
    177 
    178 OptionValueEnumeration *
    179 OptionValue::GetAsEnumeration ()
    180 {
    181     if (GetType () == OptionValue::eTypeEnum)
    182         return static_cast<OptionValueEnumeration *>(this);
    183     return NULL;
    184 }
    185 
    186 const OptionValueEnumeration *
    187 OptionValue::GetAsEnumeration () const
    188 {
    189     if (GetType () == OptionValue::eTypeEnum)
    190         return static_cast<const OptionValueEnumeration *>(this);
    191     return NULL;
    192 }
    193 
    194 OptionValueFormat *
    195 OptionValue::GetAsFormat ()
    196 {
    197     if (GetType () == OptionValue::eTypeFormat)
    198         return static_cast<OptionValueFormat *>(this);
    199     return NULL;
    200 }
    201 
    202 const OptionValueFormat *
    203 OptionValue::GetAsFormat () const
    204 {
    205     if (GetType () == OptionValue::eTypeFormat)
    206         return static_cast<const OptionValueFormat *>(this);
    207     return NULL;
    208 }
    209 
    210 OptionValuePathMappings *
    211 OptionValue::GetAsPathMappings ()
    212 {
    213     if (GetType () == OptionValue::eTypePathMap)
    214         return static_cast<OptionValuePathMappings *>(this);
    215     return NULL;
    216 }
    217 
    218 const OptionValuePathMappings *
    219 OptionValue::GetAsPathMappings () const
    220 {
    221     if (GetType () == OptionValue::eTypePathMap)
    222         return static_cast<const OptionValuePathMappings *>(this);
    223     return NULL;
    224 }
    225 
    226 OptionValueProperties *
    227 OptionValue::GetAsProperties ()
    228 {
    229     if (GetType () == OptionValue::eTypeProperties)
    230         return static_cast<OptionValueProperties *>(this);
    231     return NULL;
    232 }
    233 
    234 const OptionValueProperties *
    235 OptionValue::GetAsProperties () const
    236 {
    237     if (GetType () == OptionValue::eTypeProperties)
    238         return static_cast<const OptionValueProperties *>(this);
    239     return NULL;
    240 }
    241 
    242 OptionValueRegex *
    243 OptionValue::GetAsRegex ()
    244 {
    245     if (GetType () == OptionValue::eTypeRegex)
    246         return static_cast<OptionValueRegex *>(this);
    247     return NULL;
    248 }
    249 
    250 const OptionValueRegex *
    251 OptionValue::GetAsRegex () const
    252 {
    253     if (GetType () == OptionValue::eTypeRegex)
    254         return static_cast<const OptionValueRegex *>(this);
    255     return NULL;
    256 }
    257 
    258 OptionValueSInt64 *
    259 OptionValue::GetAsSInt64 ()
    260 {
    261     if (GetType () == OptionValue::eTypeSInt64)
    262         return static_cast<OptionValueSInt64 *>(this);
    263     return NULL;
    264 }
    265 
    266 const OptionValueSInt64 *
    267 OptionValue::GetAsSInt64 () const
    268 {
    269     if (GetType () == OptionValue::eTypeSInt64)
    270         return static_cast<const OptionValueSInt64 *>(this);
    271     return NULL;
    272 }
    273 
    274 OptionValueString *
    275 OptionValue::GetAsString ()
    276 {
    277     if (GetType () == OptionValue::eTypeString)
    278         return static_cast<OptionValueString *>(this);
    279     return NULL;
    280 }
    281 
    282 const OptionValueString *
    283 OptionValue::GetAsString () const
    284 {
    285     if (GetType () == OptionValue::eTypeString)
    286         return static_cast<const OptionValueString *>(this);
    287     return NULL;
    288 }
    289 
    290 OptionValueUInt64 *
    291 OptionValue::GetAsUInt64 ()
    292 {
    293     if (GetType () == OptionValue::eTypeUInt64)
    294         return static_cast<OptionValueUInt64 *>(this);
    295     return NULL;
    296 }
    297 
    298 const OptionValueUInt64 *
    299 OptionValue::GetAsUInt64 () const
    300 {
    301     if (GetType () == OptionValue::eTypeUInt64)
    302         return static_cast<const OptionValueUInt64 *>(this);
    303     return NULL;
    304 }
    305 
    306 OptionValueUUID *
    307 OptionValue::GetAsUUID ()
    308 {
    309     if (GetType () == OptionValue::eTypeUUID)
    310         return static_cast<OptionValueUUID *>(this);
    311     return NULL;
    312 
    313 }
    314 
    315 const OptionValueUUID *
    316 OptionValue::GetAsUUID () const
    317 {
    318     if (GetType () == OptionValue::eTypeUUID)
    319         return static_cast<const OptionValueUUID *>(this);
    320     return NULL;
    321 
    322 }
    323 
    324 bool
    325 OptionValue::GetBooleanValue (bool fail_value) const
    326 {
    327     const OptionValueBoolean *option_value = GetAsBoolean ();
    328     if (option_value)
    329         return option_value->GetCurrentValue();
    330     return fail_value;
    331 }
    332 
    333 bool
    334 OptionValue::SetBooleanValue (bool new_value)
    335 {
    336     OptionValueBoolean *option_value = GetAsBoolean ();
    337     if (option_value)
    338     {
    339         option_value->SetCurrentValue(new_value);
    340         return true;
    341     }
    342     return false;
    343 }
    344 
    345 int64_t
    346 OptionValue::GetEnumerationValue (int64_t fail_value) const
    347 {
    348     const OptionValueEnumeration *option_value = GetAsEnumeration();
    349     if (option_value)
    350         return option_value->GetCurrentValue();
    351     return fail_value;
    352 }
    353 
    354 bool
    355 OptionValue::SetEnumerationValue (int64_t value)
    356 {
    357     OptionValueEnumeration *option_value = GetAsEnumeration();
    358     if (option_value)
    359     {
    360         option_value->SetCurrentValue(value);
    361         return true;
    362     }
    363     return false;
    364 }
    365 
    366 FileSpec
    367 OptionValue::GetFileSpecValue () const
    368 {
    369     const OptionValueFileSpec *option_value = GetAsFileSpec ();
    370     if (option_value)
    371         return option_value->GetCurrentValue();
    372     return FileSpec();
    373 }
    374 
    375 
    376 bool
    377 OptionValue::SetFileSpecValue (const FileSpec &file_spec)
    378 {
    379     OptionValueFileSpec *option_value = GetAsFileSpec ();
    380     if (option_value)
    381     {
    382         option_value->SetCurrentValue(file_spec, false);
    383         return true;
    384     }
    385     return false;
    386 }
    387 
    388 FileSpecList
    389 OptionValue::GetFileSpecListValue () const
    390 {
    391     const OptionValueFileSpecList *option_value = GetAsFileSpecList ();
    392     if (option_value)
    393         return option_value->GetCurrentValue();
    394     return FileSpecList();
    395 }
    396 
    397 
    398 lldb::Format
    399 OptionValue::GetFormatValue (lldb::Format fail_value) const
    400 {
    401     const OptionValueFormat *option_value = GetAsFormat ();
    402     if (option_value)
    403         return option_value->GetCurrentValue();
    404     return fail_value;
    405 }
    406 
    407 bool
    408 OptionValue::SetFormatValue (lldb::Format new_value)
    409 {
    410     OptionValueFormat *option_value = GetAsFormat ();
    411     if (option_value)
    412     {
    413         option_value->SetCurrentValue(new_value);
    414         return true;
    415     }
    416     return false;
    417 }
    418 
    419 const RegularExpression *
    420 OptionValue::GetRegexValue () const
    421 {
    422     const OptionValueRegex *option_value = GetAsRegex ();
    423     if (option_value)
    424         return option_value->GetCurrentValue();
    425     return NULL;
    426 }
    427 
    428 
    429 int64_t
    430 OptionValue::GetSInt64Value (int64_t fail_value) const
    431 {
    432     const OptionValueSInt64 *option_value = GetAsSInt64 ();
    433     if (option_value)
    434         return option_value->GetCurrentValue();
    435     return fail_value;
    436 }
    437 
    438 bool
    439 OptionValue::SetSInt64Value (int64_t new_value)
    440 {
    441     OptionValueSInt64 *option_value = GetAsSInt64 ();
    442     if (option_value)
    443     {
    444         option_value->SetCurrentValue(new_value);
    445         return true;
    446     }
    447     return false;
    448 }
    449 
    450 const char *
    451 OptionValue::GetStringValue (const char *fail_value) const
    452 {
    453     const OptionValueString *option_value = GetAsString ();
    454     if (option_value)
    455         return option_value->GetCurrentValue();
    456     return fail_value;
    457 }
    458 
    459 bool
    460 OptionValue::SetStringValue (const char *new_value)
    461 {
    462     OptionValueString *option_value = GetAsString ();
    463     if (option_value)
    464     {
    465         option_value->SetCurrentValue(new_value);
    466         return true;
    467     }
    468     return false;
    469 }
    470 
    471 uint64_t
    472 OptionValue::GetUInt64Value (uint64_t fail_value) const
    473 {
    474     const OptionValueUInt64 *option_value = GetAsUInt64 ();
    475     if (option_value)
    476         return option_value->GetCurrentValue();
    477     return fail_value;
    478 }
    479 
    480 bool
    481 OptionValue::SetUInt64Value (uint64_t new_value)
    482 {
    483     OptionValueUInt64 *option_value = GetAsUInt64 ();
    484     if (option_value)
    485     {
    486         option_value->SetCurrentValue(new_value);
    487         return true;
    488     }
    489     return false;
    490 }
    491 
    492 UUID
    493 OptionValue::GetUUIDValue () const
    494 {
    495     const OptionValueUUID *option_value = GetAsUUID();
    496     if (option_value)
    497         return option_value->GetCurrentValue();
    498     return UUID();
    499 }
    500 
    501 bool
    502 OptionValue::SetUUIDValue (const UUID &uuid)
    503 {
    504     OptionValueUUID *option_value = GetAsUUID();
    505     if (option_value)
    506     {
    507         option_value->SetCurrentValue(uuid);
    508         return true;
    509     }
    510     return false;
    511 }
    512 
    513 const char *
    514 OptionValue::GetBuiltinTypeAsCString (Type t)
    515 {
    516     switch (t)
    517     {
    518         case eTypeInvalid:      return "invalid";
    519         case eTypeArch:         return "arch";
    520         case eTypeArgs:         return "arguments";
    521         case eTypeArray:        return "array";
    522         case eTypeBoolean:      return "boolean";
    523         case eTypeDictionary:   return "dictionary";
    524         case eTypeEnum:         return "enum";
    525         case eTypeFileSpec:     return "file";
    526         case eTypeFileSpecList: return "file-list";
    527         case eTypeFormat:       return "format";
    528         case eTypePathMap:      return "path-map";
    529         case eTypeProperties:   return "properties";
    530         case eTypeRegex:        return "regex";
    531         case eTypeSInt64:       return "int";
    532         case eTypeString:       return "string";
    533         case eTypeUInt64:       return "unsigned";
    534         case eTypeUUID:         return "uuid";
    535     }
    536     return NULL;
    537 }
    538 
    539 
    540 lldb::OptionValueSP
    541 OptionValue::CreateValueFromCStringForTypeMask (const char *value_cstr, uint32_t type_mask, Error &error)
    542 {
    543     // If only 1 bit is set in the type mask for a dictionary or array
    544     // then we know how to decode a value from a cstring
    545     lldb::OptionValueSP value_sp;
    546     switch (type_mask)
    547     {
    548     case 1u << eTypeArch:       value_sp.reset(new OptionValueArch()); break;
    549     case 1u << eTypeBoolean:    value_sp.reset(new OptionValueBoolean(false)); break;
    550     case 1u << eTypeFileSpec:   value_sp.reset(new OptionValueFileSpec()); break;
    551     case 1u << eTypeFormat:     value_sp.reset(new OptionValueFormat(eFormatInvalid));    break;
    552     case 1u << eTypeSInt64:     value_sp.reset(new OptionValueSInt64()); break;
    553     case 1u << eTypeString:     value_sp.reset(new OptionValueString()); break;
    554     case 1u << eTypeUInt64:     value_sp.reset(new OptionValueUInt64()); break;
    555     case 1u << eTypeUUID:       value_sp.reset(new OptionValueUUID()); break;
    556     }
    557 
    558     if (value_sp)
    559         error = value_sp->SetValueFromCString (value_cstr, eVarSetOperationAssign);
    560     else
    561         error.SetErrorString("unsupported type mask");
    562     return value_sp;
    563 }
    564 
    565 bool
    566 OptionValue::DumpQualifiedName (Stream &strm) const
    567 {
    568     bool dumped_something = false;
    569     lldb::OptionValueSP m_parent_sp(m_parent_wp.lock());
    570     if (m_parent_sp)
    571     {
    572         if (m_parent_sp->DumpQualifiedName(strm))
    573             dumped_something = true;
    574     }
    575     ConstString name (GetName());
    576     if (name)
    577     {
    578         if (dumped_something)
    579             strm.PutChar('.');
    580         else
    581             dumped_something = true;
    582         strm << name;
    583     }
    584     return dumped_something;
    585 }
    586 
    587 size_t
    588 OptionValue::AutoComplete (CommandInterpreter &interpreter,
    589                            const char *s,
    590                            int match_start_point,
    591                            int max_return_elements,
    592                            bool &word_complete,
    593                            StringList &matches)
    594 {
    595     word_complete = false;
    596     matches.Clear();
    597     return matches.GetSize();
    598 }
    599 
    600 Error
    601 OptionValue::SetValueFromCString (const char *value, VarSetOperationType op)
    602 {
    603     Error error;
    604     switch (op)
    605     {
    606     case eVarSetOperationReplace:
    607         error.SetErrorStringWithFormat ("%s objects do not support the 'replace' operation", GetTypeAsCString());
    608         break;
    609     case eVarSetOperationInsertBefore:
    610         error.SetErrorStringWithFormat ("%s objects do not support the 'insert-before' operation", GetTypeAsCString());
    611         break;
    612     case eVarSetOperationInsertAfter:
    613         error.SetErrorStringWithFormat ("%s objects do not support the 'insert-after' operation", GetTypeAsCString());
    614         break;
    615     case eVarSetOperationRemove:
    616         error.SetErrorStringWithFormat ("%s objects do not support the 'remove' operation", GetTypeAsCString());
    617         break;
    618     case eVarSetOperationAppend:
    619         error.SetErrorStringWithFormat ("%s objects do not support the 'append' operation", GetTypeAsCString());
    620         break;
    621     case eVarSetOperationClear:
    622         error.SetErrorStringWithFormat ("%s objects do not support the 'clear' operation", GetTypeAsCString());
    623         break;
    624     case eVarSetOperationAssign:
    625         error.SetErrorStringWithFormat ("%s objects do not support the 'assign' operation", GetTypeAsCString());
    626         break;
    627     case eVarSetOperationInvalid:
    628         error.SetErrorStringWithFormat ("invalid operation performed on a %s object", GetTypeAsCString());
    629         break;
    630     }
    631     return error;
    632 }
    633 
    634