diff options
-rw-r--r-- | lldb/include/lldb/Core/ValueObject.h | 50 | ||||
-rw-r--r-- | lldb/include/lldb/Core/ValueObjectDynamicValue.h | 12 | ||||
-rw-r--r-- | lldb/source/Core/ValueObject.cpp | 65 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectChild.cpp | 5 |
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; } |