Home | History | Annotate | Download | only in Interpreter
      1 //===-- Property.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/lldb-python.h"
     11 
     12 #include "lldb/Interpreter/Property.h"
     13 
     14 // C Includes
     15 // C++ Includes
     16 // Other libraries and framework includes
     17 // Project includes
     18 #include "lldb/Core/UserSettingsController.h"
     19 #include "lldb/Interpreter/Args.h"
     20 #include "lldb/Interpreter/CommandInterpreter.h"
     21 #include "lldb/Interpreter/OptionValues.h"
     22 
     23 using namespace lldb;
     24 using namespace lldb_private;
     25 
     26 Property::Property (const PropertyDefinition &definition) :
     27     m_name (definition.name),
     28     m_description (definition.description),
     29     m_value_sp (),
     30     m_is_global (definition.global)
     31 {
     32     switch (definition.type)
     33     {
     34         case OptionValue::eTypeInvalid:
     35         case OptionValue::eTypeProperties:
     36             break;
     37         case OptionValue::eTypeArch:
     38             // "definition.default_uint_value" is not used
     39             // "definition.default_cstr_value" as a string value that represents the default string value for the architecture/triple
     40             m_value_sp.reset (new OptionValueArch(definition.default_cstr_value));
     41             break;
     42 
     43         case OptionValue::eTypeArgs:
     44             // "definition.default_uint_value" is always a OptionValue::Type
     45             m_value_sp.reset (new OptionValueArgs());
     46             break;
     47 
     48         case OptionValue::eTypeArray:
     49             // "definition.default_uint_value" is always a OptionValue::Type
     50             m_value_sp.reset (new OptionValueArray(OptionValue::ConvertTypeToMask((OptionValue::Type)definition.default_uint_value)));
     51             break;
     52 
     53         case OptionValue::eTypeBoolean:
     54             // "definition.default_uint_value" is the default boolean value if
     55             // "definition.default_cstr_value" is NULL, otherwise interpret
     56             // "definition.default_cstr_value" as a string value that represents the default
     57             // value.
     58             if (definition.default_cstr_value)
     59                 m_value_sp.reset (new OptionValueBoolean(Args::StringToBoolean (definition.default_cstr_value, false, NULL)));
     60             else
     61                 m_value_sp.reset (new OptionValueBoolean(definition.default_uint_value != 0));
     62             break;
     63 
     64         case OptionValue::eTypeDictionary:
     65             // "definition.default_uint_value" is always a OptionValue::Type
     66             m_value_sp.reset (new OptionValueDictionary(OptionValue::ConvertTypeToMask((OptionValue::Type)definition.default_uint_value)));
     67             break;
     68 
     69         case OptionValue::eTypeEnum:
     70             // "definition.default_uint_value" is the default enumeration value if
     71             // "definition.default_cstr_value" is NULL, otherwise interpret
     72             // "definition.default_cstr_value" as a string value that represents the default
     73             // value.
     74         {
     75             OptionValueEnumeration *enum_value = new OptionValueEnumeration(definition.enum_values, definition.default_uint_value);
     76             m_value_sp.reset (enum_value);
     77             if (definition.default_cstr_value)
     78             {
     79                 if (enum_value->SetValueFromCString(definition.default_cstr_value).Success())
     80                 {
     81                     enum_value->SetDefaultValue(enum_value->GetCurrentValue());
     82                     // Call Clear() since we don't want the value to appear as
     83                     // having been set since we called SetValueFromCString() above.
     84                     // Clear will set the current value to the default and clear
     85                     // the boolean that says that the value has been set.
     86                     enum_value->Clear();
     87                 }
     88             }
     89         }
     90             break;
     91 
     92         case OptionValue::eTypeFileSpec:
     93             // "definition.default_uint_value" represents if the "definition.default_cstr_value" should
     94             // be resolved or not
     95             m_value_sp.reset (new OptionValueFileSpec(FileSpec(definition.default_cstr_value, definition.default_uint_value != 0)));
     96             break;
     97 
     98         case OptionValue::eTypeFileSpecList:
     99             // "definition.default_uint_value" is not used for a OptionValue::eTypeFileSpecList
    100             m_value_sp.reset (new OptionValueFileSpecList());
    101             break;
    102 
    103         case OptionValue::eTypeFormat:
    104             // "definition.default_uint_value" is the default format enumeration value if
    105             // "definition.default_cstr_value" is NULL, otherwise interpret
    106             // "definition.default_cstr_value" as a string value that represents the default
    107             // value.
    108         {
    109             Format new_format = eFormatInvalid;
    110             if (definition.default_cstr_value)
    111                 Args::StringToFormat (definition.default_cstr_value, new_format, NULL);
    112             else
    113                 new_format = (Format)definition.default_uint_value;
    114             m_value_sp.reset (new OptionValueFormat(new_format));
    115         }
    116             break;
    117 
    118         case OptionValue::eTypePathMap:
    119             // "definition.default_uint_value" tells us if notifications should occur for
    120             // path mappings
    121             m_value_sp.reset (new OptionValuePathMappings(definition.default_uint_value != 0));
    122             break;
    123 
    124         case OptionValue::eTypeRegex:
    125             // "definition.default_uint_value" is used to the regular expression flags
    126             // "definition.default_cstr_value" the default regular expression value
    127             // value.
    128             m_value_sp.reset (new OptionValueRegex(definition.default_cstr_value, definition.default_uint_value));
    129             break;
    130 
    131         case OptionValue::eTypeSInt64:
    132             // "definition.default_uint_value" is the default integer value if
    133             // "definition.default_cstr_value" is NULL, otherwise interpret
    134             // "definition.default_cstr_value" as a string value that represents the default
    135             // value.
    136             m_value_sp.reset (new OptionValueSInt64(definition.default_cstr_value ? Args::StringToSInt64 (definition.default_cstr_value) : definition.default_uint_value));
    137             break;
    138 
    139         case OptionValue::eTypeUInt64:
    140             // "definition.default_uint_value" is the default unsigned integer value if
    141             // "definition.default_cstr_value" is NULL, otherwise interpret
    142             // "definition.default_cstr_value" as a string value that represents the default
    143             // value.
    144             m_value_sp.reset (new OptionValueUInt64(definition.default_cstr_value ? Args::StringToUInt64 (definition.default_cstr_value) : definition.default_uint_value));
    145             break;
    146 
    147         case OptionValue::eTypeUUID:
    148             // "definition.default_uint_value" is not used for a OptionValue::eTypeUUID
    149             // "definition.default_cstr_value" can contain a default UUID value
    150         {
    151             UUID uuid;
    152             if (definition.default_cstr_value)
    153                 uuid.SetFromCString (definition.default_cstr_value);
    154             m_value_sp.reset (new OptionValueUUID(uuid));
    155         }
    156             break;
    157 
    158         case OptionValue::eTypeString:
    159             // "definition.default_uint_value" can contain the string option flags OR'ed together
    160             // "definition.default_cstr_value" can contain a default string value
    161             {
    162                 OptionValueString *string_value = new OptionValueString(definition.default_cstr_value);
    163                 if (definition.default_uint_value != 0)
    164                     string_value->GetOptions().Reset(definition.default_uint_value);
    165                 m_value_sp.reset (string_value);
    166             }
    167             break;
    168     }
    169 }
    170 
    171 Property::Property (const ConstString &name,
    172                     const ConstString &desc,
    173                     bool is_global,
    174                     const lldb::OptionValueSP &value_sp) :
    175     m_name (name),
    176     m_description (desc),
    177     m_value_sp (value_sp),
    178     m_is_global (is_global)
    179 {
    180 }
    181 
    182 bool
    183 Property::DumpQualifiedName(Stream &strm) const
    184 {
    185     if (m_name)
    186     {
    187         if (m_value_sp->DumpQualifiedName(strm))
    188             strm.PutChar('.');
    189         strm << m_name;
    190         return true;
    191     }
    192     return false;
    193 }
    194 
    195 
    196 void
    197 Property::Dump (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) const
    198 {
    199     if (m_value_sp)
    200     {
    201         const bool dump_desc = dump_mask & OptionValue::eDumpOptionDescription;
    202         const bool transparent = m_value_sp->ValueIsTransparent ();
    203         if (dump_desc || !transparent)
    204         {
    205             if ((dump_mask & OptionValue::eDumpOptionName) && m_name)
    206             {
    207                 DumpQualifiedName(strm);
    208                 if (dump_mask & ~OptionValue::eDumpOptionName)
    209                     strm.PutChar(' ');
    210             }
    211         }
    212         if (dump_desc)
    213         {
    214             const char *desc = GetDescription();
    215             if (desc)
    216                 strm.Printf ("-- %s", desc);
    217 
    218             if (transparent && (dump_mask == (OptionValue::eDumpOptionName | OptionValue::eDumpOptionDescription)))
    219                 strm.EOL();
    220         }
    221         m_value_sp->DumpValue(exe_ctx, strm, dump_mask);
    222     }
    223 }
    224 
    225 
    226 void
    227 Property::DumpDescription (CommandInterpreter &interpreter,
    228                            Stream &strm,
    229                            uint32_t output_width,
    230                            bool display_qualified_name) const
    231 {
    232     if (m_value_sp)
    233     {
    234         const char *desc = GetDescription();
    235 
    236         if (desc)
    237         {
    238             StreamString qualified_name;
    239             const OptionValueProperties *sub_properties = m_value_sp->GetAsProperties();
    240             if (sub_properties)
    241             {
    242                 strm.EOL();
    243 
    244                 if (m_value_sp->DumpQualifiedName(qualified_name))
    245                     strm.Printf("'%s' variables:\n\n", qualified_name.GetString().c_str());
    246                 sub_properties->DumpAllDescriptions(interpreter, strm);
    247             }
    248             else
    249             {
    250                 if (desc)
    251                 {
    252                     if (display_qualified_name)
    253                     {
    254                         StreamString qualified_name;
    255                         DumpQualifiedName(qualified_name);
    256                         interpreter.OutputFormattedHelpText (strm,
    257                                                              qualified_name.GetString().c_str(),
    258                                                              "--",
    259                                                              desc,
    260                                                              output_width);
    261                     }
    262                     else
    263                     {
    264                         interpreter.OutputFormattedHelpText (strm,
    265                                                              m_name.GetCString(),
    266                                                              "--",
    267                                                              desc,
    268                                                              output_width);
    269                     }
    270                 }
    271             }
    272         }
    273     }
    274 }
    275 
    276