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/Commands/CommandObjectFrame.cpp b/source/Commands/CommandObjectFrame.cpp
index 6521416..33e735a 100644
--- a/source/Commands/CommandObjectFrame.cpp
+++ b/source/Commands/CommandObjectFrame.cpp
@@ -25,6 +25,7 @@
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Interpreter/Options.h"
+#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
#include "lldb/Symbol/ClangASTType.h"
#include "lldb/Symbol/ClangASTContext.h"
#include "lldb/Symbol/ObjectFile.h"
@@ -285,73 +286,46 @@
{
public:
- class CommandOptions : public Options
+ class OptionGroupFrameVariable : public OptionGroup
{
public:
- CommandOptions (CommandInterpreter &interpreter) :
- Options(interpreter)
+ OptionGroupFrameVariable ()
{
- OptionParsingStarting ();
}
virtual
- ~CommandOptions ()
+ ~OptionGroupFrameVariable ()
{
}
+ virtual uint32_t
+ GetNumDefinitions ();
+
+ virtual const OptionDefinition*
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
+
virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg)
+ SetOptionValue (CommandInterpreter &interpreter,
+ uint32_t option_idx,
+ const char *option_arg)
{
Error error;
- bool success;
- char short_option = (char) m_getopt_table[option_idx].val;
+ char short_option = (char) g_option_table[option_idx].short_option;
switch (short_option)
{
- case 'o': use_objc = true; break;
- case 'd':
- {
- bool success;
- bool result;
- result = Args::StringToBoolean(option_arg, true, &success);
- if (!success)
- error.SetErrorStringWithFormat("Invalid dynamic value setting: \"%s\".\n", option_arg);
- else
- {
- if (result)
- use_dynamic = eLazyBoolYes;
- else
- use_dynamic = eLazyBoolNo;
- }
- }
- break;
case 'r': use_regex = true; break;
case 'a': show_args = false; break;
case 'l': show_locals = false; break;
case 'g': show_globals = true; break;
- case 't': show_types = true; break;
- case 'y': show_summary = false; break;
- case 'L': show_location= true; break;
case 'c': show_decl = true; break;
- case 'D': debug = true; break;
case 'f': error = Args::StringToFormat(option_arg, format, NULL); break;
- case 'F': flat_output = true; break;
- case 'A':
- max_depth = Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success);
- if (!success)
- error.SetErrorStringWithFormat("Invalid max depth '%s'.\n", option_arg);
- break;
-
- case 'p':
- ptr_depth = Args::StringToUInt32 (option_arg, 0, 0, &success);
- if (!success)
- error.SetErrorStringWithFormat("Invalid pointer depth '%s'.\n", option_arg);
- break;
-
case 'G':
globals.push_back(ConstString (option_arg));
break;
-
case 's':
show_scope = true;
break;
@@ -364,52 +338,29 @@
return error;
}
- void
- OptionParsingStarting ()
+ virtual void
+ OptionParsingStarting (CommandInterpreter &interpreter)
{
- use_objc = false;
- use_regex = false;
show_args = true;
- show_locals = true;
- show_globals = false;
- show_types = false;
- show_scope = false;
- show_summary = true;
- show_location = false;
show_decl = false;
- debug = false;
- flat_output = false;
- use_dynamic = eLazyBoolCalculate;
- max_depth = UINT32_MAX;
- ptr_depth = 0;
format = eFormatDefault;
+ show_globals = false;
+ show_locals = true;
+ use_regex = false;
+ show_scope = false;
globals.clear();
}
- const OptionDefinition*
- GetDefinitions ()
- {
- return g_option_table;
- }
-
// Options table: Required for subclasses of Options.
static OptionDefinition g_option_table[];
- bool use_objc:1,
- use_regex:1,
+
+ bool use_regex:1,
show_args:1,
show_locals:1,
show_globals:1,
- show_types:1,
show_scope:1,
- show_summary:1,
- show_location:1,
- show_decl:1,
- debug:1,
- flat_output:1;
- LazyBool use_dynamic;
- uint32_t max_depth; // The depth to print when dumping concrete (not pointers) aggreate values
- uint32_t ptr_depth; // The default depth that is dumped when we find pointers
+ show_decl:1;
lldb::Format format; // The format to use when dumping variables or children of variables
std::vector<ConstString> globals;
// Instance variables to hold the values for command options.
@@ -426,7 +377,9 @@
"'var->child.x'.",
NULL,
eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
- m_options (interpreter)
+ m_option_group (interpreter),
+ m_frame_var_options(),
+ m_varobj_options()
{
CommandArgumentEntry arg;
CommandArgumentData var_name_arg;
@@ -440,6 +393,10 @@
// Push the data for the first argument into the m_arguments vector.
m_arguments.push_back (arg);
+
+ m_option_group.Append (&m_frame_var_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
+ m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
+ m_option_group.Finalize();
}
virtual
@@ -451,7 +408,7 @@
Options *
GetOptions ()
{
- return &m_options;
+ return &m_option_group;
}
@@ -479,40 +436,19 @@
VariableSP var_sp;
ValueObjectSP valobj_sp;
- bool use_dynamic;
-
- // If use dynamic is not set, get it from the target:
- switch (m_options.use_dynamic)
- {
- case eLazyBoolCalculate:
- {
- if (exe_ctx.target->GetPreferDynamicValue())
- use_dynamic = true;
- else
- use_dynamic = false;
- }
- break;
- case eLazyBoolYes:
- use_dynamic = true;
- break;
- case eLazyBoolNo:
- use_dynamic = false;
- break;
- }
-
const char *name_cstr = NULL;
size_t idx;
- if (!m_options.globals.empty())
+ if (!m_frame_var_options.globals.empty())
{
uint32_t fail_count = 0;
if (exe_ctx.target)
{
- const size_t num_globals = m_options.globals.size();
+ const size_t num_globals = m_frame_var_options.globals.size();
for (idx = 0; idx < num_globals; ++idx)
{
VariableList global_var_list;
const uint32_t num_matching_globals
- = exe_ctx.target->GetImages().FindGlobalVariables (m_options.globals[idx],
+ = exe_ctx.target->GetImages().FindGlobalVariables (m_frame_var_options.globals[idx],
true,
UINT32_MAX,
global_var_list);
@@ -521,7 +457,7 @@
{
++fail_count;
result.GetErrorStream().Printf ("error: can't find global variable '%s'\n",
- m_options.globals[idx].AsCString());
+ m_frame_var_options.globals[idx].AsCString());
}
else
{
@@ -530,16 +466,18 @@
var_sp = global_var_list.GetVariableAtIndex(global_idx);
if (var_sp)
{
- valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, use_dynamic);
+ valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp,
+ m_varobj_options.use_dynamic);
if (!valobj_sp)
- valobj_sp = exe_ctx.frame->TrackGlobalVariable (var_sp, use_dynamic);
+ valobj_sp = exe_ctx.frame->TrackGlobalVariable (var_sp,
+ m_varobj_options.use_dynamic);
if (valobj_sp)
{
- if (m_options.format != eFormatDefault)
- valobj_sp->SetFormat (m_options.format);
+ if (m_frame_var_options.format != eFormatDefault)
+ valobj_sp->SetFormat (m_frame_var_options.format);
- if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
+ if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
{
var_sp->GetDeclaration ().DumpStopContext (&s, false);
s.PutCString (": ");
@@ -548,15 +486,15 @@
ValueObject::DumpValueObject (result.GetOutputStream(),
valobj_sp.get(),
name_cstr,
- m_options.ptr_depth,
+ m_varobj_options.ptr_depth,
0,
- m_options.max_depth,
- m_options.show_types,
- m_options.show_location,
- m_options.use_objc,
- use_dynamic,
+ m_varobj_options.max_depth,
+ m_varobj_options.show_types,
+ m_varobj_options.show_location,
+ m_varobj_options.use_objc,
+ m_varobj_options.use_dynamic,
false,
- m_options.flat_output);
+ m_varobj_options.flat_output);
}
}
}
@@ -576,9 +514,9 @@
// variable objects from them...
for (idx = 0; (name_cstr = command.GetArgumentAtIndex(idx)) != NULL; ++idx)
{
- uint32_t ptr_depth = m_options.ptr_depth;
+ uint32_t ptr_depth = m_varobj_options.ptr_depth;
- if (m_options.use_regex)
+ if (m_frame_var_options.use_regex)
{
const uint32_t regex_start_index = regex_var_list.GetSize();
RegularExpression regex (name_cstr);
@@ -597,13 +535,13 @@
var_sp = regex_var_list.GetVariableAtIndex (regex_idx);
if (var_sp)
{
- valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, use_dynamic);
+ valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, m_varobj_options.use_dynamic);
if (valobj_sp)
{
- if (m_options.format != eFormatDefault)
- valobj_sp->SetFormat (m_options.format);
+ if (m_frame_var_options.format != eFormatDefault)
+ valobj_sp->SetFormat (m_frame_var_options.format);
- if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
+ if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
{
var_sp->GetDeclaration ().DumpStopContext (&s, false);
s.PutCString (": ");
@@ -612,15 +550,15 @@
ValueObject::DumpValueObject (result.GetOutputStream(),
valobj_sp.get(),
var_sp->GetName().AsCString(),
- m_options.ptr_depth,
+ m_varobj_options.ptr_depth,
0,
- m_options.max_depth,
- m_options.show_types,
- m_options.show_location,
- m_options.use_objc,
- use_dynamic,
+ m_varobj_options.max_depth,
+ m_varobj_options.show_types,
+ m_varobj_options.show_location,
+ m_varobj_options.use_objc,
+ m_varobj_options.use_dynamic,
false,
- m_options.flat_output);
+ m_varobj_options.flat_output);
}
}
}
@@ -643,16 +581,17 @@
{
Error error;
uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember;
- if (use_dynamic)
- expr_path_options |= StackFrame::eExpressionPathOptionsDynamicValue;
-
- valobj_sp = exe_ctx.frame->GetValueForVariableExpressionPath (name_cstr, expr_path_options, error);
+ lldb::VariableSP var_sp;
+ valobj_sp = exe_ctx.frame->GetValueForVariableExpressionPath (name_cstr,
+ m_varobj_options.use_dynamic,
+ expr_path_options,
+ var_sp,
+ error);
if (valobj_sp)
{
- if (m_options.format != eFormatDefault)
- valobj_sp->SetFormat (m_options.format);
-
- if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
+ if (m_frame_var_options.format != eFormatDefault)
+ valobj_sp->SetFormat (m_frame_var_options.format);
+ if (m_frame_var_options.show_decl && var_sp && var_sp->GetDeclaration ().GetFile())
{
var_sp->GetDeclaration ().DumpStopContext (&s, false);
s.PutCString (": ");
@@ -662,13 +601,13 @@
valobj_sp->GetParent() ? name_cstr : NULL,
ptr_depth,
0,
- m_options.max_depth,
- m_options.show_types,
- m_options.show_location,
- m_options.use_objc,
- use_dynamic,
+ m_varobj_options.max_depth,
+ m_varobj_options.show_types,
+ m_varobj_options.show_location,
+ m_varobj_options.use_objc,
+ m_varobj_options.use_dynamic,
false,
- m_options.flat_output);
+ m_varobj_options.flat_output);
}
else
{
@@ -696,26 +635,26 @@
switch (var_sp->GetScope())
{
case eValueTypeVariableGlobal:
- dump_variable = m_options.show_globals;
- if (dump_variable && m_options.show_scope)
+ dump_variable = m_frame_var_options.show_globals;
+ if (dump_variable && m_frame_var_options.show_scope)
s.PutCString("GLOBAL: ");
break;
case eValueTypeVariableStatic:
- dump_variable = m_options.show_globals;
- if (dump_variable && m_options.show_scope)
+ dump_variable = m_frame_var_options.show_globals;
+ if (dump_variable && m_frame_var_options.show_scope)
s.PutCString("STATIC: ");
break;
case eValueTypeVariableArgument:
- dump_variable = m_options.show_args;
- if (dump_variable && m_options.show_scope)
+ dump_variable = m_frame_var_options.show_args;
+ if (dump_variable && m_frame_var_options.show_scope)
s.PutCString(" ARG: ");
break;
case eValueTypeVariableLocal:
- dump_variable = m_options.show_locals;
- if (dump_variable && m_options.show_scope)
+ dump_variable = m_frame_var_options.show_locals;
+ if (dump_variable && m_frame_var_options.show_scope)
s.PutCString(" LOCAL: ");
break;
@@ -729,17 +668,18 @@
// Use the variable object code to make sure we are
// using the same APIs as the the public API will be
// using...
- valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, use_dynamic);
+ valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp,
+ m_varobj_options.use_dynamic);
if (valobj_sp)
{
- if (m_options.format != eFormatDefault)
- valobj_sp->SetFormat (m_options.format);
+ if (m_frame_var_options.format != eFormatDefault)
+ valobj_sp->SetFormat (m_frame_var_options.format);
// When dumping all variables, don't print any variables
// that are not in scope to avoid extra unneeded output
if (valobj_sp->IsInScope ())
{
- if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
+ if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
{
var_sp->GetDeclaration ().DumpStopContext (&s, false);
s.PutCString (": ");
@@ -747,15 +687,15 @@
ValueObject::DumpValueObject (result.GetOutputStream(),
valobj_sp.get(),
name_cstr,
- m_options.ptr_depth,
+ m_varobj_options.ptr_depth,
0,
- m_options.max_depth,
- m_options.show_types,
- m_options.show_location,
- m_options.use_objc,
- use_dynamic,
+ m_varobj_options.max_depth,
+ m_varobj_options.show_types,
+ m_varobj_options.show_location,
+ m_varobj_options.use_objc,
+ m_varobj_options.use_dynamic,
false,
- m_options.flat_output);
+ m_varobj_options.flat_output);
}
}
}
@@ -769,31 +709,32 @@
}
protected:
- CommandOptions m_options;
+ OptionGroupOptions m_option_group;
+ OptionGroupFrameVariable m_frame_var_options;
+ OptionGroupValueObjectDisplay m_varobj_options;
};
OptionDefinition
-CommandObjectFrameVariable::CommandOptions::g_option_table[] =
+CommandObjectFrameVariable::OptionGroupFrameVariable::g_option_table[] =
{
-{ LLDB_OPT_SET_1, false, "aggregate-depth", 'A', required_argument, NULL, 0, eArgTypeCount, "Set the max recurse depth when dumping aggregate types (default is infinity)."},
{ LLDB_OPT_SET_1, false, "no-args", 'a', no_argument, NULL, 0, eArgTypeNone, "Omit function arguments."},
{ LLDB_OPT_SET_1, false, "show-declaration",'c', no_argument, NULL, 0, eArgTypeNone, "Show variable declaration information (source file and line where the variable was declared)."},
-{ LLDB_OPT_SET_1, false, "debug", 'D', no_argument, NULL, 0, eArgTypeNone, "Enable verbose debug information."},
-{ LLDB_OPT_SET_1, false, "dynamic-type", 'd', required_argument, NULL, 0, eArgTypeBoolean, "Show the object as its full dynamic type, not its static type, if available."},
{ LLDB_OPT_SET_1, false, "format", 'f', required_argument, NULL, 0, eArgTypeExprFormat, "Specify the format that the variable output should use."},
-{ LLDB_OPT_SET_1, false, "flat", 'F', no_argument, NULL, 0, eArgTypeNone, "Display results in a flat format that uses expression paths for each variable or member."},
{ LLDB_OPT_SET_1, false, "show-globals", 'g', no_argument, NULL, 0, eArgTypeNone, "Show the current frame source file global and static variables."},
{ LLDB_OPT_SET_1, false, "find-global", 'G', required_argument, NULL, 0, eArgTypeVarName, "Find a global variable by name (which might not be in the current stack frame source file)."},
-{ LLDB_OPT_SET_1, false, "location", 'L', no_argument, NULL, 0, eArgTypeNone, "Show variable location information."},
{ LLDB_OPT_SET_1, false, "no-locals", 'l', no_argument, NULL, 0, eArgTypeNone, "Omit local variables."},
-{ LLDB_OPT_SET_1, false, "objc", 'o', no_argument, NULL, 0, eArgTypeNone, "When looking up a variable by name, print as an Objective-C object."},
-{ LLDB_OPT_SET_1, false, "ptr-depth", 'p', required_argument, NULL, 0, eArgTypeCount, "The number of pointers to be traversed when dumping values (default is zero)."},
{ LLDB_OPT_SET_1, false, "regex", 'r', no_argument, NULL, 0, eArgTypeRegularExpression, "The <variable-name> argument for name lookups are regular expressions."},
{ LLDB_OPT_SET_1, false, "scope", 's', no_argument, NULL, 0, eArgTypeNone, "Show variable scope (argument, local, global, static)."},
-{ LLDB_OPT_SET_1, false, "show-types", 't', no_argument, NULL, 0, eArgTypeNone, "Show variable types when dumping values."},
-{ LLDB_OPT_SET_1, false, "no-summary", 'y', no_argument, NULL, 0, eArgTypeNone, "Omit summary information."},
{ 0, false, NULL, 0, 0, NULL, NULL, eArgTypeNone, NULL }
};
+
+uint32_t
+CommandObjectFrameVariable::OptionGroupFrameVariable::GetNumDefinitions ()
+{
+ return sizeof(CommandObjectFrameVariable::OptionGroupFrameVariable::g_option_table)/sizeof(OptionDefinition);
+}
+
+
#pragma mark CommandObjectMultiwordFrame
//-------------------------------------------------------------------------