summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/ValueObject.h50
-rw-r--r--lldb/include/lldb/Core/ValueObjectDynamicValue.h12
-rw-r--r--lldb/source/Core/ValueObject.cpp65
-rw-r--r--lldb/source/Core/ValueObjectChild.cpp5
4 files changed, 99 insertions, 33 deletions
diff --git a/lldb/include/lldb/Core/ValueObject.h b/lldb/include/lldb/Core/ValueObject.h
index 6b72fa5b52e..869166aacc7 100644
--- a/lldb/include/lldb/Core/ValueObject.h
+++ b/lldb/include/lldb/Core/ValueObject.h
@@ -738,12 +738,10 @@ public:
// value is from an executable file and might have its data in
// sections of the file. This can be used for variables.
virtual lldb::ModuleSP
- GetModule()
- {
- if (m_parent)
- return m_parent->GetModule();
- return lldb::ModuleSP();
- }
+ GetModule();
+
+ virtual ValueObject*
+ GetRoot ();
virtual bool
GetDeclaration (Declaration &decl);
@@ -876,14 +874,8 @@ public:
virtual lldb::ValueObjectSP
GetDynamicValue (lldb::DynamicValueType valueType);
- virtual lldb::DynamicValueType
- GetDynamicValueType ()
- {
- if (m_parent)
- return m_parent->GetDynamicValueType ();
- else
- return lldb::eNoDynamicValues;
- }
+ lldb::DynamicValueType
+ GetDynamicValueType ();
virtual lldb::ValueObjectSP
GetStaticValue ();
@@ -1020,12 +1012,7 @@ public:
}
lldb::Format
- GetFormat () const
- {
- if (m_parent && m_format == lldb::eFormatDefault)
- return m_parent->GetFormat();
- return m_format;
- }
+ GetFormat () const;
void
SetFormat (lldb::Format format)
@@ -1104,15 +1091,7 @@ public:
}
AddressType
- GetAddressTypeOfChildren()
- {
- if (m_address_type_of_ptr_or_ref_children == eAddressTypeInvalid)
- {
- if (m_parent)
- return m_parent->GetAddressTypeOfChildren();
- }
- return m_address_type_of_ptr_or_ref_children;
- }
+ GetAddressTypeOfChildren();
void
SetHasCompleteType()
@@ -1213,6 +1192,7 @@ protected:
// Classes that inherit from ValueObject can see and modify these
//------------------------------------------------------------------
ValueObject * m_parent; // The parent value object, or NULL if this has no parent
+ ValueObject * m_root; // The root of the hierarchy for this ValueObject (or NULL if never calculated)
EvaluationPoint m_update_point; // Stores both the stop id and the full context at which this value was last
// updated. When we are asked to update the value object, we check whether
// the context & stop id are the same before updating.
@@ -1300,6 +1280,18 @@ protected:
virtual void
CalculateDynamicValue (lldb::DynamicValueType use_dynamic);
+ virtual lldb::DynamicValueType
+ GetDynamicValueTypeImpl ()
+ {
+ return lldb::eNoDynamicValues;
+ }
+
+ virtual bool
+ HasDynamicValueTypeInfo ()
+ {
+ return false;
+ }
+
virtual void
CalculateSyntheticValue (bool use_synthetic = true);
diff --git a/lldb/include/lldb/Core/ValueObjectDynamicValue.h b/lldb/include/lldb/Core/ValueObjectDynamicValue.h
index c21892a7da0..a44afc41686 100644
--- a/lldb/include/lldb/Core/ValueObjectDynamicValue.h
+++ b/lldb/include/lldb/Core/ValueObjectDynamicValue.h
@@ -90,15 +90,21 @@ public:
virtual bool
SetValueFromCString (const char *value_str, Error& error);
+protected:
+ virtual bool
+ UpdateValue ();
+
virtual lldb::DynamicValueType
- GetDynamicValueType ()
+ GetDynamicValueTypeImpl ()
{
return m_use_dynamic;
}
-protected:
virtual bool
- UpdateValue ();
+ HasDynamicValueTypeInfo ()
+ {
+ return true;
+ }
virtual clang::ASTContext *
GetClangASTImpl ();
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index 140c4b48b5e..dcc9e0e8265 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -64,6 +64,7 @@ static user_id_t g_value_obj_uid = 0;
ValueObject::ValueObject (ValueObject &parent) :
UserID (++g_value_obj_uid), // Unique identifier for every value object
m_parent (&parent),
+ m_root (NULL),
m_update_point (parent.GetUpdatePoint ()),
m_name (),
m_data (),
@@ -108,6 +109,7 @@ ValueObject::ValueObject (ExecutionContextScope *exe_scope,
AddressType child_ptr_or_ref_addr_type) :
UserID (++g_value_obj_uid), // Unique identifier for every value object
m_parent (NULL),
+ m_root (NULL),
m_update_point (exe_scope),
m_name (),
m_data (),
@@ -4150,3 +4152,66 @@ ValueObject::CreateValueObjectFromData (const char* name,
new_value_sp->SetName(ConstString(name));
return new_value_sp;
}
+
+ModuleSP
+ValueObject::GetModule ()
+{
+ ValueObject* root(GetRoot());
+ if (root != this)
+ return root->GetModule();
+ return lldb::ModuleSP();
+}
+
+ValueObject*
+ValueObject::GetRoot ()
+{
+ if (m_root)
+ return m_root;
+ ValueObject* parent = m_parent;
+ if (!parent)
+ return (m_root = this);
+ while (parent->m_parent)
+ {
+ if (parent->m_root)
+ return (m_root = parent->m_root);
+ parent = parent->m_parent;
+ }
+ return (m_root = parent);
+}
+
+AddressType
+ValueObject::GetAddressTypeOfChildren()
+{
+ if (m_address_type_of_ptr_or_ref_children == eAddressTypeInvalid)
+ {
+ ValueObject* root(GetRoot());
+ if (root != this)
+ return root->GetAddressTypeOfChildren();
+ }
+ return m_address_type_of_ptr_or_ref_children;
+}
+
+lldb::DynamicValueType
+ValueObject::GetDynamicValueType ()
+{
+ ValueObject* with_dv_info = this;
+ while (with_dv_info)
+ {
+ if (with_dv_info->HasDynamicValueTypeInfo())
+ return with_dv_info->GetDynamicValueTypeImpl();
+ with_dv_info = with_dv_info->m_parent;
+ }
+ return lldb::eNoDynamicValues;
+}
+lldb::Format
+ValueObject::GetFormat () const
+{
+ const ValueObject* with_fmt_info = this;
+ while (with_fmt_info)
+ {
+ if (with_fmt_info->m_format != lldb::eFormatDefault)
+ return with_fmt_info->m_format;
+ with_fmt_info = with_fmt_info->m_parent;
+ }
+ return m_format;
+}
diff --git a/lldb/source/Core/ValueObjectChild.cpp b/lldb/source/Core/ValueObjectChild.cpp
index 8aeb005512a..cf69ea5da68 100644
--- a/lldb/source/Core/ValueObjectChild.cpp
+++ b/lldb/source/Core/ValueObjectChild.cpp
@@ -229,5 +229,8 @@ ValueObjectChild::UpdateValue ()
bool
ValueObjectChild::IsInScope ()
{
- return m_parent->IsInScope ();
+ ValueObject* root(GetRoot());
+ if (root)
+ return root->IsInScope ();
+ return false;
}
OpenPOWER on IntegriCloud