[Lldb-commits] [lldb] r137493 - in /lldb/trunk: include/lldb/Core/Debugger.h include/lldb/Core/FormatManager.h source/Commands/CommandObjectType.cpp source/Core/Debugger.cpp source/Core/ValueObject.cpp test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py
Enrico Granata
granata.enrico at gmail.com
Fri Aug 12 12:14:27 PDT 2011
Author: enrico
Date: Fri Aug 12 14:14:27 2011
New Revision: 137493
URL: http://llvm.org/viewvc/llvm-project?rev=137493&view=rev
Log:
Added an error message when the user tries to add a filter when a synthetic provider for the same type is already defined in the same category
The converse is also true: an error is shown when the user tries to add a synthetic provider to a category that already has a filter for the same type
Modified:
lldb/trunk/include/lldb/Core/Debugger.h
lldb/trunk/include/lldb/Core/FormatManager.h
lldb/trunk/source/Commands/CommandObjectType.cpp
lldb/trunk/source/Core/Debugger.cpp
lldb/trunk/source/Core/ValueObject.cpp
lldb/trunk/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py
Modified: lldb/trunk/include/lldb/Core/Debugger.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Debugger.h?rev=137493&r1=137492&r2=137493&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Debugger.h (original)
+++ lldb/trunk/include/lldb/Core/Debugger.h Fri Aug 12 14:14:27 2011
@@ -512,9 +512,16 @@
lldb::DynamicValueType use_dynamic,
lldb::SummaryFormatSP& entry);
static bool
- GetSyntheticFilter(ValueObject& vobj,
- lldb::DynamicValueType use_dynamic,
- lldb::SyntheticChildrenSP& entry);
+ GetSyntheticChildren(ValueObject& vobj,
+ lldb::DynamicValueType use_dynamic,
+ lldb::SyntheticChildrenSP& entry);
+
+ static bool
+ AnyMatches(ConstString type_name,
+ FormatCategory::FormatCategoryItems items = FormatCategory::ALL_ITEM_TYPES,
+ bool only_enabled = true,
+ const char** matching_category = NULL,
+ FormatCategory::FormatCategoryItems* matching_type = NULL);
class NamedSummaryFormats
{
Modified: lldb/trunk/include/lldb/Core/FormatManager.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/FormatManager.h?rev=137493&r1=137492&r2=137493&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/FormatManager.h (original)
+++ lldb/trunk/include/lldb/Core/FormatManager.h Fri Aug 12 14:14:27 2011
@@ -608,8 +608,10 @@
class FormatCategory
{
private:
+
typedef FormatNavigator<const char*, SummaryFormat> SummaryNavigator;
typedef FormatNavigator<lldb::RegularExpressionSP, SummaryFormat> RegexSummaryNavigator;
+
typedef FormatNavigator<const char*, SyntheticFilter> FilterNavigator;
typedef FormatNavigator<lldb::RegularExpressionSP, SyntheticFilter> RegexFilterNavigator;
@@ -655,6 +657,15 @@
friend class CategoryMap;
+ friend class FormatNavigator<const char*, SummaryFormat>;
+ friend class FormatNavigator<lldb::RegularExpressionSP, SummaryFormat>;
+
+ friend class FormatNavigator<const char*, SyntheticFilter>;
+ friend class FormatNavigator<lldb::RegularExpressionSP, SyntheticFilter>;
+
+ friend class FormatNavigator<const char*, SyntheticScriptProvider>;
+ friend class FormatNavigator<lldb::RegularExpressionSP, SyntheticScriptProvider>;
+
public:
enum FormatCategoryItem
@@ -824,17 +835,17 @@
void
Clear(FormatCategoryItems items = ALL_ITEM_TYPES)
{
- if ( (items & eSummary) )
+ if ( (items & eSummary) == eSummary )
m_summary_nav->Clear();
- if ( (items & eRegexSummary) )
+ if ( (items & eRegexSummary) == eRegexSummary )
m_regex_summary_nav->Clear();
- if ( (items & eFilter) )
+ if ( (items & eFilter) == eFilter )
m_filter_nav->Clear();
- if ( (items & eRegexFilter) )
+ if ( (items & eRegexFilter) == eRegexFilter )
m_regex_filter_nav->Clear();
- if ( (items & eSynth) )
+ if ( (items & eSynth) == eSynth )
m_synth_nav->Clear();
- if ( (items & eRegexSynth) )
+ if ( (items & eRegexSynth) == eRegexSynth )
m_regex_synth_nav->Clear();
}
@@ -843,17 +854,17 @@
FormatCategoryItems items = ALL_ITEM_TYPES)
{
bool success = false;
- if ( (items & eSummary) )
+ if ( (items & eSummary) == eSummary )
success = m_summary_nav->Delete(name) || success;
- if ( (items & eRegexSummary) )
+ if ( (items & eRegexSummary) == eRegexSummary )
success = m_regex_summary_nav->Delete(name) || success;
- if ( (items & eFilter) )
+ if ( (items & eFilter) == eFilter )
success = m_filter_nav->Delete(name) || success;
- if ( (items & eRegexFilter) )
+ if ( (items & eRegexFilter) == eRegexFilter )
success = m_regex_filter_nav->Delete(name) || success;
- if ( (items & eSynth) )
+ if ( (items & eSynth) == eSynth )
success = m_synth_nav->Delete(name) || success;
- if ( (items & eRegexSynth) )
+ if ( (items & eRegexSynth) == eRegexSynth )
success = m_regex_synth_nav->Delete(name) || success;
return success;
}
@@ -862,17 +873,17 @@
GetCount(FormatCategoryItems items = ALL_ITEM_TYPES)
{
uint32_t count = 0;
- if ( (items & eSummary) )
+ if ( (items & eSummary) == eSummary )
count += m_summary_nav->GetCount();
- if ( (items & eRegexSummary) )
+ if ( (items & eRegexSummary) == eRegexSummary )
count += m_regex_summary_nav->GetCount();
- if ( (items & eFilter) )
+ if ( (items & eFilter) == eFilter )
count += m_filter_nav->GetCount();
- if ( (items & eRegexFilter) )
+ if ( (items & eRegexFilter) == eRegexFilter )
count += m_regex_filter_nav->GetCount();
- if ( (items & eSynth) )
+ if ( (items & eSynth) == eSynth )
count += m_synth_nav->GetCount();
- if ( (items & eRegexSynth) )
+ if ( (items & eRegexSynth) == eRegexSynth )
count += m_regex_synth_nav->GetCount();
return count;
}
@@ -883,6 +894,89 @@
return m_name;
}
+ bool
+ AnyMatches(ConstString type_name,
+ FormatCategoryItems items = ALL_ITEM_TYPES,
+ bool only_enabled = true,
+ const char** matching_category = NULL,
+ FormatCategoryItems* matching_type = NULL)
+ {
+ if (!IsEnabled() && only_enabled)
+ return false;
+
+ SummaryFormat::SharedPointer summary;
+ SyntheticFilter::SharedPointer filter;
+ SyntheticScriptProvider::SharedPointer synth;
+
+ if ( (items & eSummary) == eSummary )
+ {
+ if (m_summary_nav->Get(type_name.AsCString(), summary))
+ {
+ if (matching_category)
+ *matching_category = m_name.c_str();
+ if (matching_type)
+ *matching_type = eSummary;
+ return true;
+ }
+ }
+ if ( (items & eRegexSummary) == eRegexSummary )
+ {
+ if (m_regex_summary_nav->Get(type_name.AsCString(), summary))
+ {
+ if (matching_category)
+ *matching_category = m_name.c_str();
+ if (matching_type)
+ *matching_type = eRegexSummary;
+ return true;
+ }
+ }
+ if ( (items & eFilter) == eFilter )
+ {
+ if (m_filter_nav->Get(type_name.AsCString(), filter))
+ {
+ if (matching_category)
+ *matching_category = m_name.c_str();
+ if (matching_type)
+ *matching_type = eFilter;
+ return true;
+ }
+ }
+ if ( (items & eRegexFilter) == eRegexFilter )
+ {
+ if (m_regex_filter_nav->Get(type_name.AsCString(), filter))
+ {
+ if (matching_category)
+ *matching_category = m_name.c_str();
+ if (matching_type)
+ *matching_type = eRegexFilter;
+ return true;
+ }
+ }
+ if ( (items & eSynth) == eSynth )
+ {
+ if (m_synth_nav->Get(type_name.AsCString(), synth))
+ {
+ if (matching_category)
+ *matching_category = m_name.c_str();
+ if (matching_type)
+ *matching_type = eSynth;
+ return true;
+ }
+ }
+ if ( (items & eRegexSynth) == eRegexSynth )
+ {
+ if (m_regex_synth_nav->Get(type_name.AsCString(), synth))
+ {
+ if (matching_category)
+ *matching_category = m_name.c_str();
+ if (matching_type)
+ *matching_type = eRegexSynth;
+ return true;
+ }
+ }
+ return false;
+ }
+
typedef lldb::SharedPtr<FormatCategory>::Type SharedPointer;
};
@@ -1052,6 +1146,28 @@
}
}
+ bool
+ AnyMatches(ConstString type_name,
+ FormatCategory::FormatCategoryItems items = FormatCategory::ALL_ITEM_TYPES,
+ bool only_enabled = true,
+ const char** matching_category = NULL,
+ FormatCategory::FormatCategoryItems* matching_type = NULL)
+ {
+ Mutex::Locker(m_map_mutex);
+
+ MapIterator pos, end = m_map.end();
+ for (pos = m_map.begin(); pos != end; pos++)
+ {
+ if (pos->second->AnyMatches(type_name,
+ items,
+ only_enabled,
+ matching_category,
+ matching_type))
+ return true;
+ }
+ return false;
+ }
+
uint32_t
GetCount()
{
@@ -1265,6 +1381,20 @@
{
return m_categories_map.Get(vobj, entry, use_dynamic);
}
+
+ bool
+ AnyMatches(ConstString type_name,
+ FormatCategory::FormatCategoryItems items = FormatCategory::ALL_ITEM_TYPES,
+ bool only_enabled = true,
+ const char** matching_category = NULL,
+ FormatCategory::FormatCategoryItems* matching_type = NULL)
+ {
+ return m_categories_map.AnyMatches(type_name,
+ items,
+ only_enabled,
+ matching_category,
+ matching_type);
+ }
static bool
GetFormatFromCString (const char *format_cstr,
Modified: lldb/trunk/source/Commands/CommandObjectType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectType.cpp?rev=137493&r1=137492&r2=137493&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectType.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectType.cpp Fri Aug 12 14:14:27 2011
@@ -3018,15 +3018,24 @@
lldb::FormatCategorySP category;
Debugger::Formatting::Categories::Get(ConstString(options->m_category.c_str()), category);
+ Error error;
+
for (size_t i = 0; i < options->m_target_types.GetSize(); i++) {
const char *type_name = options->m_target_types.GetStringAtIndex(i);
ConstString typeCS(type_name);
if (typeCS)
- CommandObjectTypeSynthAdd::AddSynth(typeCS,
- synth_provider,
- options->m_regex ? CommandObjectTypeSynthAdd::eRegexSynth : CommandObjectTypeSynthAdd::eRegularSynth,
- options->m_category,
- NULL);
+ {
+ if (!CommandObjectTypeSynthAdd::AddSynth(typeCS,
+ synth_provider,
+ options->m_regex ? CommandObjectTypeSynthAdd::eRegexSynth : CommandObjectTypeSynthAdd::eRegularSynth,
+ options->m_category,
+ &error))
+ {
+ out_stream->Printf("%s\n", error.AsCString());
+ out_stream->Flush();
+ return;
+ }
+ }
else
{
out_stream->Printf ("Internal error #6: no script attached.\n");
@@ -3126,15 +3135,24 @@
lldb::FormatCategorySP category;
Debugger::Formatting::Categories::Get(ConstString(m_options.m_category.c_str()), category);
+ Error error;
+
for (size_t i = 0; i < argc; i++) {
const char* typeA = command.GetArgumentAtIndex(i);
ConstString typeCS(typeA);
if (typeCS)
- AddSynth(typeCS,
- entry,
- m_options.m_regex ? eRegexSynth : eRegularSynth,
- m_options.m_category,
- NULL);
+ {
+ if (!AddSynth(typeCS,
+ entry,
+ m_options.m_regex ? eRegexSynth : eRegularSynth,
+ m_options.m_category,
+ &error))
+ {
+ result.AppendError(error.AsCString());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+ }
else
{
result.AppendError("empty typenames not allowed");
@@ -3175,6 +3193,15 @@
lldb::FormatCategorySP category;
Debugger::Formatting::Categories::Get(ConstString(category_name.c_str()), category);
+ if (category->AnyMatches(type_name,
+ FormatCategory::eFilter | FormatCategory::eRegexFilter,
+ false))
+ {
+ if (error)
+ error->SetErrorStringWithFormat("cannot add synthetic for type %s when filter is defined in same category!", type_name.AsCString());
+ return false;
+ }
+
if (type == eRegexSynth)
{
RegularExpressionSP typeRX(new RegularExpression());
@@ -3327,23 +3354,32 @@
return &m_options;
}
- enum SynthFormatType
+ enum FilterFormatType
{
- eRegularSynth,
- eRegexSynth,
+ eRegularFilter,
+ eRegexFilter,
};
bool
- AddSynth(const ConstString& type_name,
- SyntheticChildrenSP entry,
- SynthFormatType type,
- std::string category_name,
- Error* error)
+ AddFilter(const ConstString& type_name,
+ SyntheticChildrenSP entry,
+ FilterFormatType type,
+ std::string category_name,
+ Error* error)
{
lldb::FormatCategorySP category;
Debugger::Formatting::Categories::Get(ConstString(category_name.c_str()), category);
- if (type == eRegexSynth)
+ if (category->AnyMatches(type_name,
+ FormatCategory::eSynth | FormatCategory::eRegexSynth,
+ false))
+ {
+ if (error)
+ error->SetErrorStringWithFormat("cannot add filter for type %s when synthetic is defined in same category!", type_name.AsCString());
+ return false;
+ }
+
+ if (type == eRegexFilter)
{
RegularExpressionSP typeRX(new RegularExpression());
if (!typeRX->Compile(type_name.GetCString()))
@@ -3430,15 +3466,24 @@
lldb::FormatCategorySP category;
Debugger::Formatting::Categories::Get(ConstString(m_options.m_category.c_str()), category);
+ Error error;
+
for (size_t i = 0; i < argc; i++) {
const char* typeA = command.GetArgumentAtIndex(i);
ConstString typeCS(typeA);
if (typeCS)
- AddSynth(typeCS,
- entry,
- m_options.m_regex ? eRegexSynth : eRegularSynth,
- m_options.m_category,
- NULL);
+ {
+ if (!AddFilter(typeCS,
+ entry,
+ m_options.m_regex ? eRegexFilter : eRegularFilter,
+ m_options.m_category,
+ &error))
+ {
+ result.AppendError(error.AsCString());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+ }
else
{
result.AppendError("empty typenames not allowed");
Modified: lldb/trunk/source/Core/Debugger.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=137493&r1=137492&r2=137493&view=diff
==============================================================================
--- lldb/trunk/source/Core/Debugger.cpp (original)
+++ lldb/trunk/source/Core/Debugger.cpp Fri Aug 12 14:14:27 2011
@@ -1837,14 +1837,28 @@
return GetFormatManager().Get(vobj, entry, use_dynamic);
}
bool
-Debugger::Formatting::GetSyntheticFilter(ValueObject& vobj,
- lldb::DynamicValueType use_dynamic,
- lldb::SyntheticChildrenSP& entry)
+Debugger::Formatting::GetSyntheticChildren(ValueObject& vobj,
+ lldb::DynamicValueType use_dynamic,
+ lldb::SyntheticChildrenSP& entry)
{
return GetFormatManager().Get(vobj, entry, use_dynamic);
}
bool
+Debugger::Formatting::AnyMatches(ConstString type_name,
+ FormatCategory::FormatCategoryItems items,
+ bool only_enabled,
+ const char** matching_category,
+ FormatCategory::FormatCategoryItems* matching_type)
+{
+ return GetFormatManager().AnyMatches(type_name,
+ items,
+ only_enabled,
+ matching_category,
+ matching_type);
+}
+
+bool
Debugger::Formatting::Categories::Get(const ConstString &category, lldb::FormatCategorySP &entry)
{
entry = GetFormatManager().Category(category.GetCString());
Modified: lldb/trunk/source/Core/ValueObject.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=137493&r1=137492&r2=137493&view=diff
==============================================================================
--- lldb/trunk/source/Core/ValueObject.cpp (original)
+++ lldb/trunk/source/Core/ValueObject.cpp Fri Aug 12 14:14:27 2011
@@ -243,7 +243,7 @@
Debugger::Formatting::ValueFormats::Get(*this, lldb::eNoDynamicValues, m_last_value_format);
Debugger::Formatting::GetSummaryFormat(*this, use_dynamic, m_last_summary_format);
- Debugger::Formatting::GetSyntheticFilter(*this, use_dynamic, m_last_synthetic_filter);
+ Debugger::Formatting::GetSyntheticChildren(*this, use_dynamic, m_last_synthetic_filter);
m_last_format_mgr_revision = Debugger::Formatting::ValueFormats::GetCurrentRevision();
m_last_format_mgr_dynamic = use_dynamic;
Modified: lldb/trunk/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py?rev=137493&r1=137492&r2=137493&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py (original)
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py Fri Aug 12 14:14:27 2011
@@ -136,18 +136,48 @@
'fake_a = 218103808',
'a = 12'])
- # now mix synth and filter and check consistent output
- self.runCmd("type filter add foo --child b --child j")
- self.expect('frame variable f00_1',
+ # now add a filter.. it should fail
+ self.expect("type filter add foo --child b --child j", error=True,
+ substrs = ['cannot add'])
+
+ # we get the synth again..
+ self.expect('frame variable f00_1', matching=False,
substrs = ['b = 1',
'j = 17'])
+ self.expect("frame variable -P 1 f00_ptr",
+ substrs = ['r = 45',
+ 'fake_a = 218103808',
+ 'a = 12'])
+
+ # now delete the synth and add the filter
+ self.runCmd("type synth delete foo")
+ self.runCmd("type filter add foo --child b --child j")
+
+ self.expect('frame variable f00_1',
+ substrs = ['b = 1',
+ 'j = 17'])
self.expect("frame variable -P 1 f00_ptr", matching=False,
substrs = ['r = 45',
'fake_a = 218103808',
'a = 12'])
- # now add the synth again to see that it prevails
+ # now add the synth and it should fail
+ self.expect("type synth add -l fooSynthProvider foo", error=True,
+ substrs = ['cannot add'])
+
+ # check the listing
+ self.expect('type synth list', matching=False,
+ substrs = ['foo',
+ 'Python class fooSynthProvider'])
+ self.expect('type filter list',
+ substrs = ['foo',
+ '.b',
+ '.j'])
+
+ # delete the filter, add the synth
+ self.runCmd("type filter delete foo")
self.runCmd("type synth add -l fooSynthProvider foo")
+
self.expect('frame variable f00_1', matching=False,
substrs = ['b = 1',
'j = 17'])
@@ -160,7 +190,7 @@
self.expect('type synth list',
substrs = ['foo',
'Python class fooSynthProvider'])
- self.expect('type filter list',
+ self.expect('type filter list', matching=False,
substrs = ['foo',
'.b',
'.j'])
@@ -168,19 +198,6 @@
# delete the synth and check that we get good output
self.runCmd("type synth delete foo")
- # first let the filter win
- self.expect('frame variable f00_1',
- substrs = ['b = 1',
- 'j = 17'])
- self.expect("frame variable -P 1 f00_ptr", matching=False,
- substrs = ['r = 45',
- 'fake_a = 218103808',
- 'a = 12'])
-
- # then delete the filter
- self.runCmd("type filter delete foo")
-
- # and show real children
self.expect("frame variable f00_1",
substrs = ['a = 280',
'b = 1',
@@ -451,7 +468,11 @@
self.runCmd("frame variable ii -T")
self.runCmd("script from StdMapSynthProvider import *")
- self.runCmd("type summary add -x \"std::map<\" -f \"map has ${svar%#} items\" -e")
+ self.runCmd("type summary add -x \"std::map<\" -f \"map has ${svar%#} items\" -e")
+
+ #import time
+ #time.sleep(30)
+
self.runCmd("type synth add -x \"std::map<\" -l StdMapSynthProvider")
More information about the lldb-commits
mailing list