diff options
Diffstat (limited to 'lldb/source/Core')
-rw-r--r-- | lldb/source/Core/ValueObject.cpp | 24 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectDynamicValue.cpp | 19 |
2 files changed, 29 insertions, 14 deletions
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 521d3eb5880..819e67a1e9c 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -986,8 +986,11 @@ ValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create) } void -ValueObject::CalculateDynamicValue () +ValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic) { + if (use_dynamic == lldb::eNoDynamicValues) + return; + if (!m_dynamic_value && !IsDynamic()) { Process *process = m_update_point.GetProcess(); @@ -1013,12 +1016,12 @@ ValueObject::CalculateDynamicValue () { LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC); if (objc_runtime) - worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this); + worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this); } } if (worth_having_dynamic_value) - m_dynamic_value = new ValueObjectDynamicValue (*this); + m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); // if (worth_having_dynamic_value) // printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager); @@ -1027,11 +1030,14 @@ ValueObject::CalculateDynamicValue () } ValueObjectSP -ValueObject::GetDynamicValue (bool can_create) +ValueObject::GetDynamicValue (DynamicValueType use_dynamic) { - if (!IsDynamic() && m_dynamic_value == NULL && can_create) + if (use_dynamic == lldb::eNoDynamicValues) + return ValueObjectSP(); + + if (!IsDynamic() && m_dynamic_value == NULL) { - CalculateDynamicValue(); + CalculateDynamicValue(use_dynamic); } if (m_dynamic_value) return m_dynamic_value->GetSP(); @@ -1137,16 +1143,16 @@ ValueObject::DumpValueObject bool show_types, bool show_location, bool use_objc, - bool use_dynamic, + lldb::DynamicValueType use_dynamic, bool scope_already_checked, bool flat_output ) { if (valobj && valobj->UpdateValueIfNeeded ()) { - if (use_dynamic) + if (use_dynamic != lldb::eNoDynamicValues) { - ValueObject *dynamic_value = valobj->GetDynamicValue(true).get(); + ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get(); if (dynamic_value) valobj = dynamic_value; } diff --git a/lldb/source/Core/ValueObjectDynamicValue.cpp b/lldb/source/Core/ValueObjectDynamicValue.cpp index b43c6519baf..ee50d45433f 100644 --- a/lldb/source/Core/ValueObjectDynamicValue.cpp +++ b/lldb/source/Core/ValueObjectDynamicValue.cpp @@ -34,10 +34,11 @@ using namespace lldb_private; -ValueObjectDynamicValue::ValueObjectDynamicValue (ValueObject &parent) : +ValueObjectDynamicValue::ValueObjectDynamicValue (ValueObject &parent, lldb::DynamicValueType use_dynamic) : ValueObject(parent), m_address (), - m_type_sp() + m_type_sp(), + m_use_dynamic (use_dynamic) { SetName (parent.GetName().AsCString()); } @@ -122,6 +123,14 @@ ValueObjectDynamicValue::UpdateValue () return false; } + // Setting our type_sp to NULL will route everything back through our + // parent which is equivalent to not using dynamic values. + if (m_use_dynamic == lldb::eNoDynamicValues) + { + m_type_sp.reset(); + return true; + } + ExecutionContext exe_ctx (GetExecutionContextScope()); if (exe_ctx.target) @@ -144,19 +153,19 @@ ValueObjectDynamicValue::UpdateValue () { LanguageRuntime *runtime = process->GetLanguageRuntime (known_type); if (runtime) - found_dynamic_type = runtime->GetDynamicTypeAndAddress (*m_parent, class_type_or_name, dynamic_address); + found_dynamic_type = runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address); } else { LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus); if (cpp_runtime) - found_dynamic_type = cpp_runtime->GetDynamicTypeAndAddress (*m_parent, class_type_or_name, dynamic_address); + found_dynamic_type = cpp_runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address); if (!found_dynamic_type) { LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC); if (objc_runtime) - found_dynamic_type = cpp_runtime->GetDynamicTypeAndAddress (*m_parent, class_type_or_name, dynamic_address); + found_dynamic_type = cpp_runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address); } } |