Property.cpp revision 280031
1254721Semaste//===-- Property.cpp --------------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/lldb-python.h" 11254721Semaste 12254721Semaste#include "lldb/Interpreter/Property.h" 13254721Semaste 14254721Semaste// C Includes 15254721Semaste// C++ Includes 16254721Semaste// Other libraries and framework includes 17254721Semaste// Project includes 18254721Semaste#include "lldb/Core/UserSettingsController.h" 19254721Semaste#include "lldb/Interpreter/Args.h" 20254721Semaste#include "lldb/Interpreter/CommandInterpreter.h" 21254721Semaste#include "lldb/Interpreter/OptionValues.h" 22254721Semaste 23254721Semasteusing namespace lldb; 24254721Semasteusing namespace lldb_private; 25254721Semaste 26254721SemasteProperty::Property (const PropertyDefinition &definition) : 27254721Semaste m_name (definition.name), 28254721Semaste m_description (definition.description), 29254721Semaste m_value_sp (), 30254721Semaste m_is_global (definition.global) 31254721Semaste{ 32254721Semaste switch (definition.type) 33254721Semaste { 34254721Semaste case OptionValue::eTypeInvalid: 35254721Semaste case OptionValue::eTypeProperties: 36254721Semaste break; 37254721Semaste case OptionValue::eTypeArch: 38254721Semaste // "definition.default_uint_value" is not used 39254721Semaste // "definition.default_cstr_value" as a string value that represents the default string value for the architecture/triple 40254721Semaste m_value_sp.reset (new OptionValueArch(definition.default_cstr_value)); 41254721Semaste break; 42254721Semaste 43254721Semaste case OptionValue::eTypeArgs: 44254721Semaste // "definition.default_uint_value" is always a OptionValue::Type 45254721Semaste m_value_sp.reset (new OptionValueArgs()); 46254721Semaste break; 47254721Semaste 48254721Semaste case OptionValue::eTypeArray: 49254721Semaste // "definition.default_uint_value" is always a OptionValue::Type 50254721Semaste m_value_sp.reset (new OptionValueArray(OptionValue::ConvertTypeToMask((OptionValue::Type)definition.default_uint_value))); 51254721Semaste break; 52254721Semaste 53254721Semaste case OptionValue::eTypeBoolean: 54254721Semaste // "definition.default_uint_value" is the default boolean value if 55254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 56254721Semaste // "definition.default_cstr_value" as a string value that represents the default 57254721Semaste // value. 58254721Semaste if (definition.default_cstr_value) 59276479Sdim m_value_sp.reset (new OptionValueBoolean(Args::StringToBoolean (definition.default_cstr_value, false, nullptr))); 60254721Semaste else 61254721Semaste m_value_sp.reset (new OptionValueBoolean(definition.default_uint_value != 0)); 62254721Semaste break; 63280031Sdim 64280031Sdim case OptionValue::eTypeChar: 65280031Sdim m_value_sp.reset(new OptionValueChar(Args::StringToChar(definition.default_cstr_value, '\0', nullptr))); 66280031Sdim break; 67280031Sdim 68254721Semaste case OptionValue::eTypeDictionary: 69254721Semaste // "definition.default_uint_value" is always a OptionValue::Type 70254721Semaste m_value_sp.reset (new OptionValueDictionary(OptionValue::ConvertTypeToMask((OptionValue::Type)definition.default_uint_value))); 71254721Semaste break; 72254721Semaste 73254721Semaste case OptionValue::eTypeEnum: 74254721Semaste // "definition.default_uint_value" is the default enumeration value if 75254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 76254721Semaste // "definition.default_cstr_value" as a string value that represents the default 77254721Semaste // value. 78254721Semaste { 79254721Semaste OptionValueEnumeration *enum_value = new OptionValueEnumeration(definition.enum_values, definition.default_uint_value); 80254721Semaste m_value_sp.reset (enum_value); 81254721Semaste if (definition.default_cstr_value) 82254721Semaste { 83254721Semaste if (enum_value->SetValueFromCString(definition.default_cstr_value).Success()) 84254721Semaste { 85254721Semaste enum_value->SetDefaultValue(enum_value->GetCurrentValue()); 86254721Semaste // Call Clear() since we don't want the value to appear as 87254721Semaste // having been set since we called SetValueFromCString() above. 88254721Semaste // Clear will set the current value to the default and clear 89254721Semaste // the boolean that says that the value has been set. 90254721Semaste enum_value->Clear(); 91254721Semaste } 92254721Semaste } 93254721Semaste } 94254721Semaste break; 95254721Semaste 96254721Semaste case OptionValue::eTypeFileSpec: 97254721Semaste // "definition.default_uint_value" represents if the "definition.default_cstr_value" should 98254721Semaste // be resolved or not 99254721Semaste m_value_sp.reset (new OptionValueFileSpec(FileSpec(definition.default_cstr_value, definition.default_uint_value != 0))); 100254721Semaste break; 101254721Semaste 102254721Semaste case OptionValue::eTypeFileSpecList: 103254721Semaste // "definition.default_uint_value" is not used for a OptionValue::eTypeFileSpecList 104254721Semaste m_value_sp.reset (new OptionValueFileSpecList()); 105254721Semaste break; 106254721Semaste 107254721Semaste case OptionValue::eTypeFormat: 108254721Semaste // "definition.default_uint_value" is the default format enumeration value if 109254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 110254721Semaste // "definition.default_cstr_value" as a string value that represents the default 111254721Semaste // value. 112254721Semaste { 113254721Semaste Format new_format = eFormatInvalid; 114254721Semaste if (definition.default_cstr_value) 115276479Sdim Args::StringToFormat (definition.default_cstr_value, new_format, nullptr); 116254721Semaste else 117254721Semaste new_format = (Format)definition.default_uint_value; 118254721Semaste m_value_sp.reset (new OptionValueFormat(new_format)); 119254721Semaste } 120254721Semaste break; 121254721Semaste 122254721Semaste case OptionValue::eTypePathMap: 123254721Semaste // "definition.default_uint_value" tells us if notifications should occur for 124254721Semaste // path mappings 125254721Semaste m_value_sp.reset (new OptionValuePathMappings(definition.default_uint_value != 0)); 126254721Semaste break; 127254721Semaste 128254721Semaste case OptionValue::eTypeRegex: 129254721Semaste // "definition.default_uint_value" is used to the regular expression flags 130254721Semaste // "definition.default_cstr_value" the default regular expression value 131254721Semaste // value. 132254721Semaste m_value_sp.reset (new OptionValueRegex(definition.default_cstr_value, definition.default_uint_value)); 133254721Semaste break; 134254721Semaste 135254721Semaste case OptionValue::eTypeSInt64: 136254721Semaste // "definition.default_uint_value" is the default integer value if 137254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 138254721Semaste // "definition.default_cstr_value" as a string value that represents the default 139254721Semaste // value. 140254721Semaste m_value_sp.reset (new OptionValueSInt64(definition.default_cstr_value ? Args::StringToSInt64 (definition.default_cstr_value) : definition.default_uint_value)); 141254721Semaste break; 142254721Semaste 143254721Semaste case OptionValue::eTypeUInt64: 144254721Semaste // "definition.default_uint_value" is the default unsigned integer value if 145254721Semaste // "definition.default_cstr_value" is NULL, otherwise interpret 146254721Semaste // "definition.default_cstr_value" as a string value that represents the default 147254721Semaste // value. 148254721Semaste m_value_sp.reset (new OptionValueUInt64(definition.default_cstr_value ? Args::StringToUInt64 (definition.default_cstr_value) : definition.default_uint_value)); 149254721Semaste break; 150254721Semaste 151254721Semaste case OptionValue::eTypeUUID: 152254721Semaste // "definition.default_uint_value" is not used for a OptionValue::eTypeUUID 153254721Semaste // "definition.default_cstr_value" can contain a default UUID value 154254721Semaste { 155254721Semaste UUID uuid; 156254721Semaste if (definition.default_cstr_value) 157254721Semaste uuid.SetFromCString (definition.default_cstr_value); 158254721Semaste m_value_sp.reset (new OptionValueUUID(uuid)); 159254721Semaste } 160254721Semaste break; 161254721Semaste 162254721Semaste case OptionValue::eTypeString: 163254721Semaste // "definition.default_uint_value" can contain the string option flags OR'ed together 164254721Semaste // "definition.default_cstr_value" can contain a default string value 165254721Semaste { 166254721Semaste OptionValueString *string_value = new OptionValueString(definition.default_cstr_value); 167254721Semaste if (definition.default_uint_value != 0) 168254721Semaste string_value->GetOptions().Reset(definition.default_uint_value); 169254721Semaste m_value_sp.reset (string_value); 170254721Semaste } 171254721Semaste break; 172254721Semaste } 173254721Semaste} 174254721Semaste 175254721SemasteProperty::Property (const ConstString &name, 176254721Semaste const ConstString &desc, 177254721Semaste bool is_global, 178254721Semaste const lldb::OptionValueSP &value_sp) : 179254721Semaste m_name (name), 180254721Semaste m_description (desc), 181254721Semaste m_value_sp (value_sp), 182254721Semaste m_is_global (is_global) 183254721Semaste{ 184254721Semaste} 185254721Semaste 186254721Semastebool 187254721SemasteProperty::DumpQualifiedName(Stream &strm) const 188254721Semaste{ 189254721Semaste if (m_name) 190254721Semaste { 191254721Semaste if (m_value_sp->DumpQualifiedName(strm)) 192254721Semaste strm.PutChar('.'); 193254721Semaste strm << m_name; 194254721Semaste return true; 195254721Semaste } 196254721Semaste return false; 197254721Semaste} 198254721Semaste 199254721Semaste 200254721Semastevoid 201254721SemasteProperty::Dump (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) const 202254721Semaste{ 203254721Semaste if (m_value_sp) 204254721Semaste { 205254721Semaste const bool dump_desc = dump_mask & OptionValue::eDumpOptionDescription; 206254721Semaste const bool transparent = m_value_sp->ValueIsTransparent (); 207254721Semaste if (dump_desc || !transparent) 208254721Semaste { 209254721Semaste if ((dump_mask & OptionValue::eDumpOptionName) && m_name) 210254721Semaste { 211254721Semaste DumpQualifiedName(strm); 212254721Semaste if (dump_mask & ~OptionValue::eDumpOptionName) 213254721Semaste strm.PutChar(' '); 214254721Semaste } 215254721Semaste } 216254721Semaste if (dump_desc) 217254721Semaste { 218254721Semaste const char *desc = GetDescription(); 219254721Semaste if (desc) 220254721Semaste strm.Printf ("-- %s", desc); 221254721Semaste 222254721Semaste if (transparent && (dump_mask == (OptionValue::eDumpOptionName | OptionValue::eDumpOptionDescription))) 223254721Semaste strm.EOL(); 224254721Semaste } 225254721Semaste m_value_sp->DumpValue(exe_ctx, strm, dump_mask); 226254721Semaste } 227254721Semaste} 228254721Semaste 229254721Semaste 230254721Semastevoid 231254721SemasteProperty::DumpDescription (CommandInterpreter &interpreter, 232254721Semaste Stream &strm, 233254721Semaste uint32_t output_width, 234254721Semaste bool display_qualified_name) const 235254721Semaste{ 236254721Semaste if (m_value_sp) 237254721Semaste { 238254721Semaste const char *desc = GetDescription(); 239254721Semaste 240254721Semaste if (desc) 241254721Semaste { 242254721Semaste StreamString qualified_name; 243254721Semaste const OptionValueProperties *sub_properties = m_value_sp->GetAsProperties(); 244254721Semaste if (sub_properties) 245254721Semaste { 246254721Semaste strm.EOL(); 247254721Semaste 248254721Semaste if (m_value_sp->DumpQualifiedName(qualified_name)) 249254721Semaste strm.Printf("'%s' variables:\n\n", qualified_name.GetString().c_str()); 250254721Semaste sub_properties->DumpAllDescriptions(interpreter, strm); 251254721Semaste } 252254721Semaste else 253254721Semaste { 254254721Semaste if (desc) 255254721Semaste { 256254721Semaste if (display_qualified_name) 257254721Semaste { 258254721Semaste StreamString qualified_name; 259254721Semaste DumpQualifiedName(qualified_name); 260254721Semaste interpreter.OutputFormattedHelpText (strm, 261254721Semaste qualified_name.GetString().c_str(), 262254721Semaste "--", 263254721Semaste desc, 264254721Semaste output_width); 265254721Semaste } 266254721Semaste else 267254721Semaste { 268254721Semaste interpreter.OutputFormattedHelpText (strm, 269254721Semaste m_name.GetCString(), 270254721Semaste "--", 271254721Semaste desc, 272254721Semaste output_width); 273254721Semaste } 274254721Semaste } 275254721Semaste } 276254721Semaste } 277254721Semaste } 278254721Semaste} 279254721Semaste 280280031Sdim 281280031Sdimvoid 282280031SdimProperty::SetValueChangedCallback (OptionValueChangedCallback callback, void *baton) 283280031Sdim{ 284280031Sdim if (m_value_sp) 285280031Sdim m_value_sp->SetValueChangedCallback (callback, baton); 286280031Sdim} 287280031Sdim 288280031Sdim 289