summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Core')
-rw-r--r--lldb/source/Core/ValueObject.cpp24
-rw-r--r--lldb/source/Core/ValueObjectDynamicValue.cpp19
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);
}
}
OpenPOWER on IntegriCloud