Change "frame var" over to using OptionGroups (and thus the OptionGroupVariableObjectDisplay).
Change the boolean "use_dynamic" over to a tri-state, no-dynamic, dynamic-w/o running target,
and dynamic with running target.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@130832 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Target/StackFrame.cpp b/source/Target/StackFrame.cpp
index 169497a..cb4bbd4 100644
--- a/source/Target/StackFrame.cpp
+++ b/source/Target/StackFrame.cpp
@@ -486,14 +486,17 @@
}
ValueObjectSP
-StackFrame::GetValueForVariableExpressionPath (const char *var_expr_cstr, uint32_t options, Error &error)
+StackFrame::GetValueForVariableExpressionPath (const char *var_expr_cstr,
+ lldb::DynamicValueType use_dynamic,
+ uint32_t options,
+ lldb::VariableSP &var_sp,
+ Error &error)
{
if (var_expr_cstr && var_expr_cstr[0])
{
const bool check_ptr_vs_member = (options & eExpressionPathOptionCheckPtrVsMember) != 0;
const bool no_fragile_ivar = (options & eExpressionPathOptionsNoFragileObjcIvar) != 0;
- const bool dynamic_value = (options & eExpressionPathOptionsDynamicValue) != 0;
error.Clear();
bool deref = false;
bool address_of = false;
@@ -526,10 +529,10 @@
else
name_const_string.SetCStringWithLength (var_path.c_str(), separator_idx);
- VariableSP var_sp (variable_list->FindVariable(name_const_string));
+ var_sp = variable_list->FindVariable(name_const_string);
if (var_sp)
{
- valobj_sp = GetValueObjectForFrameVariable (var_sp, dynamic_value);
+ valobj_sp = GetValueObjectForFrameVariable (var_sp, use_dynamic);
if (!valobj_sp)
return valobj_sp;
@@ -626,9 +629,9 @@
}
// Remove the child name from the path
var_path.erase(0, child_name.GetLength());
- if (dynamic_value)
+ if (use_dynamic != lldb::eNoDynamicValues)
{
- ValueObjectSP dynamic_value_sp(child_valobj_sp->GetDynamicValue(true));
+ ValueObjectSP dynamic_value_sp(child_valobj_sp->GetDynamicValue(use_dynamic));
if (dynamic_value_sp)
child_valobj_sp = dynamic_value_sp;
}
@@ -688,9 +691,9 @@
// %i is the array index
var_path.erase(0, (end - var_path.c_str()) + 1);
separator_idx = var_path.find_first_of(".-[");
- if (dynamic_value)
+ if (use_dynamic != lldb::eNoDynamicValues)
{
- ValueObjectSP dynamic_value_sp(child_valobj_sp->GetDynamicValue(true));
+ ValueObjectSP dynamic_value_sp(child_valobj_sp->GetDynamicValue(use_dynamic));
if (dynamic_value_sp)
child_valobj_sp = dynamic_value_sp;
}
@@ -738,7 +741,8 @@
}
else
{
- error.SetErrorStringWithFormat("no variable named '%s' found in this frame", name_const_string.GetCString());
+ error.SetErrorStringWithFormat("no variable named '%s' found in this frame",
+ name_const_string.GetCString());
}
}
}
@@ -809,7 +813,7 @@
ValueObjectSP
-StackFrame::GetValueObjectForFrameVariable (const VariableSP &variable_sp, bool use_dynamic)
+StackFrame::GetValueObjectForFrameVariable (const VariableSP &variable_sp, lldb::DynamicValueType use_dynamic)
{
ValueObjectSP valobj_sp;
VariableList *var_list = GetVariableList (true);
@@ -830,9 +834,9 @@
}
}
}
- if (use_dynamic && valobj_sp)
+ if (use_dynamic != lldb::eNoDynamicValues && valobj_sp)
{
- ValueObjectSP dynamic_sp = valobj_sp->GetDynamicValue (true);
+ ValueObjectSP dynamic_sp = valobj_sp->GetDynamicValue (use_dynamic);
if (dynamic_sp)
return dynamic_sp;
}
@@ -840,7 +844,7 @@
}
ValueObjectSP
-StackFrame::TrackGlobalVariable (const VariableSP &variable_sp, bool use_dynamic)
+StackFrame::TrackGlobalVariable (const VariableSP &variable_sp, lldb::DynamicValueType use_dynamic)
{
// Check to make sure we aren't already tracking this variable?
ValueObjectSP valobj_sp (GetValueObjectForFrameVariable (variable_sp, use_dynamic));
diff --git a/source/Target/Target.cpp b/source/Target/Target.cpp
index a023bf5..9f3a45e 100644
--- a/source/Target/Target.cpp
+++ b/source/Target/Target.cpp
@@ -890,7 +890,7 @@
StackFrame *frame,
bool unwind_on_error,
bool keep_in_memory,
- bool fetch_dynamic_value,
+ lldb::DynamicValueType use_dynamic,
lldb::ValueObjectSP &result_valobj_sp
)
{
@@ -905,7 +905,12 @@
Error error;
const uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember |
StackFrame::eExpressionPathOptionsNoFragileObjcIvar;
- result_valobj_sp = frame->GetValueForVariableExpressionPath (expr_cstr, expr_path_options, error);
+ lldb::VariableSP var_sp;
+ result_valobj_sp = frame->GetValueForVariableExpressionPath (expr_cstr,
+ use_dynamic,
+ expr_path_options,
+ var_sp,
+ error);
}
else if (m_process_sp)
{
@@ -932,9 +937,9 @@
}
else
{
- if (fetch_dynamic_value)
+ if (use_dynamic != lldb::eNoDynamicValues)
{
- ValueObjectSP dynamic_sp = result_valobj_sp->GetDynamicValue(true);
+ ValueObjectSP dynamic_sp = result_valobj_sp->GetDynamicValue(use_dynamic);
if (dynamic_sp)
result_valobj_sp = dynamic_sp;
}
@@ -1390,7 +1395,7 @@
InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance),
m_expr_prefix_file (),
m_expr_prefix_contents_sp (),
- m_prefer_dynamic_value (true, true),
+ m_prefer_dynamic_value (2),
m_skip_prologue (true, true),
m_source_map (NULL, NULL)
{
@@ -1486,7 +1491,10 @@
}
else if (var_name == GetSettingNameForPreferDynamicValue())
{
- err = UserSettingsController::UpdateBooleanOptionValue (value, op, m_prefer_dynamic_value);
+ int new_value;
+ UserSettingsController::UpdateEnumVariable (g_dynamic_value_types, &new_value, value, err);
+ if (err.Success())
+ m_prefer_dynamic_value = new_value;
}
else if (var_name == GetSettingNameForSkipPrologue())
{
@@ -1579,10 +1587,7 @@
}
else if (var_name == GetSettingNameForPreferDynamicValue())
{
- if (m_prefer_dynamic_value)
- value.AppendString ("true");
- else
- value.AppendString ("false");
+ value.AppendString (g_dynamic_value_types[m_prefer_dynamic_value].string_value);
}
else if (var_name == GetSettingNameForSkipPrologue())
{
@@ -1620,6 +1625,14 @@
//--------------------------------------------------
// Target::SettingsController Variable Tables
//--------------------------------------------------
+OptionEnumValueElement
+TargetInstanceSettings::g_dynamic_value_types[] =
+{
+{ eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"},
+{ eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."},
+{ eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."},
+{ 0, NULL, NULL }
+};
SettingEntry
Target::SettingsController::global_settings_table[] =
@@ -1633,11 +1646,11 @@
SettingEntry
Target::SettingsController::instance_settings_table[] =
{
- // var-name var-type default enum init'd hidden help-text
- // ================= ================== =========== ==== ====== ====== =========================================================================
- { TSC_EXPR_PREFIX , eSetVarTypeString , NULL , NULL, false, false, "Path to a file containing expressions to be prepended to all expressions." },
- { TSC_PREFER_DYNAMIC, eSetVarTypeBoolean ,"true" , NULL, false, false, "Should printed values be shown as their dynamic value." },
- { TSC_SKIP_PROLOGUE , eSetVarTypeBoolean ,"true" , NULL, false, false, "Skip function prologues when setting breakpoints by name." },
- { TSC_SOURCE_MAP , eSetVarTypeArray ,NULL , NULL, false, false, "Source path remappings to use when locating source files from debug information." },
- { NULL , eSetVarTypeNone , NULL , NULL, false, false, NULL }
+ // var-name var-type default enum init'd hidden help-text
+ // ================= ================== =============== ======================= ====== ====== =========================================================================
+ { TSC_EXPR_PREFIX , eSetVarTypeString , NULL , NULL, false, false, "Path to a file containing expressions to be prepended to all expressions." },
+ { TSC_PREFER_DYNAMIC, eSetVarTypeEnum , "no-run-target", g_dynamic_value_types, false, false, "Should printed values be shown as their dynamic value." },
+ { TSC_SKIP_PROLOGUE , eSetVarTypeBoolean ,"true" , NULL, false, false, "Skip function prologues when setting breakpoints by name." },
+ { TSC_SOURCE_MAP , eSetVarTypeArray ,NULL , NULL, false, false, "Source path remappings to use when locating source files from debug information." },
+ { NULL , eSetVarTypeNone , NULL , NULL, false, false, NULL }
};