summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/source/DataFormatters/LibCxxMap.cpp31
1 files changed, 27 insertions, 4 deletions
diff --git a/lldb/source/DataFormatters/LibCxxMap.cpp b/lldb/source/DataFormatters/LibCxxMap.cpp
index 8dfa59242d5..e971df3d162 100644
--- a/lldb/source/DataFormatters/LibCxxMap.cpp
+++ b/lldb/source/DataFormatters/LibCxxMap.cpp
@@ -64,6 +64,12 @@ public:
}
bool
+ error ()
+ {
+ return m_entry_sp->GetError().Fail();
+ }
+
+ bool
null()
{
return (value() == 0);
@@ -95,10 +101,10 @@ class MapIterator
{
public:
MapIterator () {}
- MapIterator (MapEntry entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth) {}
- MapIterator (ValueObjectSP entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth) {}
- MapIterator (const MapIterator& rhs) : m_entry(rhs.m_entry),m_max_depth(rhs.m_max_depth) {}
- MapIterator (ValueObject* entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth) {}
+ MapIterator (MapEntry entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {}
+ MapIterator (ValueObjectSP entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {}
+ MapIterator (const MapIterator& rhs) : m_entry(rhs.m_entry),m_max_depth(rhs.m_max_depth), m_error(false) {}
+ MapIterator (ValueObject* entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {}
ValueObjectSP
value ()
@@ -109,6 +115,8 @@ public:
ValueObjectSP
advance (size_t count)
{
+ if (m_error)
+ return lldb::ValueObjectSP();
if (count == 0)
return m_entry.GetEntry();
if (count == 1)
@@ -119,6 +127,8 @@ public:
size_t steps = 0;
while (count > 0)
{
+ if (m_error)
+ return lldb::ValueObjectSP();
next ();
count--;
if (m_entry.null())
@@ -147,6 +157,11 @@ private:
size_t steps = 0;
while (left.null() == false)
{
+ if (left.error())
+ {
+ m_error = true;
+ return lldb::ValueObjectSP();
+ }
x.SetEntry(left.GetEntry());
left.SetEntry(x.left());
steps++;
@@ -166,6 +181,8 @@ private:
size_t steps = 0;
while (right.null() == false)
{
+ if (right.error())
+ return lldb::ValueObjectSP();
x.SetEntry(right.GetEntry());
right.SetEntry(x.right());
steps++;
@@ -198,6 +215,11 @@ private:
size_t steps = 0;
while (!is_left_child(node.GetEntry()))
{
+ if (node.error())
+ {
+ m_error = true;
+ return lldb::ValueObjectSP();
+ }
node.SetEntry(node.parent());
steps++;
if (steps > m_max_depth)
@@ -208,6 +230,7 @@ private:
MapEntry m_entry;
size_t m_max_depth;
+ bool m_error;
};
lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
OpenPOWER on IntegriCloud