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 }
 };