mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 19:45:40 -04:00

This feature was added to solve a lookup problem in expressions when local variables shadow ivars. That solution requires fully realizing all local variables to evaluate any expression, and can cause significant performance problems when evaluating expressions in frames that have many complex locals. Until we get a better solution, this setting mitigates the problem when you don't have local variables that shadow ivars. <rdar://problem/27226122> llvm-svn: 274783
135 lines
4.0 KiB
C++
135 lines
4.0 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();
|
|
const 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;
|
|
}
|
|
|
|
}
|
|
|