
settings or raise no error if not found. From time to time it is useful to add some setting to work around or enable a transitory feature. We've been reluctant to remove them later because then we will break folks .lldbinit files. With this change you can add an "experimental" node to the settings. If you later decide you want to keep the option, just move it to the level that contained the "experimental" setting and it will still be found. Or just remove it - setting it will then silently fail and won't halt the .lldbinit file execution. llvm-svn: 274593
135 lines
3.9 KiB
C++
135 lines
3.9 KiB
C++
//====-- UserSettingsController.cpp ------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include <string.h>
|
|
#include <algorithm>
|
|
|
|
#include "lldb/Core/UserSettingsController.h"
|
|
#include "lldb/Core/Error.h"
|
|
#include "lldb/Core/RegularExpression.h"
|
|
#include "lldb/Core/Stream.h"
|
|
#include "lldb/Core/StreamString.h"
|
|
#include "lldb/Interpreter/CommandInterpreter.h"
|
|
#include "lldb/Interpreter/OptionValueProperties.h"
|
|
#include "lldb/Interpreter/OptionValueString.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
|
|
lldb::OptionValueSP
|
|
Properties::GetPropertyValue (const ExecutionContext *exe_ctx,
|
|
const char *path,
|
|
bool will_modify,
|
|
Error &error) const
|
|
{
|
|
OptionValuePropertiesSP properties_sp (GetValueProperties ());
|
|
if (properties_sp)
|
|
return properties_sp->GetSubValue(exe_ctx, path, will_modify, error);
|
|
return lldb::OptionValueSP();
|
|
}
|
|
|
|
Error
|
|
Properties::SetPropertyValue (const ExecutionContext *exe_ctx,
|
|
VarSetOperationType op,
|
|
const char *path,
|
|
const char *value)
|
|
{
|
|
OptionValuePropertiesSP properties_sp (GetValueProperties ());
|
|
if (properties_sp)
|
|
return properties_sp->SetSubValue(exe_ctx, op, path, value);
|
|
Error error;
|
|
error.SetErrorString ("no properties");
|
|
return error;
|
|
}
|
|
|
|
void
|
|
Properties::DumpAllPropertyValues (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
|
|
{
|
|
OptionValuePropertiesSP properties_sp (GetValueProperties ());
|
|
if (properties_sp)
|
|
return properties_sp->DumpValue (exe_ctx, strm, dump_mask);
|
|
}
|
|
|
|
void
|
|
Properties::DumpAllDescriptions (CommandInterpreter &interpreter,
|
|
Stream &strm) const
|
|
{
|
|
strm.PutCString("Top level variables:\n\n");
|
|
|
|
OptionValuePropertiesSP properties_sp (GetValueProperties ());
|
|
if (properties_sp)
|
|
return properties_sp->DumpAllDescriptions (interpreter, strm);
|
|
}
|
|
|
|
|
|
|
|
Error
|
|
Properties::DumpPropertyValue (const ExecutionContext *exe_ctx, Stream &strm, const char *property_path, uint32_t dump_mask)
|
|
{
|
|
OptionValuePropertiesSP properties_sp (GetValueProperties ());
|
|
if (properties_sp)
|
|
{
|
|
return properties_sp->DumpPropertyValue (exe_ctx,
|
|
strm,
|
|
property_path,
|
|
dump_mask);
|
|
}
|
|
Error error;
|
|
error.SetErrorString("empty property list");
|
|
return error;
|
|
}
|
|
|
|
size_t
|
|
Properties::Apropos (const char *keyword, std::vector<const Property *> &matching_properties) const
|
|
{
|
|
OptionValuePropertiesSP properties_sp (GetValueProperties ());
|
|
if (properties_sp)
|
|
{
|
|
properties_sp->Apropos (keyword, matching_properties);
|
|
}
|
|
return matching_properties.size();
|
|
}
|
|
|
|
|
|
lldb::OptionValuePropertiesSP
|
|
Properties::GetSubProperty (const ExecutionContext *exe_ctx,
|
|
const ConstString &name)
|
|
{
|
|
OptionValuePropertiesSP properties_sp (GetValueProperties ());
|
|
if (properties_sp)
|
|
return properties_sp->GetSubProperty (exe_ctx, name);
|
|
return lldb::OptionValuePropertiesSP();
|
|
}
|
|
|
|
const char *
|
|
Properties::GetExperimentalSettingsName()
|
|
{
|
|
return "experimental";
|
|
}
|
|
|
|
bool
|
|
Properties::IsSettingExperimental(const char *setting)
|
|
{
|
|
if (setting == nullptr)
|
|
return false;
|
|
|
|
const char *experimental = GetExperimentalSettingsName();
|
|
char *dot_pos = strchr(setting, '.');
|
|
if (dot_pos == nullptr)
|
|
return strcmp(experimental, setting) == 0;
|
|
else
|
|
{
|
|
size_t first_elem_len = dot_pos - setting;
|
|
return strncmp(experimental, setting, first_elem_len) == 0;
|
|
}
|
|
|
|
}
|
|
|