2010-06-08 16:52:24 +00:00
//===-- CommandObjectFrame.cpp ----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
2012-12-05 00:20:57 +00:00
# include "lldb/lldb-python.h"
2010-06-08 16:52:24 +00:00
# include "CommandObjectFrame.h"
// C Includes
// C++ Includes
2011-09-16 21:41:42 +00:00
# include <string>
2010-06-08 16:52:24 +00:00
// Other libraries and framework includes
// Project includes
# include "lldb/Core/Debugger.h"
2010-09-02 00:18:39 +00:00
# include "lldb/Core/Module.h"
# include "lldb/Core/StreamFile.h"
2011-09-16 21:41:42 +00:00
# include "lldb/Core/StreamString.h"
2010-06-08 16:52:24 +00:00
# include "lldb/Core/Timer.h"
2010-09-02 00:18:39 +00:00
# include "lldb/Core/Value.h"
# include "lldb/Core/ValueObject.h"
# include "lldb/Core/ValueObjectVariable.h"
2013-01-28 23:47:25 +00:00
# include "lldb/DataFormatters/DataVisualization.h"
2013-09-30 19:11:51 +00:00
# include "lldb/DataFormatters/ValueObjectPrinter.h"
2011-02-01 01:31:41 +00:00
# include "lldb/Host/Host.h"
2010-09-02 00:18:39 +00:00
# include "lldb/Interpreter/Args.h"
2010-06-08 16:52:24 +00:00
# include "lldb/Interpreter/CommandInterpreter.h"
# include "lldb/Interpreter/CommandReturnObject.h"
2010-09-02 00:18:39 +00:00
# include "lldb/Interpreter/Options.h"
2011-10-25 06:44:01 +00:00
# include "lldb/Interpreter/OptionGroupFormat.h"
2011-05-04 03:43:18 +00:00
# include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
2011-07-07 04:38:25 +00:00
# include "lldb/Interpreter/OptionGroupVariable.h"
2010-09-02 00:18:39 +00:00
# include "lldb/Symbol/ClangASTType.h"
# include "lldb/Symbol/ClangASTContext.h"
# include "lldb/Symbol/ObjectFile.h"
# include "lldb/Symbol/SymbolContext.h"
# include "lldb/Symbol/Type.h"
# include "lldb/Symbol/Variable.h"
# include "lldb/Symbol/VariableList.h"
2010-06-08 16:52:24 +00:00
# include "lldb/Target/Process.h"
2013-11-04 09:33:30 +00:00
# include "lldb/Target/StackFrame.h"
2010-06-08 16:52:24 +00:00
# include "lldb/Target/Thread.h"
2010-09-02 00:18:39 +00:00
# include "lldb/Target/Target.h"
2010-06-08 16:52:24 +00:00
using namespace lldb ;
using namespace lldb_private ;
# pragma mark CommandObjectFrameInfo
//-------------------------------------------------------------------------
// CommandObjectFrameInfo
//-------------------------------------------------------------------------
2012-06-08 21:56:10 +00:00
class CommandObjectFrameInfo : public CommandObjectParsed
2010-06-08 16:52:24 +00:00
{
public :
2010-09-18 01:14:36 +00:00
CommandObjectFrameInfo ( CommandInterpreter & interpreter ) :
2012-06-08 21:56:10 +00:00
CommandObjectParsed ( interpreter ,
" frame info " ,
" List information about the currently selected frame in the current thread. " ,
" frame info " ,
2013-01-09 19:44:40 +00:00
eFlagRequiresFrame |
eFlagTryTargetAPILock |
eFlagProcessMustBeLaunched |
eFlagProcessMustBePaused )
2010-06-08 16:52:24 +00:00
{
}
~ CommandObjectFrameInfo ( )
{
}
2012-06-08 21:56:10 +00:00
protected :
2010-06-08 16:52:24 +00:00
bool
2013-01-09 19:44:40 +00:00
DoExecute ( Args & command , CommandReturnObject & result )
2010-06-08 16:52:24 +00:00
{
2013-01-09 19:44:40 +00:00
m_exe_ctx . GetFrameRef ( ) . DumpUsingSettingsFormat ( & result . GetOutputStream ( ) ) ;
result . SetStatus ( eReturnStatusSuccessFinishResult ) ;
2010-06-08 16:52:24 +00:00
return result . Succeeded ( ) ;
}
} ;
# pragma mark CommandObjectFrameSelect
//-------------------------------------------------------------------------
// CommandObjectFrameSelect
//-------------------------------------------------------------------------
2012-06-08 21:56:10 +00:00
class CommandObjectFrameSelect : public CommandObjectParsed
2010-06-08 16:52:24 +00:00
{
public :
2010-10-10 22:28:11 +00:00
class CommandOptions : public Options
{
public :
2011-04-07 22:46:35 +00:00
CommandOptions ( CommandInterpreter & interpreter ) :
2011-04-08 22:39:17 +00:00
Options ( interpreter )
2010-10-10 22:28:11 +00:00
{
2011-04-13 00:18:08 +00:00
OptionParsingStarting ( ) ;
2010-10-10 22:28:11 +00:00
}
virtual
~ CommandOptions ( )
{
}
virtual Error
2011-04-13 00:18:08 +00:00
SetOptionValue ( uint32_t option_idx , const char * option_arg )
2010-10-10 22:28:11 +00:00
{
Error error ;
bool success = false ;
2012-12-04 00:32:51 +00:00
const int short_option = m_getopt_table [ option_idx ] . val ;
2010-10-10 22:28:11 +00:00
switch ( short_option )
{
case ' r ' :
relative_frame_offset = Args : : StringToSInt32 ( option_arg , INT32_MIN , 0 , & success ) ;
if ( ! success )
2011-10-26 00:56:27 +00:00
error . SetErrorStringWithFormat ( " invalid frame offset argument '%s' " , option_arg ) ;
2010-10-10 22:28:11 +00:00
break ;
default :
2011-10-26 00:56:27 +00:00
error . SetErrorStringWithFormat ( " invalid short option character '%c' " , short_option ) ;
2010-10-10 22:28:11 +00:00
break ;
}
return error ;
}
void
2011-04-13 00:18:08 +00:00
OptionParsingStarting ( )
2010-10-10 22:28:11 +00:00
{
relative_frame_offset = INT32_MIN ;
}
2011-03-24 21:19:54 +00:00
const OptionDefinition *
2010-10-10 22:28:11 +00:00
GetDefinitions ( )
{
return g_option_table ;
}
// Options table: Required for subclasses of Options.
2011-03-24 21:19:54 +00:00
static OptionDefinition g_option_table [ ] ;
2010-10-10 22:28:11 +00:00
int32_t relative_frame_offset ;
} ;
2010-09-18 01:14:36 +00:00
CommandObjectFrameSelect ( CommandInterpreter & interpreter ) :
2012-06-08 21:56:10 +00:00
CommandObjectParsed ( interpreter ,
" frame select " ,
" Select a frame by index from within the current thread and make it the current frame. " ,
NULL ,
2013-01-09 19:44:40 +00:00
eFlagRequiresThread |
eFlagTryTargetAPILock |
eFlagProcessMustBeLaunched |
eFlagProcessMustBePaused ) ,
2011-04-07 22:46:35 +00:00
m_options ( interpreter )
2010-06-08 16:52:24 +00:00
{
2010-10-04 22:28:36 +00:00
CommandArgumentEntry arg ;
CommandArgumentData index_arg ;
// Define the first (and only) variant of this arg.
index_arg . arg_type = eArgTypeFrameIndex ;
2010-10-10 22:28:11 +00:00
index_arg . arg_repetition = eArgRepeatOptional ;
2010-10-04 22:28:36 +00:00
// There is only one variant this argument could be; put it into the argument entry.
arg . push_back ( index_arg ) ;
// Push the data for the first argument into the m_arguments vector.
m_arguments . push_back ( arg ) ;
2010-06-08 16:52:24 +00:00
}
~ CommandObjectFrameSelect ( )
{
}
2010-10-10 22:28:11 +00:00
virtual
Options *
GetOptions ( )
{
return & m_options ;
}
2012-06-08 21:56:10 +00:00
protected :
2010-06-08 16:52:24 +00:00
bool
2013-01-09 19:44:40 +00:00
DoExecute ( Args & command , CommandReturnObject & result )
2010-06-08 16:52:24 +00:00
{
2013-01-09 19:44:40 +00:00
// No need to check "thread" for validity as eFlagRequiresThread ensures it is valid
Thread * thread = m_exe_ctx . GetThreadPtr ( ) ;
uint32_t frame_idx = UINT32_MAX ;
if ( m_options . relative_frame_offset ! = INT32_MIN )
2010-06-08 16:52:24 +00:00
{
2013-01-09 19:44:40 +00:00
// The one and only argument is a signed relative frame index
frame_idx = thread - > GetSelectedFrameIndex ( ) ;
if ( frame_idx = = UINT32_MAX )
frame_idx = 0 ;
if ( m_options . relative_frame_offset < 0 )
2010-06-08 16:52:24 +00:00
{
2013-01-09 19:44:40 +00:00
if ( frame_idx > = - m_options . relative_frame_offset )
frame_idx + = m_options . relative_frame_offset ;
2010-10-10 22:28:11 +00:00
else
{
2013-01-09 19:44:40 +00:00
if ( frame_idx = = 0 )
{
//If you are already at the bottom of the stack, then just warn and don't reset the frame.
result . AppendError ( " Already at the bottom of the stack " ) ;
result . SetStatus ( eReturnStatusFailed ) ;
return false ;
}
else
frame_idx = 0 ;
2010-10-10 22:28:11 +00:00
}
}
2013-01-09 19:44:40 +00:00
else if ( m_options . relative_frame_offset > 0 )
2010-10-10 22:28:11 +00:00
{
2013-01-09 19:44:40 +00:00
// I don't want "up 20" where "20" takes you past the top of the stack to produce
// an error, but rather to just go to the top. So I have to count the stack here...
const uint32_t num_frames = thread - > GetStackFrameCount ( ) ;
if ( num_frames - frame_idx > m_options . relative_frame_offset )
frame_idx + = m_options . relative_frame_offset ;
else
2010-10-10 22:28:11 +00:00
{
2013-01-09 19:44:40 +00:00
if ( frame_idx = = num_frames - 1 )
2010-06-08 16:52:24 +00:00
{
2013-01-09 19:44:40 +00:00
//If we are already at the top of the stack, just warn and don't reset the frame.
result . AppendError ( " Already at the top of the stack " ) ;
result . SetStatus ( eReturnStatusFailed ) ;
return false ;
2010-06-08 16:52:24 +00:00
}
2013-01-09 19:44:40 +00:00
else
frame_idx = num_frames - 1 ;
2010-06-08 16:52:24 +00:00
}
}
}
2013-01-09 19:44:40 +00:00
else
2010-06-08 16:52:24 +00:00
{
2013-01-09 19:44:40 +00:00
if ( command . GetArgumentCount ( ) = = 1 )
{
const char * frame_idx_cstr = command . GetArgumentAtIndex ( 0 ) ;
2013-11-05 18:25:23 +00:00
bool success = false ;
frame_idx = Args : : StringToUInt32 ( frame_idx_cstr , UINT32_MAX , 0 , & success ) ;
if ( ! success )
{
result . AppendErrorWithFormat ( " invalid frame index argument '%s' " , frame_idx_cstr ) ;
result . SetStatus ( eReturnStatusFailed ) ;
return false ;
}
2013-01-09 19:44:40 +00:00
}
else if ( command . GetArgumentCount ( ) = = 0 )
{
frame_idx = thread - > GetSelectedFrameIndex ( ) ;
if ( frame_idx = = UINT32_MAX )
{
frame_idx = 0 ;
}
}
else
{
result . AppendError ( " invalid arguments. \n " ) ;
m_options . GenerateOptionUsage ( result . GetErrorStream ( ) , this ) ;
}
2010-06-08 16:52:24 +00:00
}
2013-01-09 19:44:40 +00:00
2013-01-31 21:46:01 +00:00
bool success = thread - > SetSelectedFrameByIndexNoisily ( frame_idx , result . GetOutputStream ( ) ) ;
2013-01-09 19:44:40 +00:00
if ( success )
{
m_exe_ctx . SetFrameSP ( thread - > GetSelectedFrame ( ) ) ;
2013-01-31 21:46:01 +00:00
result . SetStatus ( eReturnStatusSuccessFinishResult ) ;
2013-01-09 19:44:40 +00:00
}
2013-01-31 21:46:01 +00:00
else
{
result . AppendErrorWithFormat ( " Frame index (%u) out of range. \n " , frame_idx ) ;
result . SetStatus ( eReturnStatusFailed ) ;
}
return result . Succeeded ( ) ;
2010-06-08 16:52:24 +00:00
}
2010-10-10 22:28:11 +00:00
protected :
CommandOptions m_options ;
} ;
2011-03-24 21:19:54 +00:00
OptionDefinition
2010-10-10 22:28:11 +00:00
CommandObjectFrameSelect : : CommandOptions : : g_option_table [ ] =
{
2013-09-05 16:42:23 +00:00
{ LLDB_OPT_SET_1 , false , " relative " , ' r ' , OptionParser : : eRequiredArgument , NULL , 0 , eArgTypeOffset , " A relative frame index offset from the current frame index. " } ,
2012-09-11 16:09:27 +00:00
{ 0 , false , NULL , 0 , 0 , NULL , 0 , eArgTypeNone , NULL }
2010-06-08 16:52:24 +00:00
} ;
2010-09-02 00:18:39 +00:00
# pragma mark CommandObjectFrameVariable
//----------------------------------------------------------------------
// List images with associated information
//----------------------------------------------------------------------
2012-06-08 21:56:10 +00:00
class CommandObjectFrameVariable : public CommandObjectParsed
2010-09-02 00:18:39 +00:00
{
public :
2010-09-18 01:14:36 +00:00
CommandObjectFrameVariable ( CommandInterpreter & interpreter ) :
2012-06-08 21:56:10 +00:00
CommandObjectParsed ( interpreter ,
" frame variable " ,
" Show frame variables. All argument and local variables "
" that are in scope will be shown when no arguments are given. "
" If any arguments are specified, they can be names of "
" argument, local, file static and file global variables. "
" Children of aggregate variables can be specified such as "
" 'var->child.x'. " ,
NULL ,
2013-01-09 19:44:40 +00:00
eFlagRequiresFrame |
eFlagTryTargetAPILock |
eFlagProcessMustBeLaunched |
2013-02-21 01:29:04 +00:00
eFlagProcessMustBePaused |
eFlagRequiresProcess ) ,
2011-05-04 03:43:18 +00:00
m_option_group ( interpreter ) ,
2011-07-07 04:38:25 +00:00
m_option_variable ( true ) , // Include the frame specific options by passing "true"
2011-10-25 06:44:01 +00:00
m_option_format ( eFormatDefault ) ,
2011-05-04 03:43:18 +00:00
m_varobj_options ( )
2010-09-02 00:18:39 +00:00
{
2010-10-04 22:28:36 +00:00
CommandArgumentEntry arg ;
CommandArgumentData var_name_arg ;
// Define the first (and only) variant of this arg.
var_name_arg . arg_type = eArgTypeVarName ;
var_name_arg . arg_repetition = eArgRepeatStar ;
// There is only one variant this argument could be; put it into the argument entry.
arg . push_back ( var_name_arg ) ;
// Push the data for the first argument into the m_arguments vector.
m_arguments . push_back ( arg ) ;
2011-05-04 03:43:18 +00:00
2011-07-07 04:38:25 +00:00
m_option_group . Append ( & m_option_variable , LLDB_OPT_SET_ALL , LLDB_OPT_SET_1 ) ;
2011-10-27 17:55:14 +00:00
m_option_group . Append ( & m_option_format , OptionGroupFormat : : OPTION_GROUP_FORMAT | OptionGroupFormat : : OPTION_GROUP_GDB_FMT , LLDB_OPT_SET_1 ) ;
2011-05-04 03:43:18 +00:00
m_option_group . Append ( & m_varobj_options , LLDB_OPT_SET_ALL , LLDB_OPT_SET_1 ) ;
m_option_group . Finalize ( ) ;
2010-09-02 00:18:39 +00:00
}
virtual
~ CommandObjectFrameVariable ( )
{
}
virtual
Options *
GetOptions ( )
{
2011-05-04 03:43:18 +00:00
return & m_option_group ;
2010-09-02 00:18:39 +00:00
}
2013-05-14 23:43:18 +00:00
virtual int
HandleArgumentCompletion ( Args & input ,
int & cursor_index ,
int & cursor_char_position ,
OptionElementVector & opt_element_vector ,
int match_start_point ,
int max_return_elements ,
bool & word_complete ,
StringList & matches )
{
// Arguments are the standard source file completer.
std : : string completion_str ( input . GetArgumentAtIndex ( cursor_index ) ) ;
completion_str . erase ( cursor_char_position ) ;
CommandCompletions : : InvokeCommonCompletionCallbacks ( m_interpreter ,
CommandCompletions : : eVariablePathCompletion ,
completion_str . c_str ( ) ,
match_start_point ,
max_return_elements ,
NULL ,
word_complete ,
matches ) ;
return matches . GetSize ( ) ;
}
2010-09-02 00:18:39 +00:00
2012-06-08 21:56:10 +00:00
protected :
2010-09-02 00:18:39 +00:00
virtual bool
2012-06-08 21:56:10 +00:00
DoExecute ( Args & command , CommandReturnObject & result )
2010-09-02 00:18:39 +00:00
{
2013-01-09 19:44:40 +00:00
// No need to check "frame" for validity as eFlagRequiresFrame ensures it is valid
2013-11-04 09:33:30 +00:00
StackFrame * frame = m_exe_ctx . GetFramePtr ( ) ;
2011-09-12 23:58:53 +00:00
Stream & s = result . GetOutputStream ( ) ;
bool get_file_globals = true ;
// Be careful about the stack frame, if any summary formatter runs code, it might clear the StackFrameList
// for the thread. So hold onto a shared pointer to the frame so it stays alive.
2011-09-22 04:58:26 +00:00
VariableList * variable_list = frame - > GetVariableList ( get_file_globals ) ;
2011-09-12 23:58:53 +00:00
VariableSP var_sp ;
ValueObjectSP valobj_sp ;
const char * name_cstr = NULL ;
size_t idx ;
2012-02-15 02:34:21 +00:00
TypeSummaryImplSP summary_format_sp ;
2012-08-09 22:02:51 +00:00
if ( ! m_option_variable . summary . IsCurrentValueEmpty ( ) )
DataVisualization : : NamedSummaryFormats : : GetSummaryFormat ( ConstString ( m_option_variable . summary . GetCurrentValue ( ) ) , summary_format_sp ) ;
else if ( ! m_option_variable . summary_string . IsCurrentValueEmpty ( ) )
summary_format_sp . reset ( new StringSummaryFormat ( TypeSummaryImpl : : Flags ( ) , m_option_variable . summary_string . GetCurrentValue ( ) ) ) ;
2011-09-12 23:58:53 +00:00
2013-09-30 19:11:51 +00:00
DumpValueObjectOptions options ( m_varobj_options . GetAsDumpOptions ( eLanguageRuntimeDescriptionDisplayVerbosityFull , eFormatDefault , summary_format_sp ) ) ;
2011-09-12 23:58:53 +00:00
if ( variable_list )
2010-09-02 00:18:39 +00:00
{
2011-10-25 06:44:01 +00:00
const Format format = m_option_format . GetFormat ( ) ;
2012-03-01 04:24:26 +00:00
options . SetFormat ( format ) ;
2011-10-25 06:44:01 +00:00
2011-09-12 23:58:53 +00:00
if ( command . GetArgumentCount ( ) > 0 )
{
VariableList regex_var_list ;
// If we have any args to the variable command, we will make
// variable objects from them...
for ( idx = 0 ; ( name_cstr = command . GetArgumentAtIndex ( idx ) ) ! = NULL ; + + idx )
{
if ( m_option_variable . use_regex )
2010-09-02 00:18:39 +00:00
{
2013-01-25 18:06:21 +00:00
const size_t regex_start_index = regex_var_list . GetSize ( ) ;
2011-09-12 23:58:53 +00:00
RegularExpression regex ( name_cstr ) ;
if ( regex . Compile ( name_cstr ) )
2010-09-02 00:18:39 +00:00
{
2011-09-12 23:58:53 +00:00
size_t num_matches = 0 ;
const size_t num_new_regex_vars = variable_list - > AppendVariablesIfUnique ( regex ,
regex_var_list ,
num_matches ) ;
if ( num_new_regex_vars > 0 )
2010-09-02 00:18:39 +00:00
{
2013-01-25 18:06:21 +00:00
for ( size_t regex_idx = regex_start_index , end_index = regex_var_list . GetSize ( ) ;
2011-09-12 23:58:53 +00:00
regex_idx < end_index ;
+ + regex_idx )
2010-09-02 00:18:39 +00:00
{
2011-09-12 23:58:53 +00:00
var_sp = regex_var_list . GetVariableAtIndex ( regex_idx ) ;
if ( var_sp )
2010-09-02 00:18:39 +00:00
{
2011-09-22 04:58:26 +00:00
valobj_sp = frame - > GetValueObjectForFrameVariable ( var_sp , m_varobj_options . use_dynamic ) ;
2011-09-12 23:58:53 +00:00
if ( valobj_sp )
2010-09-02 00:18:39 +00:00
{
2012-01-26 21:08:30 +00:00
// if (format != eFormatDefault)
// valobj_sp->SetFormat (format);
2011-09-12 23:58:53 +00:00
if ( m_option_variable . show_decl & & var_sp - > GetDeclaration ( ) . GetFile ( ) )
{
bool show_fullpaths = false ;
bool show_module = true ;
if ( var_sp - > DumpDeclaration ( & s , show_fullpaths , show_module ) )
s . PutCString ( " : " ) ;
2010-10-10 23:55:27 +00:00
}
2013-09-30 19:11:51 +00:00
valobj_sp - > Dump ( result . GetOutputStream ( ) , options ) ;
2010-10-10 23:55:27 +00:00
}
}
}
}
2011-09-12 23:58:53 +00:00
else if ( num_matches = = 0 )
2010-10-10 23:55:27 +00:00
{
2011-09-12 23:58:53 +00:00
result . GetErrorStream ( ) . Printf ( " error: no variables matched the regular expression '%s'. \n " , name_cstr ) ;
2010-10-10 23:55:27 +00:00
}
}
2011-09-12 23:58:53 +00:00
else
2010-10-10 23:55:27 +00:00
{
2011-09-12 23:58:53 +00:00
char regex_error [ 1024 ] ;
if ( regex . GetErrorAsCString ( regex_error , sizeof ( regex_error ) ) )
result . GetErrorStream ( ) . Printf ( " error: %s \n " , regex_error ) ;
2010-10-10 23:55:27 +00:00
else
2011-09-12 23:58:53 +00:00
result . GetErrorStream ( ) . Printf ( " error: unkown regex error when compiling '%s' \n " , name_cstr ) ;
}
}
else // No regex, either exact variable names or variable expressions.
{
Error error ;
2013-11-04 09:33:30 +00:00
uint32_t expr_path_options = StackFrame : : eExpressionPathOptionCheckPtrVsMember |
StackFrame : : eExpressionPathOptionsAllowDirectIVarAccess ;
2011-09-12 23:58:53 +00:00
lldb : : VariableSP var_sp ;
2011-09-22 04:58:26 +00:00
valobj_sp = frame - > GetValueForVariableExpressionPath ( name_cstr ,
m_varobj_options . use_dynamic ,
expr_path_options ,
var_sp ,
error ) ;
2011-09-12 23:58:53 +00:00
if ( valobj_sp )
{
2012-01-26 21:08:30 +00:00
// if (format != eFormatDefault)
// valobj_sp->SetFormat (format);
2011-09-12 23:58:53 +00:00
if ( m_option_variable . show_decl & & var_sp & & var_sp - > GetDeclaration ( ) . GetFile ( ) )
2010-10-10 23:55:27 +00:00
{
2011-09-12 23:58:53 +00:00
var_sp - > GetDeclaration ( ) . DumpStopContext ( & s , false ) ;
s . PutCString ( " : " ) ;
2010-10-10 23:55:27 +00:00
}
2012-03-01 04:24:26 +00:00
options . SetFormat ( format ) ;
2011-09-12 23:58:53 +00:00
Stream & output_stream = result . GetOutputStream ( ) ;
2012-03-01 04:24:26 +00:00
options . SetRootValueObjectName ( valobj_sp - > GetParent ( ) ? name_cstr : NULL ) ;
2013-09-30 19:11:51 +00:00
valobj_sp - > Dump ( output_stream , options ) ;
2011-09-12 23:58:53 +00:00
}
else
{
const char * error_cstr = error . AsCString ( NULL ) ;
if ( error_cstr )
result . GetErrorStream ( ) . Printf ( " error: %s \n " , error_cstr ) ;
else
result . GetErrorStream ( ) . Printf ( " error: unable to find any variable expression path that matches '%s' \n " , name_cstr ) ;
2010-09-13 03:44:33 +00:00
}
2010-09-02 00:18:39 +00:00
}
}
2011-09-12 23:58:53 +00:00
}
else // No command arg specified. Use variable_list, instead.
{
2013-01-25 18:06:21 +00:00
const size_t num_variables = variable_list - > GetSize ( ) ;
2011-09-12 23:58:53 +00:00
if ( num_variables > 0 )
2010-09-13 03:44:33 +00:00
{
2013-01-25 18:06:21 +00:00
for ( size_t i = 0 ; i < num_variables ; i + + )
2010-09-13 03:44:33 +00:00
{
2011-09-12 23:58:53 +00:00
var_sp = variable_list - > GetVariableAtIndex ( i ) ;
bool dump_variable = true ;
switch ( var_sp - > GetScope ( ) )
2010-09-13 03:44:33 +00:00
{
case eValueTypeVariableGlobal :
2011-07-07 04:38:25 +00:00
dump_variable = m_option_variable . show_globals ;
if ( dump_variable & & m_option_variable . show_scope )
2010-09-13 03:44:33 +00:00
s . PutCString ( " GLOBAL: " ) ;
break ;
case eValueTypeVariableStatic :
2011-07-07 04:38:25 +00:00
dump_variable = m_option_variable . show_globals ;
if ( dump_variable & & m_option_variable . show_scope )
2010-09-13 03:44:33 +00:00
s . PutCString ( " STATIC: " ) ;
break ;
2011-09-12 23:58:53 +00:00
2010-09-13 03:44:33 +00:00
case eValueTypeVariableArgument :
2011-07-07 04:38:25 +00:00
dump_variable = m_option_variable . show_args ;
if ( dump_variable & & m_option_variable . show_scope )
2010-09-13 03:44:33 +00:00
s . PutCString ( " ARG: " ) ;
break ;
2011-09-12 23:58:53 +00:00
2010-09-13 03:44:33 +00:00
case eValueTypeVariableLocal :
2011-07-07 04:38:25 +00:00
dump_variable = m_option_variable . show_locals ;
if ( dump_variable & & m_option_variable . show_scope )
2010-09-13 03:44:33 +00:00
s . PutCString ( " LOCAL: " ) ;
break ;
default :
break ;
2011-09-12 23:58:53 +00:00
}
2010-09-13 03:44:33 +00:00
2011-09-12 23:58:53 +00:00
if ( dump_variable )
{
// Use the variable object code to make sure we are
// using the same APIs as the the public API will be
// using...
2011-09-22 04:58:26 +00:00
valobj_sp = frame - > GetValueObjectForFrameVariable ( var_sp ,
m_varobj_options . use_dynamic ) ;
2011-09-12 23:58:53 +00:00
if ( valobj_sp )
{
2012-01-26 21:08:30 +00:00
// if (format != eFormatDefault)
// valobj_sp->SetFormat (format);
2011-09-12 23:58:53 +00:00
// When dumping all variables, don't print any variables
// that are not in scope to avoid extra unneeded output
if ( valobj_sp - > IsInScope ( ) )
2010-09-13 03:44:33 +00:00
{
2011-09-12 23:58:53 +00:00
if ( m_option_variable . show_decl & & var_sp - > GetDeclaration ( ) . GetFile ( ) )
2010-09-13 03:44:33 +00:00
{
2011-09-12 23:58:53 +00:00
var_sp - > GetDeclaration ( ) . DumpStopContext ( & s , false ) ;
s . PutCString ( " : " ) ;
2010-09-14 03:16:58 +00:00
}
2012-03-01 04:24:26 +00:00
options . SetFormat ( format ) ;
options . SetRootValueObjectName ( name_cstr ) ;
2013-09-30 19:11:51 +00:00
valobj_sp - > Dump ( result . GetOutputStream ( ) , options ) ;
2010-09-13 03:44:33 +00:00
}
}
}
}
}
2010-09-02 00:18:39 +00:00
}
2011-09-12 23:58:53 +00:00
result . SetStatus ( eReturnStatusSuccessFinishResult ) ;
2010-09-02 00:18:39 +00:00
}
2011-08-12 16:42:31 +00:00
if ( m_interpreter . TruncationWarningNecessary ( ) )
{
result . GetOutputStream ( ) . Printf ( m_interpreter . TruncationWarningText ( ) ,
m_cmd_name . c_str ( ) ) ;
m_interpreter . TruncationWarningGiven ( ) ;
}
2010-09-02 00:18:39 +00:00
return result . Succeeded ( ) ;
}
protected :
2011-05-04 03:43:18 +00:00
OptionGroupOptions m_option_group ;
2011-07-07 04:38:25 +00:00
OptionGroupVariable m_option_variable ;
2011-10-25 06:44:01 +00:00
OptionGroupFormat m_option_format ;
2011-05-04 03:43:18 +00:00
OptionGroupValueObjectDisplay m_varobj_options ;
2010-09-02 00:18:39 +00:00
} ;
2011-05-04 03:43:18 +00:00
2010-06-08 16:52:24 +00:00
# pragma mark CommandObjectMultiwordFrame
//-------------------------------------------------------------------------
// CommandObjectMultiwordFrame
//-------------------------------------------------------------------------
2010-06-23 01:19:29 +00:00
CommandObjectMultiwordFrame : : CommandObjectMultiwordFrame ( CommandInterpreter & interpreter ) :
2010-09-18 01:14:36 +00:00
CommandObjectMultiword ( interpreter ,
" frame " ,
2010-06-08 16:52:24 +00:00
" A set of commands for operating on the current thread's frames. " ,
" frame <subcommand> [<subcommand-options>] " )
{
2010-09-18 01:14:36 +00:00
LoadSubCommand ( " info " , CommandObjectSP ( new CommandObjectFrameInfo ( interpreter ) ) ) ;
LoadSubCommand ( " select " , CommandObjectSP ( new CommandObjectFrameSelect ( interpreter ) ) ) ;
LoadSubCommand ( " variable " , CommandObjectSP ( new CommandObjectFrameVariable ( interpreter ) ) ) ;
2010-06-08 16:52:24 +00:00
}
CommandObjectMultiwordFrame : : ~ CommandObjectMultiwordFrame ( )
{
}