[Lldb-commits] [lldb] r158251 - in /lldb/branches/lldb-platform-work: ./ include/lldb/Host/ include/lldb/Interpreter/ scripts/Python/interface/ source/Commands/ source/Expression/ source/Host/common/ source/Interpreter/ source/Plugins/Process/gdb-remote/ test/functionalities/register/
Johnny Chen
johnny.chen at apple.com
Fri Jun 8 17:52:06 PDT 2012
Author: johnny
Date: Fri Jun 8 19:52:06 2012
New Revision: 158251
URL: http://llvm.org/viewvc/llvm-project?rev=158251&view=rev
Log:
Merge changes from ToT trunk.
Resolved conflicts and update CommandObjectPlatform.cpp due to r158235.
Modified:
lldb/branches/lldb-platform-work/ (props changed)
lldb/branches/lldb-platform-work/include/lldb/Host/Mutex.h
lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObject.h
lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectCrossref.h
lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectMultiword.h
lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectRegexCommand.h
lldb/branches/lldb-platform-work/scripts/Python/interface/SBWatchpoint.i
lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectCommands.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectCrossref.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectFrame.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectLog.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectMemory.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectMultiword.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectProcess.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectRegister.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectSource.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectTarget.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectThread.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectType.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.h
lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.cpp
lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.h
lldb/branches/lldb-platform-work/source/Expression/ClangExpressionParser.cpp
lldb/branches/lldb-platform-work/source/Expression/IRForTarget.cpp
lldb/branches/lldb-platform-work/source/Host/common/Mutex.cpp
lldb/branches/lldb-platform-work/source/Interpreter/CommandInterpreter.cpp
lldb/branches/lldb-platform-work/source/Interpreter/CommandObject.cpp
lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectRegexCommand.cpp
lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.cpp
lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.h
lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/branches/lldb-platform-work/test/functionalities/register/TestRegisters.py
Propchange: lldb/branches/lldb-platform-work/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 8 19:52:06 2012
@@ -1 +1 @@
-/lldb/trunk:154223-158207
+/lldb/trunk:154223-158240
Modified: lldb/branches/lldb-platform-work/include/lldb/Host/Mutex.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Host/Mutex.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/include/lldb/Host/Mutex.h (original)
+++ lldb/branches/lldb-platform-work/include/lldb/Host/Mutex.h Fri Jun 8 19:52:06 2012
@@ -14,6 +14,10 @@
#include <pthread.h>
#include <assert.h>
+#ifdef LLDB_CONFIGURATION_DEBUG
+#include <string>
+#endif
+
namespace lldb_private {
//----------------------------------------------------------------------
@@ -121,13 +125,13 @@
/// returns \b false otherwise.
//--------------------------------------------------------------
bool
- TryLock (Mutex &mutex);
+ TryLock (Mutex &mutex, const char *failure_message = NULL);
bool
- TryLock (Mutex *mutex)
+ TryLock (Mutex *mutex, const char *failure_message = NULL)
{
if (mutex)
- return TryLock(*mutex);
+ return TryLock(*mutex, failure_message);
else
return false;
}
@@ -139,9 +143,7 @@
//--------------------------------------------------------------
/// Member variables
//--------------------------------------------------------------
- pthread_mutex_t *m_mutex_ptr; ///< A pthread mutex that is locked when
- ///< acquired and unlocked when destroyed
- ///< or reset.
+ Mutex *m_mutex_ptr;
private:
Locker(const Locker&);
@@ -176,6 +178,9 @@
///
/// Destroys the mutex owned by this object.
//------------------------------------------------------------------
+#ifdef LLDB_CONFIGURATION_DEBUG
+ virtual
+#endif
~Mutex();
//------------------------------------------------------------------
@@ -201,8 +206,11 @@
/// @return
/// The error code from \c pthread_mutex_trylock().
//------------------------------------------------------------------
+#ifdef LLDB_CONFIGURATION_DEBUG
+ virtual
+#endif
int
- TryLock();
+ TryLock(const char *failure_message = NULL);
//------------------------------------------------------------------
/// Unlock the mutex.
@@ -215,22 +223,18 @@
/// @return
/// The error code from \c pthread_mutex_unlock().
//------------------------------------------------------------------
+#ifdef LLDB_CONFIGURATION_DEBUG
+ virtual
+#endif
int
Unlock();
- static
- int Lock (pthread_mutex_t *mutex_ptr);
-
- static
- int TryLock (pthread_mutex_t *mutex_ptr);
-
- static
- int Unlock (pthread_mutex_t *mutex_ptr);
-
protected:
//------------------------------------------------------------------
// Member variables
//------------------------------------------------------------------
+ // TODO: Hide the mutex in the implementation file in case we ever need to port to an
+ // architecture that doesn't have pthread mutexes.
pthread_mutex_t m_mutex; ///< The pthread mutex object.
private:
@@ -247,6 +251,37 @@
const Mutex& operator=(const Mutex&);
};
+#ifdef LLDB_CONFIGURATION_DEBUG
+class TrackingMutex : public Mutex
+{
+public:
+ TrackingMutex() : Mutex() {}
+ TrackingMutex(Mutex::Type type) : Mutex (type) {}
+
+ virtual
+ ~TrackingMutex() {}
+
+ virtual int
+ Unlock ();
+
+ virtual int
+ TryLock (const char *failure_message = NULL)
+ {
+ int return_value = Mutex::TryLock();
+ if (return_value != 0 && failure_message != NULL)
+ {
+ m_failure_message.assign(failure_message);
+ m_thread_that_tried = pthread_self();
+ }
+ return return_value;
+ }
+
+protected:
+ pthread_t m_thread_that_tried;
+ std::string m_failure_message;
+};
+#endif
+
} // namespace lldb_private
#endif // #if defined(__cplusplus)
Modified: lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObject.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObject.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObject.h (original)
+++ lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObject.h Fri Jun 8 19:52:06 2012
@@ -145,7 +145,7 @@
IsMultiwordObject () { return false; }
virtual bool
- WantsRawCommandString() { return false; }
+ WantsRawCommandString() = 0;
// By default, WantsCompletion = !WantsRawCommandString.
// Subclasses who want raw command string but desire, for example,
@@ -198,22 +198,6 @@
ParseOptions (Args& args,
CommandReturnObject &result);
- bool
- ExecuteWithOptions (Args& command,
- CommandReturnObject &result);
-
- virtual bool
- ExecuteRawCommandString (const char *command,
- CommandReturnObject &result)
- {
- return false;
- }
-
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result) = 0;
-
void
SetCommandName (const char *name);
@@ -337,7 +321,10 @@
/// A reference to the Flags member variable.
//------------------------------------------------------------------
Flags&
- GetFlags();
+ GetFlags()
+ {
+ return m_flags;
+ }
//------------------------------------------------------------------
/// The flags const accessor.
@@ -346,7 +333,23 @@
/// A const reference to the Flags member variable.
//------------------------------------------------------------------
const Flags&
- GetFlags() const;
+ GetFlags() const
+ {
+ return m_flags;
+ }
+
+ //------------------------------------------------------------------
+ /// Check the command flags against the interpreter's current execution context.
+ ///
+ /// @param[out] result
+ /// A command result object, if it is not okay to run the command this will be
+ /// filled in with a suitable error.
+ ///
+ /// @return
+ /// \b true if it is okay to run this command, \b false otherwise.
+ //------------------------------------------------------------------
+ bool
+ CheckFlags (CommandReturnObject &result);
//------------------------------------------------------------------
/// Get the command that appropriate for a "repeat" of the current command.
@@ -382,6 +385,9 @@
m_command_override_callback = callback;
m_command_override_baton = baton;
}
+
+ virtual bool
+ Execute (const char *args_string, CommandReturnObject &result) = 0;
protected:
CommandInterpreter &m_interpreter;
@@ -394,13 +400,66 @@
std::vector<CommandArgumentEntry> m_arguments;
CommandOverrideCallback m_command_override_callback;
void * m_command_override_baton;
+
// Helper function to populate IDs or ID ranges as the command argument data
// to the specified command argument entry.
static void
AddIDsArgumentData(CommandArgumentEntry &arg, lldb::CommandArgumentType ID, lldb::CommandArgumentType IDRange);
+
+};
+
+class CommandObjectParsed : public CommandObject
+{
+public:
+
+ CommandObjectParsed (CommandInterpreter &interpreter,
+ const char *name,
+ const char *help = NULL,
+ const char *syntax = NULL,
+ uint32_t flags = 0) :
+ CommandObject (interpreter, name, help, syntax, flags) {}
+
+ virtual
+ ~CommandObjectParsed () {};
+
+ virtual bool
+ Execute (const char *args_string, CommandReturnObject &result);
+
+protected:
+ virtual bool
+ DoExecute (Args& command,
+ CommandReturnObject &result) = 0;
+
+ virtual bool
+ WantsRawCommandString() { return false; };
+};
+class CommandObjectRaw : public CommandObject
+{
+public:
+
+ CommandObjectRaw (CommandInterpreter &interpreter,
+ const char *name,
+ const char *help = NULL,
+ const char *syntax = NULL,
+ uint32_t flags = 0) :
+ CommandObject (interpreter, name, help, syntax, flags) {}
+
+ virtual
+ ~CommandObjectRaw () {};
+
+ virtual bool
+ Execute (const char *args_string, CommandReturnObject &result);
+
+protected:
+ virtual bool
+ DoExecute (const char *command, CommandReturnObject &result) = 0;
+
+ virtual bool
+ WantsRawCommandString() { return true; };
};
+
} // namespace lldb_private
Modified: lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectCrossref.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectCrossref.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectCrossref.h (original)
+++ lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectCrossref.h Fri Jun 8 19:52:06 2012
@@ -23,7 +23,7 @@
// CommandObjectCrossref
//-------------------------------------------------------------------------
-class CommandObjectCrossref : public CommandObject
+class CommandObjectCrossref : public CommandObjectParsed
{
public:
CommandObjectCrossref (CommandInterpreter &interpreter,
@@ -38,10 +38,6 @@
GenerateHelpText (CommandReturnObject &result);
virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual bool
IsCrossRefObject ();
virtual void
@@ -50,6 +46,11 @@
const char **
GetObjectTypes () const;
+protected:
+ virtual bool
+ DoExecute (Args& command,
+ CommandReturnObject &result);
+
private:
Args m_crossref_object_types;
};
Modified: lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectMultiword.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectMultiword.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectMultiword.h (original)
+++ lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectMultiword.h Fri Jun 8 19:52:06 2012
@@ -26,6 +26,9 @@
class CommandObjectMultiword : public CommandObject
{
+// These two want to iterate over the subcommand dictionary.
+friend class CommandInterpreter;
+friend class CommandObjectSyntax;
public:
CommandObjectMultiword (CommandInterpreter &interpreter,
const char *name,
@@ -53,8 +56,7 @@
GetSubcommandObject (const char *sub_cmd, StringList *matches = NULL);
virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
+ WantsRawCommandString() { return false; };
virtual int
HandleCompletion (Args &input,
@@ -67,6 +69,11 @@
virtual const char *GetRepeatCommand (Args ¤t_command_args, uint32_t index);
+ virtual bool
+ Execute (const char *args_string,
+ CommandReturnObject &result);
+protected:
+
CommandObject::CommandMap m_subcommand_dict;
};
Modified: lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectRegexCommand.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectRegexCommand.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectRegexCommand.h (original)
+++ lldb/branches/lldb-platform-work/include/lldb/Interpreter/CommandObjectRegexCommand.h Fri Jun 8 19:52:06 2012
@@ -25,7 +25,7 @@
// CommandObjectRegexCommand
//-------------------------------------------------------------------------
-class CommandObjectRegexCommand : public CommandObject
+class CommandObjectRegexCommand : public CommandObjectRaw
{
public:
@@ -38,18 +38,6 @@
virtual
~CommandObjectRegexCommand ();
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- virtual bool
- ExecuteRawCommandString (const char *command,
- CommandReturnObject &result);
-
-
bool
AddRegexCommand (const char *re_cstr, const char *command_cstr);
@@ -60,6 +48,9 @@
}
protected:
+ virtual bool
+ DoExecute (const char *command, CommandReturnObject &result);
+
struct Entry
{
RegularExpression regex;
Modified: lldb/branches/lldb-platform-work/scripts/Python/interface/SBWatchpoint.i
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/scripts/Python/interface/SBWatchpoint.i?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/scripts/Python/interface/SBWatchpoint.i (original)
+++ lldb/branches/lldb-platform-work/scripts/Python/interface/SBWatchpoint.i Fri Jun 8 19:52:06 2012
@@ -31,6 +31,9 @@
bool
IsValid();
+ SBError
+ GetError();
+
watch_id_t
GetID ();
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.cpp Fri Jun 8 19:52:06 2012
@@ -27,10 +27,10 @@
//-------------------------------------------------------------------------
CommandObjectApropos::CommandObjectApropos (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "apropos",
- "Find a list of debugger commands related to a particular word/subject.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "apropos",
+ "Find a list of debugger commands related to a particular word/subject.",
+ NULL)
{
CommandArgumentEntry arg;
CommandArgumentData search_word_arg;
@@ -52,11 +52,7 @@
bool
-CommandObjectApropos::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
+CommandObjectApropos::DoExecute (Args& args, CommandReturnObject &result)
{
const int argc = args.GetArgumentCount ();
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectApropos.h Fri Jun 8 19:52:06 2012
@@ -22,7 +22,7 @@
// CommandObjectApropos
//-------------------------------------------------------------------------
-class CommandObjectApropos : public CommandObject
+class CommandObjectApropos : public CommandObjectParsed
{
public:
@@ -31,8 +31,9 @@
virtual
~CommandObjectApropos ();
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result);
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.cpp Fri Jun 8 19:52:06 2012
@@ -77,10 +77,10 @@
}
CommandObjectArgs::CommandObjectArgs (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "args",
- "When stopped at the start of a function, reads function arguments of type (u?)int(8|16|32|64)_t, (void|char)*",
- "args"),
+ CommandObjectParsed (interpreter,
+ "args",
+ "When stopped at the start of a function, reads function arguments of type (u?)int(8|16|32|64)_t, (void|char)*",
+ "args"),
m_options (interpreter)
{
}
@@ -96,11 +96,7 @@
}
bool
-CommandObjectArgs::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
+CommandObjectArgs::DoExecute (Args& args, CommandReturnObject &result)
{
ConstString target_triple;
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectArgs.h Fri Jun 8 19:52:06 2012
@@ -20,7 +20,7 @@
namespace lldb_private {
- class CommandObjectArgs : public CommandObject
+ class CommandObjectArgs : public CommandObjectParsed
{
public:
@@ -57,16 +57,14 @@
GetOptions ();
- virtual bool
- Execute ( Args& command,
- CommandReturnObject &result);
-
- virtual bool
- WantsRawCommandString() { return false; }
-
protected:
CommandOptions m_options;
+
+ virtual bool
+ DoExecute ( Args& command,
+ CommandReturnObject &result);
+
};
} // namespace lldb_private
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.cpp Fri Jun 8 19:52:06 2012
@@ -43,39 +43,543 @@
}
//-------------------------------------------------------------------------
-// CommandObjectBreakpointSet::CommandOptions
+// CommandObjectBreakpointSet
//-------------------------------------------------------------------------
-#pragma mark Set::CommandOptions
-CommandObjectBreakpointSet::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
- Options (interpreter),
- m_condition (),
- m_filenames (),
- m_line_num (0),
- m_column (0),
- m_check_inlines (true),
- m_func_names (),
- m_func_name_type_mask (eFunctionNameTypeNone),
- m_func_regexp (),
- m_source_text_regexp(),
- m_modules (),
- m_load_addr(),
- m_ignore_count (0),
- m_thread_id(LLDB_INVALID_THREAD_ID),
- m_thread_index (UINT32_MAX),
- m_thread_name(),
- m_queue_name(),
- m_catch_bp (false),
- m_throw_bp (false),
- m_language (eLanguageTypeUnknown),
- m_skip_prologue (eLazyBoolCalculate)
-{
-}
-CommandObjectBreakpointSet::CommandOptions::~CommandOptions ()
+class CommandObjectBreakpointSet : public CommandObjectParsed
{
-}
+public:
+
+ typedef enum BreakpointSetType
+ {
+ eSetTypeInvalid,
+ eSetTypeFileAndLine,
+ eSetTypeAddress,
+ eSetTypeFunctionName,
+ eSetTypeFunctionRegexp,
+ eSetTypeSourceRegexp,
+ eSetTypeException
+ } BreakpointSetType;
+
+ CommandObjectBreakpointSet (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "breakpoint set",
+ "Sets a breakpoint or set of breakpoints in the executable.",
+ "breakpoint set <cmd-options>"),
+ m_options (interpreter)
+ {
+ }
+
+
+ virtual
+ ~CommandObjectBreakpointSet () {}
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+ class CommandOptions : public Options
+ {
+ public:
+
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options (interpreter),
+ m_condition (),
+ m_filenames (),
+ m_line_num (0),
+ m_column (0),
+ m_check_inlines (true),
+ m_func_names (),
+ m_func_name_type_mask (eFunctionNameTypeNone),
+ m_func_regexp (),
+ m_source_text_regexp(),
+ m_modules (),
+ m_load_addr(),
+ m_ignore_count (0),
+ m_thread_id(LLDB_INVALID_THREAD_ID),
+ m_thread_index (UINT32_MAX),
+ m_thread_name(),
+ m_queue_name(),
+ m_catch_bp (false),
+ m_throw_bp (false),
+ m_language (eLanguageTypeUnknown),
+ m_skip_prologue (eLazyBoolCalculate)
+ {
+ }
+
+
+ virtual
+ ~CommandOptions () {}
+
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
+
+ switch (short_option)
+ {
+ case 'a':
+ m_load_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 0);
+ if (m_load_addr == LLDB_INVALID_ADDRESS)
+ m_load_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 16);
+
+ if (m_load_addr == LLDB_INVALID_ADDRESS)
+ error.SetErrorStringWithFormat ("invalid address string '%s'", option_arg);
+ break;
+
+ case 'C':
+ m_column = Args::StringToUInt32 (option_arg, 0);
+ break;
+
+ case 'c':
+ m_condition.assign(option_arg);
+ break;
+
+ case 'f':
+ m_filenames.AppendIfUnique (FileSpec(option_arg, false));
+ break;
+
+ case 'l':
+ m_line_num = Args::StringToUInt32 (option_arg, 0);
+ break;
+
+ case 'b':
+ m_func_names.push_back (option_arg);
+ m_func_name_type_mask |= eFunctionNameTypeBase;
+ break;
+
+ case 'n':
+ m_func_names.push_back (option_arg);
+ m_func_name_type_mask |= eFunctionNameTypeAuto;
+ break;
+
+ case 'F':
+ m_func_names.push_back (option_arg);
+ m_func_name_type_mask |= eFunctionNameTypeFull;
+ break;
+
+ case 'S':
+ m_func_names.push_back (option_arg);
+ m_func_name_type_mask |= eFunctionNameTypeSelector;
+ break;
+
+ case 'M':
+ m_func_names.push_back (option_arg);
+ m_func_name_type_mask |= eFunctionNameTypeMethod;
+ break;
+
+ case 'p':
+ m_source_text_regexp.assign (option_arg);
+ break;
+
+ case 'r':
+ m_func_regexp.assign (option_arg);
+ break;
+
+ case 's':
+ {
+ m_modules.AppendIfUnique (FileSpec (option_arg, false));
+ break;
+ }
+ case 'i':
+ {
+ m_ignore_count = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
+ if (m_ignore_count == UINT32_MAX)
+ error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg);
+ }
+ break;
+ case 't' :
+ {
+ m_thread_id = Args::StringToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0);
+ if (m_thread_id == LLDB_INVALID_THREAD_ID)
+ error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg);
+ }
+ break;
+ case 'T':
+ m_thread_name.assign (option_arg);
+ break;
+ case 'q':
+ m_queue_name.assign (option_arg);
+ break;
+ case 'x':
+ {
+ m_thread_index = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
+ if (m_thread_id == UINT32_MAX)
+ error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg);
+
+ }
+ break;
+ case 'E':
+ {
+ LanguageType language = LanguageRuntime::GetLanguageTypeFromString (option_arg);
+
+ switch (language)
+ {
+ case eLanguageTypeC89:
+ case eLanguageTypeC:
+ case eLanguageTypeC99:
+ m_language = eLanguageTypeC;
+ break;
+ case eLanguageTypeC_plus_plus:
+ m_language = eLanguageTypeC_plus_plus;
+ break;
+ case eLanguageTypeObjC:
+ m_language = eLanguageTypeObjC;
+ break;
+ case eLanguageTypeObjC_plus_plus:
+ error.SetErrorStringWithFormat ("Set exception breakpoints separately for c++ and objective-c");
+ break;
+ case eLanguageTypeUnknown:
+ error.SetErrorStringWithFormat ("Unknown language type: '%s' for exception breakpoint", option_arg);
+ break;
+ default:
+ error.SetErrorStringWithFormat ("Unsupported language type: '%s' for exception breakpoint", option_arg);
+ }
+ }
+ break;
+ case 'w':
+ {
+ bool success;
+ m_throw_bp = Args::StringToBoolean (option_arg, true, &success);
+ if (!success)
+ error.SetErrorStringWithFormat ("Invalid boolean value for on-throw option: '%s'", option_arg);
+ }
+ break;
+ case 'h':
+ {
+ bool success;
+ m_catch_bp = Args::StringToBoolean (option_arg, true, &success);
+ if (!success)
+ error.SetErrorStringWithFormat ("Invalid boolean value for on-catch option: '%s'", option_arg);
+ }
+ case 'K':
+ {
+ bool success;
+ bool value;
+ value = Args::StringToBoolean (option_arg, true, &success);
+ if (value)
+ m_skip_prologue = eLazyBoolYes;
+ else
+ m_skip_prologue = eLazyBoolNo;
+
+ if (!success)
+ error.SetErrorStringWithFormat ("Invalid boolean value for skip prologue option: '%s'", option_arg);
+ }
+ break;
+ default:
+ error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
+ break;
+ }
+
+ return error;
+ }
+ void
+ OptionParsingStarting ()
+ {
+ m_condition.clear();
+ m_filenames.Clear();
+ m_line_num = 0;
+ m_column = 0;
+ m_func_names.clear();
+ m_func_name_type_mask = 0;
+ m_func_regexp.clear();
+ m_load_addr = LLDB_INVALID_ADDRESS;
+ m_modules.Clear();
+ m_ignore_count = 0;
+ m_thread_id = LLDB_INVALID_THREAD_ID;
+ m_thread_index = UINT32_MAX;
+ m_thread_name.clear();
+ m_queue_name.clear();
+ m_language = eLanguageTypeUnknown;
+ m_catch_bp = false;
+ m_throw_bp = true;
+ m_skip_prologue = eLazyBoolCalculate;
+ }
+
+ const OptionDefinition*
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
+
+ // Options table: Required for subclasses of Options.
+
+ static OptionDefinition g_option_table[];
+
+ // Instance variables to hold the values for command options.
+
+ std::string m_condition;
+ FileSpecList m_filenames;
+ uint32_t m_line_num;
+ uint32_t m_column;
+ bool m_check_inlines;
+ std::vector<std::string> m_func_names;
+ uint32_t m_func_name_type_mask;
+ std::string m_func_regexp;
+ std::string m_source_text_regexp;
+ FileSpecList m_modules;
+ lldb::addr_t m_load_addr;
+ uint32_t m_ignore_count;
+ lldb::tid_t m_thread_id;
+ uint32_t m_thread_index;
+ std::string m_thread_name;
+ std::string m_queue_name;
+ bool m_catch_bp;
+ bool m_throw_bp;
+ lldb::LanguageType m_language;
+ LazyBool m_skip_prologue;
+
+ };
+
+protected:
+ virtual bool
+ DoExecute (Args& command,
+ CommandReturnObject &result)
+ {
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (target == NULL)
+ {
+ result.AppendError ("Invalid target. Must set target before setting breakpoints (see 'target create' command).");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+
+ // The following are the various types of breakpoints that could be set:
+ // 1). -f -l -p [-s -g] (setting breakpoint by source location)
+ // 2). -a [-s -g] (setting breakpoint by address)
+ // 3). -n [-s -g] (setting breakpoint by function name)
+ // 4). -r [-s -g] (setting breakpoint by function name regular expression)
+ // 5). -p -f (setting a breakpoint by comparing a reg-exp to source text)
+ // 6). -E [-w -h] (setting a breakpoint for exceptions for a given language.)
+
+ BreakpointSetType break_type = eSetTypeInvalid;
+
+ if (m_options.m_line_num != 0)
+ break_type = eSetTypeFileAndLine;
+ else if (m_options.m_load_addr != LLDB_INVALID_ADDRESS)
+ break_type = eSetTypeAddress;
+ else if (!m_options.m_func_names.empty())
+ break_type = eSetTypeFunctionName;
+ else if (!m_options.m_func_regexp.empty())
+ break_type = eSetTypeFunctionRegexp;
+ else if (!m_options.m_source_text_regexp.empty())
+ break_type = eSetTypeSourceRegexp;
+ else if (m_options.m_language != eLanguageTypeUnknown)
+ break_type = eSetTypeException;
+
+ Breakpoint *bp = NULL;
+ FileSpec module_spec;
+ bool use_module = false;
+ int num_modules = m_options.m_modules.GetSize();
+
+ const bool internal = false;
+
+ if ((num_modules > 0) && (break_type != eSetTypeAddress))
+ use_module = true;
+
+ switch (break_type)
+ {
+ case eSetTypeFileAndLine: // Breakpoint by source position
+ {
+ FileSpec file;
+ uint32_t num_files = m_options.m_filenames.GetSize();
+ if (num_files == 0)
+ {
+ if (!GetDefaultFile (target, file, result))
+ {
+ result.AppendError("No file supplied and no default file available.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ }
+ else if (num_files > 1)
+ {
+ result.AppendError("Only one file at a time is allowed for file and line breakpoints.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ else
+ file = m_options.m_filenames.GetFileSpecAtIndex(0);
+
+ bp = target->CreateBreakpoint (&(m_options.m_modules),
+ file,
+ m_options.m_line_num,
+ m_options.m_check_inlines,
+ m_options.m_skip_prologue,
+ internal).get();
+ }
+ break;
+
+ case eSetTypeAddress: // Breakpoint by address
+ bp = target->CreateBreakpoint (m_options.m_load_addr, false).get();
+ break;
+
+ case eSetTypeFunctionName: // Breakpoint by function name
+ {
+ uint32_t name_type_mask = m_options.m_func_name_type_mask;
+
+ if (name_type_mask == 0)
+ name_type_mask = eFunctionNameTypeAuto;
+
+ bp = target->CreateBreakpoint (&(m_options.m_modules),
+ &(m_options.m_filenames),
+ m_options.m_func_names,
+ name_type_mask,
+ m_options.m_skip_prologue,
+ internal).get();
+ }
+ break;
+
+ case eSetTypeFunctionRegexp: // Breakpoint by regular expression function name
+ {
+ RegularExpression regexp(m_options.m_func_regexp.c_str());
+ if (!regexp.IsValid())
+ {
+ char err_str[1024];
+ regexp.GetErrorAsCString(err_str, sizeof(err_str));
+ result.AppendErrorWithFormat("Function name regular expression could not be compiled: \"%s\"",
+ err_str);
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+
+ bp = target->CreateFuncRegexBreakpoint (&(m_options.m_modules),
+ &(m_options.m_filenames),
+ regexp,
+ m_options.m_skip_prologue,
+ internal).get();
+ }
+ break;
+ case eSetTypeSourceRegexp: // Breakpoint by regexp on source text.
+ {
+ int num_files = m_options.m_filenames.GetSize();
+
+ if (num_files == 0)
+ {
+ FileSpec file;
+ if (!GetDefaultFile (target, file, result))
+ {
+ result.AppendError ("No files provided and could not find default file.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ else
+ {
+ m_options.m_filenames.Append (file);
+ }
+ }
+
+ RegularExpression regexp(m_options.m_source_text_regexp.c_str());
+ if (!regexp.IsValid())
+ {
+ char err_str[1024];
+ regexp.GetErrorAsCString(err_str, sizeof(err_str));
+ result.AppendErrorWithFormat("Source text regular expression could not be compiled: \"%s\"",
+ err_str);
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ bp = target->CreateSourceRegexBreakpoint (&(m_options.m_modules), &(m_options.m_filenames), regexp).get();
+ }
+ break;
+ case eSetTypeException:
+ {
+ bp = target->CreateExceptionBreakpoint (m_options.m_language, m_options.m_catch_bp, m_options.m_throw_bp).get();
+ }
+ break;
+ default:
+ break;
+ }
+
+ // Now set the various options that were passed in:
+ if (bp)
+ {
+ if (m_options.m_thread_id != LLDB_INVALID_THREAD_ID)
+ bp->SetThreadID (m_options.m_thread_id);
+
+ if (m_options.m_thread_index != UINT32_MAX)
+ bp->GetOptions()->GetThreadSpec()->SetIndex(m_options.m_thread_index);
+
+ if (!m_options.m_thread_name.empty())
+ bp->GetOptions()->GetThreadSpec()->SetName(m_options.m_thread_name.c_str());
+
+ if (!m_options.m_queue_name.empty())
+ bp->GetOptions()->GetThreadSpec()->SetQueueName(m_options.m_queue_name.c_str());
+
+ if (m_options.m_ignore_count != 0)
+ bp->GetOptions()->SetIgnoreCount(m_options.m_ignore_count);
+
+ if (!m_options.m_condition.empty())
+ bp->GetOptions()->SetCondition(m_options.m_condition.c_str());
+ }
+
+ if (bp)
+ {
+ Stream &output_stream = result.GetOutputStream();
+ output_stream.Printf ("Breakpoint created: ");
+ bp->GetDescription(&output_stream, lldb::eDescriptionLevelBrief);
+ output_stream.EOL();
+ // Don't print out this warning for exception breakpoints. They can get set before the target
+ // is set, but we won't know how to actually set the breakpoint till we run.
+ if (bp->GetNumLocations() == 0 && break_type != eSetTypeException)
+ output_stream.Printf ("WARNING: Unable to resolve breakpoint to any actual locations.\n");
+ result.SetStatus (eReturnStatusSuccessFinishResult);
+ }
+ else if (!bp)
+ {
+ result.AppendError ("Breakpoint creation failed: No breakpoint created.");
+ result.SetStatus (eReturnStatusFailed);
+ }
+
+ return result.Succeeded();
+ }
+private:
+ bool
+ GetDefaultFile (Target *target, FileSpec &file, CommandReturnObject &result)
+ {
+ uint32_t default_line;
+ // First use the Source Manager's default file.
+ // Then use the current stack frame's file.
+ if (!target->GetSourceManager().GetDefaultFileAndLine(file, default_line))
+ {
+ StackFrame *cur_frame = m_interpreter.GetExecutionContext().GetFramePtr();
+ if (cur_frame == NULL)
+ {
+ result.AppendError ("No selected frame to use to find the default file.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ else if (!cur_frame->HasDebugInformation())
+ {
+ result.AppendError ("Cannot use the selected frame to find the default file, it has no debug info.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ else
+ {
+ const SymbolContext &sc = cur_frame->GetSymbolContext (eSymbolContextLineEntry);
+ if (sc.line_entry.file)
+ {
+ file = sc.line_entry.file;
+ }
+ else
+ {
+ result.AppendError ("Can't find the file for the selected frame to use as the default file.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ CommandOptions m_options;
+};
// If an additional option set beyond LLDB_OPTION_SET_10 is added, make sure to
// update the numbers passed to LLDB_OPT_SET_FROM_TO(...) appropriately.
#define LLDB_OPT_FILE ( LLDB_OPT_SET_FROM_TO(1, 9) & ~LLDB_OPT_SET_2 )
@@ -160,1522 +664,1120 @@
{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
};
-const OptionDefinition*
-CommandObjectBreakpointSet::CommandOptions::GetDefinitions ()
-{
- return g_option_table;
-}
+//-------------------------------------------------------------------------
+// CommandObjectBreakpointModify
+//-------------------------------------------------------------------------
+#pragma mark Modify
-Error
-CommandObjectBreakpointSet::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
+class CommandObjectBreakpointModify : public CommandObjectParsed
{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
+public:
- switch (short_option)
+ CommandObjectBreakpointModify (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "breakpoint modify",
+ "Modify the options on a breakpoint or set of breakpoints in the executable. "
+ "If no breakpoint is specified, acts on the last created breakpoint. "
+ "With the exception of -e, -d and -i, passing an empty argument clears the modification.",
+ NULL),
+ m_options (interpreter)
{
- case 'a':
- m_load_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 0);
- if (m_load_addr == LLDB_INVALID_ADDRESS)
- m_load_addr = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS, 16);
-
- if (m_load_addr == LLDB_INVALID_ADDRESS)
- error.SetErrorStringWithFormat ("invalid address string '%s'", option_arg);
- break;
-
- case 'C':
- m_column = Args::StringToUInt32 (option_arg, 0);
- break;
-
- case 'c':
- m_condition.assign(option_arg);
- break;
-
- case 'f':
- m_filenames.AppendIfUnique (FileSpec(option_arg, false));
- break;
-
- case 'l':
- m_line_num = Args::StringToUInt32 (option_arg, 0);
- break;
-
- case 'b':
- m_func_names.push_back (option_arg);
- m_func_name_type_mask |= eFunctionNameTypeBase;
- break;
-
- case 'n':
- m_func_names.push_back (option_arg);
- m_func_name_type_mask |= eFunctionNameTypeAuto;
- break;
-
- case 'F':
- m_func_names.push_back (option_arg);
- m_func_name_type_mask |= eFunctionNameTypeFull;
- break;
-
- case 'S':
- m_func_names.push_back (option_arg);
- m_func_name_type_mask |= eFunctionNameTypeSelector;
- break;
-
- case 'M':
- m_func_names.push_back (option_arg);
- m_func_name_type_mask |= eFunctionNameTypeMethod;
- break;
-
- case 'p':
- m_source_text_regexp.assign (option_arg);
- break;
-
- case 'r':
- m_func_regexp.assign (option_arg);
- break;
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back (arg);
+ }
- case 's':
- {
- m_modules.AppendIfUnique (FileSpec (option_arg, false));
- break;
- }
- case 'i':
+
+ virtual
+ ~CommandObjectBreakpointModify () {}
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+ class CommandOptions : public Options
+ {
+ public:
+
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options (interpreter),
+ m_ignore_count (0),
+ m_thread_id(LLDB_INVALID_THREAD_ID),
+ m_thread_id_passed(false),
+ m_thread_index (UINT32_MAX),
+ m_thread_index_passed(false),
+ m_thread_name(),
+ m_queue_name(),
+ m_condition (),
+ m_enable_passed (false),
+ m_enable_value (false),
+ m_name_passed (false),
+ m_queue_passed (false),
+ m_condition_passed (false)
{
- m_ignore_count = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
- if (m_ignore_count == UINT32_MAX)
- error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg);
- }
- break;
- case 't' :
- {
- m_thread_id = Args::StringToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0);
- if (m_thread_id == LLDB_INVALID_THREAD_ID)
- error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg);
- }
- break;
- case 'T':
- m_thread_name.assign (option_arg);
- break;
- case 'q':
- m_queue_name.assign (option_arg);
- break;
- case 'x':
- {
- m_thread_index = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
- if (m_thread_id == UINT32_MAX)
- error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg);
-
}
- break;
- case 'E':
+
+ virtual
+ ~CommandOptions () {}
+
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
{
- LanguageType language = LanguageRuntime::GetLanguageTypeFromString (option_arg);
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
- switch (language)
+ switch (short_option)
{
- case eLanguageTypeC89:
- case eLanguageTypeC:
- case eLanguageTypeC99:
- m_language = eLanguageTypeC;
- break;
- case eLanguageTypeC_plus_plus:
- m_language = eLanguageTypeC_plus_plus;
+ case 'c':
+ if (option_arg != NULL)
+ m_condition.assign (option_arg);
+ else
+ m_condition.clear();
+ m_condition_passed = true;
break;
- case eLanguageTypeObjC:
- m_language = eLanguageTypeObjC;
+ case 'd':
+ m_enable_passed = true;
+ m_enable_value = false;
break;
- case eLanguageTypeObjC_plus_plus:
- error.SetErrorStringWithFormat ("Set exception breakpoints separately for c++ and objective-c");
+ case 'e':
+ m_enable_passed = true;
+ m_enable_value = true;
+ break;
+ case 'i':
+ {
+ m_ignore_count = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
+ if (m_ignore_count == UINT32_MAX)
+ error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg);
+ }
+ break;
+ case 't' :
+ {
+ if (option_arg[0] == '\0')
+ {
+ m_thread_id = LLDB_INVALID_THREAD_ID;
+ m_thread_id_passed = true;
+ }
+ else
+ {
+ m_thread_id = Args::StringToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0);
+ if (m_thread_id == LLDB_INVALID_THREAD_ID)
+ error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg);
+ else
+ m_thread_id_passed = true;
+ }
+ }
+ break;
+ case 'T':
+ if (option_arg != NULL)
+ m_thread_name.assign (option_arg);
+ else
+ m_thread_name.clear();
+ m_name_passed = true;
break;
- case eLanguageTypeUnknown:
- error.SetErrorStringWithFormat ("Unknown language type: '%s' for exception breakpoint", option_arg);
+ case 'q':
+ if (option_arg != NULL)
+ m_queue_name.assign (option_arg);
+ else
+ m_queue_name.clear();
+ m_queue_passed = true;
break;
+ case 'x':
+ {
+ if (option_arg[0] == '\n')
+ {
+ m_thread_index = UINT32_MAX;
+ m_thread_index_passed = true;
+ }
+ else
+ {
+ m_thread_index = Args::StringToUInt32 (option_arg, UINT32_MAX, 0);
+ if (m_thread_id == UINT32_MAX)
+ error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg);
+ else
+ m_thread_index_passed = true;
+ }
+ }
+ break;
default:
- error.SetErrorStringWithFormat ("Unsupported language type: '%s' for exception breakpoint", option_arg);
+ error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
+ break;
}
+
+ return error;
}
- break;
- case 'w':
+ void
+ OptionParsingStarting ()
{
- bool success;
- m_throw_bp = Args::StringToBoolean (option_arg, true, &success);
- if (!success)
- error.SetErrorStringWithFormat ("Invalid boolean value for on-throw option: '%s'", option_arg);
- }
- break;
- case 'h':
- {
- bool success;
- m_catch_bp = Args::StringToBoolean (option_arg, true, &success);
- if (!success)
- error.SetErrorStringWithFormat ("Invalid boolean value for on-catch option: '%s'", option_arg);
- }
- case 'K':
- {
- bool success;
- bool value;
- value = Args::StringToBoolean (option_arg, true, &success);
- if (value)
- m_skip_prologue = eLazyBoolYes;
- else
- m_skip_prologue = eLazyBoolNo;
-
- if (!success)
- error.SetErrorStringWithFormat ("Invalid boolean value for skip prologue option: '%s'", option_arg);
+ m_ignore_count = 0;
+ m_thread_id = LLDB_INVALID_THREAD_ID;
+ m_thread_id_passed = false;
+ m_thread_index = UINT32_MAX;
+ m_thread_index_passed = false;
+ m_thread_name.clear();
+ m_queue_name.clear();
+ m_condition.clear();
+ m_enable_passed = false;
+ m_queue_passed = false;
+ m_name_passed = false;
+ m_condition_passed = false;
}
- break;
- default:
- error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
- break;
- }
+
+ const OptionDefinition*
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
+
- return error;
-}
+ // Options table: Required for subclasses of Options.
-void
-CommandObjectBreakpointSet::CommandOptions::OptionParsingStarting ()
-{
- m_condition.clear();
- m_filenames.Clear();
- m_line_num = 0;
- m_column = 0;
- m_func_names.clear();
- m_func_name_type_mask = 0;
- m_func_regexp.clear();
- m_load_addr = LLDB_INVALID_ADDRESS;
- m_modules.Clear();
- m_ignore_count = 0;
- m_thread_id = LLDB_INVALID_THREAD_ID;
- m_thread_index = UINT32_MAX;
- m_thread_name.clear();
- m_queue_name.clear();
- m_language = eLanguageTypeUnknown;
- m_catch_bp = false;
- m_throw_bp = true;
- m_skip_prologue = eLazyBoolCalculate;
-}
+ static OptionDefinition g_option_table[];
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointSet
-//-------------------------------------------------------------------------
-#pragma mark Set
+ // Instance variables to hold the values for command options.
-CommandObjectBreakpointSet::CommandObjectBreakpointSet (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "breakpoint set",
- "Sets a breakpoint or set of breakpoints in the executable.",
- "breakpoint set <cmd-options>"),
- m_options (interpreter)
-{
-}
-
-CommandObjectBreakpointSet::~CommandObjectBreakpointSet ()
-{
-}
-
-Options *
-CommandObjectBreakpointSet::GetOptions ()
-{
- return &m_options;
-}
-
-bool
-CommandObjectBreakpointSet::GetDefaultFile (Target *target, FileSpec &file, CommandReturnObject &result)
-{
- uint32_t default_line;
- // First use the Source Manager's default file.
- // Then use the current stack frame's file.
- if (!target->GetSourceManager().GetDefaultFileAndLine(file, default_line))
+ uint32_t m_ignore_count;
+ lldb::tid_t m_thread_id;
+ bool m_thread_id_passed;
+ uint32_t m_thread_index;
+ bool m_thread_index_passed;
+ std::string m_thread_name;
+ std::string m_queue_name;
+ std::string m_condition;
+ bool m_enable_passed;
+ bool m_enable_value;
+ bool m_name_passed;
+ bool m_queue_passed;
+ bool m_condition_passed;
+
+ };
+
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- StackFrame *cur_frame = m_interpreter.GetExecutionContext().GetFramePtr();
- if (cur_frame == NULL)
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (target == NULL)
{
- result.AppendError ("No selected frame to use to find the default file.");
+ result.AppendError ("Invalid target. No existing target or breakpoints.");
result.SetStatus (eReturnStatusFailed);
return false;
}
- else if (!cur_frame->HasDebugInformation())
- {
- result.AppendError ("Cannot use the selected frame to find the default file, it has no debug info.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
- else
- {
- const SymbolContext &sc = cur_frame->GetSymbolContext (eSymbolContextLineEntry);
- if (sc.line_entry.file)
- {
- file = sc.line_entry.file;
- }
- else
- {
- result.AppendError ("Can't find the file for the selected frame to use as the default file.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
- }
- }
- return true;
-}
-bool
-CommandObjectBreakpointSet::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (target == NULL)
- {
- result.AppendError ("Invalid target. Must set target before setting breakpoints (see 'target create' command).");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
-
- // The following are the various types of breakpoints that could be set:
- // 1). -f -l -p [-s -g] (setting breakpoint by source location)
- // 2). -a [-s -g] (setting breakpoint by address)
- // 3). -n [-s -g] (setting breakpoint by function name)
- // 4). -r [-s -g] (setting breakpoint by function name regular expression)
- // 5). -p -f (setting a breakpoint by comparing a reg-exp to source text)
- // 6). -E [-w -h] (setting a breakpoint for exceptions for a given language.)
-
- BreakpointSetType break_type = eSetTypeInvalid;
-
- if (m_options.m_line_num != 0)
- break_type = eSetTypeFileAndLine;
- else if (m_options.m_load_addr != LLDB_INVALID_ADDRESS)
- break_type = eSetTypeAddress;
- else if (!m_options.m_func_names.empty())
- break_type = eSetTypeFunctionName;
- else if (!m_options.m_func_regexp.empty())
- break_type = eSetTypeFunctionRegexp;
- else if (!m_options.m_source_text_regexp.empty())
- break_type = eSetTypeSourceRegexp;
- else if (m_options.m_language != eLanguageTypeUnknown)
- break_type = eSetTypeException;
-
- Breakpoint *bp = NULL;
- FileSpec module_spec;
- bool use_module = false;
- int num_modules = m_options.m_modules.GetSize();
-
- const bool internal = false;
-
- if ((num_modules > 0) && (break_type != eSetTypeAddress))
- use_module = true;
-
- switch (break_type)
- {
- case eSetTypeFileAndLine: // Breakpoint by source position
- {
- FileSpec file;
- uint32_t num_files = m_options.m_filenames.GetSize();
- if (num_files == 0)
- {
- if (!GetDefaultFile (target, file, result))
- {
- result.AppendError("No file supplied and no default file available.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
- }
- else if (num_files > 1)
- {
- result.AppendError("Only one file at a time is allowed for file and line breakpoints.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
- else
- file = m_options.m_filenames.GetFileSpecAtIndex(0);
-
- bp = target->CreateBreakpoint (&(m_options.m_modules),
- file,
- m_options.m_line_num,
- m_options.m_check_inlines,
- m_options.m_skip_prologue,
- internal).get();
- }
- break;
+ Mutex::Locker locker;
+ target->GetBreakpointList().GetListMutex(locker);
+
+ BreakpointIDList valid_bp_ids;
- case eSetTypeAddress: // Breakpoint by address
- bp = target->CreateBreakpoint (m_options.m_load_addr, false).get();
- break;
+ CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
- case eSetTypeFunctionName: // Breakpoint by function name
+ if (result.Succeeded())
+ {
+ const size_t count = valid_bp_ids.GetSize();
+ for (size_t i = 0; i < count; ++i)
{
- uint32_t name_type_mask = m_options.m_func_name_type_mask;
-
- if (name_type_mask == 0)
- name_type_mask = eFunctionNameTypeAuto;
-
- bp = target->CreateBreakpoint (&(m_options.m_modules),
- &(m_options.m_filenames),
- m_options.m_func_names,
- name_type_mask,
- m_options.m_skip_prologue,
- internal).get();
- }
- break;
+ BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
- case eSetTypeFunctionRegexp: // Breakpoint by regular expression function name
- {
- RegularExpression regexp(m_options.m_func_regexp.c_str());
- if (!regexp.IsValid())
- {
- char err_str[1024];
- regexp.GetErrorAsCString(err_str, sizeof(err_str));
- result.AppendErrorWithFormat("Function name regular expression could not be compiled: \"%s\"",
- err_str);
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
-
- bp = target->CreateFuncRegexBreakpoint (&(m_options.m_modules),
- &(m_options.m_filenames),
- regexp,
- m_options.m_skip_prologue,
- internal).get();
- }
- break;
- case eSetTypeSourceRegexp: // Breakpoint by regexp on source text.
- {
- int num_files = m_options.m_filenames.GetSize();
-
- if (num_files == 0)
+ if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
{
- FileSpec file;
- if (!GetDefaultFile (target, file, result))
+ Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+ if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
{
- result.AppendError ("No files provided and could not find default file.");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ BreakpointLocation *location = bp->FindLocationByID (cur_bp_id.GetLocationID()).get();
+ if (location)
+ {
+ if (m_options.m_thread_id_passed)
+ location->SetThreadID (m_options.m_thread_id);
+
+ if (m_options.m_thread_index_passed)
+ location->SetThreadIndex(m_options.m_thread_index);
+
+ if (m_options.m_name_passed)
+ location->SetThreadName(m_options.m_thread_name.c_str());
+
+ if (m_options.m_queue_passed)
+ location->SetQueueName(m_options.m_queue_name.c_str());
+
+ if (m_options.m_ignore_count != 0)
+ location->SetIgnoreCount(m_options.m_ignore_count);
+
+ if (m_options.m_enable_passed)
+ location->SetEnabled (m_options.m_enable_value);
+
+ if (m_options.m_condition_passed)
+ location->SetCondition (m_options.m_condition.c_str());
+ }
}
else
{
- m_options.m_filenames.Append (file);
+ if (m_options.m_thread_id_passed)
+ bp->SetThreadID (m_options.m_thread_id);
+
+ if (m_options.m_thread_index_passed)
+ bp->SetThreadIndex(m_options.m_thread_index);
+
+ if (m_options.m_name_passed)
+ bp->SetThreadName(m_options.m_thread_name.c_str());
+
+ if (m_options.m_queue_passed)
+ bp->SetQueueName(m_options.m_queue_name.c_str());
+
+ if (m_options.m_ignore_count != 0)
+ bp->SetIgnoreCount(m_options.m_ignore_count);
+
+ if (m_options.m_enable_passed)
+ bp->SetEnabled (m_options.m_enable_value);
+
+ if (m_options.m_condition_passed)
+ bp->SetCondition (m_options.m_condition.c_str());
}
}
-
- RegularExpression regexp(m_options.m_source_text_regexp.c_str());
- if (!regexp.IsValid())
- {
- char err_str[1024];
- regexp.GetErrorAsCString(err_str, sizeof(err_str));
- result.AppendErrorWithFormat("Source text regular expression could not be compiled: \"%s\"",
- err_str);
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
- bp = target->CreateSourceRegexBreakpoint (&(m_options.m_modules), &(m_options.m_filenames), regexp).get();
- }
- break;
- case eSetTypeException:
- {
- bp = target->CreateExceptionBreakpoint (m_options.m_language, m_options.m_catch_bp, m_options.m_throw_bp).get();
- }
- break;
- default:
- break;
- }
-
- // Now set the various options that were passed in:
- if (bp)
- {
- if (m_options.m_thread_id != LLDB_INVALID_THREAD_ID)
- bp->SetThreadID (m_options.m_thread_id);
-
- if (m_options.m_thread_index != UINT32_MAX)
- bp->GetOptions()->GetThreadSpec()->SetIndex(m_options.m_thread_index);
-
- if (!m_options.m_thread_name.empty())
- bp->GetOptions()->GetThreadSpec()->SetName(m_options.m_thread_name.c_str());
-
- if (!m_options.m_queue_name.empty())
- bp->GetOptions()->GetThreadSpec()->SetQueueName(m_options.m_queue_name.c_str());
-
- if (m_options.m_ignore_count != 0)
- bp->GetOptions()->SetIgnoreCount(m_options.m_ignore_count);
-
- if (!m_options.m_condition.empty())
- bp->GetOptions()->SetCondition(m_options.m_condition.c_str());
- }
-
- if (bp)
- {
- Stream &output_stream = result.GetOutputStream();
- output_stream.Printf ("Breakpoint created: ");
- bp->GetDescription(&output_stream, lldb::eDescriptionLevelBrief);
- output_stream.EOL();
- // Don't print out this warning for exception breakpoints. They can get set before the target
- // is set, but we won't know how to actually set the breakpoint till we run.
- if (bp->GetNumLocations() == 0 && break_type != eSetTypeException)
- output_stream.Printf ("WARNING: Unable to resolve breakpoint to any actual locations.\n");
- result.SetStatus (eReturnStatusSuccessFinishResult);
- }
- else if (!bp)
- {
- result.AppendError ("Breakpoint creation failed: No breakpoint created.");
- result.SetStatus (eReturnStatusFailed);
- }
-
- return result.Succeeded();
-}
-
-//-------------------------------------------------------------------------
-// CommandObjectMultiwordBreakpoint
-//-------------------------------------------------------------------------
-#pragma mark MultiwordBreakpoint
-
-CommandObjectMultiwordBreakpoint::CommandObjectMultiwordBreakpoint (CommandInterpreter &interpreter) :
- CommandObjectMultiword (interpreter,
- "breakpoint",
- "A set of commands for operating on breakpoints. Also see _regexp-break.",
- "breakpoint <command> [<command-options>]")
-{
- bool status;
-
- CommandObjectSP list_command_object (new CommandObjectBreakpointList (interpreter));
- CommandObjectSP enable_command_object (new CommandObjectBreakpointEnable (interpreter));
- CommandObjectSP disable_command_object (new CommandObjectBreakpointDisable (interpreter));
- CommandObjectSP clear_command_object (new CommandObjectBreakpointClear (interpreter));
- CommandObjectSP delete_command_object (new CommandObjectBreakpointDelete (interpreter));
- CommandObjectSP set_command_object (new CommandObjectBreakpointSet (interpreter));
- CommandObjectSP command_command_object (new CommandObjectBreakpointCommand (interpreter));
- CommandObjectSP modify_command_object (new CommandObjectBreakpointModify(interpreter));
-
- list_command_object->SetCommandName ("breakpoint list");
- enable_command_object->SetCommandName("breakpoint enable");
- disable_command_object->SetCommandName("breakpoint disable");
- clear_command_object->SetCommandName("breakpoint clear");
- delete_command_object->SetCommandName("breakpoint delete");
- set_command_object->SetCommandName("breakpoint set");
- command_command_object->SetCommandName ("breakpoint command");
- modify_command_object->SetCommandName ("breakpoint modify");
-
- status = LoadSubCommand ("list", list_command_object);
- status = LoadSubCommand ("enable", enable_command_object);
- status = LoadSubCommand ("disable", disable_command_object);
- status = LoadSubCommand ("clear", clear_command_object);
- status = LoadSubCommand ("delete", delete_command_object);
- status = LoadSubCommand ("set", set_command_object);
- status = LoadSubCommand ("command", command_command_object);
- status = LoadSubCommand ("modify", modify_command_object);
-}
-
-CommandObjectMultiwordBreakpoint::~CommandObjectMultiwordBreakpoint ()
-{
-}
-
-void
-CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (Args &args, Target *target, CommandReturnObject &result,
- BreakpointIDList *valid_ids)
-{
- // args can be strings representing 1). integers (for breakpoint ids)
- // 2). the full breakpoint & location canonical representation
- // 3). the word "to" or a hyphen, representing a range (in which case there
- // had *better* be an entry both before & after of one of the first two types.
- // If args is empty, we will use the last created breakpoint (if there is one.)
-
- Args temp_args;
-
- if (args.GetArgumentCount() == 0)
- {
- if (target->GetLastCreatedBreakpoint())
- {
- valid_ids->AddBreakpointID (BreakpointID(target->GetLastCreatedBreakpoint()->GetID(), LLDB_INVALID_BREAK_ID));
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- result.AppendError("No breakpoint specified and no last created breakpoint.");
- result.SetStatus (eReturnStatusFailed);
- }
- return;
- }
-
- // Create a new Args variable to use; copy any non-breakpoint-id-ranges stuff directly from the old ARGS to
- // the new TEMP_ARGS. Do not copy breakpoint id range strings over; instead generate a list of strings for
- // all the breakpoint ids in the range, and shove all of those breakpoint id strings into TEMP_ARGS.
-
- BreakpointIDList::FindAndReplaceIDRanges (args, target, result, temp_args);
-
- // NOW, convert the list of breakpoint id strings in TEMP_ARGS into an actual BreakpointIDList:
-
- valid_ids->InsertStringArray (temp_args.GetConstArgumentVector(), temp_args.GetArgumentCount(), result);
-
- // At this point, all of the breakpoint ids that the user passed in have been converted to breakpoint IDs
- // and put into valid_ids.
-
- if (result.Succeeded())
- {
- // Now that we've converted everything from args into a list of breakpoint ids, go through our tentative list
- // of breakpoint id's and verify that they correspond to valid/currently set breakpoints.
-
- const size_t count = valid_ids->GetSize();
- for (size_t i = 0; i < count; ++i)
- {
- BreakpointID cur_bp_id = valid_ids->GetBreakpointIDAtIndex (i);
- Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
- if (breakpoint != NULL)
- {
- int num_locations = breakpoint->GetNumLocations();
- if (cur_bp_id.GetLocationID() > num_locations)
- {
- StreamString id_str;
- BreakpointID::GetCanonicalReference (&id_str,
- cur_bp_id.GetBreakpointID(),
- cur_bp_id.GetLocationID());
- i = valid_ids->GetSize() + 1;
- result.AppendErrorWithFormat ("'%s' is not a currently valid breakpoint/location id.\n",
- id_str.GetData());
- result.SetStatus (eReturnStatusFailed);
- }
- }
- else
- {
- i = valid_ids->GetSize() + 1;
- result.AppendErrorWithFormat ("'%d' is not a currently valid breakpoint id.\n", cur_bp_id.GetBreakpointID());
- result.SetStatus (eReturnStatusFailed);
}
}
+
+ return result.Succeeded();
}
-}
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointList::Options
-//-------------------------------------------------------------------------
-#pragma mark List::CommandOptions
-
-CommandObjectBreakpointList::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
- Options (interpreter),
- m_level (lldb::eDescriptionLevelBrief) // Breakpoint List defaults to brief descriptions
-{
-}
-CommandObjectBreakpointList::CommandOptions::~CommandOptions ()
-{
-}
-
-OptionDefinition
-CommandObjectBreakpointList::CommandOptions::g_option_table[] =
-{
- { LLDB_OPT_SET_ALL, false, "internal", 'i', no_argument, NULL, 0, eArgTypeNone,
- "Show debugger internal breakpoints" },
-
- { LLDB_OPT_SET_1, false, "brief", 'b', no_argument, NULL, 0, eArgTypeNone,
- "Give a brief description of the breakpoint (no location info)."},
-
- // FIXME: We need to add an "internal" command, and then add this sort of thing to it.
- // But I need to see it for now, and don't want to wait.
- { LLDB_OPT_SET_2, false, "full", 'f', no_argument, NULL, 0, eArgTypeNone,
- "Give a full description of the breakpoint and its locations."},
-
- { LLDB_OPT_SET_3, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone,
- "Explain everything we know about the breakpoint (for debugging debugger bugs)." },
-
- { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
+private:
+ CommandOptions m_options;
};
-const OptionDefinition*
-CommandObjectBreakpointList::CommandOptions::GetDefinitions ()
-{
- return g_option_table;
-}
-
-Error
-CommandObjectBreakpointList::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
-{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
-
- switch (short_option)
- {
- case 'b':
- m_level = lldb::eDescriptionLevelBrief;
- break;
- case 'f':
- m_level = lldb::eDescriptionLevelFull;
- break;
- case 'v':
- m_level = lldb::eDescriptionLevelVerbose;
- break;
- case 'i':
- m_internal = true;
- break;
- default:
- error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
- break;
- }
-
- return error;
-}
-
-void
-CommandObjectBreakpointList::CommandOptions::OptionParsingStarting ()
-{
- m_level = lldb::eDescriptionLevelFull;
- m_internal = false;
-}
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointList
-//-------------------------------------------------------------------------
-#pragma mark List
-
-CommandObjectBreakpointList::CommandObjectBreakpointList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "breakpoint list",
- "List some or all breakpoints at configurable levels of detail.",
- NULL),
- m_options (interpreter)
-{
- CommandArgumentEntry arg;
- CommandArgumentData bp_id_arg;
-
- // Define the first (and only) variant of this arg.
- bp_id_arg.arg_type = eArgTypeBreakpointID;
- bp_id_arg.arg_repetition = eArgRepeatOptional;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg.push_back (bp_id_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg);
-}
-
-CommandObjectBreakpointList::~CommandObjectBreakpointList ()
-{
-}
-
-Options *
-CommandObjectBreakpointList::GetOptions ()
-{
- return &m_options;
-}
-
-bool
-CommandObjectBreakpointList::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
+#pragma mark Modify::CommandOptions
+OptionDefinition
+CommandObjectBreakpointModify::CommandOptions::g_option_table[] =
{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (target == NULL)
- {
- result.AppendError ("Invalid target. No current target or breakpoints.");
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- return true;
- }
-
- const BreakpointList &breakpoints = target->GetBreakpointList(m_options.m_internal);
- Mutex::Locker locker;
- target->GetBreakpointList(m_options.m_internal).GetListMutex(locker);
-
- size_t num_breakpoints = breakpoints.GetSize();
-
- if (num_breakpoints == 0)
- {
- result.AppendMessage ("No breakpoints currently set.");
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- return true;
- }
-
- Stream &output_stream = result.GetOutputStream();
-
- if (args.GetArgumentCount() == 0)
- {
- // No breakpoint selected; show info about all currently set breakpoints.
- result.AppendMessage ("Current breakpoints:");
- for (size_t i = 0; i < num_breakpoints; ++i)
- {
- Breakpoint *breakpoint = breakpoints.GetBreakpointAtIndex (i).get();
- AddBreakpointDescription (&output_stream, breakpoint, m_options.m_level);
- }
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- // Particular breakpoints selected; show info about that breakpoint.
- BreakpointIDList valid_bp_ids;
- CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (args, target, result, &valid_bp_ids);
-
- if (result.Succeeded())
- {
- for (size_t i = 0; i < valid_bp_ids.GetSize(); ++i)
- {
- BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
- Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
- AddBreakpointDescription (&output_stream, breakpoint, m_options.m_level);
- }
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- result.AppendError ("Invalid breakpoint id.");
- result.SetStatus (eReturnStatusFailed);
- }
- }
-
- return result.Succeeded();
-}
+{ LLDB_OPT_SET_ALL, false, "ignore-count", 'i', required_argument, NULL, 0, eArgTypeCount, "Set the number of times this breakpoint is skipped before stopping." },
+{ LLDB_OPT_SET_ALL, false, "thread-index", 'x', required_argument, NULL, 0, eArgTypeThreadIndex, "The breakpoint stops only for the thread whose indeX matches this argument."},
+{ LLDB_OPT_SET_ALL, false, "thread-id", 't', required_argument, NULL, 0, eArgTypeThreadID, "The breakpoint stops only for the thread whose TID matches this argument."},
+{ LLDB_OPT_SET_ALL, false, "thread-name", 'T', required_argument, NULL, 0, eArgTypeThreadName, "The breakpoint stops only for the thread whose thread name matches this argument."},
+{ LLDB_OPT_SET_ALL, false, "queue-name", 'q', required_argument, NULL, 0, eArgTypeQueueName, "The breakpoint stops only for threads in the queue whose name is given by this argument."},
+{ LLDB_OPT_SET_ALL, false, "condition", 'c', required_argument, NULL, 0, eArgTypeExpression, "The breakpoint stops only if this condition expression evaluates to true."},
+{ LLDB_OPT_SET_1, false, "enable", 'e', no_argument, NULL, 0, eArgTypeNone, "Enable the breakpoint."},
+{ LLDB_OPT_SET_2, false, "disable", 'd', no_argument, NULL, 0, eArgTypeNone, "Disable the breakpoint."},
+{ 0, false, NULL, 0 , 0, NULL, 0, eArgTypeNone, NULL }
+};
//-------------------------------------------------------------------------
// CommandObjectBreakpointEnable
//-------------------------------------------------------------------------
#pragma mark Enable
-CommandObjectBreakpointEnable::CommandObjectBreakpointEnable (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "enable",
- "Enable the specified disabled breakpoint(s). If no breakpoints are specified, enable all of them.",
- NULL)
-{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back (arg);
-}
-
-
-CommandObjectBreakpointEnable::~CommandObjectBreakpointEnable ()
-{
-}
-
-
-bool
-CommandObjectBreakpointEnable::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
+class CommandObjectBreakpointEnable : public CommandObjectParsed
{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (target == NULL)
+public:
+ CommandObjectBreakpointEnable (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "enable",
+ "Enable the specified disabled breakpoint(s). If no breakpoints are specified, enable all of them.",
+ NULL)
{
- result.AppendError ("Invalid target. No existing target or breakpoints.");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back (arg);
}
- Mutex::Locker locker;
- target->GetBreakpointList().GetListMutex(locker);
-
- const BreakpointList &breakpoints = target->GetBreakpointList();
- size_t num_breakpoints = breakpoints.GetSize();
+ virtual
+ ~CommandObjectBreakpointEnable () {}
- if (num_breakpoints == 0)
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- result.AppendError ("No breakpoints exist to be enabled.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (target == NULL)
+ {
+ result.AppendError ("Invalid target. No existing target or breakpoints.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- if (args.GetArgumentCount() == 0)
- {
- // No breakpoint selected; enable all currently set breakpoints.
- target->EnableAllBreakpoints ();
- result.AppendMessageWithFormat ("All breakpoints enabled. (%lu breakpoints)\n", num_breakpoints);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- // Particular breakpoint selected; enable that breakpoint.
- BreakpointIDList valid_bp_ids;
- CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (args, target, result, &valid_bp_ids);
+ Mutex::Locker locker;
+ target->GetBreakpointList().GetListMutex(locker);
- if (result.Succeeded())
+ const BreakpointList &breakpoints = target->GetBreakpointList();
+
+ size_t num_breakpoints = breakpoints.GetSize();
+
+ if (num_breakpoints == 0)
{
- int enable_count = 0;
- int loc_count = 0;
- const size_t count = valid_bp_ids.GetSize();
- for (size_t i = 0; i < count; ++i)
- {
- BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+ result.AppendError ("No breakpoints exist to be enabled.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
+ if (command.GetArgumentCount() == 0)
+ {
+ // No breakpoint selected; enable all currently set breakpoints.
+ target->EnableAllBreakpoints ();
+ result.AppendMessageWithFormat ("All breakpoints enabled. (%lu breakpoints)\n", num_breakpoints);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ // Particular breakpoint selected; enable that breakpoint.
+ BreakpointIDList valid_bp_ids;
+ CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+
+ if (result.Succeeded())
+ {
+ int enable_count = 0;
+ int loc_count = 0;
+ const size_t count = valid_bp_ids.GetSize();
+ for (size_t i = 0; i < count; ++i)
{
- Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
- if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
+ BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+
+ if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
{
- BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
- if (location)
+ Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+ if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
{
- location->SetEnabled (true);
- ++loc_count;
+ BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
+ if (location)
+ {
+ location->SetEnabled (true);
+ ++loc_count;
+ }
+ }
+ else
+ {
+ breakpoint->SetEnabled (true);
+ ++enable_count;
}
- }
- else
- {
- breakpoint->SetEnabled (true);
- ++enable_count;
}
}
+ result.AppendMessageWithFormat ("%d breakpoints enabled.\n", enable_count + loc_count);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
- result.AppendMessageWithFormat ("%d breakpoints enabled.\n", enable_count + loc_count);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
- }
- return result.Succeeded();
-}
+ return result.Succeeded();
+ }
+};
//-------------------------------------------------------------------------
// CommandObjectBreakpointDisable
//-------------------------------------------------------------------------
#pragma mark Disable
-CommandObjectBreakpointDisable::CommandObjectBreakpointDisable (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "breakpoint disable",
- "Disable the specified breakpoint(s) without removing it/them. If no breakpoints are specified, disable them all.",
- NULL)
-{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back (arg);
-}
-
-CommandObjectBreakpointDisable::~CommandObjectBreakpointDisable ()
+class CommandObjectBreakpointDisable : public CommandObjectParsed
{
-}
-
-bool
-CommandObjectBreakpointDisable::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (target == NULL)
+public:
+ CommandObjectBreakpointDisable (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "breakpoint disable",
+ "Disable the specified breakpoint(s) without removing it/them. If no breakpoints are specified, disable them all.",
+ NULL)
{
- result.AppendError ("Invalid target. No existing target or breakpoints.");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back (arg);
}
- Mutex::Locker locker;
- target->GetBreakpointList().GetListMutex(locker);
- const BreakpointList &breakpoints = target->GetBreakpointList();
- size_t num_breakpoints = breakpoints.GetSize();
+ virtual
+ ~CommandObjectBreakpointDisable () {}
- if (num_breakpoints == 0)
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- result.AppendError ("No breakpoints exist to be disabled.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (target == NULL)
+ {
+ result.AppendError ("Invalid target. No existing target or breakpoints.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- if (args.GetArgumentCount() == 0)
- {
- // No breakpoint selected; disable all currently set breakpoints.
- target->DisableAllBreakpoints ();
- result.AppendMessageWithFormat ("All breakpoints disabled. (%lu breakpoints)\n", num_breakpoints);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- // Particular breakpoint selected; disable that breakpoint.
- BreakpointIDList valid_bp_ids;
+ Mutex::Locker locker;
+ target->GetBreakpointList().GetListMutex(locker);
- CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (args, target, result, &valid_bp_ids);
+ const BreakpointList &breakpoints = target->GetBreakpointList();
+ size_t num_breakpoints = breakpoints.GetSize();
- if (result.Succeeded())
+ if (num_breakpoints == 0)
{
- int disable_count = 0;
- int loc_count = 0;
- const size_t count = valid_bp_ids.GetSize();
- for (size_t i = 0; i < count; ++i)
- {
- BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+ result.AppendError ("No breakpoints exist to be disabled.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
+ if (command.GetArgumentCount() == 0)
+ {
+ // No breakpoint selected; disable all currently set breakpoints.
+ target->DisableAllBreakpoints ();
+ result.AppendMessageWithFormat ("All breakpoints disabled. (%lu breakpoints)\n", num_breakpoints);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ // Particular breakpoint selected; disable that breakpoint.
+ BreakpointIDList valid_bp_ids;
+
+ CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+
+ if (result.Succeeded())
+ {
+ int disable_count = 0;
+ int loc_count = 0;
+ const size_t count = valid_bp_ids.GetSize();
+ for (size_t i = 0; i < count; ++i)
{
- Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
- if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
+ BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+
+ if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
{
- BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
- if (location)
+ Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+ if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
{
- location->SetEnabled (false);
- ++loc_count;
+ BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
+ if (location)
+ {
+ location->SetEnabled (false);
+ ++loc_count;
+ }
+ }
+ else
+ {
+ breakpoint->SetEnabled (false);
+ ++disable_count;
}
- }
- else
- {
- breakpoint->SetEnabled (false);
- ++disable_count;
}
}
+ result.AppendMessageWithFormat ("%d breakpoints disabled.\n", disable_count + loc_count);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
- result.AppendMessageWithFormat ("%d breakpoints disabled.\n", disable_count + loc_count);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
+
+ return result.Succeeded();
}
- return result.Succeeded();
-}
+};
//-------------------------------------------------------------------------
-// CommandObjectBreakpointClear::CommandOptions
+// CommandObjectBreakpointList
//-------------------------------------------------------------------------
-#pragma mark Clear::CommandOptions
-
-CommandObjectBreakpointClear::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
- Options (interpreter),
- m_filename (),
- m_line_num (0)
-{
-}
+#pragma mark List
-CommandObjectBreakpointClear::CommandOptions::~CommandOptions ()
+class CommandObjectBreakpointList : public CommandObjectParsed
{
-}
+public:
+ CommandObjectBreakpointList (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "breakpoint list",
+ "List some or all breakpoints at configurable levels of detail.",
+ NULL),
+ m_options (interpreter)
+ {
+ CommandArgumentEntry arg;
+ CommandArgumentData bp_id_arg;
-OptionDefinition
-CommandObjectBreakpointClear::CommandOptions::g_option_table[] =
-{
- { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,
- "Specify the breakpoint by source location in this particular file."},
+ // Define the first (and only) variant of this arg.
+ bp_id_arg.arg_type = eArgTypeBreakpointID;
+ bp_id_arg.arg_repetition = eArgRepeatOptional;
- { LLDB_OPT_SET_1, true, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum,
- "Specify the breakpoint by source location at this particular line."},
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg.push_back (bp_id_arg);
- { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
-};
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg);
+ }
-const OptionDefinition*
-CommandObjectBreakpointClear::CommandOptions::GetDefinitions ()
-{
- return g_option_table;
-}
-Error
-CommandObjectBreakpointClear::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
-{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
+ virtual
+ ~CommandObjectBreakpointList () {}
- switch (short_option)
+ virtual Options *
+ GetOptions ()
{
- case 'f':
- m_filename.assign (option_arg);
- break;
-
- case 'l':
- m_line_num = Args::StringToUInt32 (option_arg, 0);
- break;
-
- default:
- error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
- break;
+ return &m_options;
}
+
+ class CommandOptions : public Options
+ {
+ public:
- return error;
-}
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options (interpreter),
+ m_level (lldb::eDescriptionLevelBrief) // Breakpoint List defaults to brief descriptions
+ {
+ }
-void
-CommandObjectBreakpointClear::CommandOptions::OptionParsingStarting ()
-{
- m_filename.clear();
- m_line_num = 0;
-}
+ virtual
+ ~CommandOptions () {}
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointClear
-//-------------------------------------------------------------------------
-#pragma mark Clear
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
-CommandObjectBreakpointClear::CommandObjectBreakpointClear (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "breakpoint clear",
- "Clears a breakpoint or set of breakpoints in the executable.",
- "breakpoint clear <cmd-options>"),
- m_options (interpreter)
-{
-}
+ switch (short_option)
+ {
+ case 'b':
+ m_level = lldb::eDescriptionLevelBrief;
+ break;
+ case 'f':
+ m_level = lldb::eDescriptionLevelFull;
+ break;
+ case 'v':
+ m_level = lldb::eDescriptionLevelVerbose;
+ break;
+ case 'i':
+ m_internal = true;
+ break;
+ default:
+ error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
+ break;
+ }
-CommandObjectBreakpointClear::~CommandObjectBreakpointClear ()
-{
-}
+ return error;
+ }
-Options *
-CommandObjectBreakpointClear::GetOptions ()
-{
- return &m_options;
-}
+ void
+ OptionParsingStarting ()
+ {
+ m_level = lldb::eDescriptionLevelFull;
+ m_internal = false;
+ }
-bool
-CommandObjectBreakpointClear::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (target == NULL)
- {
- result.AppendError ("Invalid target. No existing target or breakpoints.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ const OptionDefinition *
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
- // The following are the various types of breakpoints that could be cleared:
- // 1). -f -l (clearing breakpoint by source location)
+ // Options table: Required for subclasses of Options.
- BreakpointClearType break_type = eClearTypeInvalid;
+ static OptionDefinition g_option_table[];
- if (m_options.m_line_num != 0)
- break_type = eClearTypeFileAndLine;
+ // Instance variables to hold the values for command options.
- Mutex::Locker locker;
- target->GetBreakpointList().GetListMutex(locker);
+ lldb::DescriptionLevel m_level;
- BreakpointList &breakpoints = target->GetBreakpointList();
- size_t num_breakpoints = breakpoints.GetSize();
+ bool m_internal;
+ };
- // Early return if there's no breakpoint at all.
- if (num_breakpoints == 0)
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- result.AppendError ("Breakpoint clear: No breakpoint cleared.");
- result.SetStatus (eReturnStatusFailed);
- return result.Succeeded();
- }
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (target == NULL)
+ {
+ result.AppendError ("Invalid target. No current target or breakpoints.");
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ return true;
+ }
- // Find matching breakpoints and delete them.
+ const BreakpointList &breakpoints = target->GetBreakpointList(m_options.m_internal);
+ Mutex::Locker locker;
+ target->GetBreakpointList(m_options.m_internal).GetListMutex(locker);
- // First create a copy of all the IDs.
- std::vector<break_id_t> BreakIDs;
- for (size_t i = 0; i < num_breakpoints; ++i)
- BreakIDs.push_back(breakpoints.GetBreakpointAtIndex(i).get()->GetID());
-
- int num_cleared = 0;
- StreamString ss;
- switch (break_type)
- {
- case eClearTypeFileAndLine: // Breakpoint by source position
+ size_t num_breakpoints = breakpoints.GetSize();
+
+ if (num_breakpoints == 0)
+ {
+ result.AppendMessage ("No breakpoints currently set.");
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ return true;
+ }
+
+ Stream &output_stream = result.GetOutputStream();
+
+ if (command.GetArgumentCount() == 0)
+ {
+ // No breakpoint selected; show info about all currently set breakpoints.
+ result.AppendMessage ("Current breakpoints:");
+ for (size_t i = 0; i < num_breakpoints; ++i)
{
- const ConstString filename(m_options.m_filename.c_str());
- BreakpointLocationCollection loc_coll;
+ Breakpoint *breakpoint = breakpoints.GetBreakpointAtIndex (i).get();
+ AddBreakpointDescription (&output_stream, breakpoint, m_options.m_level);
+ }
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ // Particular breakpoints selected; show info about that breakpoint.
+ BreakpointIDList valid_bp_ids;
+ CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
- for (size_t i = 0; i < num_breakpoints; ++i)
+ if (result.Succeeded())
+ {
+ for (size_t i = 0; i < valid_bp_ids.GetSize(); ++i)
{
- Breakpoint *bp = breakpoints.FindBreakpointByID(BreakIDs[i]).get();
-
- if (bp->GetMatchingFileLine(filename, m_options.m_line_num, loc_coll))
- {
- // If the collection size is 0, it's a full match and we can just remove the breakpoint.
- if (loc_coll.GetSize() == 0)
- {
- bp->GetDescription(&ss, lldb::eDescriptionLevelBrief);
- ss.EOL();
- target->RemoveBreakpointByID (bp->GetID());
- ++num_cleared;
- }
- }
+ BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+ Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+ AddBreakpointDescription (&output_stream, breakpoint, m_options.m_level);
}
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ result.AppendError ("Invalid breakpoint id.");
+ result.SetStatus (eReturnStatusFailed);
}
- break;
+ }
- default:
- break;
+ return result.Succeeded();
}
- if (num_cleared > 0)
+private:
+ CommandOptions m_options;
+};
+
+#pragma mark List::CommandOptions
+OptionDefinition
+CommandObjectBreakpointList::CommandOptions::g_option_table[] =
+{
+ { LLDB_OPT_SET_ALL, false, "internal", 'i', no_argument, NULL, 0, eArgTypeNone,
+ "Show debugger internal breakpoints" },
+
+ { LLDB_OPT_SET_1, false, "brief", 'b', no_argument, NULL, 0, eArgTypeNone,
+ "Give a brief description of the breakpoint (no location info)."},
+
+ // FIXME: We need to add an "internal" command, and then add this sort of thing to it.
+ // But I need to see it for now, and don't want to wait.
+ { LLDB_OPT_SET_2, false, "full", 'f', no_argument, NULL, 0, eArgTypeNone,
+ "Give a full description of the breakpoint and its locations."},
+
+ { LLDB_OPT_SET_3, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone,
+ "Explain everything we know about the breakpoint (for debugging debugger bugs)." },
+
+ { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
+};
+
+//-------------------------------------------------------------------------
+// CommandObjectBreakpointClear
+//-------------------------------------------------------------------------
+#pragma mark Clear
+
+class CommandObjectBreakpointClear : public CommandObjectParsed
+{
+public:
+
+ typedef enum BreakpointClearType
+ {
+ eClearTypeInvalid,
+ eClearTypeFileAndLine
+ } BreakpointClearType;
+
+ CommandObjectBreakpointClear (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "breakpoint clear",
+ "Clears a breakpoint or set of breakpoints in the executable.",
+ "breakpoint clear <cmd-options>"),
+ m_options (interpreter)
{
- Stream &output_stream = result.GetOutputStream();
- output_stream.Printf ("%d breakpoints cleared:\n", num_cleared);
- output_stream << ss.GetData();
- output_stream.EOL();
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
- else
+
+ virtual
+ ~CommandObjectBreakpointClear () {}
+
+ virtual Options *
+ GetOptions ()
{
- result.AppendError ("Breakpoint clear: No breakpoint cleared.");
- result.SetStatus (eReturnStatusFailed);
+ return &m_options;
}
- return result.Succeeded();
-}
+ class CommandOptions : public Options
+ {
+ public:
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointDelete
-//-------------------------------------------------------------------------
-#pragma mark Delete
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options (interpreter),
+ m_filename (),
+ m_line_num (0)
+ {
+ }
-CommandObjectBreakpointDelete::CommandObjectBreakpointDelete(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "breakpoint delete",
- "Delete the specified breakpoint(s). If no breakpoints are specified, delete them all.",
- NULL)
-{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back (arg);
-}
+ virtual
+ ~CommandOptions () {}
+
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
+ switch (short_option)
+ {
+ case 'f':
+ m_filename.assign (option_arg);
+ break;
+
+ case 'l':
+ m_line_num = Args::StringToUInt32 (option_arg, 0);
+ break;
+
+ default:
+ error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
+ break;
+ }
+
+ return error;
+ }
+
+ void
+ OptionParsingStarting ()
+ {
+ m_filename.clear();
+ m_line_num = 0;
+ }
+
+ const OptionDefinition*
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
-CommandObjectBreakpointDelete::~CommandObjectBreakpointDelete ()
-{
-}
+ // Options table: Required for subclasses of Options.
-bool
-CommandObjectBreakpointDelete::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (target == NULL)
- {
- result.AppendError ("Invalid target. No existing target or breakpoints.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ static OptionDefinition g_option_table[];
- Mutex::Locker locker;
- target->GetBreakpointList().GetListMutex(locker);
-
- const BreakpointList &breakpoints = target->GetBreakpointList();
+ // Instance variables to hold the values for command options.
- size_t num_breakpoints = breakpoints.GetSize();
+ std::string m_filename;
+ uint32_t m_line_num;
- if (num_breakpoints == 0)
- {
- result.AppendError ("No breakpoints exist to be deleted.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ };
- if (args.GetArgumentCount() == 0)
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- if (!m_interpreter.Confirm ("About to delete all breakpoints, do you want to do that?", true))
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (target == NULL)
{
- result.AppendMessage("Operation cancelled...");
+ result.AppendError ("Invalid target. No existing target or breakpoints.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
- else
+
+ // The following are the various types of breakpoints that could be cleared:
+ // 1). -f -l (clearing breakpoint by source location)
+
+ BreakpointClearType break_type = eClearTypeInvalid;
+
+ if (m_options.m_line_num != 0)
+ break_type = eClearTypeFileAndLine;
+
+ Mutex::Locker locker;
+ target->GetBreakpointList().GetListMutex(locker);
+
+ BreakpointList &breakpoints = target->GetBreakpointList();
+ size_t num_breakpoints = breakpoints.GetSize();
+
+ // Early return if there's no breakpoint at all.
+ if (num_breakpoints == 0)
{
- target->RemoveAllBreakpoints ();
- result.AppendMessageWithFormat ("All breakpoints removed. (%lu breakpoints)\n", num_breakpoints);
+ result.AppendError ("Breakpoint clear: No breakpoint cleared.");
+ result.SetStatus (eReturnStatusFailed);
+ return result.Succeeded();
}
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- // Particular breakpoint selected; disable that breakpoint.
- BreakpointIDList valid_bp_ids;
- CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (args, target, result, &valid_bp_ids);
- if (result.Succeeded())
- {
- int delete_count = 0;
- int disable_count = 0;
- const size_t count = valid_bp_ids.GetSize();
- for (size_t i = 0; i < count; ++i)
- {
- BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+ // Find matching breakpoints and delete them.
- if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
+ // First create a copy of all the IDs.
+ std::vector<break_id_t> BreakIDs;
+ for (size_t i = 0; i < num_breakpoints; ++i)
+ BreakIDs.push_back(breakpoints.GetBreakpointAtIndex(i).get()->GetID());
+
+ int num_cleared = 0;
+ StreamString ss;
+ switch (break_type)
+ {
+ case eClearTypeFileAndLine: // Breakpoint by source position
{
- if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
+ const ConstString filename(m_options.m_filename.c_str());
+ BreakpointLocationCollection loc_coll;
+
+ for (size_t i = 0; i < num_breakpoints; ++i)
{
- Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
- BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
- // It makes no sense to try to delete individual locations, so we disable them instead.
- if (location)
+ Breakpoint *bp = breakpoints.FindBreakpointByID(BreakIDs[i]).get();
+
+ if (bp->GetMatchingFileLine(filename, m_options.m_line_num, loc_coll))
{
- location->SetEnabled (false);
- ++disable_count;
+ // If the collection size is 0, it's a full match and we can just remove the breakpoint.
+ if (loc_coll.GetSize() == 0)
+ {
+ bp->GetDescription(&ss, lldb::eDescriptionLevelBrief);
+ ss.EOL();
+ target->RemoveBreakpointByID (bp->GetID());
+ ++num_cleared;
+ }
}
}
- else
- {
- target->RemoveBreakpointByID (cur_bp_id.GetBreakpointID());
- ++delete_count;
- }
}
- }
- result.AppendMessageWithFormat ("%d breakpoints deleted; %d breakpoint locations disabled.\n",
- delete_count, disable_count);
+ break;
+
+ default:
+ break;
+ }
+
+ if (num_cleared > 0)
+ {
+ Stream &output_stream = result.GetOutputStream();
+ output_stream.Printf ("%d breakpoints cleared:\n", num_cleared);
+ output_stream << ss.GetData();
+ output_stream.EOL();
result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
- }
- return result.Succeeded();
-}
+ else
+ {
+ result.AppendError ("Breakpoint clear: No breakpoint cleared.");
+ result.SetStatus (eReturnStatusFailed);
+ }
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointModify::CommandOptions
-//-------------------------------------------------------------------------
-#pragma mark Modify::CommandOptions
+ return result.Succeeded();
+ }
-CommandObjectBreakpointModify::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
- Options (interpreter),
- m_ignore_count (0),
- m_thread_id(LLDB_INVALID_THREAD_ID),
- m_thread_id_passed(false),
- m_thread_index (UINT32_MAX),
- m_thread_index_passed(false),
- m_thread_name(),
- m_queue_name(),
- m_condition (),
- m_enable_passed (false),
- m_enable_value (false),
- m_name_passed (false),
- m_queue_passed (false),
- m_condition_passed (false)
-{
-}
+private:
+ CommandOptions m_options;
+};
-CommandObjectBreakpointModify::CommandOptions::~CommandOptions ()
-{
-}
+#pragma mark Clear::CommandOptions
OptionDefinition
-CommandObjectBreakpointModify::CommandOptions::g_option_table[] =
+CommandObjectBreakpointClear::CommandOptions::g_option_table[] =
{
-{ LLDB_OPT_SET_ALL, false, "ignore-count", 'i', required_argument, NULL, 0, eArgTypeCount, "Set the number of times this breakpoint is skipped before stopping." },
-{ LLDB_OPT_SET_ALL, false, "thread-index", 'x', required_argument, NULL, 0, eArgTypeThreadIndex, "The breakpoint stops only for the thread whose indeX matches this argument."},
-{ LLDB_OPT_SET_ALL, false, "thread-id", 't', required_argument, NULL, 0, eArgTypeThreadID, "The breakpoint stops only for the thread whose TID matches this argument."},
-{ LLDB_OPT_SET_ALL, false, "thread-name", 'T', required_argument, NULL, 0, eArgTypeThreadName, "The breakpoint stops only for the thread whose thread name matches this argument."},
-{ LLDB_OPT_SET_ALL, false, "queue-name", 'q', required_argument, NULL, 0, eArgTypeQueueName, "The breakpoint stops only for threads in the queue whose name is given by this argument."},
-{ LLDB_OPT_SET_ALL, false, "condition", 'c', required_argument, NULL, 0, eArgTypeExpression, "The breakpoint stops only if this condition expression evaluates to true."},
-{ LLDB_OPT_SET_1, false, "enable", 'e', no_argument, NULL, 0, eArgTypeNone, "Enable the breakpoint."},
-{ LLDB_OPT_SET_2, false, "disable", 'd', no_argument, NULL, 0, eArgTypeNone, "Disable the breakpoint."},
-{ 0, false, NULL, 0 , 0, NULL, 0, eArgTypeNone, NULL }
+ { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,
+ "Specify the breakpoint by source location in this particular file."},
+
+ { LLDB_OPT_SET_1, true, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum,
+ "Specify the breakpoint by source location at this particular line."},
+
+ { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
};
-const OptionDefinition*
-CommandObjectBreakpointModify::CommandOptions::GetDefinitions ()
-{
- return g_option_table;
-}
+//-------------------------------------------------------------------------
+// CommandObjectBreakpointDelete
+//-------------------------------------------------------------------------
+#pragma mark Delete
-Error
-CommandObjectBreakpointModify::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
+class CommandObjectBreakpointDelete : public CommandObjectParsed
{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
+public:
+ CommandObjectBreakpointDelete (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "breakpoint delete",
+ "Delete the specified breakpoint(s). If no breakpoints are specified, delete them all.",
+ NULL)
+ {
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back (arg);
+ }
- switch (short_option)
+ virtual
+ ~CommandObjectBreakpointDelete () {}
+
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- case 'c':
- if (option_arg != NULL)
- m_condition.assign (option_arg);
- else
- m_condition.clear();
- m_condition_passed = true;
- break;
- case 'd':
- m_enable_passed = true;
- m_enable_value = false;
- break;
- case 'e':
- m_enable_passed = true;
- m_enable_value = true;
- break;
- case 'i':
- {
- m_ignore_count = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
- if (m_ignore_count == UINT32_MAX)
- error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg);
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (target == NULL)
+ {
+ result.AppendError ("Invalid target. No existing target or breakpoints.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+
+ Mutex::Locker locker;
+ target->GetBreakpointList().GetListMutex(locker);
+
+ const BreakpointList &breakpoints = target->GetBreakpointList();
+
+ size_t num_breakpoints = breakpoints.GetSize();
+
+ if (num_breakpoints == 0)
+ {
+ result.AppendError ("No breakpoints exist to be deleted.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
- break;
- case 't' :
+
+ if (command.GetArgumentCount() == 0)
{
- if (option_arg[0] == '\0')
+ if (!m_interpreter.Confirm ("About to delete all breakpoints, do you want to do that?", true))
{
- m_thread_id = LLDB_INVALID_THREAD_ID;
- m_thread_id_passed = true;
+ result.AppendMessage("Operation cancelled...");
}
else
{
- m_thread_id = Args::StringToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0);
- if (m_thread_id == LLDB_INVALID_THREAD_ID)
- error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg);
- else
- m_thread_id_passed = true;
+ target->RemoveAllBreakpoints ();
+ result.AppendMessageWithFormat ("All breakpoints removed. (%lu breakpoints)\n", num_breakpoints);
}
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
- break;
- case 'T':
- if (option_arg != NULL)
- m_thread_name.assign (option_arg);
- else
- m_thread_name.clear();
- m_name_passed = true;
- break;
- case 'q':
- if (option_arg != NULL)
- m_queue_name.assign (option_arg);
- else
- m_queue_name.clear();
- m_queue_passed = true;
- break;
- case 'x':
+ else
{
- if (option_arg[0] == '\n')
- {
- m_thread_index = UINT32_MAX;
- m_thread_index_passed = true;
- }
- else
- {
- m_thread_index = Args::StringToUInt32 (option_arg, UINT32_MAX, 0);
- if (m_thread_id == UINT32_MAX)
- error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg);
- else
- m_thread_index_passed = true;
+ // Particular breakpoint selected; disable that breakpoint.
+ BreakpointIDList valid_bp_ids;
+ CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+
+ if (result.Succeeded())
+ {
+ int delete_count = 0;
+ int disable_count = 0;
+ const size_t count = valid_bp_ids.GetSize();
+ for (size_t i = 0; i < count; ++i)
+ {
+ BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+
+ if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
+ {
+ if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
+ {
+ Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+ BreakpointLocation *location = breakpoint->FindLocationByID (cur_bp_id.GetLocationID()).get();
+ // It makes no sense to try to delete individual locations, so we disable them instead.
+ if (location)
+ {
+ location->SetEnabled (false);
+ ++disable_count;
+ }
+ }
+ else
+ {
+ target->RemoveBreakpointByID (cur_bp_id.GetBreakpointID());
+ ++delete_count;
+ }
+ }
+ }
+ result.AppendMessageWithFormat ("%d breakpoints deleted; %d breakpoint locations disabled.\n",
+ delete_count, disable_count);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
}
- break;
- default:
- error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
- break;
+ return result.Succeeded();
}
-
- return error;
-}
-
-void
-CommandObjectBreakpointModify::CommandOptions::OptionParsingStarting ()
-{
- m_ignore_count = 0;
- m_thread_id = LLDB_INVALID_THREAD_ID;
- m_thread_id_passed = false;
- m_thread_index = UINT32_MAX;
- m_thread_index_passed = false;
- m_thread_name.clear();
- m_queue_name.clear();
- m_condition.clear();
- m_enable_passed = false;
- m_queue_passed = false;
- m_name_passed = false;
- m_condition_passed = false;
-}
+};
//-------------------------------------------------------------------------
-// CommandObjectBreakpointModify
+// CommandObjectMultiwordBreakpoint
//-------------------------------------------------------------------------
-#pragma mark Modify
+#pragma mark MultiwordBreakpoint
-CommandObjectBreakpointModify::CommandObjectBreakpointModify (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "breakpoint modify",
- "Modify the options on a breakpoint or set of breakpoints in the executable. "
- "If no breakpoint is specified, acts on the last created breakpoint. "
- "With the exception of -e, -d and -i, passing an empty argument clears the modification.",
- NULL),
- m_options (interpreter)
+CommandObjectMultiwordBreakpoint::CommandObjectMultiwordBreakpoint (CommandInterpreter &interpreter) :
+ CommandObjectMultiword (interpreter,
+ "breakpoint",
+ "A set of commands for operating on breakpoints. Also see _regexp-break.",
+ "breakpoint <command> [<command-options>]")
{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeBreakpointID, eArgTypeBreakpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back (arg);
-}
+ bool status;
-CommandObjectBreakpointModify::~CommandObjectBreakpointModify ()
-{
+ CommandObjectSP list_command_object (new CommandObjectBreakpointList (interpreter));
+ CommandObjectSP enable_command_object (new CommandObjectBreakpointEnable (interpreter));
+ CommandObjectSP disable_command_object (new CommandObjectBreakpointDisable (interpreter));
+ CommandObjectSP clear_command_object (new CommandObjectBreakpointClear (interpreter));
+ CommandObjectSP delete_command_object (new CommandObjectBreakpointDelete (interpreter));
+ CommandObjectSP set_command_object (new CommandObjectBreakpointSet (interpreter));
+ CommandObjectSP command_command_object (new CommandObjectBreakpointCommand (interpreter));
+ CommandObjectSP modify_command_object (new CommandObjectBreakpointModify(interpreter));
+
+ list_command_object->SetCommandName ("breakpoint list");
+ enable_command_object->SetCommandName("breakpoint enable");
+ disable_command_object->SetCommandName("breakpoint disable");
+ clear_command_object->SetCommandName("breakpoint clear");
+ delete_command_object->SetCommandName("breakpoint delete");
+ set_command_object->SetCommandName("breakpoint set");
+ command_command_object->SetCommandName ("breakpoint command");
+ modify_command_object->SetCommandName ("breakpoint modify");
+
+ status = LoadSubCommand ("list", list_command_object);
+ status = LoadSubCommand ("enable", enable_command_object);
+ status = LoadSubCommand ("disable", disable_command_object);
+ status = LoadSubCommand ("clear", clear_command_object);
+ status = LoadSubCommand ("delete", delete_command_object);
+ status = LoadSubCommand ("set", set_command_object);
+ status = LoadSubCommand ("command", command_command_object);
+ status = LoadSubCommand ("modify", modify_command_object);
}
-Options *
-CommandObjectBreakpointModify::GetOptions ()
+CommandObjectMultiwordBreakpoint::~CommandObjectMultiwordBreakpoint ()
{
- return &m_options;
}
-bool
-CommandObjectBreakpointModify::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
+void
+CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (Args &args, Target *target, CommandReturnObject &result,
+ BreakpointIDList *valid_ids)
{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (target == NULL)
+ // args can be strings representing 1). integers (for breakpoint ids)
+ // 2). the full breakpoint & location canonical representation
+ // 3). the word "to" or a hyphen, representing a range (in which case there
+ // had *better* be an entry both before & after of one of the first two types.
+ // If args is empty, we will use the last created breakpoint (if there is one.)
+
+ Args temp_args;
+
+ if (args.GetArgumentCount() == 0)
{
- result.AppendError ("Invalid target. No existing target or breakpoints.");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ if (target->GetLastCreatedBreakpoint())
+ {
+ valid_ids->AddBreakpointID (BreakpointID(target->GetLastCreatedBreakpoint()->GetID(), LLDB_INVALID_BREAK_ID));
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ result.AppendError("No breakpoint specified and no last created breakpoint.");
+ result.SetStatus (eReturnStatusFailed);
+ }
+ return;
}
-
- Mutex::Locker locker;
- target->GetBreakpointList().GetListMutex(locker);
- BreakpointIDList valid_bp_ids;
+ // Create a new Args variable to use; copy any non-breakpoint-id-ranges stuff directly from the old ARGS to
+ // the new TEMP_ARGS. Do not copy breakpoint id range strings over; instead generate a list of strings for
+ // all the breakpoint ids in the range, and shove all of those breakpoint id strings into TEMP_ARGS.
+
+ BreakpointIDList::FindAndReplaceIDRanges (args, target, result, temp_args);
+
+ // NOW, convert the list of breakpoint id strings in TEMP_ARGS into an actual BreakpointIDList:
+
+ valid_ids->InsertStringArray (temp_args.GetConstArgumentVector(), temp_args.GetArgumentCount(), result);
- CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+ // At this point, all of the breakpoint ids that the user passed in have been converted to breakpoint IDs
+ // and put into valid_ids.
if (result.Succeeded())
{
- const size_t count = valid_bp_ids.GetSize();
+ // Now that we've converted everything from args into a list of breakpoint ids, go through our tentative list
+ // of breakpoint id's and verify that they correspond to valid/currently set breakpoints.
+
+ const size_t count = valid_ids->GetSize();
for (size_t i = 0; i < count; ++i)
{
- BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
-
- if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
+ BreakpointID cur_bp_id = valid_ids->GetBreakpointIDAtIndex (i);
+ Breakpoint *breakpoint = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+ if (breakpoint != NULL)
{
- Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
- if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
- {
- BreakpointLocation *location = bp->FindLocationByID (cur_bp_id.GetLocationID()).get();
- if (location)
- {
- if (m_options.m_thread_id_passed)
- location->SetThreadID (m_options.m_thread_id);
-
- if (m_options.m_thread_index_passed)
- location->SetThreadIndex(m_options.m_thread_index);
-
- if (m_options.m_name_passed)
- location->SetThreadName(m_options.m_thread_name.c_str());
-
- if (m_options.m_queue_passed)
- location->SetQueueName(m_options.m_queue_name.c_str());
-
- if (m_options.m_ignore_count != 0)
- location->SetIgnoreCount(m_options.m_ignore_count);
-
- if (m_options.m_enable_passed)
- location->SetEnabled (m_options.m_enable_value);
-
- if (m_options.m_condition_passed)
- location->SetCondition (m_options.m_condition.c_str());
- }
- }
- else
+ int num_locations = breakpoint->GetNumLocations();
+ if (cur_bp_id.GetLocationID() > num_locations)
{
- if (m_options.m_thread_id_passed)
- bp->SetThreadID (m_options.m_thread_id);
-
- if (m_options.m_thread_index_passed)
- bp->SetThreadIndex(m_options.m_thread_index);
-
- if (m_options.m_name_passed)
- bp->SetThreadName(m_options.m_thread_name.c_str());
-
- if (m_options.m_queue_passed)
- bp->SetQueueName(m_options.m_queue_name.c_str());
-
- if (m_options.m_ignore_count != 0)
- bp->SetIgnoreCount(m_options.m_ignore_count);
-
- if (m_options.m_enable_passed)
- bp->SetEnabled (m_options.m_enable_value);
-
- if (m_options.m_condition_passed)
- bp->SetCondition (m_options.m_condition.c_str());
+ StreamString id_str;
+ BreakpointID::GetCanonicalReference (&id_str,
+ cur_bp_id.GetBreakpointID(),
+ cur_bp_id.GetLocationID());
+ i = valid_ids->GetSize() + 1;
+ result.AppendErrorWithFormat ("'%s' is not a currently valid breakpoint/location id.\n",
+ id_str.GetData());
+ result.SetStatus (eReturnStatusFailed);
}
}
+ else
+ {
+ i = valid_ids->GetSize() + 1;
+ result.AppendErrorWithFormat ("'%d' is not a currently valid breakpoint id.\n", cur_bp_id.GetBreakpointID());
+ result.SetStatus (eReturnStatusFailed);
+ }
}
}
-
- return result.Succeeded();
}
-
-
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpoint.h Fri Jun 8 19:52:06 2012
@@ -42,326 +42,6 @@
};
-//-------------------------------------------------------------------------
-// CommandObjectdBreakpointSet
-//-------------------------------------------------------------------------
-
-
-class CommandObjectBreakpointSet : public CommandObject
-{
-public:
-
- typedef enum BreakpointSetType
- {
- eSetTypeInvalid,
- eSetTypeFileAndLine,
- eSetTypeAddress,
- eSetTypeFunctionName,
- eSetTypeFunctionRegexp,
- eSetTypeSourceRegexp,
- eSetTypeException
- } BreakpointSetType;
-
- CommandObjectBreakpointSet (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointSet ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition*
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- std::string m_condition;
- FileSpecList m_filenames;
- uint32_t m_line_num;
- uint32_t m_column;
- bool m_check_inlines;
- std::vector<std::string> m_func_names;
- uint32_t m_func_name_type_mask;
- std::string m_func_regexp;
- std::string m_source_text_regexp;
- FileSpecList m_modules;
- lldb::addr_t m_load_addr;
- uint32_t m_ignore_count;
- lldb::tid_t m_thread_id;
- uint32_t m_thread_index;
- std::string m_thread_name;
- std::string m_queue_name;
- bool m_catch_bp;
- bool m_throw_bp;
- lldb::LanguageType m_language;
- LazyBool m_skip_prologue;
-
- };
-
-private:
- bool
- GetDefaultFile (Target *target, FileSpec &file, CommandReturnObject &result);
-
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectMultiwordBreakpointModify
-//-------------------------------------------------------------------------
-
-
-class CommandObjectBreakpointModify : public CommandObject
-{
-public:
-
- CommandObjectBreakpointModify (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointModify ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition*
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- uint32_t m_ignore_count;
- lldb::tid_t m_thread_id;
- bool m_thread_id_passed;
- uint32_t m_thread_index;
- bool m_thread_index_passed;
- std::string m_thread_name;
- std::string m_queue_name;
- std::string m_condition;
- bool m_enable_passed;
- bool m_enable_value;
- bool m_name_passed;
- bool m_queue_passed;
- bool m_condition_passed;
-
- };
-
-private:
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointEnable
-//-------------------------------------------------------------------------
-
-class CommandObjectBreakpointEnable : public CommandObject
-{
-public:
- CommandObjectBreakpointEnable (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointEnable ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointDisable
-//-------------------------------------------------------------------------
-
-class CommandObjectBreakpointDisable : public CommandObject
-{
-public:
- CommandObjectBreakpointDisable (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointDisable ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointList
-//-------------------------------------------------------------------------
-
-class CommandObjectBreakpointList : public CommandObject
-{
-public:
- CommandObjectBreakpointList (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointList ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition *
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- lldb::DescriptionLevel m_level;
-
- bool m_internal;
- };
-
-private:
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointClear
-//-------------------------------------------------------------------------
-
-
-class CommandObjectBreakpointClear : public CommandObject
-{
-public:
-
- typedef enum BreakpointClearType
- {
- eClearTypeInvalid,
- eClearTypeFileAndLine
- } BreakpointClearType;
-
- CommandObjectBreakpointClear (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointClear ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition*
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- std::string m_filename;
- uint32_t m_line_num;
-
- };
-
-private:
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointDelete
-//-------------------------------------------------------------------------
-
-class CommandObjectBreakpointDelete : public CommandObject
-{
-public:
- CommandObjectBreakpointDelete (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointDelete ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-private:
-};
-
} // namespace lldb_private
#endif // liblldb_CommandObjectBreakpoint_h_
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.cpp Fri Jun 8 19:52:06 2012
@@ -28,143 +28,22 @@
using namespace lldb_private;
//-------------------------------------------------------------------------
-// CommandObjectBreakpointCommandAdd::CommandOptions
+// CommandObjectBreakpointCommandAdd
//-------------------------------------------------------------------------
-CommandObjectBreakpointCommandAdd::CommandOptions::CommandOptions (CommandInterpreter &interpreter) :
- Options (interpreter),
- m_use_commands (false),
- m_use_script_language (false),
- m_script_language (eScriptLanguageNone),
- m_use_one_liner (false),
- m_one_liner(),
- m_function_name()
-{
-}
-CommandObjectBreakpointCommandAdd::CommandOptions::~CommandOptions ()
+class CommandObjectBreakpointCommandAdd : public CommandObjectParsed
{
-}
-
-// FIXME: "script-type" needs to have its contents determined dynamically, so somebody can add a new scripting
-// language to lldb and have it pickable here without having to change this enumeration by hand and rebuild lldb proper.
+public:
-static OptionEnumValueElement
-g_script_option_enumeration[4] =
-{
- { eScriptLanguageNone, "command", "Commands are in the lldb command interpreter language"},
- { eScriptLanguagePython, "python", "Commands are in the Python language."},
- { eSortOrderByName, "default-script", "Commands are in the default scripting language."},
- { 0, NULL, NULL }
-};
-
-OptionDefinition
-CommandObjectBreakpointCommandAdd::CommandOptions::g_option_table[] =
-{
- { LLDB_OPT_SET_1, false, "one-liner", 'o', required_argument, NULL, NULL, eArgTypeOneLiner,
- "Specify a one-line breakpoint command inline. Be sure to surround it with quotes." },
-
- { LLDB_OPT_SET_ALL, false, "stop-on-error", 'e', required_argument, NULL, NULL, eArgTypeBoolean,
- "Specify whether breakpoint command execution should terminate on error." },
-
- { LLDB_OPT_SET_ALL, false, "script-type", 's', required_argument, g_script_option_enumeration, NULL, eArgTypeNone,
- "Specify the language for the commands - if none is specified, the lldb command interpreter will be used."},
-
- { LLDB_OPT_SET_2, false, "python-function", 'F', required_argument, NULL, NULL, eArgTypePythonFunction,
- "Give the name of a Python function to run as command for this breakpoint. Be sure to give a module name if appropriate."},
-
- { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
-};
-
-const OptionDefinition*
-CommandObjectBreakpointCommandAdd::CommandOptions::GetDefinitions ()
-{
- return g_option_table;
-}
-
-
-Error
-CommandObjectBreakpointCommandAdd::CommandOptions::SetOptionValue
-(
- uint32_t option_idx,
- const char *option_arg
-)
-{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
-
- switch (short_option)
+ CommandObjectBreakpointCommandAdd (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "add",
+ "Add a set of commands to a breakpoint, to be executed whenever the breakpoint is hit.",
+ NULL),
+ m_options (interpreter)
{
- case 'o':
- m_use_one_liner = true;
- m_one_liner = option_arg;
- break;
-
- case 's':
- m_script_language = (lldb::ScriptLanguage) Args::StringToOptionEnum (option_arg,
- g_option_table[option_idx].enum_values,
- eScriptLanguageNone,
- error);
-
- if (m_script_language == eScriptLanguagePython || m_script_language == eScriptLanguageDefault)
- {
- m_use_script_language = true;
- }
- else
- {
- m_use_script_language = false;
- }
- break;
-
- case 'e':
- {
- bool success = false;
- m_stop_on_error = Args::StringToBoolean(option_arg, false, &success);
- if (!success)
- error.SetErrorStringWithFormat("invalid value for stop-on-error: \"%s\"", option_arg);
- }
- break;
-
- case 'F':
- {
- m_use_one_liner = false;
- m_use_script_language = true;
- m_function_name.assign(option_arg);
- }
- break;
-
- default:
- break;
- }
- return error;
-}
-
-void
-CommandObjectBreakpointCommandAdd::CommandOptions::OptionParsingStarting ()
-{
- m_use_commands = true;
- m_use_script_language = false;
- m_script_language = eScriptLanguageNone;
-
- m_use_one_liner = false;
- m_stop_on_error = true;
- m_one_liner.clear();
- m_function_name.clear();
-}
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointCommandAdd
-//-------------------------------------------------------------------------
-
-
-CommandObjectBreakpointCommandAdd::CommandObjectBreakpointCommandAdd (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "add",
- "Add a set of commands to a breakpoint, to be executed whenever the breakpoint is hit.",
- NULL),
- m_options (interpreter)
-{
- SetHelpLong (
+ SetHelpLong (
"\nGeneral information about entering breakpoint commands \n\
------------------------------------------------------ \n\
\n\
@@ -282,518 +161,698 @@
debugger prompt. You may enter as many debugger commands as you like, \n\
but do NOT enter more than one command per line. \n" );
+ CommandArgumentEntry arg;
+ CommandArgumentData bp_id_arg;
- CommandArgumentEntry arg;
- CommandArgumentData bp_id_arg;
+ // Define the first (and only) variant of this arg.
+ bp_id_arg.arg_type = eArgTypeBreakpointID;
+ bp_id_arg.arg_repetition = eArgRepeatPlain;
- // Define the first (and only) variant of this arg.
- bp_id_arg.arg_type = eArgTypeBreakpointID;
- bp_id_arg.arg_repetition = eArgRepeatPlain;
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg.push_back (bp_id_arg);
- // There is only one variant this argument could be; put it into the argument entry.
- arg.push_back (bp_id_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg);
-}
-
-CommandObjectBreakpointCommandAdd::~CommandObjectBreakpointCommandAdd ()
-{
-}
-
-bool
-CommandObjectBreakpointCommandAdd::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
-
- if (target == NULL)
- {
- result.AppendError ("There is not a current executable; there are no breakpoints to which to add commands");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg);
}
- const BreakpointList &breakpoints = target->GetBreakpointList();
- size_t num_breakpoints = breakpoints.GetSize();
+ virtual
+ ~CommandObjectBreakpointCommandAdd () {}
- if (num_breakpoints == 0)
+ virtual Options *
+ GetOptions ()
{
- result.AppendError ("No breakpoints exist to have commands added");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ return &m_options;
}
- if (m_options.m_use_script_language == false && m_options.m_function_name.size())
+ void
+ CollectDataForBreakpointCommandCallback (BreakpointOptions *bp_options,
+ CommandReturnObject &result)
{
- result.AppendError ("need to enable scripting to have a function run as a breakpoint command");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
+ std::auto_ptr<BreakpointOptions::CommandData> data_ap(new BreakpointOptions::CommandData());
+ if (reader_sp && data_ap.get())
+ {
+ BatonSP baton_sp (new BreakpointOptions::CommandBaton (data_ap.release()));
+ bp_options->SetCallback (BreakpointOptionsCallbackFunction, baton_sp);
+
+ Error err (reader_sp->Initialize (CommandObjectBreakpointCommandAdd::GenerateBreakpointCommandCallback,
+ bp_options, // baton
+ eInputReaderGranularityLine, // token size, to pass to callback function
+ "DONE", // end token
+ "> ", // prompt
+ true)); // echo input
+ if (err.Success())
+ {
+ m_interpreter.GetDebugger().PushInputReader (reader_sp);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ }
+ else
+ {
+ result.AppendError("out of memory");
+ result.SetStatus (eReturnStatusFailed);
+ }
+
}
- BreakpointIDList valid_bp_ids;
- CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+ /// Set a one-liner as the callback for the breakpoint.
+ void
+ SetBreakpointCommandCallback (BreakpointOptions *bp_options,
+ const char *oneliner)
+ {
+ std::auto_ptr<BreakpointOptions::CommandData> data_ap(new BreakpointOptions::CommandData());
+
+ // It's necessary to set both user_source and script_source to the oneliner.
+ // The former is used to generate callback description (as in breakpoint command list)
+ // while the latter is used for Python to interpret during the actual callback.
+ data_ap->user_source.AppendString (oneliner);
+ data_ap->script_source.assign (oneliner);
+ data_ap->stop_on_error = m_options.m_stop_on_error;
- if (result.Succeeded())
+ BatonSP baton_sp (new BreakpointOptions::CommandBaton (data_ap.release()));
+ bp_options->SetCallback (BreakpointOptionsCallbackFunction, baton_sp);
+
+ return;
+ }
+
+ static size_t
+ GenerateBreakpointCommandCallback (void *baton,
+ InputReader &reader,
+ lldb::InputReaderAction notification,
+ const char *bytes,
+ size_t bytes_len)
{
- const size_t count = valid_bp_ids.GetSize();
- for (size_t i = 0; i < count; ++i)
+ StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
+ bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
+
+ switch (notification)
{
- BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
- if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
+ case eInputReaderActivate:
+ if (!batch_mode)
{
- Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
- BreakpointOptions *bp_options = NULL;
- if (cur_bp_id.GetLocationID() == LLDB_INVALID_BREAK_ID)
- {
- // This breakpoint does not have an associated location.
- bp_options = bp->GetOptions();
- }
- else
- {
- BreakpointLocationSP bp_loc_sp(bp->FindLocationByID (cur_bp_id.GetLocationID()));
- // This breakpoint does have an associated location.
- // Get its breakpoint options.
- if (bp_loc_sp)
- bp_options = bp_loc_sp->GetLocationOptions();
- }
+ out_stream->Printf ("%s\n", g_reader_instructions);
+ if (reader.GetPrompt())
+ out_stream->Printf ("%s", reader.GetPrompt());
+ out_stream->Flush();
+ }
+ break;
- // Skip this breakpoint if bp_options is not good.
- if (bp_options == NULL) continue;
+ case eInputReaderDeactivate:
+ break;
- // If we are using script language, get the script interpreter
- // in order to set or collect command callback. Otherwise, call
- // the methods associated with this object.
- if (m_options.m_use_script_language)
+ case eInputReaderReactivate:
+ if (reader.GetPrompt() && !batch_mode)
+ {
+ out_stream->Printf ("%s", reader.GetPrompt());
+ out_stream->Flush();
+ }
+ break;
+
+ case eInputReaderAsynchronousOutputWritten:
+ break;
+
+ case eInputReaderGotToken:
+ if (bytes && bytes_len && baton)
+ {
+ BreakpointOptions *bp_options = (BreakpointOptions *) baton;
+ if (bp_options)
{
- // Special handling for one-liner specified inline.
- if (m_options.m_use_one_liner)
- {
- m_interpreter.GetScriptInterpreter()->SetBreakpointCommandCallback (bp_options,
- m_options.m_one_liner.c_str());
- }
- // Special handling for using a Python function by name
- // instead of extending the breakpoint callback data structures, we just automatize
- // what the user would do manually: make their breakpoint command be a function call
- else if (m_options.m_function_name.size())
- {
- std::string oneliner(m_options.m_function_name);
- oneliner += "(frame, bp_loc, dict)";
- m_interpreter.GetScriptInterpreter()->SetBreakpointCommandCallback (bp_options,
- oneliner.c_str());
- }
- else
+ Baton *bp_options_baton = bp_options->GetBaton();
+ if (bp_options_baton)
+ ((BreakpointOptions::CommandData *)bp_options_baton->m_data)->user_source.AppendString (bytes, bytes_len);
+ }
+ }
+ if (!reader.IsDone() && reader.GetPrompt() && !batch_mode)
+ {
+ out_stream->Printf ("%s", reader.GetPrompt());
+ out_stream->Flush();
+ }
+ break;
+
+ case eInputReaderInterrupt:
+ {
+ // Finish, and cancel the breakpoint command.
+ reader.SetIsDone (true);
+ BreakpointOptions *bp_options = (BreakpointOptions *) baton;
+ if (bp_options)
+ {
+ Baton *bp_options_baton = bp_options->GetBaton ();
+ if (bp_options_baton)
{
- m_interpreter.GetScriptInterpreter()->CollectDataForBreakpointCommandCallback (bp_options,
- result);
+ ((BreakpointOptions::CommandData *) bp_options_baton->m_data)->user_source.Clear();
+ ((BreakpointOptions::CommandData *) bp_options_baton->m_data)->script_source.clear();
}
}
- else
+ if (!batch_mode)
{
- // Special handling for one-liner specified inline.
- if (m_options.m_use_one_liner)
- SetBreakpointCommandCallback (bp_options,
- m_options.m_one_liner.c_str());
- else
- CollectDataForBreakpointCommandCallback (bp_options,
- result);
+ out_stream->Printf ("Warning: No command attached to breakpoint.\n");
+ out_stream->Flush();
}
}
+ break;
+
+ case eInputReaderEndOfFile:
+ reader.SetIsDone (true);
+ break;
+
+ case eInputReaderDone:
+ break;
}
+
+ return bytes_len;
}
+
+ static bool
+ BreakpointOptionsCallbackFunction (void *baton,
+ StoppointCallbackContext *context,
+ lldb::user_id_t break_id,
+ lldb::user_id_t break_loc_id)
+ {
+ bool ret_value = true;
+ if (baton == NULL)
+ return true;
+
+
+ BreakpointOptions::CommandData *data = (BreakpointOptions::CommandData *) baton;
+ StringList &commands = data->user_source;
+
+ if (commands.GetSize() > 0)
+ {
+ ExecutionContext exe_ctx (context->exe_ctx_ref);
+ Target *target = exe_ctx.GetTargetPtr();
+ if (target)
+ {
+ CommandReturnObject result;
+ Debugger &debugger = target->GetDebugger();
+ // Rig up the results secondary output stream to the debugger's, so the output will come out synchronously
+ // if the debugger is set up that way.
+
+ StreamSP output_stream (debugger.GetAsyncOutputStream());
+ StreamSP error_stream (debugger.GetAsyncErrorStream());
+ result.SetImmediateOutputStream (output_stream);
+ result.SetImmediateErrorStream (error_stream);
+
+ bool stop_on_continue = true;
+ bool echo_commands = false;
+ bool print_results = true;
+
+ debugger.GetCommandInterpreter().HandleCommands (commands,
+ &exe_ctx,
+ stop_on_continue,
+ data->stop_on_error,
+ echo_commands,
+ print_results,
+ eLazyBoolNo,
+ result);
+ result.GetImmediateOutputStream()->Flush();
+ result.GetImmediateErrorStream()->Flush();
+ }
+ }
+ return ret_value;
+ }
- return result.Succeeded();
-}
+ class CommandOptions : public Options
+ {
+ public:
-Options *
-CommandObjectBreakpointCommandAdd::GetOptions ()
-{
- return &m_options;
-}
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options (interpreter),
+ m_use_commands (false),
+ m_use_script_language (false),
+ m_script_language (eScriptLanguageNone),
+ m_use_one_liner (false),
+ m_one_liner(),
+ m_function_name()
+ {
+ }
-const char *g_reader_instructions = "Enter your debugger command(s). Type 'DONE' to end.";
+ virtual
+ ~CommandOptions () {}
-void
-CommandObjectBreakpointCommandAdd::CollectDataForBreakpointCommandCallback
-(
- BreakpointOptions *bp_options,
- CommandReturnObject &result
-)
-{
- InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
- std::auto_ptr<BreakpointOptions::CommandData> data_ap(new BreakpointOptions::CommandData());
- if (reader_sp && data_ap.get())
- {
- BatonSP baton_sp (new BreakpointOptions::CommandBaton (data_ap.release()));
- bp_options->SetCallback (CommandObjectBreakpointCommand::BreakpointOptionsCallbackFunction, baton_sp);
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
+
+ switch (short_option)
+ {
+ case 'o':
+ m_use_one_liner = true;
+ m_one_liner = option_arg;
+ break;
+
+ case 's':
+ m_script_language = (lldb::ScriptLanguage) Args::StringToOptionEnum (option_arg,
+ g_option_table[option_idx].enum_values,
+ eScriptLanguageNone,
+ error);
+
+ if (m_script_language == eScriptLanguagePython || m_script_language == eScriptLanguageDefault)
+ {
+ m_use_script_language = true;
+ }
+ else
+ {
+ m_use_script_language = false;
+ }
+ break;
+
+ case 'e':
+ {
+ bool success = false;
+ m_stop_on_error = Args::StringToBoolean(option_arg, false, &success);
+ if (!success)
+ error.SetErrorStringWithFormat("invalid value for stop-on-error: \"%s\"", option_arg);
+ }
+ break;
+
+ case 'F':
+ {
+ m_use_one_liner = false;
+ m_use_script_language = true;
+ m_function_name.assign(option_arg);
+ }
+ break;
- Error err (reader_sp->Initialize (CommandObjectBreakpointCommandAdd::GenerateBreakpointCommandCallback,
- bp_options, // baton
- eInputReaderGranularityLine, // token size, to pass to callback function
- "DONE", // end token
- "> ", // prompt
- true)); // echo input
- if (err.Success())
+ default:
+ break;
+ }
+ return error;
+ }
+ void
+ OptionParsingStarting ()
{
- m_interpreter.GetDebugger().PushInputReader (reader_sp);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ m_use_commands = true;
+ m_use_script_language = false;
+ m_script_language = eScriptLanguageNone;
+
+ m_use_one_liner = false;
+ m_stop_on_error = true;
+ m_one_liner.clear();
+ m_function_name.clear();
}
- else
+
+ const OptionDefinition*
+ GetDefinitions ()
{
- result.AppendError (err.AsCString());
- result.SetStatus (eReturnStatusFailed);
+ return g_option_table;
}
- }
- else
- {
- result.AppendError("out of memory");
- result.SetStatus (eReturnStatusFailed);
- }
-}
+ // Options table: Required for subclasses of Options.
-// Set a one-liner as the callback for the breakpoint.
-void
-CommandObjectBreakpointCommandAdd::SetBreakpointCommandCallback (BreakpointOptions *bp_options,
- const char *oneliner)
-{
- std::auto_ptr<BreakpointOptions::CommandData> data_ap(new BreakpointOptions::CommandData());
+ static OptionDefinition g_option_table[];
- // It's necessary to set both user_source and script_source to the oneliner.
- // The former is used to generate callback description (as in breakpoint command list)
- // while the latter is used for Python to interpret during the actual callback.
- data_ap->user_source.AppendString (oneliner);
- data_ap->script_source.assign (oneliner);
- data_ap->stop_on_error = m_options.m_stop_on_error;
+ // Instance variables to hold the values for command options.
- BatonSP baton_sp (new BreakpointOptions::CommandBaton (data_ap.release()));
- bp_options->SetCallback (CommandObjectBreakpointCommand::BreakpointOptionsCallbackFunction, baton_sp);
+ bool m_use_commands;
+ bool m_use_script_language;
+ lldb::ScriptLanguage m_script_language;
- return;
-}
+ // Instance variables to hold the values for one_liner options.
+ bool m_use_one_liner;
+ std::string m_one_liner;
+ bool m_stop_on_error;
+ std::string m_function_name;
+ };
-size_t
-CommandObjectBreakpointCommandAdd::GenerateBreakpointCommandCallback
-(
- void *baton,
- InputReader &reader,
- lldb::InputReaderAction notification,
- const char *bytes,
- size_t bytes_len
-)
-{
- StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
- bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
-
- switch (notification)
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- case eInputReaderActivate:
- if (!batch_mode)
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+
+ if (target == NULL)
{
- out_stream->Printf ("%s\n", g_reader_instructions);
- if (reader.GetPrompt())
- out_stream->Printf ("%s", reader.GetPrompt());
- out_stream->Flush();
+ result.AppendError ("There is not a current executable; there are no breakpoints to which to add commands");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
- break;
- case eInputReaderDeactivate:
- break;
+ const BreakpointList &breakpoints = target->GetBreakpointList();
+ size_t num_breakpoints = breakpoints.GetSize();
- case eInputReaderReactivate:
- if (reader.GetPrompt() && !batch_mode)
+ if (num_breakpoints == 0)
{
- out_stream->Printf ("%s", reader.GetPrompt());
- out_stream->Flush();
+ result.AppendError ("No breakpoints exist to have commands added");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
- break;
- case eInputReaderAsynchronousOutputWritten:
- break;
-
- case eInputReaderGotToken:
- if (bytes && bytes_len && baton)
- {
- BreakpointOptions *bp_options = (BreakpointOptions *) baton;
- if (bp_options)
- {
- Baton *bp_options_baton = bp_options->GetBaton();
- if (bp_options_baton)
- ((BreakpointOptions::CommandData *)bp_options_baton->m_data)->user_source.AppendString (bytes, bytes_len);
- }
- }
- if (!reader.IsDone() && reader.GetPrompt() && !batch_mode)
+ if (m_options.m_use_script_language == false && m_options.m_function_name.size())
{
- out_stream->Printf ("%s", reader.GetPrompt());
- out_stream->Flush();
+ result.AppendError ("need to enable scripting to have a function run as a breakpoint command");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
- break;
- case eInputReaderInterrupt:
+ BreakpointIDList valid_bp_ids;
+ CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+
+ if (result.Succeeded())
{
- // Finish, and cancel the breakpoint command.
- reader.SetIsDone (true);
- BreakpointOptions *bp_options = (BreakpointOptions *) baton;
- if (bp_options)
+ const size_t count = valid_bp_ids.GetSize();
+ for (size_t i = 0; i < count; ++i)
{
- Baton *bp_options_baton = bp_options->GetBaton ();
- if (bp_options_baton)
+ BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+ if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
{
- ((BreakpointOptions::CommandData *) bp_options_baton->m_data)->user_source.Clear();
- ((BreakpointOptions::CommandData *) bp_options_baton->m_data)->script_source.clear();
+ Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+ BreakpointOptions *bp_options = NULL;
+ if (cur_bp_id.GetLocationID() == LLDB_INVALID_BREAK_ID)
+ {
+ // This breakpoint does not have an associated location.
+ bp_options = bp->GetOptions();
+ }
+ else
+ {
+ BreakpointLocationSP bp_loc_sp(bp->FindLocationByID (cur_bp_id.GetLocationID()));
+ // This breakpoint does have an associated location.
+ // Get its breakpoint options.
+ if (bp_loc_sp)
+ bp_options = bp_loc_sp->GetLocationOptions();
+ }
+
+ // Skip this breakpoint if bp_options is not good.
+ if (bp_options == NULL) continue;
+
+ // If we are using script language, get the script interpreter
+ // in order to set or collect command callback. Otherwise, call
+ // the methods associated with this object.
+ if (m_options.m_use_script_language)
+ {
+ // Special handling for one-liner specified inline.
+ if (m_options.m_use_one_liner)
+ {
+ m_interpreter.GetScriptInterpreter()->SetBreakpointCommandCallback (bp_options,
+ m_options.m_one_liner.c_str());
+ }
+ // Special handling for using a Python function by name
+ // instead of extending the breakpoint callback data structures, we just automatize
+ // what the user would do manually: make their breakpoint command be a function call
+ else if (m_options.m_function_name.size())
+ {
+ std::string oneliner(m_options.m_function_name);
+ oneliner += "(frame, bp_loc, dict)";
+ m_interpreter.GetScriptInterpreter()->SetBreakpointCommandCallback (bp_options,
+ oneliner.c_str());
+ }
+ else
+ {
+ m_interpreter.GetScriptInterpreter()->CollectDataForBreakpointCommandCallback (bp_options,
+ result);
+ }
+ }
+ else
+ {
+ // Special handling for one-liner specified inline.
+ if (m_options.m_use_one_liner)
+ SetBreakpointCommandCallback (bp_options,
+ m_options.m_one_liner.c_str());
+ else
+ CollectDataForBreakpointCommandCallback (bp_options,
+ result);
+ }
}
}
- if (!batch_mode)
- {
- out_stream->Printf ("Warning: No command attached to breakpoint.\n");
- out_stream->Flush();
- }
}
- break;
-
- case eInputReaderEndOfFile:
- reader.SetIsDone (true);
- break;
-
- case eInputReaderDone:
- break;
+
+ return result.Succeeded();
}
- return bytes_len;
-}
+private:
+ CommandOptions m_options;
+ static const char *g_reader_instructions;
+};
+
+const char *
+CommandObjectBreakpointCommandAdd::g_reader_instructions = "Enter your debugger command(s). Type 'DONE' to end.";
+
+// FIXME: "script-type" needs to have its contents determined dynamically, so somebody can add a new scripting
+// language to lldb and have it pickable here without having to change this enumeration by hand and rebuild lldb proper.
+
+static OptionEnumValueElement
+g_script_option_enumeration[4] =
+{
+ { eScriptLanguageNone, "command", "Commands are in the lldb command interpreter language"},
+ { eScriptLanguagePython, "python", "Commands are in the Python language."},
+ { eSortOrderByName, "default-script", "Commands are in the default scripting language."},
+ { 0, NULL, NULL }
+};
+
+OptionDefinition
+CommandObjectBreakpointCommandAdd::CommandOptions::g_option_table[] =
+{
+ { LLDB_OPT_SET_1, false, "one-liner", 'o', required_argument, NULL, NULL, eArgTypeOneLiner,
+ "Specify a one-line breakpoint command inline. Be sure to surround it with quotes." },
+
+ { LLDB_OPT_SET_ALL, false, "stop-on-error", 'e', required_argument, NULL, NULL, eArgTypeBoolean,
+ "Specify whether breakpoint command execution should terminate on error." },
+
+ { LLDB_OPT_SET_ALL, false, "script-type", 's', required_argument, g_script_option_enumeration, NULL, eArgTypeNone,
+ "Specify the language for the commands - if none is specified, the lldb command interpreter will be used."},
+
+ { LLDB_OPT_SET_2, false, "python-function", 'F', required_argument, NULL, NULL, eArgTypePythonFunction,
+ "Give the name of a Python function to run as command for this breakpoint. Be sure to give a module name if appropriate."},
+
+ { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
+};
//-------------------------------------------------------------------------
// CommandObjectBreakpointCommandDelete
//-------------------------------------------------------------------------
-CommandObjectBreakpointCommandDelete::CommandObjectBreakpointCommandDelete (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "delete",
- "Delete the set of commands from a breakpoint.",
- NULL)
+class CommandObjectBreakpointCommandDelete : public CommandObjectParsed
{
- CommandArgumentEntry arg;
- CommandArgumentData bp_id_arg;
+public:
+ CommandObjectBreakpointCommandDelete (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "delete",
+ "Delete the set of commands from a breakpoint.",
+ NULL)
+ {
+ CommandArgumentEntry arg;
+ CommandArgumentData bp_id_arg;
- // Define the first (and only) variant of this arg.
- bp_id_arg.arg_type = eArgTypeBreakpointID;
- bp_id_arg.arg_repetition = eArgRepeatPlain;
+ // Define the first (and only) variant of this arg.
+ bp_id_arg.arg_type = eArgTypeBreakpointID;
+ bp_id_arg.arg_repetition = eArgRepeatPlain;
- // There is only one variant this argument could be; put it into the argument entry.
- arg.push_back (bp_id_arg);
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg.push_back (bp_id_arg);
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg);
-}
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg);
+ }
-CommandObjectBreakpointCommandDelete::~CommandObjectBreakpointCommandDelete ()
-{
-}
-bool
-CommandObjectBreakpointCommandDelete::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ virtual
+ ~CommandObjectBreakpointCommandDelete () {}
- if (target == NULL)
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- result.AppendError ("There is not a current executable; there are no breakpoints from which to delete commands");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- const BreakpointList &breakpoints = target->GetBreakpointList();
- size_t num_breakpoints = breakpoints.GetSize();
+ if (target == NULL)
+ {
+ result.AppendError ("There is not a current executable; there are no breakpoints from which to delete commands");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- if (num_breakpoints == 0)
- {
- result.AppendError ("No breakpoints exist to have commands deleted");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ const BreakpointList &breakpoints = target->GetBreakpointList();
+ size_t num_breakpoints = breakpoints.GetSize();
- if (command.GetArgumentCount() == 0)
- {
- result.AppendError ("No breakpoint specified from which to delete the commands");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ if (num_breakpoints == 0)
+ {
+ result.AppendError ("No breakpoints exist to have commands deleted");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- BreakpointIDList valid_bp_ids;
- CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+ if (command.GetArgumentCount() == 0)
+ {
+ result.AppendError ("No breakpoint specified from which to delete the commands");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- if (result.Succeeded())
- {
- const size_t count = valid_bp_ids.GetSize();
- for (size_t i = 0; i < count; ++i)
+ BreakpointIDList valid_bp_ids;
+ CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+
+ if (result.Succeeded())
{
- BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
- if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
+ const size_t count = valid_bp_ids.GetSize();
+ for (size_t i = 0; i < count; ++i)
{
- Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
- if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
+ BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+ if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
{
- BreakpointLocationSP bp_loc_sp (bp->FindLocationByID (cur_bp_id.GetLocationID()));
- if (bp_loc_sp)
- bp_loc_sp->ClearCallback();
+ Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+ if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
+ {
+ BreakpointLocationSP bp_loc_sp (bp->FindLocationByID (cur_bp_id.GetLocationID()));
+ if (bp_loc_sp)
+ bp_loc_sp->ClearCallback();
+ else
+ {
+ result.AppendErrorWithFormat("Invalid breakpoint ID: %u.%u.\n",
+ cur_bp_id.GetBreakpointID(),
+ cur_bp_id.GetLocationID());
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ }
else
{
- result.AppendErrorWithFormat("Invalid breakpoint ID: %u.%u.\n",
- cur_bp_id.GetBreakpointID(),
- cur_bp_id.GetLocationID());
- result.SetStatus (eReturnStatusFailed);
- return false;
+ bp->ClearCallback();
}
}
- else
- {
- bp->ClearCallback();
- }
}
}
+ return result.Succeeded();
}
- return result.Succeeded();
-}
-
+};
//-------------------------------------------------------------------------
// CommandObjectBreakpointCommandList
//-------------------------------------------------------------------------
-CommandObjectBreakpointCommandList::CommandObjectBreakpointCommandList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "list",
- "List the script or set of commands to be executed when the breakpoint is hit.",
- NULL)
+class CommandObjectBreakpointCommandList : public CommandObjectParsed
{
- CommandArgumentEntry arg;
- CommandArgumentData bp_id_arg;
-
- // Define the first (and only) variant of this arg.
- bp_id_arg.arg_type = eArgTypeBreakpointID;
- bp_id_arg.arg_repetition = eArgRepeatPlain;
+public:
+ CommandObjectBreakpointCommandList (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "list",
+ "List the script or set of commands to be executed when the breakpoint is hit.",
+ NULL)
+ {
+ CommandArgumentEntry arg;
+ CommandArgumentData bp_id_arg;
- // There is only one variant this argument could be; put it into the argument entry.
- arg.push_back (bp_id_arg);
+ // Define the first (and only) variant of this arg.
+ bp_id_arg.arg_type = eArgTypeBreakpointID;
+ bp_id_arg.arg_repetition = eArgRepeatPlain;
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg);
-}
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg.push_back (bp_id_arg);
-CommandObjectBreakpointCommandList::~CommandObjectBreakpointCommandList ()
-{
-}
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg);
+ }
-bool
-CommandObjectBreakpointCommandList::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ virtual
+ ~CommandObjectBreakpointCommandList () {}
- if (target == NULL)
+protected:
+ virtual bool
+ DoExecute (Args& command,
+ CommandReturnObject &result)
{
- result.AppendError ("There is not a current executable; there are no breakpoints for which to list commands");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+
+ if (target == NULL)
+ {
+ result.AppendError ("There is not a current executable; there are no breakpoints for which to list commands");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- const BreakpointList &breakpoints = target->GetBreakpointList();
- size_t num_breakpoints = breakpoints.GetSize();
+ const BreakpointList &breakpoints = target->GetBreakpointList();
+ size_t num_breakpoints = breakpoints.GetSize();
- if (num_breakpoints == 0)
- {
- result.AppendError ("No breakpoints exist for which to list commands");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ if (num_breakpoints == 0)
+ {
+ result.AppendError ("No breakpoints exist for which to list commands");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- if (command.GetArgumentCount() == 0)
- {
- result.AppendError ("No breakpoint specified for which to list the commands");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ if (command.GetArgumentCount() == 0)
+ {
+ result.AppendError ("No breakpoint specified for which to list the commands");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- BreakpointIDList valid_bp_ids;
- CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
+ BreakpointIDList valid_bp_ids;
+ CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs (command, target, result, &valid_bp_ids);
- if (result.Succeeded())
- {
- const size_t count = valid_bp_ids.GetSize();
- for (size_t i = 0; i < count; ++i)
+ if (result.Succeeded())
{
- BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
- if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
+ const size_t count = valid_bp_ids.GetSize();
+ for (size_t i = 0; i < count; ++i)
{
- Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
-
- if (bp)
+ BreakpointID cur_bp_id = valid_bp_ids.GetBreakpointIDAtIndex (i);
+ if (cur_bp_id.GetBreakpointID() != LLDB_INVALID_BREAK_ID)
{
- const BreakpointOptions *bp_options = NULL;
- if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
+ Breakpoint *bp = target->GetBreakpointByID (cur_bp_id.GetBreakpointID()).get();
+
+ if (bp)
{
- BreakpointLocationSP bp_loc_sp(bp->FindLocationByID (cur_bp_id.GetLocationID()));
- if (bp_loc_sp)
- bp_options = bp_loc_sp->GetOptionsNoCreate();
+ const BreakpointOptions *bp_options = NULL;
+ if (cur_bp_id.GetLocationID() != LLDB_INVALID_BREAK_ID)
+ {
+ BreakpointLocationSP bp_loc_sp(bp->FindLocationByID (cur_bp_id.GetLocationID()));
+ if (bp_loc_sp)
+ bp_options = bp_loc_sp->GetOptionsNoCreate();
+ else
+ {
+ result.AppendErrorWithFormat("Invalid breakpoint ID: %u.%u.\n",
+ cur_bp_id.GetBreakpointID(),
+ cur_bp_id.GetLocationID());
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ }
else
{
- result.AppendErrorWithFormat("Invalid breakpoint ID: %u.%u.\n",
- cur_bp_id.GetBreakpointID(),
- cur_bp_id.GetLocationID());
- result.SetStatus (eReturnStatusFailed);
- return false;
+ bp_options = bp->GetOptions();
+ }
+
+ if (bp_options)
+ {
+ StreamString id_str;
+ BreakpointID::GetCanonicalReference (&id_str,
+ cur_bp_id.GetBreakpointID(),
+ cur_bp_id.GetLocationID());
+ const Baton *baton = bp_options->GetBaton();
+ if (baton)
+ {
+ result.GetOutputStream().Printf ("Breakpoint %s:\n", id_str.GetData());
+ result.GetOutputStream().IndentMore ();
+ baton->GetDescription(&result.GetOutputStream(), eDescriptionLevelFull);
+ result.GetOutputStream().IndentLess ();
+ }
+ else
+ {
+ result.AppendMessageWithFormat ("Breakpoint %s does not have an associated command.\n",
+ id_str.GetData());
+ }
}
+ result.SetStatus (eReturnStatusSuccessFinishResult);
}
else
{
- bp_options = bp->GetOptions();
+ result.AppendErrorWithFormat("Invalid breakpoint ID: %u.\n", cur_bp_id.GetBreakpointID());
+ result.SetStatus (eReturnStatusFailed);
}
- if (bp_options)
- {
- StreamString id_str;
- BreakpointID::GetCanonicalReference (&id_str,
- cur_bp_id.GetBreakpointID(),
- cur_bp_id.GetLocationID());
- const Baton *baton = bp_options->GetBaton();
- if (baton)
- {
- result.GetOutputStream().Printf ("Breakpoint %s:\n", id_str.GetData());
- result.GetOutputStream().IndentMore ();
- baton->GetDescription(&result.GetOutputStream(), eDescriptionLevelFull);
- result.GetOutputStream().IndentLess ();
- }
- else
- {
- result.AppendMessageWithFormat ("Breakpoint %s does not have an associated command.\n",
- id_str.GetData());
- }
- }
- result.SetStatus (eReturnStatusSuccessFinishResult);
}
- else
- {
- result.AppendErrorWithFormat("Invalid breakpoint ID: %u.\n", cur_bp_id.GetBreakpointID());
- result.SetStatus (eReturnStatusFailed);
- }
-
}
}
- }
- return result.Succeeded();
-}
+ return result.Succeeded();
+ }
+};
//-------------------------------------------------------------------------
// CommandObjectBreakpointCommand
@@ -819,60 +878,8 @@
status = LoadSubCommand ("list", list_command_object);
}
-
CommandObjectBreakpointCommand::~CommandObjectBreakpointCommand ()
{
}
-bool
-CommandObjectBreakpointCommand::BreakpointOptionsCallbackFunction
-(
- void *baton,
- StoppointCallbackContext *context,
- lldb::user_id_t break_id,
- lldb::user_id_t break_loc_id
-)
-{
- bool ret_value = true;
- if (baton == NULL)
- return true;
-
-
- BreakpointOptions::CommandData *data = (BreakpointOptions::CommandData *) baton;
- StringList &commands = data->user_source;
-
- if (commands.GetSize() > 0)
- {
- ExecutionContext exe_ctx (context->exe_ctx_ref);
- Target *target = exe_ctx.GetTargetPtr();
- if (target)
- {
- CommandReturnObject result;
- Debugger &debugger = target->GetDebugger();
- // Rig up the results secondary output stream to the debugger's, so the output will come out synchronously
- // if the debugger is set up that way.
-
- StreamSP output_stream (debugger.GetAsyncOutputStream());
- StreamSP error_stream (debugger.GetAsyncErrorStream());
- result.SetImmediateOutputStream (output_stream);
- result.SetImmediateErrorStream (error_stream);
-
- bool stop_on_continue = true;
- bool echo_commands = false;
- bool print_results = true;
-
- debugger.GetCommandInterpreter().HandleCommands (commands,
- &exe_ctx,
- stop_on_continue,
- data->stop_on_error,
- echo_commands,
- print_results,
- eLazyBoolNo,
- result);
- result.GetImmediateOutputStream()->Flush();
- result.GetImmediateErrorStream()->Flush();
- }
- }
- return ret_value;
-}
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectBreakpointCommand.h Fri Jun 8 19:52:06 2012
@@ -39,136 +39,8 @@
virtual
~CommandObjectBreakpointCommand ();
-
- static bool
- BreakpointOptionsCallbackFunction (void *baton,
- StoppointCallbackContext *context,
- lldb::user_id_t break_id,
- lldb::user_id_t break_loc_id);
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointCommandAdd
-//-------------------------------------------------------------------------
-
-
-class CommandObjectBreakpointCommandAdd : public CommandObject
-{
-public:
-
- CommandObjectBreakpointCommandAdd (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointCommandAdd ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- void
- CollectDataForBreakpointCommandCallback (BreakpointOptions *bp_options,
- CommandReturnObject &result);
-
- /// Set a one-liner as the callback for the breakpoint.
- void
- SetBreakpointCommandCallback (BreakpointOptions *bp_options,
- const char *oneliner);
-
- static size_t
- GenerateBreakpointCommandCallback (void *baton,
- InputReader &reader,
- lldb::InputReaderAction notification,
- const char *bytes,
- size_t bytes_len);
-
- static bool
- BreakpointOptionsCallbackFunction (void *baton,
- StoppointCallbackContext *context,
- lldb::user_id_t break_id,
- lldb::user_id_t break_loc_id);
-
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition*
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- bool m_use_commands;
- bool m_use_script_language;
- lldb::ScriptLanguage m_script_language;
-
- // Instance variables to hold the values for one_liner options.
- bool m_use_one_liner;
- std::string m_one_liner;
- bool m_stop_on_error;
- std::string m_function_name;
- };
-
-private:
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointCommandDelete
-//-------------------------------------------------------------------------
-
-class CommandObjectBreakpointCommandDelete : public CommandObject
-{
-public:
- CommandObjectBreakpointCommandDelete (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointCommandDelete ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectBreakpointCommandList
-//-------------------------------------------------------------------------
-
-class CommandObjectBreakpointCommandList : public CommandObject
-{
-public:
- CommandObjectBreakpointCommandList (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectBreakpointCommandList ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-private:
};
-
} // namespace lldb_private
#endif // liblldb_CommandObjectBreakpointCommand_h_
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectCommands.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectCommands.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectCommands.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectCommands.cpp Fri Jun 8 19:52:06 2012
@@ -34,9 +34,27 @@
// CommandObjectCommandsSource
//-------------------------------------------------------------------------
-class CommandObjectCommandsHistory : public CommandObject
+class CommandObjectCommandsHistory : public CommandObjectParsed
{
-private:
+public:
+ CommandObjectCommandsHistory(CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "command history",
+ "Dump the history of commands in this session.",
+ NULL),
+ m_options (interpreter)
+ {
+ }
+
+ ~CommandObjectCommandsHistory () {}
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+protected:
class CommandOptions : public Options
{
@@ -108,34 +126,8 @@
uint32_t m_end_idx;
};
- CommandOptions m_options;
-
- virtual Options *
- GetOptions ()
- {
- return &m_options;
- }
-
-public:
- CommandObjectCommandsHistory(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "command history",
- "Dump the history of commands in this session.",
- NULL),
- m_options (interpreter)
- {
- }
-
- ~CommandObjectCommandsHistory ()
- {
- }
-
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
m_interpreter.DumpHistory (result.GetOutputStream(),
@@ -144,6 +136,8 @@
return result.Succeeded();
}
+
+ CommandOptions m_options;
};
OptionDefinition
@@ -160,9 +154,69 @@
// CommandObjectCommandsSource
//-------------------------------------------------------------------------
-class CommandObjectCommandsSource : public CommandObject
+class CommandObjectCommandsSource : public CommandObjectParsed
{
-private:
+public:
+ CommandObjectCommandsSource(CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "command source",
+ "Read in debugger commands from the file <filename> and execute them.",
+ NULL),
+ m_options (interpreter)
+ {
+ CommandArgumentEntry arg;
+ CommandArgumentData file_arg;
+
+ // Define the first (and only) variant of this arg.
+ file_arg.arg_type = eArgTypeFilename;
+ file_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg.push_back (file_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg);
+ }
+
+ ~CommandObjectCommandsSource () {}
+
+ virtual const char*
+ GetRepeatCommand (Args ¤t_command_args, uint32_t index)
+ {
+ return "";
+ }
+
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex(cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eDiskFileCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ return matches.GetSize();
+ }
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+protected:
class CommandOptions : public Options
{
@@ -226,51 +280,13 @@
bool m_stop_on_continue;
};
- CommandOptions m_options;
-
- virtual Options *
- GetOptions ()
- {
- return &m_options;
- }
-
-public:
- CommandObjectCommandsSource(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "command source",
- "Read in debugger commands from the file <filename> and execute them.",
- NULL),
- m_options (interpreter)
- {
- CommandArgumentEntry arg;
- CommandArgumentData file_arg;
-
- // Define the first (and only) variant of this arg.
- file_arg.arg_type = eArgTypeFilename;
- file_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg.push_back (file_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg);
- }
-
- ~CommandObjectCommandsSource ()
- {
- }
-
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute(Args& command, CommandReturnObject &result)
{
- const int argc = args.GetArgumentCount();
+ const int argc = command.GetArgumentCount();
if (argc == 1)
{
- const char *filename = args.GetArgumentAtIndex(0);
+ const char *filename = command.GetArgumentAtIndex(0);
result.AppendMessageWithFormat ("Executing commands in '%s'.\n", filename);
@@ -296,36 +312,7 @@
return result.Succeeded();
}
-
- virtual const char*
- GetRepeatCommand (Args ¤t_command_args, uint32_t index)
- {
- return "";
- }
-
- 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)
- {
- std::string completion_str (input.GetArgumentAtIndex(cursor_index));
- completion_str.erase (cursor_char_position);
-
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eDiskFileCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- return matches.GetSize();
- }
+ CommandOptions m_options;
};
OptionDefinition
@@ -346,13 +333,13 @@
"def my_command_impl(debugger, args, result, dict):";
-class CommandObjectCommandsAlias : public CommandObject
+class CommandObjectCommandsAlias : public CommandObjectRaw
{
public:
CommandObjectCommandsAlias (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
+ CommandObjectRaw (interpreter,
"command alias",
"Allow users to define their own debugger command abbreviations.",
NULL)
@@ -451,14 +438,9 @@
{
}
- bool
- WantsRawCommandString ()
- {
- return true;
- }
-
- bool
- ExecuteRawCommandString (const char *raw_command_line, CommandReturnObject &result)
+protected:
+ virtual bool
+ DoExecute (const char *raw_command_line, CommandReturnObject &result)
{
Args args (raw_command_line);
std::string raw_command_string (raw_command_line);
@@ -518,16 +500,24 @@
{
// Note that args was initialized with the original command, and has not been updated to this point.
// Therefore can we pass it to the version of Execute that does not need/expect raw input in the alias.
- return Execute (args, result);
+ return HandleAliasingNormalCommand (args, result);
}
else
{
+ return HandleAliasingRawCommand (alias_command, raw_command_string, *cmd_obj, result);
+ }
+ return result.Succeeded();
+ }
+
+ bool
+ HandleAliasingRawCommand (const std::string &alias_command, std::string &raw_command_string, CommandObject &cmd_obj, CommandReturnObject &result)
+ {
// Verify & handle any options/arguments passed to the alias command
OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector);
OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
- CommandObjectSP cmd_obj_sp = m_interpreter.GetCommandSPExact (cmd_obj->GetCommandName(), false);
+ CommandObjectSP cmd_obj_sp = m_interpreter.GetCommandSPExact (cmd_obj.GetCommandName(), false);
if (!m_interpreter.ProcessAliasOptionsArgs (cmd_obj_sp, raw_command_string.c_str(), option_arg_vector_sp))
{
@@ -562,16 +552,11 @@
result.AppendError ("Unable to create requested alias.\n");
result.SetStatus (eReturnStatusFailed);
}
- }
- return result.Succeeded();
+ return result.Succeeded ();
}
-
+
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ HandleAliasingNormalCommand (Args& args, CommandReturnObject &result)
{
size_t argc = args.GetArgumentCount();
@@ -686,6 +671,7 @@
return result.Succeeded();
}
+
};
#pragma mark CommandObjectCommandsUnalias
@@ -693,11 +679,11 @@
// CommandObjectCommandsUnalias
//-------------------------------------------------------------------------
-class CommandObjectCommandsUnalias : public CommandObject
+class CommandObjectCommandsUnalias : public CommandObjectParsed
{
public:
CommandObjectCommandsUnalias (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
+ CommandObjectParsed (interpreter,
"command unalias",
"Allow the user to remove/delete a user-defined command abbreviation.",
NULL)
@@ -720,13 +706,9 @@
{
}
-
+protected:
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& args, CommandReturnObject &result)
{
CommandObject::CommandMap::iterator pos;
CommandObject *cmd_obj;
@@ -777,16 +759,16 @@
}
};
-#pragma mark CommandObjectCommandsAddRegex
//-------------------------------------------------------------------------
// CommandObjectCommandsAddRegex
//-------------------------------------------------------------------------
+#pragma mark CommandObjectCommandsAddRegex
-class CommandObjectCommandsAddRegex : public CommandObject
+class CommandObjectCommandsAddRegex : public CommandObjectParsed
{
public:
CommandObjectCommandsAddRegex (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
+ CommandObjectParsed (interpreter,
"command regex",
"Allow the user to create a regular expression command.",
"command regex <cmd-name> [s/<regex>/<subst>/ ...]"),
@@ -822,10 +804,11 @@
}
+protected:
bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
- const size_t argc = args.GetArgumentCount();
+ const size_t argc = command.GetArgumentCount();
if (argc == 0)
{
result.AppendError ("usage: 'command regex <command-name> [s/<regex1>/<subst1>/ s/<regex2>/<subst2>/ ...]'\n");
@@ -834,7 +817,7 @@
else
{
Error error;
- const char *name = args.GetArgumentAtIndex(0);
+ const char *name = command.GetArgumentAtIndex(0);
m_regex_cmd_ap.reset (new CommandObjectRegexCommand (m_interpreter,
name,
m_options.GetHelp (),
@@ -864,7 +847,7 @@
{
for (size_t arg_idx = 1; arg_idx < argc; ++arg_idx)
{
- llvm::StringRef arg_strref (args.GetArgumentAtIndex(arg_idx));
+ llvm::StringRef arg_strref (command.GetArgumentAtIndex(arg_idx));
error = AppendRegexSubstitution (arg_strref);
if (error.Fail())
break;
@@ -1007,7 +990,78 @@
InputReader &reader,
lldb::InputReaderAction notification,
const char *bytes,
- size_t bytes_len);
+ size_t bytes_len)
+ {
+ CommandObjectCommandsAddRegex *add_regex_cmd = (CommandObjectCommandsAddRegex *) baton;
+ bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
+
+ switch (notification)
+ {
+ case eInputReaderActivate:
+ if (!batch_mode)
+ {
+ StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream ();
+ out_stream->Printf("%s\n", "Enter regular expressions in the form 's/<regex>/<subst>/' and terminate with an empty line:");
+ out_stream->Flush();
+ }
+ break;
+ case eInputReaderReactivate:
+ break;
+
+ case eInputReaderDeactivate:
+ break;
+
+ case eInputReaderAsynchronousOutputWritten:
+ break;
+
+ case eInputReaderGotToken:
+ while (bytes_len > 0 && (bytes[bytes_len-1] == '\r' || bytes[bytes_len-1] == '\n'))
+ --bytes_len;
+ if (bytes_len == 0)
+ reader.SetIsDone(true);
+ else if (bytes)
+ {
+ llvm::StringRef bytes_strref (bytes, bytes_len);
+ Error error (add_regex_cmd->AppendRegexSubstitution (bytes_strref));
+ if (error.Fail())
+ {
+ if (!batch_mode)
+ {
+ StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
+ out_stream->Printf("error: %s\n", error.AsCString());
+ out_stream->Flush();
+ }
+ add_regex_cmd->InputReaderDidCancel ();
+ reader.SetIsDone (true);
+ }
+ }
+ break;
+
+ case eInputReaderInterrupt:
+ {
+ reader.SetIsDone (true);
+ if (!batch_mode)
+ {
+ StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
+ out_stream->PutCString("Regular expression command creations was cancelled.\n");
+ out_stream->Flush();
+ }
+ add_regex_cmd->InputReaderDidCancel ();
+ }
+ break;
+
+ case eInputReaderEndOfFile:
+ reader.SetIsDone (true);
+ break;
+
+ case eInputReaderDone:
+ add_regex_cmd->AddRegexCommandToInterpreter();
+ break;
+ }
+
+ return bytes_len;
+ }
+
private:
std::auto_ptr<CommandObjectRegexCommand> m_regex_cmd_ap;
@@ -1082,95 +1136,16 @@
std::string m_help;
std::string m_syntax;
};
-
- CommandOptions m_options;
-
+
virtual Options *
GetOptions ()
{
return &m_options;
}
-
+
+ CommandOptions m_options;
};
-size_t
-CommandObjectCommandsAddRegex::InputReaderCallback (void *baton,
- InputReader &reader,
- lldb::InputReaderAction notification,
- const char *bytes,
- size_t bytes_len)
-{
- CommandObjectCommandsAddRegex *add_regex_cmd = (CommandObjectCommandsAddRegex *) baton;
- bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
-
- switch (notification)
- {
- case eInputReaderActivate:
- if (!batch_mode)
- {
- StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream ();
- out_stream->Printf("%s\n", "Enter regular expressions in the form 's/<regex>/<subst>/' and terminate with an empty line:");
- out_stream->Flush();
- }
- break;
- case eInputReaderReactivate:
- break;
-
- case eInputReaderDeactivate:
- break;
-
- case eInputReaderAsynchronousOutputWritten:
- break;
-
- case eInputReaderGotToken:
- while (bytes_len > 0 && (bytes[bytes_len-1] == '\r' || bytes[bytes_len-1] == '\n'))
- --bytes_len;
- if (bytes_len == 0)
- reader.SetIsDone(true);
- else if (bytes)
- {
- llvm::StringRef bytes_strref (bytes, bytes_len);
- Error error (add_regex_cmd->AppendRegexSubstitution (bytes_strref));
- if (error.Fail())
- {
- if (!batch_mode)
- {
- StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
- out_stream->Printf("error: %s\n", error.AsCString());
- out_stream->Flush();
- }
- add_regex_cmd->InputReaderDidCancel ();
- reader.SetIsDone (true);
- }
- }
- break;
-
- case eInputReaderInterrupt:
- {
- reader.SetIsDone (true);
- if (!batch_mode)
- {
- StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
- out_stream->PutCString("Regular expression command creations was cancelled.\n");
- out_stream->Flush();
- }
- add_regex_cmd->InputReaderDidCancel ();
- }
- break;
-
- case eInputReaderEndOfFile:
- reader.SetIsDone (true);
- break;
-
- case eInputReaderDone:
- add_regex_cmd->AddRegexCommandToInterpreter();
- break;
- }
-
- return bytes_len;
-}
-
-
OptionDefinition
CommandObjectCommandsAddRegex::CommandOptions::g_option_table[] =
{
@@ -1180,7 +1155,7 @@
};
-class CommandObjectPythonFunction : public CommandObject
+class CommandObjectPythonFunction : public CommandObjectRaw
{
private:
std::string m_function_name;
@@ -1192,12 +1167,12 @@
std::string name,
std::string funct,
ScriptedCommandSynchronicity synch) :
- CommandObject (interpreter,
- name.c_str(),
- (std::string("Run Python function ") + funct).c_str(),
- NULL),
- m_function_name(funct),
- m_synchro(synch)
+ CommandObjectRaw (interpreter,
+ name.c_str(),
+ (std::string("Run Python function ") + funct).c_str(),
+ NULL),
+ m_function_name(funct),
+ m_synchro(synch)
{
ScriptInterpreter* scripter = m_interpreter.GetScriptInterpreter();
if (scripter)
@@ -1214,7 +1189,26 @@
}
virtual bool
- ExecuteRawCommandString (const char *raw_command_line, CommandReturnObject &result)
+ IsRemovable ()
+ {
+ return true;
+ }
+
+ const std::string&
+ GetFunctionName ()
+ {
+ return m_function_name;
+ }
+
+ ScriptedCommandSynchronicity
+ GetSynchronicity ()
+ {
+ return m_synchro;
+ }
+
+protected:
+ virtual bool
+ DoExecute (const char *raw_command_line, CommandReturnObject &result)
{
ScriptInterpreter* scripter = m_interpreter.GetScriptInterpreter();
@@ -1235,55 +1229,78 @@
return result.Succeeded();
}
- virtual bool
- WantsRawCommandString ()
- {
- return true;
- }
+};
- bool
- Execute (Args& command,
- CommandReturnObject &result)
- {
- std::string cmd_string;
- command.GetCommandString(cmd_string);
- return ExecuteRawCommandString(cmd_string.c_str(), result);
- }
+//-------------------------------------------------------------------------
+// CommandObjectCommandsScriptImport
+//-------------------------------------------------------------------------
- virtual bool
- IsRemovable ()
+class CommandObjectCommandsScriptImport : public CommandObjectParsed
+{
+public:
+ CommandObjectCommandsScriptImport (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "command script import",
+ "Import a scripting module in LLDB.",
+ NULL),
+ m_options(interpreter)
{
- return true;
+ CommandArgumentEntry arg1;
+ CommandArgumentData cmd_arg;
+
+ // Define the first (and only) variant of this arg.
+ cmd_arg.arg_type = eArgTypeFilename;
+ cmd_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (cmd_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
}
-
- const std::string&
- GetFunctionName ()
+
+ ~CommandObjectCommandsScriptImport ()
{
- return m_function_name;
}
-
- ScriptedCommandSynchronicity
- GetSynchronicity ()
+
+ 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)
{
- return m_synchro;
+ std::string completion_str (input.GetArgumentAtIndex(cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eDiskFileCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ return matches.GetSize();
}
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectCommandsScriptImport
-//-------------------------------------------------------------------------
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
-class CommandObjectCommandsScriptImport : public CommandObject
-{
-private:
+protected:
class CommandOptions : public Options
{
public:
CommandOptions (CommandInterpreter &interpreter) :
- Options (interpreter)
+ Options (interpreter)
{
}
@@ -1329,47 +1346,9 @@
bool m_allow_reload;
};
-
- CommandOptions m_options;
-
- virtual Options *
- GetOptions ()
- {
- return &m_options;
- }
-public:
- CommandObjectCommandsScriptImport (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "command script import",
- "Import a scripting module in LLDB.",
- NULL),
- m_options(interpreter)
- {
- CommandArgumentEntry arg1;
- CommandArgumentData cmd_arg;
-
- // Define the first (and only) variant of this arg.
- cmd_arg.arg_type = eArgTypeFilename;
- cmd_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (cmd_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
- }
-
- ~CommandObjectCommandsScriptImport ()
- {
- }
-
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
if (m_interpreter.GetDebugger().GetScriptLanguage() != lldb::eScriptLanguagePython)
@@ -1379,7 +1358,7 @@
return false;
}
- size_t argc = args.GetArgumentCount();
+ size_t argc = command.GetArgumentCount();
if (argc != 1)
{
@@ -1388,7 +1367,7 @@
return false;
}
- std::string path = args.GetArgumentAtIndex(0);
+ std::string path = command.GetArgumentAtIndex(0);
Error error;
if (m_interpreter.GetScriptInterpreter()->LoadScriptingModule(path.c_str(),
@@ -1406,29 +1385,7 @@
return result.Succeeded();
}
- 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)
- {
- std::string completion_str (input.GetArgumentAtIndex(cursor_index));
- completion_str.erase (cursor_char_position);
-
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eDiskFileCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- return matches.GetSize();
- }
+ CommandOptions m_options;
};
OptionDefinition
@@ -1443,9 +1400,41 @@
// CommandObjectCommandsScriptAdd
//-------------------------------------------------------------------------
-class CommandObjectCommandsScriptAdd : public CommandObject
+class CommandObjectCommandsScriptAdd : public CommandObjectParsed
{
-private:
+public:
+ CommandObjectCommandsScriptAdd(CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "command script add",
+ "Add a scripted function as an LLDB command.",
+ NULL),
+ m_options (interpreter)
+ {
+ CommandArgumentEntry arg1;
+ CommandArgumentData cmd_arg;
+
+ // Define the first (and only) variant of this arg.
+ cmd_arg.arg_type = eArgTypeCommandName;
+ cmd_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (cmd_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
+ }
+
+ ~CommandObjectCommandsScriptAdd ()
+ {
+ }
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+protected:
class CommandOptions : public Options
{
@@ -1505,15 +1494,8 @@
std::string m_funct_name;
ScriptedCommandSynchronicity m_synchronous;
};
-
- CommandOptions m_options;
-
- virtual Options *
- GetOptions ()
- {
- return &m_options;
- }
-
+
+private:
class PythonAliasReader : public InputReaderEZ
{
private:
@@ -1632,38 +1614,9 @@
}
};
-public:
- CommandObjectCommandsScriptAdd(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "command script add",
- "Add a scripted function as an LLDB command.",
- NULL),
- m_options (interpreter)
- {
- CommandArgumentEntry arg1;
- CommandArgumentData cmd_arg;
-
- // Define the first (and only) variant of this arg.
- cmd_arg.arg_type = eArgTypeCommandName;
- cmd_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (cmd_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
- }
-
- ~CommandObjectCommandsScriptAdd ()
- {
- }
-
+protected:
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
if (m_interpreter.GetDebugger().GetScriptLanguage() != lldb::eScriptLanguagePython)
@@ -1673,7 +1626,7 @@
return false;
}
- size_t argc = args.GetArgumentCount();
+ size_t argc = command.GetArgumentCount();
if (argc != 1)
{
@@ -1682,7 +1635,7 @@
return false;
}
- std::string cmd_name = args.GetArgumentAtIndex(0);
+ std::string cmd_name = command.GetArgumentAtIndex(0);
if (m_options.m_funct_name.empty())
{
@@ -1734,6 +1687,8 @@
return result.Succeeded();
}
+
+ CommandOptions m_options;
};
static OptionEnumValueElement g_script_synchro_type[] =
@@ -1756,13 +1711,13 @@
// CommandObjectCommandsScriptList
//-------------------------------------------------------------------------
-class CommandObjectCommandsScriptList : public CommandObject
+class CommandObjectCommandsScriptList : public CommandObjectParsed
{
private:
public:
CommandObjectCommandsScriptList(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
+ CommandObjectParsed (interpreter,
"command script list",
"List defined scripted commands.",
NULL)
@@ -1774,11 +1729,7 @@
}
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
m_interpreter.GetHelp(result,
@@ -1796,16 +1747,16 @@
// CommandObjectCommandsScriptClear
//-------------------------------------------------------------------------
-class CommandObjectCommandsScriptClear : public CommandObject
+class CommandObjectCommandsScriptClear : public CommandObjectParsed
{
private:
public:
CommandObjectCommandsScriptClear(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "command script clear",
- "Delete all scripted commands.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "command script clear",
+ "Delete all scripted commands.",
+ NULL)
{
}
@@ -1813,12 +1764,9 @@
{
}
+protected:
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
m_interpreter.RemoveAllUser();
@@ -1826,8 +1774,6 @@
result.SetStatus (eReturnStatusSuccessFinishResult);
return true;
-
-
}
};
@@ -1835,16 +1781,14 @@
// CommandObjectCommandsScriptDelete
//-------------------------------------------------------------------------
-class CommandObjectCommandsScriptDelete : public CommandObject
+class CommandObjectCommandsScriptDelete : public CommandObjectParsed
{
-private:
-
public:
CommandObjectCommandsScriptDelete(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "command script delete",
- "Delete a scripted command.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "command script delete",
+ "Delete a scripted command.",
+ NULL)
{
CommandArgumentEntry arg1;
CommandArgumentData cmd_arg;
@@ -1864,15 +1808,12 @@
{
}
+protected:
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
- size_t argc = args.GetArgumentCount();
+ size_t argc = command.GetArgumentCount();
if (argc != 1)
{
@@ -1881,7 +1822,7 @@
return false;
}
- const char* cmd_name = args.GetArgumentAtIndex(0);
+ const char* cmd_name = command.GetArgumentAtIndex(0);
if (cmd_name && *cmd_name && m_interpreter.HasUserCommands() && m_interpreter.UserCommandExists(cmd_name))
{
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectCrossref.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectCrossref.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectCrossref.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectCrossref.cpp Fri Jun 8 19:52:06 2012
@@ -29,7 +29,7 @@
const char *help,
const char *syntax
) :
- CommandObject (interpreter, name, help, syntax),
+ CommandObjectParsed (interpreter, name, help, syntax),
m_crossref_object_types()
{
}
@@ -39,11 +39,7 @@
}
bool
-CommandObjectCrossref::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
+CommandObjectCrossref::DoExecute (Args& command, CommandReturnObject &result)
{
if (m_crossref_object_types.GetArgumentCount() == 0)
{
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.cpp Fri Jun 8 19:52:06 2012
@@ -210,10 +210,10 @@
//-------------------------------------------------------------------------
CommandObjectDisassemble::CommandObjectDisassemble (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "disassemble",
- "Disassemble bytes in the current function, or elsewhere in the executable program as specified by the user.",
- "disassemble [<cmd-options>]"),
+ CommandObjectParsed (interpreter,
+ "disassemble",
+ "Disassemble bytes in the current function, or elsewhere in the executable program as specified by the user.",
+ "disassemble [<cmd-options>]"),
m_options (interpreter)
{
}
@@ -223,11 +223,7 @@
}
bool
-CommandObjectDisassemble::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
+CommandObjectDisassemble::DoExecute (Args& command, CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
if (target == NULL)
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectDisassemble.h Fri Jun 8 19:52:06 2012
@@ -23,7 +23,7 @@
// CommandObjectDisassemble
//-------------------------------------------------------------------------
-class CommandObjectDisassemble : public CommandObject
+class CommandObjectDisassemble : public CommandObjectParsed
{
public:
class CommandOptions : public Options
@@ -85,11 +85,11 @@
return &m_options;
}
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result);
-protected:
CommandOptions m_options;
};
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.cpp Fri Jun 8 19:52:06 2012
@@ -134,10 +134,11 @@
}
CommandObjectExpression::CommandObjectExpression (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "expression",
- "Evaluate a C/ObjC/C++ expression in the current program context, using variables currently in scope.",
- NULL),
+ CommandObjectRaw (interpreter,
+ "expression",
+ "Evaluate a C/ObjC/C++ expression in the current program context, using variables currently in scope.",
+ NULL,
+ eFlagProcessMustBePaused),
m_option_group (interpreter),
m_format_options (eFormatDefault),
m_command_options (),
@@ -180,18 +181,6 @@
return &m_option_group;
}
-
-bool
-CommandObjectExpression::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- return false;
-}
-
-
size_t
CommandObjectExpression::MultiLineExpressionCallback
(
@@ -418,7 +407,7 @@
}
bool
-CommandObjectExpression::ExecuteRawCommandString
+CommandObjectExpression::DoExecute
(
const char *command,
CommandReturnObject &result
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectExpression.h Fri Jun 8 19:52:06 2012
@@ -20,7 +20,7 @@
namespace lldb_private {
-class CommandObjectExpression : public CommandObject
+class CommandObjectExpression : public CommandObjectRaw
{
public:
@@ -66,19 +66,10 @@
Options *
GetOptions ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- virtual bool
- ExecuteRawCommandString (const char *command,
- CommandReturnObject &result);
-
protected:
+ virtual bool
+ DoExecute (const char *command,
+ CommandReturnObject &result);
static size_t
MultiLineExpressionCallback (void *baton,
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectFrame.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectFrame.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectFrame.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectFrame.cpp Fri Jun 8 19:52:06 2012
@@ -52,16 +52,16 @@
// CommandObjectFrameInfo
//-------------------------------------------------------------------------
-class CommandObjectFrameInfo : public CommandObject
+class CommandObjectFrameInfo : public CommandObjectParsed
{
public:
CommandObjectFrameInfo (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "frame info",
- "List information about the currently selected frame in the current thread.",
- "frame info",
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
+ CommandObjectParsed (interpreter,
+ "frame info",
+ "List information about the currently selected frame in the current thread.",
+ "frame info",
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
{
}
@@ -69,8 +69,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
@@ -95,7 +96,7 @@
// CommandObjectFrameSelect
//-------------------------------------------------------------------------
-class CommandObjectFrameSelect : public CommandObject
+class CommandObjectFrameSelect : public CommandObjectParsed
{
public:
@@ -155,11 +156,11 @@
};
CommandObjectFrameSelect (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "frame select",
- "Select a frame by index from within the current thread and make it the current frame.",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
+ CommandObjectParsed (interpreter,
+ "frame select",
+ "Select a frame by index from within the current thread and make it the current frame.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
m_options (interpreter)
{
CommandArgumentEntry arg;
@@ -188,8 +189,9 @@
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
ExecutionContext exe_ctx (m_interpreter.GetExecutionContext());
@@ -319,21 +321,21 @@
//----------------------------------------------------------------------
// List images with associated information
//----------------------------------------------------------------------
-class CommandObjectFrameVariable : public CommandObject
+class CommandObjectFrameVariable : public CommandObjectParsed
{
public:
CommandObjectFrameVariable (CommandInterpreter &interpreter) :
- CommandObject (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,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
+ 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,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
m_option_group (interpreter),
m_option_variable(true), // Include the frame specific options by passing "true"
m_option_format (eFormatDefault),
@@ -370,13 +372,9 @@
return &m_option_group;
}
-
+protected:
virtual bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
StackFrame *frame = exe_ctx.GetFramePtr();
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.cpp Fri Jun 8 19:52:06 2012
@@ -26,10 +26,10 @@
//-------------------------------------------------------------------------
CommandObjectHelp::CommandObjectHelp (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "help",
- "Show a list of all debugger commands, or give details about specific commands.",
- "help [<cmd-name>]"), m_options (interpreter)
+ CommandObjectParsed (interpreter,
+ "help",
+ "Show a list of all debugger commands, or give details about specific commands.",
+ "help [<cmd-name>]"), m_options (interpreter)
{
CommandArgumentEntry arg;
CommandArgumentData command_arg;
@@ -58,7 +58,7 @@
};
bool
-CommandObjectHelp::Execute (Args& command, CommandReturnObject &result)
+CommandObjectHelp::DoExecute (Args& command, CommandReturnObject &result)
{
CommandObject::CommandMap::iterator pos;
CommandObject *cmd_obj;
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectHelp.h Fri Jun 8 19:52:06 2012
@@ -23,7 +23,7 @@
// CommandObjectHelp
//-------------------------------------------------------------------------
-class CommandObjectHelp : public CommandObject
+class CommandObjectHelp : public CommandObjectParsed
{
public:
@@ -32,10 +32,6 @@
virtual
~CommandObjectHelp ();
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
virtual int
HandleCompletion (Args &input,
int &cursor_index,
@@ -102,14 +98,20 @@
bool m_show_user_defined;
};
- CommandOptions m_options;
-
virtual Options *
GetOptions ()
{
return &m_options;
}
+
+protected:
+ virtual bool
+ DoExecute (Args& command,
+ CommandReturnObject &result);
+private:
+ CommandOptions m_options;
+
};
} // namespace lldb_private
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectLog.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectLog.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectLog.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectLog.cpp Fri Jun 8 19:52:06 2012
@@ -42,17 +42,17 @@
using namespace lldb_private;
-class CommandObjectLogEnable : public CommandObject
+class CommandObjectLogEnable : public CommandObjectParsed
{
public:
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
CommandObjectLogEnable(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "log enable",
- "Enable logging for a single log channel.",
- NULL),
+ CommandObjectParsed (interpreter,
+ "log enable",
+ "Enable logging for a single log channel.",
+ NULL),
m_options (interpreter)
{
@@ -110,31 +110,6 @@
// return matches.GetSize();
// }
//
- virtual bool
- Execute (Args& args,
- CommandReturnObject &result)
- {
- if (args.GetArgumentCount() < 2)
- {
- result.AppendErrorWithFormat("%s takes a log channel and one or more log types.\n", m_cmd_name.c_str());
- }
- else
- {
- std::string channel(args.GetArgumentAtIndex(0));
- args.Shift (); // Shift off the channel
- bool success = m_interpreter.GetDebugger().EnableLog (channel.c_str(),
- args.GetConstArgumentVector(),
- m_options.log_file.c_str(),
- m_options.log_options,
- result.GetErrorStream());
- if (success)
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- else
- result.SetStatus (eReturnStatusFailed);
- }
- return result.Succeeded();
- }
-
class CommandOptions : public Options
{
@@ -201,6 +176,31 @@
};
protected:
+ virtual bool
+ DoExecute (Args& args,
+ CommandReturnObject &result)
+ {
+ if (args.GetArgumentCount() < 2)
+ {
+ result.AppendErrorWithFormat("%s takes a log channel and one or more log types.\n", m_cmd_name.c_str());
+ }
+ else
+ {
+ std::string channel(args.GetArgumentAtIndex(0));
+ args.Shift (); // Shift off the channel
+ bool success = m_interpreter.GetDebugger().EnableLog (channel.c_str(),
+ args.GetConstArgumentVector(),
+ m_options.log_file.c_str(),
+ m_options.log_options,
+ result.GetErrorStream());
+ if (success)
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ else
+ result.SetStatus (eReturnStatusFailed);
+ }
+ return result.Succeeded();
+ }
+
CommandOptions m_options;
};
@@ -218,17 +218,17 @@
{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
};
-class CommandObjectLogDisable : public CommandObject
+class CommandObjectLogDisable : public CommandObjectParsed
{
public:
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
CommandObjectLogDisable(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "log disable",
- "Disable one or more log channel categories.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "log disable",
+ "Disable one or more log channel categories.",
+ NULL)
{
CommandArgumentEntry arg1;
CommandArgumentEntry arg2;
@@ -257,8 +257,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args,
+ DoExecute (Args& args,
CommandReturnObject &result)
{
const size_t argc = args.GetArgumentCount();
@@ -297,17 +298,17 @@
}
};
-class CommandObjectLogList : public CommandObject
+class CommandObjectLogList : public CommandObjectParsed
{
public:
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
CommandObjectLogList(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "log list",
- "List the log categories for one or more log channels. If none specified, lists them all.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "log list",
+ "List the log categories for one or more log channels. If none specified, lists them all.",
+ NULL)
{
CommandArgumentEntry arg;
CommandArgumentData channel_arg;
@@ -328,8 +329,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args,
+ DoExecute (Args& args,
CommandReturnObject &result)
{
const size_t argc = args.GetArgumentCount();
@@ -372,17 +374,17 @@
}
};
-class CommandObjectLogTimer : public CommandObject
+class CommandObjectLogTimer : public CommandObjectParsed
{
public:
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
CommandObjectLogTimer(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "log timers",
- "Enable, disable, dump, and reset LLDB internal performance timers.",
- "log timers < enable <depth> | disable | dump | increment <bool> | reset >")
+ CommandObjectParsed (interpreter,
+ "log timers",
+ "Enable, disable, dump, and reset LLDB internal performance timers.",
+ "log timers < enable <depth> | disable | dump | increment <bool> | reset >")
{
}
@@ -391,8 +393,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args,
+ DoExecute (Args& args,
CommandReturnObject &result)
{
const size_t argc = args.GetArgumentCount();
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectMemory.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectMemory.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectMemory.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectMemory.cpp Fri Jun 8 19:52:06 2012
@@ -283,16 +283,16 @@
//----------------------------------------------------------------------
// Read memory from the inferior process
//----------------------------------------------------------------------
-class CommandObjectMemoryRead : public CommandObject
+class CommandObjectMemoryRead : public CommandObjectParsed
{
public:
CommandObjectMemoryRead (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "memory read",
- "Read from the memory of the process being debugged.",
- NULL,
- eFlagProcessMustBePaused),
+ CommandObjectParsed (interpreter,
+ "memory read",
+ "Read from the memory of the process being debugged.",
+ NULL,
+ eFlagProcessMustBePaused),
m_option_group (interpreter),
m_format_options (eFormatBytesWithASCII, 1, 8),
m_memory_options (),
@@ -361,8 +361,9 @@
return m_cmd_name.c_str();
}
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
ExecutionContext exe_ctx (m_interpreter.GetExecutionContext());
@@ -763,7 +764,6 @@
return true;
}
-protected:
OptionGroupOptions m_option_group;
OptionGroupFormat m_format_options;
OptionGroupReadMemory m_memory_options;
@@ -789,7 +789,7 @@
//----------------------------------------------------------------------
// Write memory to the inferior process
//----------------------------------------------------------------------
-class CommandObjectMemoryWrite : public CommandObject
+class CommandObjectMemoryWrite : public CommandObjectParsed
{
public:
@@ -867,12 +867,11 @@
};
CommandObjectMemoryWrite (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "memory write",
- "Write to the memory of the process being debugged.",
- //"memory write [<cmd-options>] <addr> [value1 value2 ...]",
- NULL,
- eFlagProcessMustBeLaunched),
+ CommandObjectParsed (interpreter,
+ "memory write",
+ "Write to the memory of the process being debugged.",
+ NULL,
+ eFlagProcessMustBeLaunched),
m_option_group (interpreter),
m_format_options (eFormatBytes, 1, UINT64_MAX),
m_memory_options ()
@@ -945,9 +944,9 @@
return min <= sval64 && sval64 <= max;
}
+protected:
virtual bool
- Execute (Args& command,
- CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
if (process == NULL)
@@ -1221,8 +1220,6 @@
return true;
}
-protected:
-
OptionGroupOptions m_option_group;
OptionGroupFormat m_format_options;
OptionGroupWriteMemory m_memory_options;
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectMultiword.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectMultiword.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectMultiword.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectMultiword.cpp Fri Jun 8 19:52:06 2012
@@ -107,12 +107,9 @@
}
bool
-CommandObjectMultiword::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
+CommandObjectMultiword::Execute(const char *args_string, CommandReturnObject &result)
{
+ Args args (args_string);
const size_t argc = args.GetArgumentCount();
if (argc == 0)
{
@@ -139,7 +136,7 @@
args.Shift();
- sub_cmd_obj->ExecuteWithOptions (args, result);
+ sub_cmd_obj->Execute (args_string, result);
}
else
{
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp Fri Jun 8 19:52:06 2012
@@ -179,15 +179,15 @@
//----------------------------------------------------------------------
// "platform select <platform-name>"
//----------------------------------------------------------------------
-class CommandObjectPlatformSelect : public CommandObject
+class CommandObjectPlatformSelect : public CommandObjectParsed
{
public:
CommandObjectPlatformSelect (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform select",
- "Create a platform if needed and select it as the current platform.",
- "platform select <platform-name>",
- 0),
+ CommandObjectParsed (interpreter,
+ "platform select",
+ "Create a platform if needed and select it as the current platform.",
+ "platform select <platform-name>",
+ 0),
m_option_group (interpreter),
m_platform_options (false) // Don't include the "--platform" option by passing false
{
@@ -200,8 +200,37 @@
{
}
+ virtual int
+ HandleCompletion (Args &input,
+ int &cursor_index,
+ int &cursor_char_position,
+ int match_start_point,
+ int max_return_elements,
+ bool &word_complete,
+ StringList &matches)
+ {
+ std::string completion_str (input.GetArgumentAtIndex(cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ CommandCompletions::PlatformPluginNames (m_interpreter,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ return matches.GetSize();
+ }
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_option_group;
+ }
+
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
if (args.GetArgumentCount() == 1)
{
@@ -237,37 +266,7 @@
}
return result.Succeeded();
}
-
-
- virtual int
- HandleCompletion (Args &input,
- int &cursor_index,
- int &cursor_char_position,
- int match_start_point,
- int max_return_elements,
- bool &word_complete,
- StringList &matches)
- {
- std::string completion_str (input.GetArgumentAtIndex(cursor_index));
- completion_str.erase (cursor_char_position);
-
- CommandCompletions::PlatformPluginNames (m_interpreter,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- return matches.GetSize();
- }
-
- virtual Options *
- GetOptions ()
- {
- return &m_option_group;
- }
-protected:
OptionGroupOptions m_option_group;
OptionGroupPlatform m_platform_options;
};
@@ -275,15 +274,15 @@
//----------------------------------------------------------------------
// "platform list"
//----------------------------------------------------------------------
-class CommandObjectPlatformList : public CommandObject
+class CommandObjectPlatformList : public CommandObjectParsed
{
public:
CommandObjectPlatformList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform list",
- "List all platforms that are available.",
- NULL,
- 0)
+ CommandObjectParsed (interpreter,
+ "platform list",
+ "List all platforms that are available.",
+ NULL,
+ 0)
{
}
@@ -292,8 +291,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
Stream &ostrm = result.GetOutputStream();
ostrm.Printf("Available platforms:\n");
@@ -329,15 +329,15 @@
//----------------------------------------------------------------------
// "platform status"
//----------------------------------------------------------------------
-class CommandObjectPlatformStatus : public CommandObject
+class CommandObjectPlatformStatus : public CommandObjectParsed
{
public:
CommandObjectPlatformStatus (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform status",
- "Display status for the currently selected platform.",
- NULL,
- 0)
+ CommandObjectParsed (interpreter,
+ "platform status",
+ "Display status for the currently selected platform.",
+ NULL,
+ 0)
{
}
@@ -346,8 +346,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
Stream &ostrm = result.GetOutputStream();
@@ -369,15 +370,15 @@
//----------------------------------------------------------------------
// "platform connect <connect-url>"
//----------------------------------------------------------------------
-class CommandObjectPlatformConnect : public CommandObject
+class CommandObjectPlatformConnect : public CommandObjectParsed
{
public:
CommandObjectPlatformConnect (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform connect",
- "Connect a platform by name to be the currently selected platform.",
- "platform connect <connect-url>",
- 0)
+ CommandObjectParsed (interpreter,
+ "platform connect",
+ "Connect a platform by name to be the currently selected platform.",
+ "platform connect <connect-url>",
+ 0)
{
}
@@ -386,8 +387,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
Stream &ostrm = result.GetOutputStream();
@@ -433,15 +435,15 @@
//----------------------------------------------------------------------
// "platform disconnect"
//----------------------------------------------------------------------
-class CommandObjectPlatformDisconnect : public CommandObject
+class CommandObjectPlatformDisconnect : public CommandObjectParsed
{
public:
CommandObjectPlatformDisconnect (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform disconnect",
- "Disconnect a platform by name to be the currently selected platform.",
- "platform disconnect",
- 0)
+ CommandObjectParsed (interpreter,
+ "platform disconnect",
+ "Disconnect a platform by name to be the currently selected platform.",
+ "platform disconnect",
+ 0)
{
}
@@ -450,8 +452,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
if (platform_sp)
@@ -511,15 +514,15 @@
//----------------------------------------------------------------------
// "platform mkdir"
//----------------------------------------------------------------------
-class CommandObjectPlatformMkDir : public CommandObject
+class CommandObjectPlatformMkDir : public CommandObjectParsed
{
public:
CommandObjectPlatformMkDir (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform shell",
- "Make a new directory on the remote end.",
- NULL,
- 0),
+ CommandObjectParsed (interpreter,
+ "platform shell",
+ "Make a new directory on the remote end.",
+ NULL,
+ 0),
m_options(interpreter)
{
}
@@ -530,7 +533,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
if (platform_sp)
@@ -572,15 +575,15 @@
//----------------------------------------------------------------------
// "platform fopen"
//----------------------------------------------------------------------
-class CommandObjectPlatformFOpen : public CommandObject
+class CommandObjectPlatformFOpen : public CommandObjectParsed
{
public:
CommandObjectPlatformFOpen (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform file open",
- "Open a file on the remote end.",
- NULL,
- 0),
+ CommandObjectParsed (interpreter,
+ "platform file open",
+ "Open a file on the remote end.",
+ NULL,
+ 0),
m_options(interpreter)
{
}
@@ -591,7 +594,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
if (platform_sp)
@@ -634,15 +637,15 @@
//----------------------------------------------------------------------
// "platform fclose"
//----------------------------------------------------------------------
-class CommandObjectPlatformFClose : public CommandObject
+class CommandObjectPlatformFClose : public CommandObjectParsed
{
public:
CommandObjectPlatformFClose (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform file close",
- "Close a file on the remote end.",
- NULL,
- 0)
+ CommandObjectParsed (interpreter,
+ "platform file close",
+ "Close a file on the remote end.",
+ NULL,
+ 0)
{
}
@@ -652,7 +655,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
if (platform_sp)
@@ -676,15 +679,15 @@
//----------------------------------------------------------------------
// "platform fread"
//----------------------------------------------------------------------
-class CommandObjectPlatformFRead : public CommandObject
+class CommandObjectPlatformFRead : public CommandObjectParsed
{
public:
CommandObjectPlatformFRead (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform file read",
- "Read data from a file on the remote end.",
- NULL,
- 0),
+ CommandObjectParsed (interpreter,
+ "platform file read",
+ "Read data from a file on the remote end.",
+ NULL,
+ 0),
m_options (interpreter)
{
}
@@ -695,7 +698,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
if (platform_sp)
@@ -801,15 +804,15 @@
//----------------------------------------------------------------------
// "platform fwrite"
//----------------------------------------------------------------------
-class CommandObjectPlatformFWrite : public CommandObject
+class CommandObjectPlatformFWrite : public CommandObjectParsed
{
public:
CommandObjectPlatformFWrite (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform file write",
- "Write data to a file on the remote end.",
- NULL,
- 0),
+ CommandObjectParsed (interpreter,
+ "platform file write",
+ "Write data to a file on the remote end.",
+ NULL,
+ 0),
m_options (interpreter)
{
}
@@ -820,7 +823,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
if (platform_sp)
@@ -951,15 +954,15 @@
//----------------------------------------------------------------------
// "platform get-file remote-file-path host-file-path"
//----------------------------------------------------------------------
-class CommandObjectPlatformGetFile : public CommandObject
+class CommandObjectPlatformGetFile : public CommandObjectParsed
{
public:
CommandObjectPlatformGetFile (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform get-file",
- "Transfer a file from the remote end to the local host.",
- "platform get-file <remote-file-spec> <local-file-spec>",
- 0)
+ CommandObjectParsed (interpreter,
+ "platform get-file",
+ "Transfer a file from the remote end to the local host.",
+ "platform get-file <remote-file-spec> <local-file-spec>",
+ 0)
{
SetHelpLong(
"Examples: \n\
@@ -993,7 +996,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
// If the number of arguments is incorrect, issue an error message.
if (args.GetArgumentCount() != 2)
@@ -1034,15 +1037,15 @@
//----------------------------------------------------------------------
// "platform get-size remote-file-path"
//----------------------------------------------------------------------
-class CommandObjectPlatformGetSize : public CommandObject
+class CommandObjectPlatformGetSize : public CommandObjectParsed
{
public:
CommandObjectPlatformGetSize (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform get-size",
- "Get the file size from the remote end.",
- "platform get-size <remote-file-spec>",
- 0)
+ CommandObjectParsed (interpreter,
+ "platform get-size",
+ "Get the file size from the remote end.",
+ "platform get-size <remote-file-spec>",
+ 0)
{
SetHelpLong(
"Examples: \n\
@@ -1069,7 +1072,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
// If the number of arguments is incorrect, issue an error message.
if (args.GetArgumentCount() != 1)
@@ -1107,15 +1110,15 @@
//----------------------------------------------------------------------
// "platform put-file"
//----------------------------------------------------------------------
-class CommandObjectPlatformPutFile : public CommandObject
+class CommandObjectPlatformPutFile : public CommandObjectParsed
{
public:
CommandObjectPlatformPutFile (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform put-file",
- "Transfer a file from this system to the remote end.",
- NULL,
- 0)
+ CommandObjectParsed (interpreter,
+ "platform put-file",
+ "Transfer a file from this system to the remote end.",
+ NULL,
+ 0)
{
}
@@ -1125,7 +1128,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
const char* src = args.GetArgumentAtIndex(0);
const char* dst = args.GetArgumentAtIndex(1);
@@ -1150,15 +1153,15 @@
//----------------------------------------------------------------------
// "platform process launch"
//----------------------------------------------------------------------
-class CommandObjectPlatformProcessLaunch : public CommandObject
+class CommandObjectPlatformProcessLaunch : public CommandObjectParsed
{
public:
CommandObjectPlatformProcessLaunch (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform process launch",
- "Launch a new process on a remote platform.",
- "platform process launch program",
- 0),
+ CommandObjectParsed (interpreter,
+ "platform process launch",
+ "Launch a new process on a remote platform.",
+ "platform process launch program",
+ 0),
m_options (interpreter)
{
}
@@ -1168,8 +1171,15 @@
{
}
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
@@ -1256,12 +1266,6 @@
return result.Succeeded();
}
- virtual Options *
- GetOptions ()
- {
- return &m_options;
- }
-
protected:
ProcessLaunchCommandOptions m_options;
};
@@ -1271,15 +1275,15 @@
//----------------------------------------------------------------------
// "platform process list"
//----------------------------------------------------------------------
-class CommandObjectPlatformProcessList : public CommandObject
+class CommandObjectPlatformProcessList : public CommandObjectParsed
{
public:
CommandObjectPlatformProcessList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform process list",
- "List processes on a remote platform by name, pid, or many other matching attributes.",
- "platform process list",
- 0),
+ CommandObjectParsed (interpreter,
+ "platform process list",
+ "List processes on a remote platform by name, pid, or many other matching attributes.",
+ "platform process list",
+ 0),
m_options (interpreter)
{
}
@@ -1289,8 +1293,15 @@
{
}
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
@@ -1384,14 +1395,6 @@
return result.Succeeded();
}
- virtual Options *
- GetOptions ()
- {
- return &m_options;
- }
-
-protected:
-
class CommandOptions : public Options
{
public:
@@ -1547,15 +1550,15 @@
//----------------------------------------------------------------------
// "platform process info"
//----------------------------------------------------------------------
-class CommandObjectPlatformProcessInfo : public CommandObject
+class CommandObjectPlatformProcessInfo : public CommandObjectParsed
{
public:
CommandObjectPlatformProcessInfo (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform process info",
- "Get detailed information for one or more process by process ID.",
- "platform process info <pid> [<pid> <pid> ...]",
- 0)
+ CommandObjectParsed (interpreter,
+ "platform process info",
+ "Get detailed information for one or more process by process ID.",
+ "platform process info <pid> [<pid> <pid> ...]",
+ 0)
{
CommandArgumentEntry arg;
CommandArgumentData pid_args;
@@ -1576,8 +1579,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
if (platform_sp)
@@ -1640,7 +1644,7 @@
}
};
-class CommandObjectPlatformProcessAttach : public CommandObject
+class CommandObjectPlatformProcessAttach : public CommandObjectParsed
{
public:
@@ -1775,10 +1779,10 @@
};
CommandObjectPlatformProcessAttach (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform process attach",
- "Attach to a process.",
- "platform process attach <cmd-options>"),
+ CommandObjectParsed (interpreter,
+ "platform process attach",
+ "Attach to a process.",
+ "platform process attach <cmd-options>"),
m_options (interpreter)
{
}
@@ -1788,7 +1792,7 @@
}
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
@@ -1875,7 +1879,7 @@
//----------------------------------------------------------------------
// "platform shell"
//----------------------------------------------------------------------
-class CommandObjectPlatformShell : public CommandObject
+class CommandObjectPlatformShell : public CommandObjectRaw
{
public:
@@ -1944,11 +1948,11 @@
};
CommandObjectPlatformShell (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform shell",
- "Run a shell command on a the selected platform.",
- "platform shell <shell-command>",
- 0),
+ CommandObjectRaw (interpreter,
+ "platform shell",
+ "Run a shell command on a the selected platform.",
+ "platform shell <shell-command>",
+ 0),
m_options(interpreter)
{
}
@@ -1958,25 +1962,8 @@
{
}
- virtual
- Options *
- GetOptions ()
- {
- return &m_options;
- }
-
virtual bool
- Execute (Args& command,
- CommandReturnObject &result)
- {
- return false;
- }
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- bool
- ExecuteRawCommandString (const char *raw_command_line, CommandReturnObject &result)
+ DoExecute (const char *raw_command_line, CommandReturnObject &result)
{
const char* expr = NULL;
@@ -2062,8 +2049,6 @@
}
return true;
}
-
-protected:
CommandOptions m_options;
};
@@ -2156,15 +2141,15 @@
//----------------------------------------------------------------------
// "platform install" - install a target to a remote end
//----------------------------------------------------------------------
-class CommandObjectPlatformInstall : public CommandObject
+class CommandObjectPlatformInstall : public CommandObjectParsed
{
public:
CommandObjectPlatformInstall (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "platform target-install",
- "Install a target (bundle or executable file) to the remote end.",
- "platform target-install <local-thing> <remote-sandbox>",
- 0)
+ CommandObjectParsed (interpreter,
+ "platform target-install",
+ "Install a target (bundle or executable file) to the remote end.",
+ "platform target-install <local-thing> <remote-sandbox>",
+ 0)
{
}
@@ -2174,7 +2159,7 @@
}
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
if (args.GetArgumentCount() != 2)
{
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectProcess.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectProcess.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectProcess.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectProcess.cpp Fri Jun 8 19:52:06 2012
@@ -31,15 +31,15 @@
// CommandObjectProcessLaunch
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessLaunch
-class CommandObjectProcessLaunch : public CommandObject
+class CommandObjectProcessLaunch : public CommandObjectParsed
{
public:
CommandObjectProcessLaunch (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process launch",
- "Launch the executable in the debugger.",
- NULL),
+ CommandObjectParsed (interpreter,
+ "process launch",
+ "Launch the executable in the debugger.",
+ NULL),
m_options (interpreter)
{
CommandArgumentEntry arg;
@@ -67,8 +67,15 @@
return &m_options;
}
+ virtual const char *GetRepeatCommand (Args ¤t_command_args, uint32_t index)
+ {
+ // No repeat for "process launch"...
+ return "";
+ }
+
+protected:
bool
- Execute (Args& launch_args, CommandReturnObject &result)
+ DoExecute (Args& launch_args, CommandReturnObject &result)
{
Debugger &debugger = m_interpreter.GetDebugger();
Target *target = debugger.GetSelectedTarget().get();
@@ -256,12 +263,6 @@
return result.Succeeded();
}
- virtual const char *GetRepeatCommand (Args ¤t_command_args, uint32_t index)
- {
- // No repeat for "process launch"...
- return "";
- }
-
protected:
ProcessLaunchCommandOptions m_options;
};
@@ -293,7 +294,7 @@
// CommandObjectProcessAttach
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessAttach
-class CommandObjectProcessAttach : public CommandObject
+class CommandObjectProcessAttach : public CommandObjectParsed
{
public:
@@ -432,10 +433,10 @@
};
CommandObjectProcessAttach (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process attach",
- "Attach to a process.",
- "process attach <cmd-options>"),
+ CommandObjectParsed (interpreter,
+ "process attach",
+ "Attach to a process.",
+ "process attach <cmd-options>"),
m_options (interpreter)
{
}
@@ -444,8 +445,15 @@
{
}
+ Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -603,14 +611,6 @@
return result.Succeeded();
}
- Options *
- GetOptions ()
- {
- return &m_options;
- }
-
-protected:
-
CommandOptions m_options;
};
@@ -631,16 +631,16 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessContinue
-class CommandObjectProcessContinue : public CommandObject
+class CommandObjectProcessContinue : public CommandObjectParsed
{
public:
CommandObjectProcessContinue (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process continue",
- "Continue execution of all threads in the current process.",
- "process continue",
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
+ CommandObjectParsed (interpreter,
+ "process continue",
+ "Continue execution of all threads in the current process.",
+ "process continue",
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
{
}
@@ -649,8 +649,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
@@ -719,16 +720,16 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessDetach
-class CommandObjectProcessDetach : public CommandObject
+class CommandObjectProcessDetach : public CommandObjectParsed
{
public:
CommandObjectProcessDetach (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process detach",
- "Detach from the current process being debugged.",
- "process detach",
- eFlagProcessMustBeLaunched)
+ CommandObjectParsed (interpreter,
+ "process detach",
+ "Detach from the current process being debugged.",
+ "process detach",
+ eFlagProcessMustBeLaunched)
{
}
@@ -736,8 +737,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
@@ -769,7 +771,7 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessConnect
-class CommandObjectProcessConnect : public CommandObject
+class CommandObjectProcessConnect : public CommandObjectParsed
{
public:
@@ -829,11 +831,11 @@
};
CommandObjectProcessConnect (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process connect",
- "Connect to a remote debug service.",
- "process connect <remote-url>",
- 0),
+ CommandObjectParsed (interpreter,
+ "process connect",
+ "Connect to a remote debug service.",
+ "process connect <remote-url>",
+ 0),
m_options (interpreter)
{
}
@@ -843,8 +845,15 @@
}
+ Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
@@ -919,14 +928,6 @@
}
return result.Succeeded();
}
-
- Options *
- GetOptions ()
- {
- return &m_options;
- }
-
-protected:
CommandOptions m_options;
};
@@ -944,16 +945,16 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessLoad
-class CommandObjectProcessLoad : public CommandObject
+class CommandObjectProcessLoad : public CommandObjectParsed
{
public:
CommandObjectProcessLoad (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process load",
- "Load a shared library into the current process.",
- "process load <filename> [<filename> ...]",
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
+ CommandObjectParsed (interpreter,
+ "process load",
+ "Load a shared library into the current process.",
+ "process load <filename> [<filename> ...]",
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
{
}
@@ -961,8 +962,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
@@ -1003,16 +1005,16 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessUnload
-class CommandObjectProcessUnload : public CommandObject
+class CommandObjectProcessUnload : public CommandObjectParsed
{
public:
CommandObjectProcessUnload (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process unload",
- "Unload a shared library from the current process using the index returned by a previous call to \"process load\".",
- "process unload <index>",
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
+ CommandObjectParsed (interpreter,
+ "process unload",
+ "Unload a shared library from the current process using the index returned by a previous call to \"process load\".",
+ "process unload <index>",
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
{
}
@@ -1020,8 +1022,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
@@ -1069,15 +1072,15 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessSignal
-class CommandObjectProcessSignal : public CommandObject
+class CommandObjectProcessSignal : public CommandObjectParsed
{
public:
CommandObjectProcessSignal (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process signal",
- "Send a UNIX signal to the current process being debugged.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "process signal",
+ "Send a UNIX signal to the current process being debugged.",
+ NULL)
{
CommandArgumentEntry arg;
CommandArgumentData signal_arg;
@@ -1097,8 +1100,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
@@ -1154,17 +1158,17 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessInterrupt
-class CommandObjectProcessInterrupt : public CommandObject
+class CommandObjectProcessInterrupt : public CommandObjectParsed
{
public:
CommandObjectProcessInterrupt (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process interrupt",
- "Interrupt the current process being debugged.",
- "process interrupt",
- eFlagProcessMustBeLaunched)
+ CommandObjectParsed (interpreter,
+ "process interrupt",
+ "Interrupt the current process being debugged.",
+ "process interrupt",
+ eFlagProcessMustBeLaunched)
{
}
@@ -1172,8 +1176,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
@@ -1217,16 +1222,16 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessKill
-class CommandObjectProcessKill : public CommandObject
+class CommandObjectProcessKill : public CommandObjectParsed
{
public:
CommandObjectProcessKill (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process kill",
- "Terminate the current process being debugged.",
- "process kill",
- eFlagProcessMustBeLaunched)
+ CommandObjectParsed (interpreter,
+ "process kill",
+ "Terminate the current process being debugged.",
+ "process kill",
+ eFlagProcessMustBeLaunched)
{
}
@@ -1234,8 +1239,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
@@ -1275,15 +1281,15 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessStatus
-class CommandObjectProcessStatus : public CommandObject
+class CommandObjectProcessStatus : public CommandObjectParsed
{
public:
CommandObjectProcessStatus (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process status",
- "Show the current status and location of executing process.",
- "process status",
- 0)
+ CommandObjectParsed (interpreter,
+ "process status",
+ "Show the current status and location of executing process.",
+ "process status",
+ 0)
{
}
@@ -1293,11 +1299,7 @@
bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
Stream &strm = result.GetOutputStream();
result.SetStatus (eReturnStatusSuccessFinishNoResult);
@@ -1331,7 +1333,7 @@
//-------------------------------------------------------------------------
#pragma mark CommandObjectProcessHandle
-class CommandObjectProcessHandle : public CommandObject
+class CommandObjectProcessHandle : public CommandObjectParsed
{
public:
@@ -1400,10 +1402,10 @@
CommandObjectProcessHandle (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "process handle",
- "Show or update what the process and debugger should do with various signals received from the OS.",
- NULL),
+ CommandObjectParsed (interpreter,
+ "process handle",
+ "Show or update what the process and debugger should do with various signals received from the OS.",
+ NULL),
m_options (interpreter)
{
SetHelpLong ("If no signals are specified, update them all. If no update option is specified, list the current values.\n");
@@ -1503,8 +1505,9 @@
}
}
+protected:
bool
- Execute (Args &signal_args, CommandReturnObject &result)
+ DoExecute (Args &signal_args, CommandReturnObject &result)
{
TargetSP target_sp = m_interpreter.GetDebugger().GetSelectedTarget();
@@ -1618,8 +1621,6 @@
return result.Succeeded();
}
-protected:
-
CommandOptions m_options;
};
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.cpp Fri Jun 8 19:52:06 2012
@@ -24,7 +24,7 @@
//-------------------------------------------------------------------------
CommandObjectQuit::CommandObjectQuit (CommandInterpreter &interpreter) :
- CommandObject (interpreter, "quit", "Quit out of the LLDB debugger.", "quit")
+ CommandObjectParsed (interpreter, "quit", "Quit out of the LLDB debugger.", "quit")
{
}
@@ -33,11 +33,7 @@
}
bool
-CommandObjectQuit::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
+CommandObjectQuit::DoExecute (Args& command, CommandReturnObject &result)
{
m_interpreter.BroadcastEvent (CommandInterpreter::eBroadcastBitQuitCommandReceived);
result.SetStatus (eReturnStatusQuit);
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectQuit.h Fri Jun 8 19:52:06 2012
@@ -22,7 +22,7 @@
// CommandObjectQuit
//-------------------------------------------------------------------------
-class CommandObjectQuit : public CommandObject
+class CommandObjectQuit : public CommandObjectParsed
{
public:
@@ -31,8 +31,9 @@
virtual
~CommandObjectQuit ();
+protected:
virtual bool
- Execute (Args& args,
+ DoExecute (Args& args,
CommandReturnObject &result);
};
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectRegister.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectRegister.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectRegister.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectRegister.cpp Fri Jun 8 19:52:06 2012
@@ -34,16 +34,15 @@
//----------------------------------------------------------------------
// "register read"
//----------------------------------------------------------------------
-class CommandObjectRegisterRead : public CommandObject
+class CommandObjectRegisterRead : public CommandObjectParsed
{
public:
CommandObjectRegisterRead (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "register read",
- "Dump the contents of one or more register values from the current frame. If no register is specified, dumps them all.",
- //"register read [<reg-name1> [<reg-name2> [...]]]",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
+ CommandObjectParsed (interpreter,
+ "register read",
+ "Dump the contents of one or more register values from the current frame. If no register is specified, dumps them all.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
m_option_group (interpreter),
m_format_options (eFormatDefault),
m_command_options ()
@@ -158,12 +157,9 @@
return available_count > 0;
}
+protected:
virtual bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
Stream &strm = result.GetOutputStream();
ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
@@ -359,15 +355,15 @@
//----------------------------------------------------------------------
// "register write"
//----------------------------------------------------------------------
-class CommandObjectRegisterWrite : public CommandObject
+class CommandObjectRegisterWrite : public CommandObjectParsed
{
public:
CommandObjectRegisterWrite (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "register write",
- "Modify a single register value.",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
+ CommandObjectParsed (interpreter,
+ "register write",
+ "Modify a single register value.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
{
CommandArgumentEntry arg1;
CommandArgumentEntry arg2;
@@ -398,12 +394,9 @@
{
}
+protected:
virtual bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute(Args& command, CommandReturnObject &result)
{
DataExtractor reg_data;
ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.cpp Fri Jun 8 19:52:06 2012
@@ -19,67 +19,52 @@
using namespace lldb;
using namespace lldb_private;
+#include "llvm/ADT/StringRef.h"
-//-------------------------------------------------------------------------
-// CommandObjectMultiwordSettings
-//-------------------------------------------------------------------------
-
-CommandObjectMultiwordSettings::CommandObjectMultiwordSettings (CommandInterpreter &interpreter) :
- CommandObjectMultiword (interpreter,
- "settings",
- "A set of commands for manipulating internal settable debugger variables.",
- "settings <command> [<command-options>]")
-{
- LoadSubCommand ("set", CommandObjectSP (new CommandObjectSettingsSet (interpreter)));
- LoadSubCommand ("show", CommandObjectSP (new CommandObjectSettingsShow (interpreter)));
- LoadSubCommand ("list", CommandObjectSP (new CommandObjectSettingsList (interpreter)));
- LoadSubCommand ("remove", CommandObjectSP (new CommandObjectSettingsRemove (interpreter)));
- LoadSubCommand ("replace", CommandObjectSP (new CommandObjectSettingsReplace (interpreter)));
- LoadSubCommand ("insert-before", CommandObjectSP (new CommandObjectSettingsInsertBefore (interpreter)));
- LoadSubCommand ("insert-after", CommandObjectSP (new CommandObjectSettingsInsertAfter (interpreter)));
- LoadSubCommand ("append", CommandObjectSP (new CommandObjectSettingsAppend (interpreter)));
- LoadSubCommand ("clear", CommandObjectSP (new CommandObjectSettingsClear (interpreter)));
-}
-
-CommandObjectMultiwordSettings::~CommandObjectMultiwordSettings ()
+static inline void StripLeadingSpaces(llvm::StringRef &Str)
{
+ while (!Str.empty() && isspace(Str[0]))
+ Str = Str.substr(1);
}
//-------------------------------------------------------------------------
// CommandObjectSettingsSet
//-------------------------------------------------------------------------
-CommandObjectSettingsSet::CommandObjectSettingsSet (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings set",
- "Set or change the value of a single debugger setting variable.",
- NULL),
- m_options (interpreter)
+class CommandObjectSettingsSet : public CommandObjectRaw
{
- CommandArgumentEntry arg1;
- CommandArgumentEntry arg2;
- CommandArgumentData var_name_arg;
- CommandArgumentData value_arg;
-
- // Define the first (and only) variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (var_name_arg);
-
- // Define the first (and only) variant of this arg.
- value_arg.arg_type = eArgTypeValue;
- value_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg2.push_back (value_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
- m_arguments.push_back (arg2);
-
- SetHelpLong (
+public:
+ CommandObjectSettingsSet (CommandInterpreter &interpreter) :
+ CommandObjectRaw (interpreter,
+ "settings set",
+ "Set or change the value of a single debugger setting variable.",
+ NULL),
+ m_options (interpreter)
+ {
+ CommandArgumentEntry arg1;
+ CommandArgumentEntry arg2;
+ CommandArgumentData var_name_arg;
+ CommandArgumentData value_arg;
+
+ // Define the first (and only) variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (var_name_arg);
+
+ // Define the first (and only) variant of this arg.
+ value_arg.arg_type = eArgTypeValue;
+ value_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg2.push_back (value_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
+ m_arguments.push_back (arg2);
+
+ SetHelpLong (
"When setting a dictionary or array variable, you can set multiple entries \n\
at once by giving the values to the set command. For example: \n\
\n\
@@ -101,528 +86,374 @@
the end), use one of the other settings sub-commands: append, replace, \n\
insert-before or insert-after.\n");
-}
-
-CommandObjectSettingsSet::~CommandObjectSettingsSet()
-{
-}
-
+ }
-#include "llvm/ADT/StringRef.h"
-static inline void StripLeadingSpaces(llvm::StringRef &Str)
-{
- while (!Str.empty() && isspace(Str[0]))
- Str = Str.substr(1);
-}
-bool
-CommandObjectSettingsSet::ExecuteRawCommandString (const char *raw_command, CommandReturnObject &result)
-{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- Args cmd_args(raw_command);
+ virtual
+ ~CommandObjectSettingsSet () {}
- // Process possible options.
- if (!ParseOptions (cmd_args, result))
- return false;
+ // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
+ virtual bool
+ WantsCompletion() { return true; }
- const int argc = cmd_args.GetArgumentCount ();
- if ((argc < 2) && (!m_options.m_reset))
+ virtual Options *
+ GetOptions ()
{
- result.AppendError ("'settings set' takes more arguments");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ return &m_options;
}
-
- const char *var_name = cmd_args.GetArgumentAtIndex (0);
- if ((var_name == NULL) || (var_name[0] == '\0'))
+
+ class CommandOptions : public Options
{
- result.AppendError ("'settings set' command requires a valid variable name; No value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ public:
- // Split the raw command into var_name and value pair.
- std::string var_name_string = var_name;
- llvm::StringRef raw_str(raw_command);
- llvm::StringRef var_value_str = raw_str.split(var_name).second;
- StripLeadingSpaces(var_value_str);
- std::string var_value_string = var_value_str.str();
-
- if (!m_options.m_reset
- && var_value_string.empty())
- {
- result.AppendError ("'settings set' command requires a valid variable value unless using '--reset' option;"
- " No value supplied");
- result.SetStatus (eReturnStatusFailed);
- }
- else
- {
- Error err = usc_sp->SetVariable (var_name_string.c_str(),
- var_value_string.c_str(),
- eVarSetOperationAssign,
- m_options.m_override,
- m_interpreter.GetDebugger().GetInstanceName().AsCString());
- if (err.Fail ())
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options (interpreter),
+ m_override (true),
+ m_reset (false)
{
- result.AppendError (err.AsCString());
- result.SetStatus (eReturnStatusFailed);
}
- else
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- return result.Succeeded();
-}
+ virtual
+ ~CommandOptions () {}
-int
-CommandObjectSettingsSet::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)
-{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
- // Attempting to complete variable name
- llvm::StringRef prev_str(cursor_index == 2 ? input.GetArgumentAtIndex(1) : "");
- if (cursor_index == 1 ||
- (cursor_index == 2 && prev_str.startswith("-")) // "settings set -r th", followed by Tab.
- )
- {
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eSettingsNameCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- // If there is only 1 match which fulfills the completion request, do an early return.
- if (matches.GetSize() == 1 && completion_str.compare(matches.GetStringAtIndex(0)) != 0)
- return 1;
- }
-
- // Attempting to complete value
- if ((cursor_index == 2) // Partly into the variable's value
- || (cursor_index == 1 // Or at the end of a completed valid variable name
- && matches.GetSize() == 1
- && completion_str.compare (matches.GetStringAtIndex(0)) == 0))
- {
- matches.Clear();
- UserSettingsControllerSP usc_sp = Debugger::GetSettingsController();
- if (cursor_index == 1)
- {
- // The user is at the end of the variable name, which is complete and valid.
- UserSettingsController::CompleteSettingsValue (usc_sp,
- input.GetArgumentAtIndex (1), // variable name
- NULL, // empty value string
- word_complete,
- matches);
+ switch (short_option)
+ {
+ case 'n':
+ m_override = false;
+ break;
+ case 'r':
+ m_reset = true;
+ break;
+ default:
+ error.SetErrorStringWithFormat ("unrecognized options '%c'", short_option);
+ break;
+ }
+
+ return error;
}
- else
+
+ void
+ OptionParsingStarting ()
{
- // The user is partly into the variable value.
- UserSettingsController::CompleteSettingsValue (usc_sp,
- input.GetArgumentAtIndex (1), // variable name
- completion_str.c_str(), // partial value string
- word_complete,
- matches);
+ m_override = true;
+ m_reset = false;
+ }
+
+ const OptionDefinition*
+ GetDefinitions ()
+ {
+ return g_option_table;
}
- }
- return matches.GetSize();
-}
+ // Options table: Required for subclasses of Options.
-//-------------------------------------------------------------------------
-// CommandObjectSettingsSet::CommandOptions
-//-------------------------------------------------------------------------
+ static OptionDefinition g_option_table[];
-CommandObjectSettingsSet::CommandOptions::CommandOptions (CommandInterpreter &interpreter) :
- Options (interpreter),
- m_override (true),
- m_reset (false)
-{
-}
+ // Instance variables to hold the values for command options.
-CommandObjectSettingsSet::CommandOptions::~CommandOptions ()
-{
-}
+ bool m_override;
+ bool m_reset;
-OptionDefinition
-CommandObjectSettingsSet::CommandOptions::g_option_table[] =
-{
- { LLDB_OPT_SET_1, false, "no-override", 'n', no_argument, NULL, NULL, eArgTypeNone, "Prevents already existing instances and pending settings from being assigned this new value. Using this option means that only the default or specified instance setting values will be updated." },
- { LLDB_OPT_SET_2, false, "reset", 'r', no_argument, NULL, NULL, eArgTypeNone, "Causes value to be reset to the original default for this variable. No value needs to be specified when this option is used." },
- { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
-};
-
-const OptionDefinition*
-CommandObjectSettingsSet::CommandOptions::GetDefinitions ()
-{
- return g_option_table;
-}
+ };
+
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ // Attempting to complete variable name
+ llvm::StringRef prev_str(cursor_index == 2 ? input.GetArgumentAtIndex(1) : "");
+ if (cursor_index == 1 ||
+ (cursor_index == 2 && prev_str.startswith("-")) // "settings set -r th", followed by Tab.
+ )
+ {
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eSettingsNameCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ // If there is only 1 match which fulfills the completion request, do an early return.
+ if (matches.GetSize() == 1 && completion_str.compare(matches.GetStringAtIndex(0)) != 0)
+ return 1;
+ }
-Error
-CommandObjectSettingsSet::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
-{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
+ // Attempting to complete value
+ if ((cursor_index == 2) // Partly into the variable's value
+ || (cursor_index == 1 // Or at the end of a completed valid variable name
+ && matches.GetSize() == 1
+ && completion_str.compare (matches.GetStringAtIndex(0)) == 0))
+ {
+ matches.Clear();
+ UserSettingsControllerSP usc_sp = Debugger::GetSettingsController();
+ if (cursor_index == 1)
+ {
+ // The user is at the end of the variable name, which is complete and valid.
+ UserSettingsController::CompleteSettingsValue (usc_sp,
+ input.GetArgumentAtIndex (1), // variable name
+ NULL, // empty value string
+ word_complete,
+ matches);
+ }
+ else
+ {
+ // The user is partly into the variable value.
+ UserSettingsController::CompleteSettingsValue (usc_sp,
+ input.GetArgumentAtIndex (1), // variable name
+ completion_str.c_str(), // partial value string
+ word_complete,
+ matches);
+ }
+ }
- switch (short_option)
- {
- case 'n':
- m_override = false;
- break;
- case 'r':
- m_reset = true;
- break;
- default:
- error.SetErrorStringWithFormat ("unrecognized options '%c'", short_option);
- break;
+ return matches.GetSize();
}
+
+protected:
+ virtual bool
+ DoExecute (const char *command, CommandReturnObject &result)
+ {
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- return error;
-}
-
-void
-CommandObjectSettingsSet::CommandOptions::OptionParsingStarting ()
-{
- m_override = true;
- m_reset = false;
-}
-
-Options *
-CommandObjectSettingsSet::GetOptions ()
-{
- return &m_options;
-}
-
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingsShow -- Show current values
-//-------------------------------------------------------------------------
-
-CommandObjectSettingsShow::CommandObjectSettingsShow (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings show",
- "Show the specified internal debugger setting variable and its value, or show all the currently set variables and their values, if nothing is specified.",
- NULL)
-{
- CommandArgumentEntry arg1;
- CommandArgumentData var_name_arg;
-
- // Define the first (and only) variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatOptional;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (var_name_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
-}
-
-CommandObjectSettingsShow::~CommandObjectSettingsShow()
-{
-}
-
-
-bool
-CommandObjectSettingsShow::Execute (Args& command, CommandReturnObject &result)
-{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- const char *current_prefix = usc_sp->GetLevelName().GetCString();
+ Args cmd_args(command);
- Error err;
+ // Process possible options.
+ if (!ParseOptions (cmd_args, result))
+ return false;
- if (command.GetArgumentCount())
- {
- // The user requested to see the value of a particular variable.
- SettableVariableType var_type;
- const char *variable_name = command.GetArgumentAtIndex (0);
- StringList value = usc_sp->GetVariable (variable_name,
- var_type,
- m_interpreter.GetDebugger().GetInstanceName().AsCString(),
- err);
-
- if (err.Fail ())
+ const int argc = cmd_args.GetArgumentCount ();
+ if ((argc < 2) && (!m_options.m_reset))
{
- result.AppendError (err.AsCString());
+ result.AppendError ("'settings set' takes more arguments");
result.SetStatus (eReturnStatusFailed);
-
+ return false;
}
- else
+
+ const char *var_name = cmd_args.GetArgumentAtIndex (0);
+ if ((var_name == NULL) || (var_name[0] == '\0'))
{
- UserSettingsController::DumpValue(m_interpreter, usc_sp, variable_name, result.GetOutputStream());
- result.SetStatus (eReturnStatusSuccessFinishResult);
+ result.AppendError ("'settings set' command requires a valid variable name; No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
}
- }
- else
- {
- UserSettingsController::GetAllVariableValues (m_interpreter,
- usc_sp,
- current_prefix,
- result.GetOutputStream(),
- err);
- if (err.Fail ())
+
+ // Split the raw command into var_name and value pair.
+ std::string var_name_string = var_name;
+ llvm::StringRef raw_str(command);
+ llvm::StringRef var_value_str = raw_str.split(var_name).second;
+ StripLeadingSpaces(var_value_str);
+ std::string var_value_string = var_value_str.str();
+
+ if (!m_options.m_reset
+ && var_value_string.empty())
{
- result.AppendError (err.AsCString());
+ result.AppendError ("'settings set' command requires a valid variable value unless using '--reset' option;"
+ " No value supplied");
result.SetStatus (eReturnStatusFailed);
}
else
{
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ Error err = usc_sp->SetVariable (var_name_string.c_str(),
+ var_value_string.c_str(),
+ eVarSetOperationAssign,
+ m_options.m_override,
+ m_interpreter.GetDebugger().GetInstanceName().AsCString());
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
- }
- return result.Succeeded();
-}
+ return result.Succeeded();
+ }
+private:
+ CommandOptions m_options;
+};
-int
-CommandObjectSettingsShow::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)
+OptionDefinition
+CommandObjectSettingsSet::CommandOptions::g_option_table[] =
{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
+ { LLDB_OPT_SET_1, false, "no-override", 'n', no_argument, NULL, NULL, eArgTypeNone, "Prevents already existing instances and pending settings from being assigned this new value. Using this option means that only the default or specified instance setting values will be updated." },
+ { LLDB_OPT_SET_2, false, "reset", 'r', no_argument, NULL, NULL, eArgTypeNone, "Causes value to be reset to the original default for this variable. No value needs to be specified when this option is used." },
+ { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
+};
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eSettingsNameCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- return matches.GetSize();
-}
//-------------------------------------------------------------------------
-// CommandObjectSettingsList
+// CommandObjectSettingsShow -- Show current values
//-------------------------------------------------------------------------
-CommandObjectSettingsList::CommandObjectSettingsList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings list",
- "List and describe all the internal debugger settings variables that are available to the user to 'set' or 'show', or describe a particular variable or set of variables (by specifying the variable name or a common prefix).",
- NULL)
+class CommandObjectSettingsShow : public CommandObjectParsed
{
- CommandArgumentEntry arg;
- CommandArgumentData var_name_arg;
- CommandArgumentData prefix_name_arg;
-
- // Define the first variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatOptional;
-
- // Define the second variant of this arg.
- prefix_name_arg.arg_type = eArgTypeSettingPrefix;
- prefix_name_arg.arg_repetition = eArgRepeatOptional;
-
- arg.push_back (var_name_arg);
- arg.push_back (prefix_name_arg);
+public:
+ CommandObjectSettingsShow (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "settings show",
+ "Show the specified internal debugger setting variable and its value, or show all the currently set variables and their values, if nothing is specified.",
+ NULL)
+ {
+ CommandArgumentEntry arg1;
+ CommandArgumentData var_name_arg;
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg);
-}
+ // Define the first (and only) variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatOptional;
-CommandObjectSettingsList::~CommandObjectSettingsList()
-{
-}
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (var_name_arg);
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
+ }
-bool
-CommandObjectSettingsList::Execute (Args& command, CommandReturnObject &result)
-{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- const char *current_prefix = usc_sp->GetLevelName().GetCString();
+ virtual
+ ~CommandObjectSettingsShow () {}
- Error err;
- if (command.GetArgumentCount() == 0)
+ 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)
{
- UserSettingsController::FindAllSettingsDescriptions (m_interpreter,
- usc_sp,
- current_prefix,
- result.GetOutputStream(),
- err);
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eSettingsNameCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ return matches.GetSize();
}
- else if (command.GetArgumentCount() == 1)
+
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- const char *search_name = command.GetArgumentAtIndex (0);
- UserSettingsController::FindSettingsDescriptions (m_interpreter,
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
+ const char *current_prefix = usc_sp->GetLevelName().GetCString();
+
+ Error err;
+
+ if (command.GetArgumentCount())
+ {
+ // The user requested to see the value of a particular variable.
+ SettableVariableType var_type;
+ const char *variable_name = command.GetArgumentAtIndex (0);
+ StringList value = usc_sp->GetVariable (variable_name,
+ var_type,
+ m_interpreter.GetDebugger().GetInstanceName().AsCString(),
+ err);
+
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+
+ }
+ else
+ {
+ UserSettingsController::DumpValue(m_interpreter, usc_sp, variable_name, result.GetOutputStream());
+ result.SetStatus (eReturnStatusSuccessFinishResult);
+ }
+ }
+ else
+ {
+ UserSettingsController::GetAllVariableValues (m_interpreter,
usc_sp,
- current_prefix,
- search_name,
+ current_prefix,
result.GetOutputStream(),
err);
- }
- else
- {
- result.AppendError ("Too many aguments for 'settings list' command.\n");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ {
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ }
- if (err.Fail ())
- {
- result.AppendError (err.AsCString());
- result.SetStatus (eReturnStatusFailed);
- }
- else
- {
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ return result.Succeeded();
}
-
- return result.Succeeded();
-}
-
-int
-CommandObjectSettingsList::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)
-{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
-
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eSettingsNameCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- return matches.GetSize();
-}
+};
//-------------------------------------------------------------------------
-// CommandObjectSettingsRemove
+// CommandObjectSettingsList -- List settable variables
//-------------------------------------------------------------------------
-CommandObjectSettingsRemove::CommandObjectSettingsRemove (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings remove",
- "Remove the specified element from an internal debugger settings array or dictionary variable.",
- NULL)
+class CommandObjectSettingsList : public CommandObjectParsed
{
- CommandArgumentEntry arg1;
- CommandArgumentEntry arg2;
- CommandArgumentData var_name_arg;
- CommandArgumentData index_arg;
- CommandArgumentData key_arg;
-
- // Define the first (and only) variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (var_name_arg);
-
- // Define the first variant of this arg.
- index_arg.arg_type = eArgTypeSettingIndex;
- index_arg.arg_repetition = eArgRepeatPlain;
-
- // Define the second variant of this arg.
- key_arg.arg_type = eArgTypeSettingKey;
- key_arg.arg_repetition = eArgRepeatPlain;
-
- // Push both variants into this arg
- arg2.push_back (index_arg);
- arg2.push_back (key_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
- m_arguments.push_back (arg2);
-}
-
-CommandObjectSettingsRemove::~CommandObjectSettingsRemove ()
-{
-}
-
-bool
-CommandObjectSettingsRemove::Execute (Args& command, CommandReturnObject &result)
-{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
-
- const int argc = command.GetArgumentCount ();
-
- if (argc != 2)
- {
- result.AppendError ("'settings remove' takes two arguments");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
-
- const char *var_name = command.GetArgumentAtIndex (0);
- std::string var_name_string;
- if ((var_name == NULL) || (var_name[0] == '\0'))
+public:
+ CommandObjectSettingsList (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "settings list",
+ "List and describe all the internal debugger settings variables that are available to the user to 'set' or 'show', or describe a particular variable or set of variables (by specifying the variable name or a common prefix).",
+ NULL)
{
- result.AppendError ("'settings remove' command requires a valid variable name; No value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ CommandArgumentEntry arg;
+ CommandArgumentData var_name_arg;
+ CommandArgumentData prefix_name_arg;
- var_name_string = var_name;
- command.Shift();
+ // Define the first variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatOptional;
- const char *index_value = command.GetArgumentAtIndex (0);
- std::string index_value_string;
- if ((index_value == NULL) || (index_value[0] == '\0'))
- {
- result.AppendError ("'settings remove' command requires an index or key value; no value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ // Define the second variant of this arg.
+ prefix_name_arg.arg_type = eArgTypeSettingPrefix;
+ prefix_name_arg.arg_repetition = eArgRepeatOptional;
- index_value_string = index_value;
+ arg.push_back (var_name_arg);
+ arg.push_back (prefix_name_arg);
- Error err = usc_sp->SetVariable (var_name_string.c_str(),
- NULL,
- eVarSetOperationRemove,
- true,
- m_interpreter.GetDebugger().GetInstanceName().AsCString(),
- index_value_string.c_str());
- if (err.Fail ())
- {
- result.AppendError (err.AsCString());
- result.SetStatus (eReturnStatusFailed);
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg);
}
- else
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- return result.Succeeded();
-}
+ virtual
+ ~CommandObjectSettingsList () {}
-int
-CommandObjectSettingsRemove::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)
-{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
- // Attempting to complete variable name
- if (cursor_index < 2)
CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
CommandCompletions::eSettingsNameCompletion,
completion_str.c_str(),
@@ -631,119 +462,171 @@
NULL,
word_complete,
matches);
+ return matches.GetSize();
+ }
- return matches.GetSize();
-}
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
+ {
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
+ const char *current_prefix = usc_sp->GetLevelName().GetCString();
-//-------------------------------------------------------------------------
-// CommandObjectSettingsReplace
-//-------------------------------------------------------------------------
+ Error err;
-CommandObjectSettingsReplace::CommandObjectSettingsReplace (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings replace",
- "Replace the specified element from an internal debugger settings array or dictionary variable with the specified new value.",
- NULL)
-{
- CommandArgumentEntry arg1;
- CommandArgumentEntry arg2;
- CommandArgumentEntry arg3;
- CommandArgumentData var_name_arg;
- CommandArgumentData index_arg;
- CommandArgumentData key_arg;
- CommandArgumentData value_arg;
-
- // Define the first (and only) variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (var_name_arg);
-
- // Define the first (variant of this arg.
- index_arg.arg_type = eArgTypeSettingIndex;
- index_arg.arg_repetition = eArgRepeatPlain;
-
- // Define the second (variant of this arg.
- key_arg.arg_type = eArgTypeSettingKey;
- key_arg.arg_repetition = eArgRepeatPlain;
-
- // Put both variants into this arg
- arg2.push_back (index_arg);
- arg2.push_back (key_arg);
-
- // Define the first (and only) variant of this arg.
- value_arg.arg_type = eArgTypeValue;
- value_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg3.push_back (value_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
- m_arguments.push_back (arg2);
- m_arguments.push_back (arg3);
-}
+ if (command.GetArgumentCount() == 0)
+ {
+ UserSettingsController::FindAllSettingsDescriptions (m_interpreter,
+ usc_sp,
+ current_prefix,
+ result.GetOutputStream(),
+ err);
+ }
+ else if (command.GetArgumentCount() == 1)
+ {
+ const char *search_name = command.GetArgumentAtIndex (0);
+ UserSettingsController::FindSettingsDescriptions (m_interpreter,
+ usc_sp,
+ current_prefix,
+ search_name,
+ result.GetOutputStream(),
+ err);
+ }
+ else
+ {
+ result.AppendError ("Too many aguments for 'settings list' command.\n");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
-CommandObjectSettingsReplace::~CommandObjectSettingsReplace ()
-{
-}
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ {
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
-bool
-CommandObjectSettingsReplace::ExecuteRawCommandString (const char *raw_command, CommandReturnObject &result)
-{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
+ return result.Succeeded();
+ }
+};
- Args cmd_args(raw_command);
- const int argc = cmd_args.GetArgumentCount ();
+//-------------------------------------------------------------------------
+// CommandObjectSettingsRemove
+//-------------------------------------------------------------------------
- if (argc < 3)
+class CommandObjectSettingsRemove : public CommandObjectParsed
+{
+public:
+ CommandObjectSettingsRemove (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "settings remove",
+ "Remove the specified element from an internal debugger settings array or dictionary variable.",
+ NULL)
+ {
+ CommandArgumentEntry arg1;
+ CommandArgumentEntry arg2;
+ CommandArgumentData var_name_arg;
+ CommandArgumentData index_arg;
+ CommandArgumentData key_arg;
+
+ // Define the first (and only) variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (var_name_arg);
+
+ // Define the first variant of this arg.
+ index_arg.arg_type = eArgTypeSettingIndex;
+ index_arg.arg_repetition = eArgRepeatPlain;
+
+ // Define the second variant of this arg.
+ key_arg.arg_type = eArgTypeSettingKey;
+ key_arg.arg_repetition = eArgRepeatPlain;
+
+ // Push both variants into this arg
+ arg2.push_back (index_arg);
+ arg2.push_back (key_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
+ m_arguments.push_back (arg2);
+ }
+
+ virtual
+ ~CommandObjectSettingsRemove () {}
+
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ // Attempting to complete variable name
+ if (cursor_index < 2)
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eSettingsNameCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+
+ return matches.GetSize();
+ }
+
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- result.AppendError ("'settings replace' takes more arguments");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- const char *var_name = cmd_args.GetArgumentAtIndex (0);
- std::string var_name_string;
- if ((var_name == NULL) || (var_name[0] == '\0'))
- {
- result.AppendError ("'settings replace' command requires a valid variable name; No value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ const int argc = command.GetArgumentCount ();
- var_name_string = var_name;
- cmd_args.Shift();
+ if (argc != 2)
+ {
+ result.AppendError ("'settings remove' takes two arguments");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- const char *index_value = cmd_args.GetArgumentAtIndex (0);
- std::string index_value_string;
- if ((index_value == NULL) || (index_value[0] == '\0'))
- {
- result.AppendError ("'settings insert-before' command requires an index value; no value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ const char *var_name = command.GetArgumentAtIndex (0);
+ std::string var_name_string;
+ if ((var_name == NULL) || (var_name[0] == '\0'))
+ {
+ result.AppendError ("'settings remove' command requires a valid variable name; No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- index_value_string = index_value;
- cmd_args.Shift();
+ var_name_string = var_name;
+ command.Shift();
- // Split the raw command into var_name, index_value, and value triple.
- llvm::StringRef raw_str(raw_command);
- llvm::StringRef var_value_str = raw_str.split(var_name).second.split(index_value).second;
- StripLeadingSpaces(var_value_str);
- std::string var_value_string = var_value_str.str();
+ const char *index_value = command.GetArgumentAtIndex (0);
+ std::string index_value_string;
+ if ((index_value == NULL) || (index_value[0] == '\0'))
+ {
+ result.AppendError ("'settings remove' command requires an index or key value; no value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+
+ index_value_string = index_value;
- if (var_value_string.empty())
- {
- result.AppendError ("'settings replace' command requires a valid variable value; no value supplied");
- result.SetStatus (eReturnStatusFailed);
- }
- else
- {
Error err = usc_sp->SetVariable (var_name_string.c_str(),
- var_value_string.c_str(),
- eVarSetOperationReplace,
+ NULL,
+ eVarSetOperationRemove,
true,
m_interpreter.GetDebugger().GetInstanceName().AsCString(),
index_value_string.c_str());
@@ -754,548 +637,730 @@
}
else
result.SetStatus (eReturnStatusSuccessFinishNoResult);
+
+ return result.Succeeded();
}
+};
- return result.Succeeded();
-}
+//-------------------------------------------------------------------------
+// CommandObjectSettingsReplace
+//-------------------------------------------------------------------------
-int
-CommandObjectSettingsReplace::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)
+class CommandObjectSettingsReplace : public CommandObjectRaw
{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
+public:
+ CommandObjectSettingsReplace (CommandInterpreter &interpreter) :
+ CommandObjectRaw (interpreter,
+ "settings replace",
+ "Replace the specified element from an internal debugger settings array or dictionary variable with the specified new value.",
+ NULL)
+ {
+ CommandArgumentEntry arg1;
+ CommandArgumentEntry arg2;
+ CommandArgumentEntry arg3;
+ CommandArgumentData var_name_arg;
+ CommandArgumentData index_arg;
+ CommandArgumentData key_arg;
+ CommandArgumentData value_arg;
+
+ // Define the first (and only) variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (var_name_arg);
+
+ // Define the first (variant of this arg.
+ index_arg.arg_type = eArgTypeSettingIndex;
+ index_arg.arg_repetition = eArgRepeatPlain;
+
+ // Define the second (variant of this arg.
+ key_arg.arg_type = eArgTypeSettingKey;
+ key_arg.arg_repetition = eArgRepeatPlain;
+
+ // Put both variants into this arg
+ arg2.push_back (index_arg);
+ arg2.push_back (key_arg);
+
+ // Define the first (and only) variant of this arg.
+ value_arg.arg_type = eArgTypeValue;
+ value_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg3.push_back (value_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
+ m_arguments.push_back (arg2);
+ m_arguments.push_back (arg3);
+ }
+
+
+ virtual
+ ~CommandObjectSettingsReplace () {}
+
+ // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
+ virtual bool
+ WantsCompletion() { return true; }
+
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ // Attempting to complete variable name
+ if (cursor_index < 2)
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eSettingsNameCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+
+ return matches.GetSize();
+ }
+
+protected:
+ virtual bool
+ DoExecute (const char *command, CommandReturnObject &result)
+ {
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- // Attempting to complete variable name
- if (cursor_index < 2)
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eSettingsNameCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
+ Args cmd_args(command);
+ const int argc = cmd_args.GetArgumentCount ();
- return matches.GetSize();
-}
+ if (argc < 3)
+ {
+ result.AppendError ("'settings replace' takes more arguments");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
-//-------------------------------------------------------------------------
-// CommandObjectSettingsInsertBefore
-//-------------------------------------------------------------------------
+ const char *var_name = cmd_args.GetArgumentAtIndex (0);
+ std::string var_name_string;
+ if ((var_name == NULL) || (var_name[0] == '\0'))
+ {
+ result.AppendError ("'settings replace' command requires a valid variable name; No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
-CommandObjectSettingsInsertBefore::CommandObjectSettingsInsertBefore (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings insert-before",
- "Insert value(s) into an internal debugger settings array variable, immediately before the specified element.",
- NULL)
-{
- CommandArgumentEntry arg1;
- CommandArgumentEntry arg2;
- CommandArgumentEntry arg3;
- CommandArgumentData var_name_arg;
- CommandArgumentData index_arg;
- CommandArgumentData value_arg;
-
- // Define the first (and only) variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (var_name_arg);
-
- // Define the first (variant of this arg.
- index_arg.arg_type = eArgTypeSettingIndex;
- index_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg2.push_back (index_arg);
-
- // Define the first (and only) variant of this arg.
- value_arg.arg_type = eArgTypeValue;
- value_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg3.push_back (value_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
- m_arguments.push_back (arg2);
- m_arguments.push_back (arg3);
-}
+ var_name_string = var_name;
+ cmd_args.Shift();
-CommandObjectSettingsInsertBefore::~CommandObjectSettingsInsertBefore ()
-{
-}
+ const char *index_value = cmd_args.GetArgumentAtIndex (0);
+ std::string index_value_string;
+ if ((index_value == NULL) || (index_value[0] == '\0'))
+ {
+ result.AppendError ("'settings insert-before' command requires an index value; no value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
-bool
-CommandObjectSettingsInsertBefore::ExecuteRawCommandString (const char *raw_command, CommandReturnObject &result)
-{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
+ index_value_string = index_value;
+ cmd_args.Shift();
- Args cmd_args(raw_command);
- const int argc = cmd_args.GetArgumentCount ();
+ // Split the raw command into var_name, index_value, and value triple.
+ llvm::StringRef raw_str(command);
+ llvm::StringRef var_value_str = raw_str.split(var_name).second.split(index_value).second;
+ StripLeadingSpaces(var_value_str);
+ std::string var_value_string = var_value_str.str();
- if (argc < 3)
- {
- result.AppendError ("'settings insert-before' takes more arguments");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ if (var_value_string.empty())
+ {
+ result.AppendError ("'settings replace' command requires a valid variable value; no value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ {
+ Error err = usc_sp->SetVariable (var_name_string.c_str(),
+ var_value_string.c_str(),
+ eVarSetOperationReplace,
+ true,
+ m_interpreter.GetDebugger().GetInstanceName().AsCString(),
+ index_value_string.c_str());
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
- const char *var_name = cmd_args.GetArgumentAtIndex (0);
- std::string var_name_string;
- if ((var_name == NULL) || (var_name[0] == '\0'))
- {
- result.AppendError ("'settings insert-before' command requires a valid variable name; No value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ return result.Succeeded();
}
+};
- var_name_string = var_name;
- cmd_args.Shift();
+//-------------------------------------------------------------------------
+// CommandObjectSettingsInsertBefore
+//-------------------------------------------------------------------------
- const char *index_value = cmd_args.GetArgumentAtIndex (0);
- std::string index_value_string;
- if ((index_value == NULL) || (index_value[0] == '\0'))
+class CommandObjectSettingsInsertBefore : public CommandObjectRaw
+{
+public:
+ CommandObjectSettingsInsertBefore (CommandInterpreter &interpreter) :
+ CommandObjectRaw (interpreter,
+ "settings insert-before",
+ "Insert value(s) into an internal debugger settings array variable, immediately before the specified element.",
+ NULL)
+ {
+ CommandArgumentEntry arg1;
+ CommandArgumentEntry arg2;
+ CommandArgumentEntry arg3;
+ CommandArgumentData var_name_arg;
+ CommandArgumentData index_arg;
+ CommandArgumentData value_arg;
+
+ // Define the first (and only) variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (var_name_arg);
+
+ // Define the first (variant of this arg.
+ index_arg.arg_type = eArgTypeSettingIndex;
+ index_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg2.push_back (index_arg);
+
+ // Define the first (and only) variant of this arg.
+ value_arg.arg_type = eArgTypeValue;
+ value_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg3.push_back (value_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
+ m_arguments.push_back (arg2);
+ m_arguments.push_back (arg3);
+ }
+
+ virtual
+ ~CommandObjectSettingsInsertBefore () {}
+
+ // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
+ virtual bool
+ WantsCompletion() { return true; }
+
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ // Attempting to complete variable name
+ if (cursor_index < 2)
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eSettingsNameCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+
+ return matches.GetSize();
+ }
+
+protected:
+ virtual bool
+ DoExecute (const char *command, CommandReturnObject &result)
{
- result.AppendError ("'settings insert-before' command requires an index value; no value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- index_value_string = index_value;
- cmd_args.Shift();
+ Args cmd_args(command);
+ const int argc = cmd_args.GetArgumentCount ();
- // Split the raw command into var_name, index_value, and value triple.
- llvm::StringRef raw_str(raw_command);
- llvm::StringRef var_value_str = raw_str.split(var_name).second.split(index_value).second;
- StripLeadingSpaces(var_value_str);
- std::string var_value_string = var_value_str.str();
+ if (argc < 3)
+ {
+ result.AppendError ("'settings insert-before' takes more arguments");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- if (var_value_string.empty())
- {
- result.AppendError ("'settings insert-before' command requires a valid variable value;"
- " No value supplied");
- result.SetStatus (eReturnStatusFailed);
- }
- else
- {
- Error err = usc_sp->SetVariable (var_name_string.c_str(),
- var_value_string.c_str(),
- eVarSetOperationInsertBefore,
- true,
- m_interpreter.GetDebugger().GetInstanceName().AsCString(),
- index_value_string.c_str());
- if (err.Fail ())
+ const char *var_name = cmd_args.GetArgumentAtIndex (0);
+ std::string var_name_string;
+ if ((var_name == NULL) || (var_name[0] == '\0'))
{
- result.AppendError (err.AsCString());
+ result.AppendError ("'settings insert-before' command requires a valid variable name; No value supplied");
result.SetStatus (eReturnStatusFailed);
+ return false;
}
- else
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- return result.Succeeded();
-}
+ var_name_string = var_name;
+ cmd_args.Shift();
+ const char *index_value = cmd_args.GetArgumentAtIndex (0);
+ std::string index_value_string;
+ if ((index_value == NULL) || (index_value[0] == '\0'))
+ {
+ result.AppendError ("'settings insert-before' command requires an index value; no value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
-int
-CommandObjectSettingsInsertBefore::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)
-{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
+ index_value_string = index_value;
+ cmd_args.Shift();
- // Attempting to complete variable name
- if (cursor_index < 2)
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eSettingsNameCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
+ // Split the raw command into var_name, index_value, and value triple.
+ llvm::StringRef raw_str(command);
+ llvm::StringRef var_value_str = raw_str.split(var_name).second.split(index_value).second;
+ StripLeadingSpaces(var_value_str);
+ std::string var_value_string = var_value_str.str();
- return matches.GetSize();
-}
+ if (var_value_string.empty())
+ {
+ result.AppendError ("'settings insert-before' command requires a valid variable value;"
+ " No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ {
+ Error err = usc_sp->SetVariable (var_name_string.c_str(),
+ var_value_string.c_str(),
+ eVarSetOperationInsertBefore,
+ true,
+ m_interpreter.GetDebugger().GetInstanceName().AsCString(),
+ index_value_string.c_str());
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+
+ return result.Succeeded();
+ }
+};
//-------------------------------------------------------------------------
// CommandObjectSettingInsertAfter
//-------------------------------------------------------------------------
-CommandObjectSettingsInsertAfter::CommandObjectSettingsInsertAfter (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings insert-after",
- "Insert value(s) into an internal debugger settings array variable, immediately after the specified element.",
- NULL)
-{
- CommandArgumentEntry arg1;
- CommandArgumentEntry arg2;
- CommandArgumentEntry arg3;
- CommandArgumentData var_name_arg;
- CommandArgumentData index_arg;
- CommandArgumentData value_arg;
-
- // Define the first (and only) variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (var_name_arg);
-
- // Define the first (variant of this arg.
- index_arg.arg_type = eArgTypeSettingIndex;
- index_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg2.push_back (index_arg);
-
- // Define the first (and only) variant of this arg.
- value_arg.arg_type = eArgTypeValue;
- value_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg3.push_back (value_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
- m_arguments.push_back (arg2);
- m_arguments.push_back (arg3);
-}
-
-CommandObjectSettingsInsertAfter::~CommandObjectSettingsInsertAfter ()
-{
-}
-
-bool
-CommandObjectSettingsInsertAfter::ExecuteRawCommandString (const char *raw_command, CommandReturnObject &result)
+class CommandObjectSettingsInsertAfter : public CommandObjectRaw
{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
+public:
+ CommandObjectSettingsInsertAfter (CommandInterpreter &interpreter) :
+ CommandObjectRaw (interpreter,
+ "settings insert-after",
+ "Insert value(s) into an internal debugger settings array variable, immediately after the specified element.",
+ NULL)
+ {
+ CommandArgumentEntry arg1;
+ CommandArgumentEntry arg2;
+ CommandArgumentEntry arg3;
+ CommandArgumentData var_name_arg;
+ CommandArgumentData index_arg;
+ CommandArgumentData value_arg;
+
+ // Define the first (and only) variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (var_name_arg);
+
+ // Define the first (variant of this arg.
+ index_arg.arg_type = eArgTypeSettingIndex;
+ index_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg2.push_back (index_arg);
+
+ // Define the first (and only) variant of this arg.
+ value_arg.arg_type = eArgTypeValue;
+ value_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg3.push_back (value_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
+ m_arguments.push_back (arg2);
+ m_arguments.push_back (arg3);
+ }
+
+ virtual
+ ~CommandObjectSettingsInsertAfter () {}
+
+ // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
+ virtual bool
+ WantsCompletion() { return true; }
+
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ // Attempting to complete variable name
+ if (cursor_index < 2)
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eSettingsNameCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
- Args cmd_args(raw_command);
- const int argc = cmd_args.GetArgumentCount ();
-
- if (argc < 3)
- {
- result.AppendError ("'settings insert-after' takes more arguments");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ return matches.GetSize();
}
-
- const char *var_name = cmd_args.GetArgumentAtIndex (0);
- std::string var_name_string;
- if ((var_name == NULL) || (var_name[0] == '\0'))
+
+protected:
+ virtual bool
+ DoExecute (const char *command, CommandReturnObject &result)
{
- result.AppendError ("'settings insert-after' command requires a valid variable name; No value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- var_name_string = var_name;
- cmd_args.Shift();
+ Args cmd_args(command);
+ const int argc = cmd_args.GetArgumentCount ();
- const char *index_value = cmd_args.GetArgumentAtIndex (0);
- std::string index_value_string;
- if ((index_value == NULL) || (index_value[0] == '\0'))
- {
- result.AppendError ("'settings insert-after' command requires an index value; no value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ if (argc < 3)
+ {
+ result.AppendError ("'settings insert-after' takes more arguments");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- index_value_string = index_value;
- cmd_args.Shift();
+ const char *var_name = cmd_args.GetArgumentAtIndex (0);
+ std::string var_name_string;
+ if ((var_name == NULL) || (var_name[0] == '\0'))
+ {
+ result.AppendError ("'settings insert-after' command requires a valid variable name; No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- // Split the raw command into var_name, index_value, and value triple.
- llvm::StringRef raw_str(raw_command);
- llvm::StringRef var_value_str = raw_str.split(var_name).second.split(index_value).second;
- StripLeadingSpaces(var_value_str);
- std::string var_value_string = var_value_str.str();
+ var_name_string = var_name;
+ cmd_args.Shift();
- if (var_value_string.empty())
- {
- result.AppendError ("'settings insert-after' command requires a valid variable value;"
- " No value supplied");
- result.SetStatus (eReturnStatusFailed);
- }
- else
- {
- Error err = usc_sp->SetVariable (var_name_string.c_str(),
- var_value_string.c_str(),
- eVarSetOperationInsertAfter,
- true,
- m_interpreter.GetDebugger().GetInstanceName().AsCString(),
- index_value_string.c_str());
- if (err.Fail ())
+ const char *index_value = cmd_args.GetArgumentAtIndex (0);
+ std::string index_value_string;
+ if ((index_value == NULL) || (index_value[0] == '\0'))
{
- result.AppendError (err.AsCString());
+ result.AppendError ("'settings insert-after' command requires an index value; no value supplied");
result.SetStatus (eReturnStatusFailed);
+ return false;
}
- else
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
-
- return result.Succeeded();
-}
+ index_value_string = index_value;
+ cmd_args.Shift();
-int
-CommandObjectSettingsInsertAfter::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)
-{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
+ // Split the raw command into var_name, index_value, and value triple.
+ llvm::StringRef raw_str(command);
+ llvm::StringRef var_value_str = raw_str.split(var_name).second.split(index_value).second;
+ StripLeadingSpaces(var_value_str);
+ std::string var_value_string = var_value_str.str();
- // Attempting to complete variable name
- if (cursor_index < 2)
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eSettingsNameCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
+ if (var_value_string.empty())
+ {
+ result.AppendError ("'settings insert-after' command requires a valid variable value;"
+ " No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ {
+ Error err = usc_sp->SetVariable (var_name_string.c_str(),
+ var_value_string.c_str(),
+ eVarSetOperationInsertAfter,
+ true,
+ m_interpreter.GetDebugger().GetInstanceName().AsCString(),
+ index_value_string.c_str());
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
- return matches.GetSize();
-}
+ return result.Succeeded();
+ }
+};
//-------------------------------------------------------------------------
// CommandObjectSettingsAppend
//-------------------------------------------------------------------------
-CommandObjectSettingsAppend::CommandObjectSettingsAppend (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings append",
- "Append a new value to the end of an internal debugger settings array, dictionary or string variable.",
- NULL)
-{
- CommandArgumentEntry arg1;
- CommandArgumentEntry arg2;
- CommandArgumentData var_name_arg;
- CommandArgumentData value_arg;
-
- // Define the first (and only) variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg1.push_back (var_name_arg);
-
- // Define the first (and only) variant of this arg.
- value_arg.arg_type = eArgTypeValue;
- value_arg.arg_repetition = eArgRepeatPlain;
-
- // There is only one variant this argument could be; put it into the argument entry.
- arg2.push_back (value_arg);
-
- // Push the data for the first argument into the m_arguments vector.
- m_arguments.push_back (arg1);
- m_arguments.push_back (arg2);
-}
-
-CommandObjectSettingsAppend::~CommandObjectSettingsAppend ()
+class CommandObjectSettingsAppend : public CommandObjectRaw
{
-}
-
-bool
-CommandObjectSettingsAppend::ExecuteRawCommandString (const char *raw_command, CommandReturnObject &result)
-{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
-
- Args cmd_args(raw_command);
- const int argc = cmd_args.GetArgumentCount ();
-
- if (argc < 2)
+public:
+ CommandObjectSettingsAppend (CommandInterpreter &interpreter) :
+ CommandObjectRaw (interpreter,
+ "settings append",
+ "Append a new value to the end of an internal debugger settings array, dictionary or string variable.",
+ NULL)
+ {
+ CommandArgumentEntry arg1;
+ CommandArgumentEntry arg2;
+ CommandArgumentData var_name_arg;
+ CommandArgumentData value_arg;
+
+ // Define the first (and only) variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg1.push_back (var_name_arg);
+
+ // Define the first (and only) variant of this arg.
+ value_arg.arg_type = eArgTypeValue;
+ value_arg.arg_repetition = eArgRepeatPlain;
+
+ // There is only one variant this argument could be; put it into the argument entry.
+ arg2.push_back (value_arg);
+
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg1);
+ m_arguments.push_back (arg2);
+ }
+
+ virtual
+ ~CommandObjectSettingsAppend () {}
+
+ // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
+ virtual bool
+ WantsCompletion() { return true; }
+
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ // Attempting to complete variable name
+ if (cursor_index < 2)
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eSettingsNameCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+
+ return matches.GetSize();
+ }
+
+protected:
+ virtual bool
+ DoExecute (const char *command, CommandReturnObject &result)
{
- result.AppendError ("'settings append' takes more arguments");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- const char *var_name = cmd_args.GetArgumentAtIndex (0);
- std::string var_name_string;
- if ((var_name == NULL) || (var_name[0] == '\0'))
- {
- result.AppendError ("'settings append' command requires a valid variable name; No value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ Args cmd_args(command);
+ const int argc = cmd_args.GetArgumentCount ();
- var_name_string = var_name;
- // Do not perform cmd_args.Shift() since StringRef is manipulating the
- // raw character string later on.
-
- // Split the raw command into var_name and value pair.
- llvm::StringRef raw_str(raw_command);
- llvm::StringRef var_value_str = raw_str.split(var_name).second;
- StripLeadingSpaces(var_value_str);
- std::string var_value_string = var_value_str.str();
-
- if (var_value_string.empty())
- {
- result.AppendError ("'settings append' command requires a valid variable value;"
- " No value supplied");
- result.SetStatus (eReturnStatusFailed);
- }
- else
- {
- Error err = usc_sp->SetVariable (var_name_string.c_str(),
- var_value_string.c_str(),
- eVarSetOperationAppend,
- true,
- m_interpreter.GetDebugger().GetInstanceName().AsCString());
- if (err.Fail ())
+ if (argc < 2)
{
- result.AppendError (err.AsCString());
+ result.AppendError ("'settings append' takes more arguments");
result.SetStatus (eReturnStatusFailed);
+ return false;
}
- else
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
-
- return result.Succeeded();
-}
+ const char *var_name = cmd_args.GetArgumentAtIndex (0);
+ std::string var_name_string;
+ if ((var_name == NULL) || (var_name[0] == '\0'))
+ {
+ result.AppendError ("'settings append' command requires a valid variable name; No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
-int
-CommandObjectSettingsAppend::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)
-{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
+ var_name_string = var_name;
+ // Do not perform cmd_args.Shift() since StringRef is manipulating the
+ // raw character string later on.
+
+ // Split the raw command into var_name and value pair.
+ llvm::StringRef raw_str(command);
+ llvm::StringRef var_value_str = raw_str.split(var_name).second;
+ StripLeadingSpaces(var_value_str);
+ std::string var_value_string = var_value_str.str();
- // Attempting to complete variable name
- if (cursor_index < 2)
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eSettingsNameCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
+ if (var_value_string.empty())
+ {
+ result.AppendError ("'settings append' command requires a valid variable value;"
+ " No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ {
+ Error err = usc_sp->SetVariable (var_name_string.c_str(),
+ var_value_string.c_str(),
+ eVarSetOperationAppend,
+ true,
+ m_interpreter.GetDebugger().GetInstanceName().AsCString());
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
- return matches.GetSize();
-}
+ return result.Succeeded();
+ }
+};
//-------------------------------------------------------------------------
// CommandObjectSettingsClear
//-------------------------------------------------------------------------
-CommandObjectSettingsClear::CommandObjectSettingsClear (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "settings clear",
- "Erase all the contents of an internal debugger settings variables; this is only valid for variables with clearable types, i.e. strings, arrays or dictionaries.",
- NULL)
+class CommandObjectSettingsClear : public CommandObjectParsed
{
- CommandArgumentEntry arg;
- CommandArgumentData var_name_arg;
+public:
+ CommandObjectSettingsClear (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "settings clear",
+ "Erase all the contents of an internal debugger settings variables; this is only valid for variables with clearable types, i.e. strings, arrays or dictionaries.",
+ NULL)
+ {
+ CommandArgumentEntry arg;
+ CommandArgumentData var_name_arg;
- // Define the first (and only) variant of this arg.
- var_name_arg.arg_type = eArgTypeSettingVariableName;
- var_name_arg.arg_repetition = eArgRepeatPlain;
+ // Define the first (and only) variant of this arg.
+ var_name_arg.arg_type = eArgTypeSettingVariableName;
+ var_name_arg.arg_repetition = eArgRepeatPlain;
- // There is only one variant this argument could be; put it into the argument entry.
- arg.push_back (var_name_arg);
+ // 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);
-}
+ // Push the data for the first argument into the m_arguments vector.
+ m_arguments.push_back (arg);
+ }
-CommandObjectSettingsClear::~CommandObjectSettingsClear ()
-{
-}
+ virtual
+ ~CommandObjectSettingsClear () {}
-bool
-CommandObjectSettingsClear::Execute (Args& command, CommandReturnObject &result)
-{
- UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex (cursor_index));
+ completion_str.erase (cursor_char_position);
- const int argc = command.GetArgumentCount ();
+ // Attempting to complete variable name
+ if (cursor_index < 2)
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eSettingsNameCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
- if (argc != 1)
- {
- result.AppendError ("'setttings clear' takes exactly one argument");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ return matches.GetSize();
}
- const char *var_name = command.GetArgumentAtIndex (0);
- if ((var_name == NULL) || (var_name[0] == '\0'))
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- result.AppendError ("'settings clear' command requires a valid variable name; No value supplied");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ());
- Error err = usc_sp->SetVariable (var_name,
- NULL,
- eVarSetOperationClear,
- false,
- m_interpreter.GetDebugger().GetInstanceName().AsCString());
+ const int argc = command.GetArgumentCount ();
- if (err.Fail ())
- {
- result.AppendError (err.AsCString());
- result.SetStatus (eReturnStatusFailed);
- }
- else
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ if (argc != 1)
+ {
+ result.AppendError ("'setttings clear' takes exactly one argument");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- return result.Succeeded();
-}
+ const char *var_name = command.GetArgumentAtIndex (0);
+ if ((var_name == NULL) || (var_name[0] == '\0'))
+ {
+ result.AppendError ("'settings clear' command requires a valid variable name; No value supplied");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
+ Error err = usc_sp->SetVariable (var_name,
+ NULL,
+ eVarSetOperationClear,
+ false,
+ m_interpreter.GetDebugger().GetInstanceName().AsCString());
-int
-CommandObjectSettingsClear::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)
-{
- std::string completion_str (input.GetArgumentAtIndex (cursor_index));
- completion_str.erase (cursor_char_position);
+ if (err.Fail ())
+ {
+ result.AppendError (err.AsCString());
+ result.SetStatus (eReturnStatusFailed);
+ }
+ else
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
- // Attempting to complete variable name
- if (cursor_index < 2)
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eSettingsNameCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
+ return result.Succeeded();
+ }
+};
- return matches.GetSize();
+//-------------------------------------------------------------------------
+// CommandObjectMultiwordSettings
+//-------------------------------------------------------------------------
+
+CommandObjectMultiwordSettings::CommandObjectMultiwordSettings (CommandInterpreter &interpreter) :
+ CommandObjectMultiword (interpreter,
+ "settings",
+ "A set of commands for manipulating internal settable debugger variables.",
+ "settings <command> [<command-options>]")
+{
+ LoadSubCommand ("set", CommandObjectSP (new CommandObjectSettingsSet (interpreter)));
+ LoadSubCommand ("show", CommandObjectSP (new CommandObjectSettingsShow (interpreter)));
+ LoadSubCommand ("list", CommandObjectSP (new CommandObjectSettingsList (interpreter)));
+ LoadSubCommand ("remove", CommandObjectSP (new CommandObjectSettingsRemove (interpreter)));
+ LoadSubCommand ("replace", CommandObjectSP (new CommandObjectSettingsReplace (interpreter)));
+ LoadSubCommand ("insert-before", CommandObjectSP (new CommandObjectSettingsInsertBefore (interpreter)));
+ LoadSubCommand ("insert-after", CommandObjectSP (new CommandObjectSettingsInsertAfter (interpreter)));
+ LoadSubCommand ("append", CommandObjectSP (new CommandObjectSettingsAppend (interpreter)));
+ LoadSubCommand ("clear", CommandObjectSP (new CommandObjectSettingsClear (interpreter)));
+}
+
+CommandObjectMultiwordSettings::~CommandObjectMultiwordSettings ()
+{
}
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectSettings.h Fri Jun 8 19:52:06 2012
@@ -36,361 +36,6 @@
};
-//-------------------------------------------------------------------------
-// CommandObjectSettingsSet
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsSet : public CommandObject
-{
-public:
- CommandObjectSettingsSet (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsSet ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result)
- { return false; }
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
- virtual bool
- WantsCompletion() { return true; }
-
- virtual bool
- ExecuteRawCommandString (const char *raw_command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition*
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- bool m_override;
- bool m_reset;
-
- };
-
- 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);
-
-private:
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingsShow -- Show current values
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsShow : public CommandObject
-{
-public:
- CommandObjectSettingsShow (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsShow ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-
- 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);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingsList -- List settable variables
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsList : public CommandObject
-{
-public:
- CommandObjectSettingsList (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsList ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- 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);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingsRemove
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsRemove : public CommandObject
-{
-public:
- CommandObjectSettingsRemove (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsRemove ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- 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);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingsReplace
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsReplace : public CommandObject
-{
-public:
- CommandObjectSettingsReplace (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsReplace ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result)
- { return false; }
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
- virtual bool
- WantsCompletion() { return true; }
-
- virtual bool
- ExecuteRawCommandString (const char *raw_command,
- CommandReturnObject &result);
-
- 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);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingsInsertBefore
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsInsertBefore : public CommandObject
-{
-public:
- CommandObjectSettingsInsertBefore (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsInsertBefore ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result)
- { return false; }
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
- virtual bool
- WantsCompletion() { return true; }
-
- virtual bool
- ExecuteRawCommandString (const char *raw_command,
- CommandReturnObject &result);
-
- 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);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingInsertAfter
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsInsertAfter : public CommandObject
-{
-public:
- CommandObjectSettingsInsertAfter (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsInsertAfter ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result)
- { return false; }
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
- virtual bool
- WantsCompletion() { return true; }
-
- virtual bool
- ExecuteRawCommandString (const char *raw_command,
- CommandReturnObject &result);
-
- 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);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingsAppend
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsAppend : public CommandObject
-{
-public:
- CommandObjectSettingsAppend (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsAppend ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result)
- { return false; }
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
- virtual bool
- WantsCompletion() { return true; }
-
- virtual bool
- ExecuteRawCommandString (const char *raw_command,
- CommandReturnObject &result);
-
- 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);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectSettingsClear
-//-------------------------------------------------------------------------
-
-class CommandObjectSettingsClear : public CommandObject
-{
-public:
- CommandObjectSettingsClear (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectSettingsClear ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- 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);
-
-private:
-};
-
} // namespace lldb_private
#endif // liblldb_CommandObjectSettings_h_
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectSource.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectSource.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectSource.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectSource.cpp Fri Jun 8 19:52:06 2012
@@ -32,7 +32,7 @@
// CommandObjectSourceInfo
//-------------------------------------------------------------------------
-class CommandObjectSourceInfo : public CommandObject
+class CommandObjectSourceInfo : public CommandObjectParsed
{
class CommandOptions : public Options
@@ -96,10 +96,10 @@
public:
CommandObjectSourceInfo(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "source info",
- "Display information about the source lines from the current executable's debug info.",
- "source info [<cmd-options>]"),
+ CommandObjectParsed (interpreter,
+ "source info",
+ "Display information about the source lines from the current executable's debug info.",
+ "source info [<cmd-options>]"),
m_options (interpreter)
{
}
@@ -115,19 +115,15 @@
return &m_options;
}
-
+protected:
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
result.AppendError ("Not yet implemented");
result.SetStatus (eReturnStatusFailed);
return false;
}
-protected:
+
CommandOptions m_options;
};
@@ -144,7 +140,7 @@
// CommandObjectSourceList
//-------------------------------------------------------------------------
-class CommandObjectSourceList : public CommandObject
+class CommandObjectSourceList : public CommandObjectParsed
{
class CommandOptions : public Options
@@ -232,10 +228,10 @@
public:
CommandObjectSourceList(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "source list",
- "Display source code (as specified) based on the current executable's debug info.",
- NULL),
+ CommandObjectParsed (interpreter,
+ "source list",
+ "Display source code (as specified) based on the current executable's debug info.",
+ NULL),
m_options (interpreter)
{
CommandArgumentEntry arg;
@@ -263,15 +259,17 @@
return &m_options;
}
+ virtual const char *
+ GetRepeatCommand (Args ¤t_command_args, uint32_t index)
+ {
+ return m_cmd_name.c_str();
+ }
+protected:
bool
- Execute
- (
- Args& args,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
- const int argc = args.GetArgumentCount();
+ const int argc = command.GetArgumentCount();
if (argc != 0)
{
@@ -601,12 +599,6 @@
return result.Succeeded();
}
- virtual const char *GetRepeatCommand (Args ¤t_command_args, uint32_t index)
- {
- return m_cmd_name.c_str();
- }
-
-protected:
const SymbolContextList *
GetBreakpointLocations ()
{
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.cpp Fri Jun 8 19:52:06 2012
@@ -28,10 +28,10 @@
//-------------------------------------------------------------------------
CommandObjectSyntax::CommandObjectSyntax (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "syntax",
- "Shows the correct syntax for a given debugger command.",
- "syntax <command>")
+ CommandObjectParsed (interpreter,
+ "syntax",
+ "Shows the correct syntax for a given debugger command.",
+ "syntax <command>")
{
CommandArgumentEntry arg;
CommandArgumentData command_arg;
@@ -53,11 +53,7 @@
bool
-CommandObjectSyntax::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
+CommandObjectSyntax::DoExecute (Args& command, CommandReturnObject &result)
{
CommandObject::CommandMap::iterator pos;
CommandObject *cmd_obj;
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectSyntax.h Fri Jun 8 19:52:06 2012
@@ -22,7 +22,7 @@
// CommandObjectSyntax
//-------------------------------------------------------------------------
-class CommandObjectSyntax : public CommandObject
+class CommandObjectSyntax : public CommandObjectParsed
{
public:
@@ -31,8 +31,9 @@
virtual
~CommandObjectSyntax ();
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result);
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectTarget.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectTarget.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectTarget.cpp Fri Jun 8 19:52:06 2012
@@ -138,14 +138,14 @@
// "target create"
//-------------------------------------------------------------------------
-class CommandObjectTargetCreate : public CommandObject
+class CommandObjectTargetCreate : public CommandObjectParsed
{
public:
CommandObjectTargetCreate(CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target create",
- "Create a target using the argument as the main executable.",
- NULL),
+ CommandObjectParsed (interpreter,
+ "target create",
+ "Create a target using the argument as the main executable.",
+ NULL),
m_option_group (interpreter),
m_arch_option (),
m_platform_options(true), // Do include the "--platform" option in the platform settings by passing true
@@ -182,8 +182,33 @@
return &m_option_group;
}
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex(cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eDiskFileCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ return matches.GetSize();
+ }
+
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const int argc = command.GetArgumentCount();
FileSpec core_file (m_core_file.GetOptionValue().GetCurrentValue());
@@ -335,29 +360,6 @@
}
- 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)
- {
- std::string completion_str (input.GetArgumentAtIndex(cursor_index));
- completion_str.erase (cursor_char_position);
-
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eDiskFileCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- return matches.GetSize();
- }
private:
OptionGroupOptions m_option_group;
OptionGroupArchitecture m_arch_option;
@@ -373,15 +375,15 @@
// "target list"
//----------------------------------------------------------------------
-class CommandObjectTargetList : public CommandObject
+class CommandObjectTargetList : public CommandObjectParsed
{
public:
CommandObjectTargetList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target list",
- "List all current targets in the current debug session.",
- NULL,
- 0)
+ CommandObjectParsed (interpreter,
+ "target list",
+ "List all current targets in the current debug session.",
+ NULL,
+ 0)
{
}
@@ -390,8 +392,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
if (args.GetArgumentCount() == 0)
{
@@ -420,15 +423,15 @@
// "target select"
//----------------------------------------------------------------------
-class CommandObjectTargetSelect : public CommandObject
+class CommandObjectTargetSelect : public CommandObjectParsed
{
public:
CommandObjectTargetSelect (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target select",
- "Select a target as the current target by target index.",
- NULL,
- 0)
+ CommandObjectParsed (interpreter,
+ "target select",
+ "Select a target as the current target by target index.",
+ NULL,
+ 0)
{
}
@@ -437,8 +440,9 @@
{
}
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
if (args.GetArgumentCount() == 1)
{
@@ -495,15 +499,15 @@
// "target delete"
//----------------------------------------------------------------------
-class CommandObjectTargetDelete : public CommandObject
+class CommandObjectTargetDelete : public CommandObjectParsed
{
public:
CommandObjectTargetDelete (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target delete",
- "Delete one or more targets by target index.",
- NULL,
- 0),
+ CommandObjectParsed (interpreter,
+ "target delete",
+ "Delete one or more targets by target index.",
+ NULL,
+ 0),
m_option_group (interpreter),
m_cleanup_option (LLDB_OPT_SET_1, false, "clean", 'c', 0, eArgTypeNone, "Perform extra cleanup to minimize memory consumption after deleting the target.", false)
{
@@ -516,8 +520,15 @@
{
}
+ Options *
+ GetOptions ()
+ {
+ return &m_option_group;
+ }
+
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
const size_t argc = args.GetArgumentCount();
std::vector<TargetSP> delete_target_list;
@@ -594,13 +605,6 @@
return result.Succeeded();
}
- Options *
- GetOptions ()
- {
- return &m_option_group;
- }
-
-protected:
OptionGroupOptions m_option_group;
OptionGroupBoolean m_cleanup_option;
};
@@ -612,15 +616,15 @@
// "target variable"
//----------------------------------------------------------------------
-class CommandObjectTargetVariable : public CommandObject
+class CommandObjectTargetVariable : public CommandObjectParsed
{
public:
CommandObjectTargetVariable (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target variable",
- "Read global variable(s) prior to running your binary.",
- NULL,
- 0),
+ CommandObjectParsed (interpreter,
+ "target variable",
+ "Read global variable(s) prior to running your binary.",
+ NULL,
+ 0),
m_option_group (interpreter),
m_option_variable (false), // Don't include frame options
m_option_format (eFormatDefault),
@@ -734,8 +738,15 @@
+ Options *
+ GetOptions ()
+ {
+ return &m_option_group;
+ }
+
+protected:
virtual bool
- Execute (Args& args, CommandReturnObject &result)
+ DoExecute (Args& args, CommandReturnObject &result)
{
ExecutionContext exe_ctx (m_interpreter.GetExecutionContext());
Target *target = exe_ctx.GetTargetPtr();
@@ -875,13 +886,6 @@
return result.Succeeded();
}
- Options *
- GetOptions ()
- {
- return &m_option_group;
- }
-
-protected:
OptionGroupOptions m_option_group;
OptionGroupVariable m_option_variable;
OptionGroupFormat m_option_format;
@@ -894,15 +898,15 @@
#pragma mark CommandObjectTargetModulesSearchPathsAdd
-class CommandObjectTargetModulesSearchPathsAdd : public CommandObject
+class CommandObjectTargetModulesSearchPathsAdd : public CommandObjectParsed
{
public:
CommandObjectTargetModulesSearchPathsAdd (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target modules search-paths add",
- "Add new image search paths substitution pairs to the current target.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "target modules search-paths add",
+ "Add new image search paths substitution pairs to the current target.",
+ NULL)
{
CommandArgumentEntry arg;
CommandArgumentData old_prefix_arg;
@@ -930,8 +934,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -980,15 +985,15 @@
#pragma mark CommandObjectTargetModulesSearchPathsClear
-class CommandObjectTargetModulesSearchPathsClear : public CommandObject
+class CommandObjectTargetModulesSearchPathsClear : public CommandObjectParsed
{
public:
CommandObjectTargetModulesSearchPathsClear (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target modules search-paths clear",
- "Clear all current image search path substitution pairs from the current target.",
- "target modules search-paths clear")
+ CommandObjectParsed (interpreter,
+ "target modules search-paths clear",
+ "Clear all current image search path substitution pairs from the current target.",
+ "target modules search-paths clear")
{
}
@@ -996,8 +1001,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -1018,15 +1024,15 @@
#pragma mark CommandObjectTargetModulesSearchPathsInsert
-class CommandObjectTargetModulesSearchPathsInsert : public CommandObject
+class CommandObjectTargetModulesSearchPathsInsert : public CommandObjectParsed
{
public:
CommandObjectTargetModulesSearchPathsInsert (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target modules search-paths insert",
- "Insert a new image search path substitution pair into the current target at the specified index.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "target modules search-paths insert",
+ "Insert a new image search path substitution pair into the current target at the specified index.",
+ NULL)
{
CommandArgumentEntry arg1;
CommandArgumentEntry arg2;
@@ -1065,8 +1071,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -1137,15 +1144,15 @@
#pragma mark CommandObjectTargetModulesSearchPathsList
-class CommandObjectTargetModulesSearchPathsList : public CommandObject
+class CommandObjectTargetModulesSearchPathsList : public CommandObjectParsed
{
public:
CommandObjectTargetModulesSearchPathsList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target modules search-paths list",
- "List all current image search path substitution pairs in the current target.",
- "target modules search-paths list")
+ CommandObjectParsed (interpreter,
+ "target modules search-paths list",
+ "List all current image search path substitution pairs in the current target.",
+ "target modules search-paths list")
{
}
@@ -1153,8 +1160,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -1181,15 +1189,15 @@
#pragma mark CommandObjectTargetModulesSearchPathsQuery
-class CommandObjectTargetModulesSearchPathsQuery : public CommandObject
+class CommandObjectTargetModulesSearchPathsQuery : public CommandObjectParsed
{
public:
CommandObjectTargetModulesSearchPathsQuery (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target modules search-paths query",
- "Transform a path using the first applicable image search path.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "target modules search-paths query",
+ "Transform a path using the first applicable image search path.",
+ NULL)
{
CommandArgumentEntry arg;
CommandArgumentData path_arg;
@@ -1209,8 +1217,9 @@
{
}
+protected:
bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -1836,7 +1845,7 @@
// paths
//----------------------------------------------------------------------
-class CommandObjectTargetModulesModuleAutoComplete : public CommandObject
+class CommandObjectTargetModulesModuleAutoComplete : public CommandObjectParsed
{
public:
@@ -1844,7 +1853,7 @@
const char *name,
const char *help,
const char *syntax) :
- CommandObject (interpreter, name, help, syntax)
+ CommandObjectParsed (interpreter, name, help, syntax)
{
CommandArgumentEntry arg;
CommandArgumentData file_arg;
@@ -1898,7 +1907,7 @@
// file paths
//----------------------------------------------------------------------
-class CommandObjectTargetModulesSourceFileAutoComplete : public CommandObject
+class CommandObjectTargetModulesSourceFileAutoComplete : public CommandObjectParsed
{
public:
@@ -1906,7 +1915,7 @@
const char *name,
const char *help,
const char *syntax) :
- CommandObject (interpreter, name, help, syntax)
+ CommandObjectParsed (interpreter, name, help, syntax)
{
CommandArgumentEntry arg;
CommandArgumentData source_file_arg;
@@ -1974,8 +1983,71 @@
{
}
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
+
+ class CommandOptions : public Options
+ {
+ public:
+
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options(interpreter),
+ m_sort_order (eSortOrderNone)
+ {
+ }
+
+ virtual
+ ~CommandOptions ()
+ {
+ }
+
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
+
+ switch (short_option)
+ {
+ case 's':
+ m_sort_order = (SortOrder) Args::StringToOptionEnum (option_arg,
+ g_option_table[option_idx].enum_values,
+ eSortOrderNone,
+ error);
+ break;
+
+ default:
+ error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
+ break;
+
+ }
+ return error;
+ }
+
+ void
+ OptionParsingStarting ()
+ {
+ m_sort_order = eSortOrderNone;
+ }
+
+ const OptionDefinition*
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
+
+ // Options table: Required for subclasses of Options.
+ static OptionDefinition g_option_table[];
+
+ SortOrder m_sort_order;
+ };
+
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -2063,69 +2135,6 @@
return result.Succeeded();
}
- virtual Options *
- GetOptions ()
- {
- return &m_options;
- }
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter) :
- Options(interpreter),
- m_sort_order (eSortOrderNone)
- {
- }
-
- virtual
- ~CommandOptions ()
- {
- }
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg)
- {
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
-
- switch (short_option)
- {
- case 's':
- m_sort_order = (SortOrder) Args::StringToOptionEnum (option_arg,
- g_option_table[option_idx].enum_values,
- eSortOrderNone,
- error);
- break;
-
- default:
- error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
- break;
-
- }
- return error;
- }
-
- void
- OptionParsingStarting ()
- {
- m_sort_order = eSortOrderNone;
- }
-
- const OptionDefinition*
- GetDefinitions ()
- {
- return g_option_table;
- }
-
- // Options table: Required for subclasses of Options.
- static OptionDefinition g_option_table[];
-
- SortOrder m_sort_order;
- };
-
-protected:
CommandOptions m_options;
};
@@ -2170,8 +2179,9 @@
{
}
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -2275,8 +2285,9 @@
{
}
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -2376,8 +2387,9 @@
{
}
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -2476,14 +2488,14 @@
}
};
-class CommandObjectTargetModulesAdd : public CommandObject
+class CommandObjectTargetModulesAdd : public CommandObjectParsed
{
public:
CommandObjectTargetModulesAdd (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target modules add",
- "Add a new module to the current target's modules.",
- "target modules add [<module>]")
+ CommandObjectParsed (interpreter,
+ "target modules add",
+ "Add a new module to the current target's modules.",
+ "target modules add [<module>]")
{
}
@@ -2492,8 +2504,33 @@
{
}
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex(cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eDiskFileCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ return matches.GetSize();
+ }
+
+protected:
virtual bool
- Execute (Args& args,
+ DoExecute (Args& args,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -2554,30 +2591,6 @@
return result.Succeeded();
}
- 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)
- {
- std::string completion_str (input.GetArgumentAtIndex(cursor_index));
- completion_str.erase (cursor_char_position);
-
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eDiskFileCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- return matches.GetSize();
- }
-
};
class CommandObjectTargetModulesLoad : public CommandObjectTargetModulesModuleAutoComplete
@@ -2603,8 +2616,15 @@
{
}
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_option_group;
+ }
+
+protected:
virtual bool
- Execute (Args& args,
+ DoExecute (Args& args,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -2797,13 +2817,6 @@
return result.Succeeded();
}
- virtual Options *
- GetOptions ()
- {
- return &m_option_group;
- }
-
-protected:
OptionGroupOptions m_option_group;
OptionGroupUUID m_uuid_option_group;
OptionGroupFile m_file_option;
@@ -2813,7 +2826,7 @@
//----------------------------------------------------------------------
// List images with associated information
//----------------------------------------------------------------------
-class CommandObjectTargetModulesList : public CommandObject
+class CommandObjectTargetModulesList : public CommandObjectParsed
{
public:
@@ -2889,10 +2902,10 @@
};
CommandObjectTargetModulesList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target modules list",
- "List current executable and dependent shared library images.",
- "target modules list [<cmd-options>]"),
+ CommandObjectParsed (interpreter,
+ "target modules list",
+ "List current executable and dependent shared library images.",
+ "target modules list [<cmd-options>]"),
m_options (interpreter)
{
}
@@ -2909,8 +2922,9 @@
return &m_options;
}
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -3057,7 +3071,6 @@
}
return result.Succeeded();
}
-protected:
void
PrintModule (Target *target, Module *module, uint32_t idx, int indent, Stream &strm)
@@ -3247,7 +3260,7 @@
//----------------------------------------------------------------------
// Lookup information in images
//----------------------------------------------------------------------
-class CommandObjectTargetModulesLookup : public CommandObject
+class CommandObjectTargetModulesLookup : public CommandObjectParsed
{
public:
@@ -3392,11 +3405,11 @@
};
CommandObjectTargetModulesLookup (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target modules lookup",
- "Look up information within executable and dependent shared library images.",
- NULL),
- m_options (interpreter)
+ CommandObjectParsed (interpreter,
+ "target modules lookup",
+ "Look up information within executable and dependent shared library images.",
+ NULL),
+ m_options (interpreter)
{
CommandArgumentEntry arg;
CommandArgumentData file_arg;
@@ -3575,8 +3588,9 @@
return false;
}
+protected:
virtual bool
- Execute (Args& command,
+ DoExecute (Args& command,
CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
@@ -3675,7 +3689,6 @@
}
return result.Succeeded();
}
-protected:
CommandOptions m_options;
};
@@ -3773,14 +3786,14 @@
-class CommandObjectTargetSymbolsAdd : public CommandObject
+class CommandObjectTargetSymbolsAdd : public CommandObjectParsed
{
public:
CommandObjectTargetSymbolsAdd (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target symbols add",
- "Add a debug symbol file to one of the target's current modules.",
- "target symbols add [<symfile>]")
+ CommandObjectParsed (interpreter,
+ "target symbols add",
+ "Add a debug symbol file to one of the target's current modules.",
+ "target symbols add [<symfile>]")
{
}
@@ -3789,8 +3802,33 @@
{
}
+ 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)
+ {
+ std::string completion_str (input.GetArgumentAtIndex(cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
+ CommandCompletions::eDiskFileCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ return matches.GetSize();
+ }
+
+protected:
virtual bool
- Execute (Args& args,
+ DoExecute (Args& args,
CommandReturnObject &result)
{
ExecutionContext exe_ctx (m_interpreter.GetExecutionContext());
@@ -3881,30 +3919,6 @@
return result.Succeeded();
}
- 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)
- {
- std::string completion_str (input.GetArgumentAtIndex(cursor_index));
- completion_str.erase (cursor_char_position);
-
- CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
- CommandCompletions::eDiskFileCompletion,
- completion_str.c_str(),
- match_start_point,
- max_return_elements,
- NULL,
- word_complete,
- matches);
- return matches.GetSize();
- }
-
};
@@ -3948,7 +3962,7 @@
// CommandObjectTargetStopHookAdd
//-------------------------------------------------------------------------
-class CommandObjectTargetStopHookAdd : public CommandObject
+class CommandObjectTargetStopHookAdd : public CommandObjectParsed
{
public:
@@ -4114,10 +4128,10 @@
}
CommandObjectTargetStopHookAdd (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target stop-hook add ",
- "Add a hook to be executed when the target stops.",
- "target stop-hook add"),
+ CommandObjectParsed (interpreter,
+ "target stop-hook add ",
+ "Add a hook to be executed when the target stops.",
+ "target stop-hook add"),
m_options (interpreter)
{
}
@@ -4213,9 +4227,9 @@
return bytes_len;
}
+protected:
bool
- Execute (Args& command,
- CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
if (target)
@@ -4368,15 +4382,15 @@
// CommandObjectTargetStopHookDelete
//-------------------------------------------------------------------------
-class CommandObjectTargetStopHookDelete : public CommandObject
+class CommandObjectTargetStopHookDelete : public CommandObjectParsed
{
public:
CommandObjectTargetStopHookDelete (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target stop-hook delete",
- "Delete a stop-hook.",
- "target stop-hook delete [<idx>]")
+ CommandObjectParsed (interpreter,
+ "target stop-hook delete",
+ "Delete a stop-hook.",
+ "target stop-hook delete [<idx>]")
{
}
@@ -4384,9 +4398,9 @@
{
}
+protected:
bool
- Execute (Args& command,
- CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
if (target)
@@ -4443,15 +4457,15 @@
// CommandObjectTargetStopHookEnableDisable
//-------------------------------------------------------------------------
-class CommandObjectTargetStopHookEnableDisable : public CommandObject
+class CommandObjectTargetStopHookEnableDisable : public CommandObjectParsed
{
public:
CommandObjectTargetStopHookEnableDisable (CommandInterpreter &interpreter, bool enable, const char *name, const char *help, const char *syntax) :
- CommandObject (interpreter,
- name,
- help,
- syntax),
+ CommandObjectParsed (interpreter,
+ name,
+ help,
+ syntax),
m_enable (enable)
{
}
@@ -4460,9 +4474,9 @@
{
}
+protected:
bool
- Execute (Args& command,
- CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
if (target)
@@ -4514,15 +4528,15 @@
// CommandObjectTargetStopHookList
//-------------------------------------------------------------------------
-class CommandObjectTargetStopHookList : public CommandObject
+class CommandObjectTargetStopHookList : public CommandObjectParsed
{
public:
CommandObjectTargetStopHookList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "target stop-hook list",
- "List all stop-hooks.",
- "target stop-hook list [<type>]")
+ CommandObjectParsed (interpreter,
+ "target stop-hook list",
+ "List all stop-hooks.",
+ "target stop-hook list [<type>]")
{
}
@@ -4530,9 +4544,9 @@
{
}
+protected:
bool
- Execute (Args& command,
- CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
if (!target)
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectThread.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectThread.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectThread.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectThread.cpp Fri Jun 8 19:52:06 2012
@@ -42,7 +42,7 @@
// CommandObjectThreadBacktrace
//-------------------------------------------------------------------------
-class CommandObjectThreadBacktrace : public CommandObject
+class CommandObjectThreadBacktrace : public CommandObjectParsed
{
public:
@@ -121,11 +121,11 @@
};
CommandObjectThreadBacktrace (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "thread backtrace",
- "Show the stack for one or more threads. If no threads are specified, show the currently selected thread. Use the thread-index \"all\" to see all threads.",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
+ CommandObjectParsed (interpreter,
+ "thread backtrace",
+ "Show the stack for one or more threads. If no threads are specified, show the currently selected thread. Use the thread-index \"all\" to see all threads.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
m_options(interpreter)
{
CommandArgumentEntry arg;
@@ -152,8 +152,9 @@
return &m_options;
}
+protected:
virtual bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
result.SetStatus (eReturnStatusSuccessFinishResult);
Stream &strm = result.GetOutputStream();
@@ -250,7 +251,7 @@
}
return result.Succeeded();
}
-protected:
+
CommandOptions m_options;
};
@@ -268,7 +269,7 @@
eStepScopeInstruction
};
-class CommandObjectThreadStepWithTypeAndScope : public CommandObject
+class CommandObjectThreadStepWithTypeAndScope : public CommandObjectParsed
{
public:
@@ -358,7 +359,7 @@
uint32_t flags,
StepType step_type,
StepScope step_scope) :
- CommandObject (interpreter, name, help, syntax, flags),
+ CommandObjectParsed (interpreter, name, help, syntax, flags),
m_step_type (step_type),
m_step_scope (step_scope),
m_options (interpreter)
@@ -389,12 +390,9 @@
return &m_options;
}
+protected:
virtual bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
bool synchronous_execution = m_interpreter.GetSynchronous();
@@ -594,16 +592,16 @@
// CommandObjectThreadContinue
//-------------------------------------------------------------------------
-class CommandObjectThreadContinue : public CommandObject
+class CommandObjectThreadContinue : public CommandObjectParsed
{
public:
CommandObjectThreadContinue (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "thread continue",
- "Continue execution of one or more threads in an active process.",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
+ CommandObjectParsed (interpreter,
+ "thread continue",
+ "Continue execution of one or more threads in an active process.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
{
CommandArgumentEntry arg;
CommandArgumentData thread_idx_arg;
@@ -626,11 +624,7 @@
}
virtual bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
bool synchronous_execution = m_interpreter.GetSynchronous ();
@@ -782,7 +776,7 @@
// CommandObjectThreadUntil
//-------------------------------------------------------------------------
-class CommandObjectThreadUntil : public CommandObject
+class CommandObjectThreadUntil : public CommandObjectParsed
{
public:
@@ -879,11 +873,11 @@
};
CommandObjectThreadUntil (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "thread until",
- "Run the current or specified thread until it reaches a given line number or leaves the current function.",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
+ CommandObjectParsed (interpreter,
+ "thread until",
+ "Run the current or specified thread until it reaches a given line number or leaves the current function.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
m_options (interpreter)
{
CommandArgumentEntry arg;
@@ -913,12 +907,9 @@
return &m_options;
}
+protected:
virtual bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
bool synchronous_execution = m_interpreter.GetSynchronous ();
@@ -1100,7 +1091,7 @@
}
return result.Succeeded();
}
-protected:
+
CommandOptions m_options;
};
@@ -1119,16 +1110,16 @@
// CommandObjectThreadSelect
//-------------------------------------------------------------------------
-class CommandObjectThreadSelect : public CommandObject
+class CommandObjectThreadSelect : public CommandObjectParsed
{
public:
CommandObjectThreadSelect (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "thread select",
- "Select a thread as the currently active thread.",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
+ CommandObjectParsed (interpreter,
+ "thread select",
+ "Select a thread as the currently active thread.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
{
CommandArgumentEntry arg;
CommandArgumentData thread_idx_arg;
@@ -1150,12 +1141,9 @@
{
}
+protected:
virtual bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
if (process == NULL)
@@ -1202,17 +1190,17 @@
// CommandObjectThreadList
//-------------------------------------------------------------------------
-class CommandObjectThreadList : public CommandObject
+class CommandObjectThreadList : public CommandObjectParsed
{
public:
CommandObjectThreadList (CommandInterpreter &interpreter):
- CommandObject (interpreter,
- "thread list",
- "Show a summary of all current threads in a process.",
- "thread list",
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
+ CommandObjectParsed (interpreter,
+ "thread list",
+ "Show a summary of all current threads in a process.",
+ "thread list",
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
{
}
@@ -1220,12 +1208,9 @@
{
}
+protected:
bool
- Execute
- (
- Args& command,
- CommandReturnObject &result
- )
+ DoExecute (Args& command, CommandReturnObject &result)
{
Stream &strm = result.GetOutputStream();
result.SetStatus (eReturnStatusSuccessFinishNoResult);
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectType.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectType.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectType.cpp Fri Jun 8 19:52:06 2012
@@ -98,7 +98,7 @@
-class CommandObjectTypeSummaryAdd : public CommandObject
+class CommandObjectTypeSummaryAdd : public CommandObjectParsed
{
private:
@@ -176,18 +176,19 @@
{
}
- bool
- Execute (Args& command, CommandReturnObject &result);
-
static bool
AddSummary(const ConstString& type_name,
lldb::TypeSummaryImplSP entry,
SummaryFormatType type,
std::string category,
Error* error = NULL);
+protected:
+ bool
+ DoExecute (Args& command, CommandReturnObject &result);
+
};
-class CommandObjectTypeSynthAdd : public CommandObject
+class CommandObjectTypeSynthAdd : public CommandObjectParsed
{
private:
@@ -297,13 +298,14 @@
CollectPythonScript (SynthAddOptions *options,
CommandReturnObject &result);
bool
- Execute_HandwritePython (Args& command, CommandReturnObject &result);
+ Execute_HandwritePython (Args& command, CommandReturnObject &result);
bool
Execute_PythonClass (Args& command, CommandReturnObject &result);
+protected:
bool
- Execute (Args& command, CommandReturnObject &result);
+ DoExecute (Args& command, CommandReturnObject &result);
public:
@@ -331,7 +333,7 @@
// CommandObjectTypeFormatAdd
//-------------------------------------------------------------------------
-class CommandObjectTypeFormatAdd : public CommandObject
+class CommandObjectTypeFormatAdd : public CommandObjectParsed
{
private:
@@ -419,10 +421,10 @@
public:
CommandObjectTypeFormatAdd (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type format add",
- "Add a new formatting style for a type.",
- NULL),
+ CommandObjectParsed (interpreter,
+ "type format add",
+ "Add a new formatting style for a type.",
+ NULL),
m_option_group (interpreter),
m_format_options (eFormatInvalid),
m_command_options ()
@@ -476,8 +478,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -544,14 +547,14 @@
// CommandObjectTypeFormatDelete
//-------------------------------------------------------------------------
-class CommandObjectTypeFormatDelete : public CommandObject
+class CommandObjectTypeFormatDelete : public CommandObjectParsed
{
public:
CommandObjectTypeFormatDelete (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type format delete",
- "Delete an existing formatting style for a type.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "type format delete",
+ "Delete an existing formatting style for a type.",
+ NULL)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -569,8 +572,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -612,14 +616,14 @@
// CommandObjectTypeFormatClear
//-------------------------------------------------------------------------
-class CommandObjectTypeFormatClear : public CommandObject
+class CommandObjectTypeFormatClear : public CommandObjectParsed
{
public:
CommandObjectTypeFormatClear (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type format clear",
- "Delete all existing format styles.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "type format clear",
+ "Delete all existing format styles.",
+ NULL)
{
}
@@ -627,8 +631,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
DataVisualization::ValueFormats::Clear();
result.SetStatus(eReturnStatusSuccessFinishResult);
@@ -653,14 +658,14 @@
RegularExpression* X = NULL) : self(S), result(R), regex(X) {}
};
-class CommandObjectTypeFormatList : public CommandObject
+class CommandObjectTypeFormatList : public CommandObjectParsed
{
public:
CommandObjectTypeFormatList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type format list",
- "Show a list of current formatting styles.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "type format list",
+ "Show a list of current formatting styles.",
+ NULL)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -677,8 +682,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -1230,10 +1236,11 @@
}
CommandObjectTypeSummaryAdd::CommandObjectTypeSummaryAdd (CommandInterpreter &interpreter) :
-CommandObject (interpreter,
- "type summary add",
- "Add a new summary style for a type.",
- NULL), m_options (interpreter)
+ CommandObjectParsed (interpreter,
+ "type summary add",
+ "Add a new summary style for a type.",
+ NULL),
+ m_options (interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -1312,7 +1319,7 @@
}
bool
-CommandObjectTypeSummaryAdd::Execute (Args& command, CommandReturnObject &result)
+CommandObjectTypeSummaryAdd::DoExecute (Args& command, CommandReturnObject &result)
{
if (m_options.m_is_add_script)
{
@@ -1391,7 +1398,7 @@
// CommandObjectTypeSummaryDelete
//-------------------------------------------------------------------------
-class CommandObjectTypeSummaryDelete : public CommandObject
+class CommandObjectTypeSummaryDelete : public CommandObjectParsed
{
private:
class CommandOptions : public Options
@@ -1471,10 +1478,11 @@
public:
CommandObjectTypeSummaryDelete (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type summary delete",
- "Delete an existing summary style for a type.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type summary delete",
+ "Delete an existing summary style for a type.",
+ NULL),
+ m_options(interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -1492,8 +1500,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -1551,7 +1560,7 @@
{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
};
-class CommandObjectTypeSummaryClear : public CommandObject
+class CommandObjectTypeSummaryClear : public CommandObjectParsed
{
private:
@@ -1628,10 +1637,11 @@
public:
CommandObjectTypeSummaryClear (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type summary clear",
- "Delete all existing summary styles.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type summary clear",
+ "Delete all existing summary styles.",
+ NULL),
+ m_options(interpreter)
{
}
@@ -1639,8 +1649,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
if (m_options.m_delete_all)
@@ -1694,7 +1705,7 @@
RegularExpression* CX = NULL) : self(S), result(R), regex(X), cate_regex(CX) {}
};
-class CommandObjectTypeSummaryList : public CommandObject
+class CommandObjectTypeSummaryList : public CommandObjectParsed
{
class CommandOptions : public Options
@@ -1760,10 +1771,11 @@
public:
CommandObjectTypeSummaryList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type summary list",
- "Show a list of current summary styles.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type summary list",
+ "Show a list of current summary styles.",
+ NULL),
+ m_options(interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -1780,8 +1792,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -1905,14 +1918,14 @@
// CommandObjectTypeCategoryEnable
//-------------------------------------------------------------------------
-class CommandObjectTypeCategoryEnable : public CommandObject
+class CommandObjectTypeCategoryEnable : public CommandObjectParsed
{
public:
CommandObjectTypeCategoryEnable (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type category enable",
- "Enable a category as a source of formatters.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "type category enable",
+ "Enable a category as a source of formatters.",
+ NULL)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -1930,8 +1943,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -1974,14 +1988,14 @@
// CommandObjectTypeCategoryDelete
//-------------------------------------------------------------------------
-class CommandObjectTypeCategoryDelete : public CommandObject
+class CommandObjectTypeCategoryDelete : public CommandObjectParsed
{
public:
CommandObjectTypeCategoryDelete (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type category delete",
- "Delete a category and all associated formatters.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "type category delete",
+ "Delete a category and all associated formatters.",
+ NULL)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -1999,8 +2013,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -2046,14 +2061,14 @@
// CommandObjectTypeCategoryDisable
//-------------------------------------------------------------------------
-class CommandObjectTypeCategoryDisable : public CommandObject
+class CommandObjectTypeCategoryDisable : public CommandObjectParsed
{
public:
CommandObjectTypeCategoryDisable (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type category disable",
- "Disable a category as a source of formatters.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "type category disable",
+ "Disable a category as a source of formatters.",
+ NULL)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -2071,8 +2086,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -2122,7 +2138,7 @@
// CommandObjectTypeCategoryList
//-------------------------------------------------------------------------
-class CommandObjectTypeCategoryList : public CommandObject
+class CommandObjectTypeCategoryList : public CommandObjectParsed
{
private:
@@ -2159,10 +2175,10 @@
}
public:
CommandObjectTypeCategoryList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type category list",
- "Provide a list of all existing categories.",
- NULL)
+ CommandObjectParsed (interpreter,
+ "type category list",
+ "Provide a list of all existing categories.",
+ NULL)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -2179,8 +2195,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
RegularExpression* regex = NULL;
@@ -2229,7 +2246,7 @@
RegularExpression* CX = NULL) : self(S), result(R), regex(X), cate_regex(CX) {}
};
-class CommandObjectTypeFilterList : public CommandObject
+class CommandObjectTypeFilterList : public CommandObjectParsed
{
class CommandOptions : public Options
@@ -2295,10 +2312,11 @@
public:
CommandObjectTypeFilterList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type filter list",
- "Show a list of current filters.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type filter list",
+ "Show a list of current filters.",
+ NULL),
+ m_options(interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -2315,8 +2333,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -2441,7 +2460,7 @@
RegularExpression* CX = NULL) : self(S), result(R), regex(X), cate_regex(CX) {}
};
-class CommandObjectTypeSynthList : public CommandObject
+class CommandObjectTypeSynthList : public CommandObjectParsed
{
class CommandOptions : public Options
@@ -2507,10 +2526,11 @@
public:
CommandObjectTypeSynthList (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type synthetic list",
- "Show a list of current synthetic providers.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type synthetic list",
+ "Show a list of current synthetic providers.",
+ NULL),
+ m_options(interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -2527,8 +2547,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -2637,7 +2658,7 @@
// CommandObjectTypeFilterDelete
//-------------------------------------------------------------------------
-class CommandObjectTypeFilterDelete : public CommandObject
+class CommandObjectTypeFilterDelete : public CommandObjectParsed
{
private:
class CommandOptions : public Options
@@ -2716,10 +2737,11 @@
public:
CommandObjectTypeFilterDelete (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type filter delete",
- "Delete an existing filter for a type.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type filter delete",
+ "Delete an existing filter for a type.",
+ NULL),
+ m_options(interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -2737,8 +2759,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -2801,7 +2824,7 @@
// CommandObjectTypeSynthDelete
//-------------------------------------------------------------------------
-class CommandObjectTypeSynthDelete : public CommandObject
+class CommandObjectTypeSynthDelete : public CommandObjectParsed
{
private:
class CommandOptions : public Options
@@ -2880,10 +2903,11 @@
public:
CommandObjectTypeSynthDelete (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type synthetic delete",
- "Delete an existing synthetic provider for a type.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type synthetic delete",
+ "Delete an existing synthetic provider for a type.",
+ NULL),
+ m_options(interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -2901,8 +2925,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
@@ -2965,7 +2990,7 @@
// CommandObjectTypeFilterClear
//-------------------------------------------------------------------------
-class CommandObjectTypeFilterClear : public CommandObject
+class CommandObjectTypeFilterClear : public CommandObjectParsed
{
private:
@@ -3041,10 +3066,11 @@
public:
CommandObjectTypeFilterClear (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type filter clear",
- "Delete all existing filters.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type filter clear",
+ "Delete all existing filters.",
+ NULL),
+ m_options(interpreter)
{
}
@@ -3052,8 +3078,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
if (m_options.m_delete_all)
@@ -3092,7 +3119,7 @@
// CommandObjectTypeSynthClear
//-------------------------------------------------------------------------
-class CommandObjectTypeSynthClear : public CommandObject
+class CommandObjectTypeSynthClear : public CommandObjectParsed
{
private:
@@ -3168,10 +3195,11 @@
public:
CommandObjectTypeSynthClear (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type synthetic clear",
- "Delete all existing synthetic providers.",
- NULL), m_options(interpreter)
+ CommandObjectParsed (interpreter,
+ "type synthetic clear",
+ "Delete all existing synthetic providers.",
+ NULL),
+ m_options(interpreter)
{
}
@@ -3179,8 +3207,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
if (m_options.m_delete_all)
@@ -3496,10 +3525,11 @@
}
CommandObjectTypeSynthAdd::CommandObjectTypeSynthAdd (CommandInterpreter &interpreter) :
-CommandObject (interpreter,
- "type synthetic add",
- "Add a new synthetic provider for a type.",
- NULL), m_options (interpreter)
+ CommandObjectParsed (interpreter,
+ "type synthetic add",
+ "Add a new synthetic provider for a type.",
+ NULL),
+ m_options (interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -3555,7 +3585,7 @@
}
bool
-CommandObjectTypeSynthAdd::Execute (Args& command, CommandReturnObject &result)
+CommandObjectTypeSynthAdd::DoExecute (Args& command, CommandReturnObject &result)
{
if (m_options.handwrite_python)
return Execute_HandwritePython(command, result);
@@ -3584,7 +3614,7 @@
#endif // #ifndef LLDB_DISABLE_PYTHON
-class CommandObjectTypeFilterAdd : public CommandObject
+class CommandObjectTypeFilterAdd : public CommandObjectParsed
{
private:
@@ -3737,11 +3767,11 @@
public:
CommandObjectTypeFilterAdd (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "type filter add",
- "Add a new filter for a type.",
- NULL),
- m_options (interpreter)
+ CommandObjectParsed (interpreter,
+ "type filter add",
+ "Add a new filter for a type.",
+ NULL),
+ m_options (interpreter)
{
CommandArgumentEntry type_arg;
CommandArgumentData type_style_arg;
@@ -3785,8 +3815,9 @@
{
}
+protected:
bool
- Execute (Args& command, CommandReturnObject &result)
+ DoExecute (Args& command, CommandReturnObject &result)
{
const size_t argc = command.GetArgumentCount();
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.cpp Fri Jun 8 19:52:06 2012
@@ -25,7 +25,7 @@
//-------------------------------------------------------------------------
CommandObjectVersion::CommandObjectVersion (CommandInterpreter &interpreter) :
- CommandObject (interpreter, "version", "Show version of LLDB debugger.", "version")
+ CommandObjectParsed (interpreter, "version", "Show version of LLDB debugger.", "version")
{
}
@@ -34,11 +34,7 @@
}
bool
-CommandObjectVersion::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
+CommandObjectVersion::DoExecute (Args& args, CommandReturnObject &result)
{
result.AppendMessageWithFormat ("%s\n", lldb_private::GetVersion());
result.SetStatus (eReturnStatusSuccessFinishResult);
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectVersion.h Fri Jun 8 19:52:06 2012
@@ -22,7 +22,7 @@
// CommandObjectVersion
//-------------------------------------------------------------------------
-class CommandObjectVersion : public CommandObject
+class CommandObjectVersion : public CommandObjectParsed
{
public:
@@ -31,8 +31,9 @@
virtual
~CommandObjectVersion ();
+protected:
virtual bool
- Execute (Args& args,
+ DoExecute (Args& args,
CommandReturnObject &result);
};
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.cpp Fri Jun 8 19:52:06 2012
@@ -59,7 +59,30 @@
return true;
}
+// FIXME: This doesn't seem to be the right place for this functionality.
#include "llvm/ADT/StringRef.h"
+static inline void StripLeadingSpaces(llvm::StringRef &Str)
+{
+ while (!Str.empty() && isspace(Str[0]))
+ Str = Str.substr(1);
+}
+static inline llvm::StringRef StripOptionTerminator(llvm::StringRef &Str, bool with_dash_w, bool with_dash_x)
+{
+ llvm::StringRef ExprStr = Str;
+
+ // Get rid of the leading spaces first.
+ StripLeadingSpaces(ExprStr);
+
+ // If there's no '-w' and no '-x', we can just return.
+ if (!with_dash_w && !with_dash_x)
+ return ExprStr;
+
+ // Otherwise, split on the "--" option terminator string, and return the rest of the string.
+ ExprStr = ExprStr.split("--").second;
+ StripLeadingSpaces(ExprStr);
+ return ExprStr;
+}
+
// Equivalent class: {"-", "to", "To", "TO"} of range specifier array.
static const char* RSA[4] = { "-", "to", "To", "TO" };
@@ -143,1092 +166,1161 @@
}
//-------------------------------------------------------------------------
-// CommandObjectMultiwordWatchpoint
+// CommandObjectWatchpointList
//-------------------------------------------------------------------------
-#pragma mark MultiwordWatchpoint
-
-CommandObjectMultiwordWatchpoint::CommandObjectMultiwordWatchpoint(CommandInterpreter &interpreter) :
- CommandObjectMultiword (interpreter,
- "watchpoint",
- "A set of commands for operating on watchpoints.",
- "watchpoint <command> [<command-options>]")
-{
- bool status;
-
- CommandObjectSP list_command_object (new CommandObjectWatchpointList (interpreter));
- CommandObjectSP enable_command_object (new CommandObjectWatchpointEnable (interpreter));
- CommandObjectSP disable_command_object (new CommandObjectWatchpointDisable (interpreter));
- CommandObjectSP delete_command_object (new CommandObjectWatchpointDelete (interpreter));
- CommandObjectSP ignore_command_object (new CommandObjectWatchpointIgnore (interpreter));
- CommandObjectSP modify_command_object (new CommandObjectWatchpointModify (interpreter));
- CommandObjectSP set_command_object (new CommandObjectWatchpointSet (interpreter));
-
- list_command_object->SetCommandName ("watchpoint list");
- enable_command_object->SetCommandName("watchpoint enable");
- disable_command_object->SetCommandName("watchpoint disable");
- delete_command_object->SetCommandName("watchpoint delete");
- ignore_command_object->SetCommandName("watchpoint ignore");
- modify_command_object->SetCommandName("watchpoint modify");
- set_command_object->SetCommandName("watchpoint set");
-
- status = LoadSubCommand ("list", list_command_object);
- status = LoadSubCommand ("enable", enable_command_object);
- status = LoadSubCommand ("disable", disable_command_object);
- status = LoadSubCommand ("delete", delete_command_object);
- status = LoadSubCommand ("ignore", ignore_command_object);
- status = LoadSubCommand ("modify", modify_command_object);
- status = LoadSubCommand ("set", set_command_object);
-}
+#pragma mark List
-CommandObjectMultiwordWatchpoint::~CommandObjectMultiwordWatchpoint()
+class CommandObjectWatchpointList : public CommandObjectParsed
{
-}
-
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointList::Options
-//-------------------------------------------------------------------------
-#pragma mark List::CommandOptions
+public:
+ CommandObjectWatchpointList (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "watchpoint list",
+ "List all watchpoints at configurable levels of detail.",
+ NULL),
+ m_options(interpreter)
+ {
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back(arg);
+ }
-CommandObjectWatchpointList::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
- Options(interpreter),
- m_level(lldb::eDescriptionLevelBrief) // Watchpoint List defaults to brief descriptions
-{
-}
+ virtual
+ ~CommandObjectWatchpointList () {}
-CommandObjectWatchpointList::CommandOptions::~CommandOptions()
-{
-}
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
-OptionDefinition
-CommandObjectWatchpointList::CommandOptions::g_option_table[] =
-{
- { LLDB_OPT_SET_1, false, "brief", 'b', no_argument, NULL, 0, eArgTypeNone,
- "Give a brief description of the watchpoint (no location info)."},
+ class CommandOptions : public Options
+ {
+ public:
- { LLDB_OPT_SET_2, false, "full", 'f', no_argument, NULL, 0, eArgTypeNone,
- "Give a full description of the watchpoint and its locations."},
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options(interpreter),
+ m_level(lldb::eDescriptionLevelBrief) // Watchpoint List defaults to brief descriptions
+ {
+ }
- { LLDB_OPT_SET_3, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone,
- "Explain everything we know about the watchpoint (for debugging debugger bugs)." },
+ virtual
+ ~CommandOptions () {}
- { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
-};
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
-const OptionDefinition*
-CommandObjectWatchpointList::CommandOptions::GetDefinitions()
-{
- return g_option_table;
-}
+ switch (short_option)
+ {
+ case 'b':
+ m_level = lldb::eDescriptionLevelBrief;
+ break;
+ case 'f':
+ m_level = lldb::eDescriptionLevelFull;
+ break;
+ case 'v':
+ m_level = lldb::eDescriptionLevelVerbose;
+ break;
+ default:
+ error.SetErrorStringWithFormat("unrecognized option '%c'", short_option);
+ break;
+ }
-Error
-CommandObjectWatchpointList::CommandOptions::SetOptionValue(uint32_t option_idx, const char *option_arg)
-{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
+ return error;
+ }
- switch (short_option)
- {
- case 'b':
- m_level = lldb::eDescriptionLevelBrief;
- break;
- case 'f':
+ void
+ OptionParsingStarting ()
+ {
m_level = lldb::eDescriptionLevelFull;
- break;
- case 'v':
- m_level = lldb::eDescriptionLevelVerbose;
- break;
- default:
- error.SetErrorStringWithFormat("unrecognized option '%c'", short_option);
- break;
- }
-
- return error;
-}
+ }
-void
-CommandObjectWatchpointList::CommandOptions::OptionParsingStarting()
-{
- m_level = lldb::eDescriptionLevelFull;
-}
+ const OptionDefinition *
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointList
-//-------------------------------------------------------------------------
-#pragma mark List
-CommandObjectWatchpointList::CommandObjectWatchpointList(CommandInterpreter &interpreter) :
- CommandObject(interpreter,
- "watchpoint list",
- "List all watchpoints at configurable levels of detail.",
- NULL),
- m_options(interpreter)
-{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back(arg);
-}
+ // Options table: Required for subclasses of Options.
-CommandObjectWatchpointList::~CommandObjectWatchpointList()
-{
-}
+ static OptionDefinition g_option_table[];
-Options *
-CommandObjectWatchpointList::GetOptions()
-{
- return &m_options;
-}
+ // Instance variables to hold the values for command options.
-bool
-CommandObjectWatchpointList::Execute(Args& args, CommandReturnObject &result)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (target == NULL)
- {
- result.AppendError ("Invalid target. No current target or watchpoints.");
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- return true;
- }
+ lldb::DescriptionLevel m_level;
+ };
- if (target->GetProcessSP() && target->GetProcessSP()->IsAlive())
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
{
- uint32_t num_supported_hardware_watchpoints;
- Error error = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
- if (error.Success())
- result.AppendMessageWithFormat("Number of supported hardware watchpoints: %u\n",
- num_supported_hardware_watchpoints);
- }
-
- const WatchpointList &watchpoints = target->GetWatchpointList();
- Mutex::Locker locker;
- target->GetWatchpointList().GetListMutex(locker);
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (target == NULL)
+ {
+ result.AppendError ("Invalid target. No current target or watchpoints.");
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ return true;
+ }
- size_t num_watchpoints = watchpoints.GetSize();
+ if (target->GetProcessSP() && target->GetProcessSP()->IsAlive())
+ {
+ uint32_t num_supported_hardware_watchpoints;
+ Error error = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
+ if (error.Success())
+ result.AppendMessageWithFormat("Number of supported hardware watchpoints: %u\n",
+ num_supported_hardware_watchpoints);
+ }
- if (num_watchpoints == 0)
- {
- result.AppendMessage("No watchpoints currently set.");
- result.SetStatus(eReturnStatusSuccessFinishNoResult);
- return true;
- }
+ const WatchpointList &watchpoints = target->GetWatchpointList();
+ Mutex::Locker locker;
+ target->GetWatchpointList().GetListMutex(locker);
- Stream &output_stream = result.GetOutputStream();
+ size_t num_watchpoints = watchpoints.GetSize();
- if (args.GetArgumentCount() == 0)
- {
- // No watchpoint selected; show info about all currently set watchpoints.
- result.AppendMessage ("Current watchpoints:");
- for (size_t i = 0; i < num_watchpoints; ++i)
- {
- Watchpoint *wp = watchpoints.GetByIndex(i).get();
- AddWatchpointDescription(&output_stream, wp, m_options.m_level);
- }
- result.SetStatus(eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- // Particular watchpoints selected; enable them.
- std::vector<uint32_t> wp_ids;
- if (!VerifyWatchpointIDs(args, wp_ids))
+ if (num_watchpoints == 0)
{
- result.AppendError("Invalid watchpoints specification.");
- result.SetStatus(eReturnStatusFailed);
- return false;
+ result.AppendMessage("No watchpoints currently set.");
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ return true;
}
- const size_t size = wp_ids.size();
- for (size_t i = 0; i < size; ++i)
+ Stream &output_stream = result.GetOutputStream();
+
+ if (command.GetArgumentCount() == 0)
{
- Watchpoint *wp = watchpoints.FindByID(wp_ids[i]).get();
- if (wp)
+ // No watchpoint selected; show info about all currently set watchpoints.
+ result.AppendMessage ("Current watchpoints:");
+ for (size_t i = 0; i < num_watchpoints; ++i)
+ {
+ Watchpoint *wp = watchpoints.GetByIndex(i).get();
AddWatchpointDescription(&output_stream, wp, m_options.m_level);
+ }
result.SetStatus(eReturnStatusSuccessFinishNoResult);
}
+ else
+ {
+ // Particular watchpoints selected; enable them.
+ std::vector<uint32_t> wp_ids;
+ if (!VerifyWatchpointIDs(command, wp_ids))
+ {
+ result.AppendError("Invalid watchpoints specification.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+
+ const size_t size = wp_ids.size();
+ for (size_t i = 0; i < size; ++i)
+ {
+ Watchpoint *wp = watchpoints.FindByID(wp_ids[i]).get();
+ if (wp)
+ AddWatchpointDescription(&output_stream, wp, m_options.m_level);
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ }
+ }
+
+ return result.Succeeded();
}
- return result.Succeeded();
-}
+private:
+ CommandOptions m_options;
+};
//-------------------------------------------------------------------------
-// CommandObjectWatchpointEnable
+// CommandObjectWatchpointList::Options
//-------------------------------------------------------------------------
-#pragma mark Enable
-
-CommandObjectWatchpointEnable::CommandObjectWatchpointEnable(CommandInterpreter &interpreter) :
- CommandObject(interpreter,
- "enable",
- "Enable the specified disabled watchpoint(s). If no watchpoints are specified, enable all of them.",
- NULL)
-{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back(arg);
-}
-
-CommandObjectWatchpointEnable::~CommandObjectWatchpointEnable()
+#pragma mark List::CommandOptions
+OptionDefinition
+CommandObjectWatchpointList::CommandOptions::g_option_table[] =
{
-}
+ { LLDB_OPT_SET_1, false, "brief", 'b', no_argument, NULL, 0, eArgTypeNone,
+ "Give a brief description of the watchpoint (no location info)."},
-bool
-CommandObjectWatchpointEnable::Execute(Args& args, CommandReturnObject &result)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (!CheckTargetForWatchpointOperations(target, result))
- return false;
+ { LLDB_OPT_SET_2, false, "full", 'f', no_argument, NULL, 0, eArgTypeNone,
+ "Give a full description of the watchpoint and its locations."},
- Mutex::Locker locker;
- target->GetWatchpointList().GetListMutex(locker);
+ { LLDB_OPT_SET_3, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone,
+ "Explain everything we know about the watchpoint (for debugging debugger bugs)." },
- const WatchpointList &watchpoints = target->GetWatchpointList();
+ { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
+};
- size_t num_watchpoints = watchpoints.GetSize();
+//-------------------------------------------------------------------------
+// CommandObjectWatchpointEnable
+//-------------------------------------------------------------------------
+#pragma mark Enable
- if (num_watchpoints == 0)
+class CommandObjectWatchpointEnable : public CommandObjectParsed
+{
+public:
+ CommandObjectWatchpointEnable (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "enable",
+ "Enable the specified disabled watchpoint(s). If no watchpoints are specified, enable all of them.",
+ NULL)
+ {
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back(arg);
+ }
+
+ virtual
+ ~CommandObjectWatchpointEnable () {}
+
+protected:
+ virtual bool
+ DoExecute (Args& command,
+ CommandReturnObject &result)
{
- result.AppendError("No watchpoints exist to be enabled.");
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (!CheckTargetForWatchpointOperations(target, result))
+ return false;
- if (args.GetArgumentCount() == 0)
- {
- // No watchpoint selected; enable all currently set watchpoints.
- target->EnableAllWatchpoints();
- result.AppendMessageWithFormat("All watchpoints enabled. (%lu watchpoints)\n", num_watchpoints);
- result.SetStatus(eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- // Particular watchpoints selected; enable them.
- std::vector<uint32_t> wp_ids;
- if (!VerifyWatchpointIDs(args, wp_ids))
+ Mutex::Locker locker;
+ target->GetWatchpointList().GetListMutex(locker);
+
+ const WatchpointList &watchpoints = target->GetWatchpointList();
+
+ size_t num_watchpoints = watchpoints.GetSize();
+
+ if (num_watchpoints == 0)
{
- result.AppendError("Invalid watchpoints specification.");
+ result.AppendError("No watchpoints exist to be enabled.");
result.SetStatus(eReturnStatusFailed);
return false;
}
- int count = 0;
- const size_t size = wp_ids.size();
- for (size_t i = 0; i < size; ++i)
- if (target->EnableWatchpointByID(wp_ids[i]))
- ++count;
- result.AppendMessageWithFormat("%d watchpoints enabled.\n", count);
- result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ if (command.GetArgumentCount() == 0)
+ {
+ // No watchpoint selected; enable all currently set watchpoints.
+ target->EnableAllWatchpoints();
+ result.AppendMessageWithFormat("All watchpoints enabled. (%lu watchpoints)\n", num_watchpoints);
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ // Particular watchpoints selected; enable them.
+ std::vector<uint32_t> wp_ids;
+ if (!VerifyWatchpointIDs(command, wp_ids))
+ {
+ result.AppendError("Invalid watchpoints specification.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+
+ int count = 0;
+ const size_t size = wp_ids.size();
+ for (size_t i = 0; i < size; ++i)
+ if (target->EnableWatchpointByID(wp_ids[i]))
+ ++count;
+ result.AppendMessageWithFormat("%d watchpoints enabled.\n", count);
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ }
+
+ return result.Succeeded();
}
- return result.Succeeded();
-}
+private:
+};
//-------------------------------------------------------------------------
// CommandObjectWatchpointDisable
//-------------------------------------------------------------------------
#pragma mark Disable
-CommandObjectWatchpointDisable::CommandObjectWatchpointDisable(CommandInterpreter &interpreter) :
- CommandObject(interpreter,
- "watchpoint disable",
- "Disable the specified watchpoint(s) without removing it/them. If no watchpoints are specified, disable them all.",
- NULL)
+class CommandObjectWatchpointDisable : public CommandObjectParsed
{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back(arg);
-}
+public:
+ CommandObjectWatchpointDisable (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "watchpoint disable",
+ "Disable the specified watchpoint(s) without removing it/them. If no watchpoints are specified, disable them all.",
+ NULL)
+ {
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back(arg);
+ }
-CommandObjectWatchpointDisable::~CommandObjectWatchpointDisable()
-{
-}
-bool
-CommandObjectWatchpointDisable::Execute(Args& args, CommandReturnObject &result)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (!CheckTargetForWatchpointOperations(target, result))
- return false;
+ virtual
+ ~CommandObjectWatchpointDisable () {}
- Mutex::Locker locker;
- target->GetWatchpointList().GetListMutex(locker);
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
+ {
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (!CheckTargetForWatchpointOperations(target, result))
+ return false;
- const WatchpointList &watchpoints = target->GetWatchpointList();
- size_t num_watchpoints = watchpoints.GetSize();
+ Mutex::Locker locker;
+ target->GetWatchpointList().GetListMutex(locker);
- if (num_watchpoints == 0)
- {
- result.AppendError("No watchpoints exist to be disabled.");
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
+ const WatchpointList &watchpoints = target->GetWatchpointList();
+ size_t num_watchpoints = watchpoints.GetSize();
- if (args.GetArgumentCount() == 0)
- {
- // No watchpoint selected; disable all currently set watchpoints.
- if (target->DisableAllWatchpoints())
+ if (num_watchpoints == 0)
{
- result.AppendMessageWithFormat("All watchpoints disabled. (%lu watchpoints)\n", num_watchpoints);
- result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ result.AppendError("No watchpoints exist to be disabled.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
}
- else
+
+ if (command.GetArgumentCount() == 0)
{
- result.AppendError("Disable all watchpoints failed\n");
- result.SetStatus(eReturnStatusFailed);
+ // No watchpoint selected; disable all currently set watchpoints.
+ if (target->DisableAllWatchpoints())
+ {
+ result.AppendMessageWithFormat("All watchpoints disabled. (%lu watchpoints)\n", num_watchpoints);
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ result.AppendError("Disable all watchpoints failed\n");
+ result.SetStatus(eReturnStatusFailed);
+ }
}
- }
- else
- {
- // Particular watchpoints selected; disable them.
- std::vector<uint32_t> wp_ids;
- if (!VerifyWatchpointIDs(args, wp_ids))
+ else
{
- result.AppendError("Invalid watchpoints specification.");
- result.SetStatus(eReturnStatusFailed);
- return false;
+ // Particular watchpoints selected; disable them.
+ std::vector<uint32_t> wp_ids;
+ if (!VerifyWatchpointIDs(command, wp_ids))
+ {
+ result.AppendError("Invalid watchpoints specification.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+
+ int count = 0;
+ const size_t size = wp_ids.size();
+ for (size_t i = 0; i < size; ++i)
+ if (target->DisableWatchpointByID(wp_ids[i]))
+ ++count;
+ result.AppendMessageWithFormat("%d watchpoints disabled.\n", count);
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
}
- int count = 0;
- const size_t size = wp_ids.size();
- for (size_t i = 0; i < size; ++i)
- if (target->DisableWatchpointByID(wp_ids[i]))
- ++count;
- result.AppendMessageWithFormat("%d watchpoints disabled.\n", count);
- result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ return result.Succeeded();
}
- return result.Succeeded();
-}
+};
//-------------------------------------------------------------------------
// CommandObjectWatchpointDelete
//-------------------------------------------------------------------------
#pragma mark Delete
-CommandObjectWatchpointDelete::CommandObjectWatchpointDelete(CommandInterpreter &interpreter) :
- CommandObject(interpreter,
- "watchpoint delete",
- "Delete the specified watchpoint(s). If no watchpoints are specified, delete them all.",
- NULL)
-{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back(arg);
-}
-
-CommandObjectWatchpointDelete::~CommandObjectWatchpointDelete()
-{
-}
-
-bool
-CommandObjectWatchpointDelete::Execute(Args& args, CommandReturnObject &result)
+class CommandObjectWatchpointDelete : public CommandObjectParsed
{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (!CheckTargetForWatchpointOperations(target, result))
- return false;
-
- Mutex::Locker locker;
- target->GetWatchpointList().GetListMutex(locker);
-
- const WatchpointList &watchpoints = target->GetWatchpointList();
+public:
+ CommandObjectWatchpointDelete (CommandInterpreter &interpreter) :
+ CommandObjectParsed(interpreter,
+ "watchpoint delete",
+ "Delete the specified watchpoint(s). If no watchpoints are specified, delete them all.",
+ NULL)
+ {
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back(arg);
+ }
+
+ virtual
+ ~CommandObjectWatchpointDelete () {}
+
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
+ {
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (!CheckTargetForWatchpointOperations(target, result))
+ return false;
- size_t num_watchpoints = watchpoints.GetSize();
+ Mutex::Locker locker;
+ target->GetWatchpointList().GetListMutex(locker);
+
+ const WatchpointList &watchpoints = target->GetWatchpointList();
- if (num_watchpoints == 0)
- {
- result.AppendError("No watchpoints exist to be deleted.");
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
+ size_t num_watchpoints = watchpoints.GetSize();
- if (args.GetArgumentCount() == 0)
- {
- if (!m_interpreter.Confirm("About to delete all watchpoints, do you want to do that?", true))
+ if (num_watchpoints == 0)
{
- result.AppendMessage("Operation cancelled...");
+ result.AppendError("No watchpoints exist to be deleted.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
}
- else
+
+ if (command.GetArgumentCount() == 0)
{
- target->RemoveAllWatchpoints();
- result.AppendMessageWithFormat("All watchpoints removed. (%lu watchpoints)\n", num_watchpoints);
- }
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
- {
- // Particular watchpoints selected; delete them.
- std::vector<uint32_t> wp_ids;
- if (!VerifyWatchpointIDs(args, wp_ids))
+ if (!m_interpreter.Confirm("About to delete all watchpoints, do you want to do that?", true))
+ {
+ result.AppendMessage("Operation cancelled...");
+ }
+ else
+ {
+ target->RemoveAllWatchpoints();
+ result.AppendMessageWithFormat("All watchpoints removed. (%lu watchpoints)\n", num_watchpoints);
+ }
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
{
- result.AppendError("Invalid watchpoints specification.");
- result.SetStatus(eReturnStatusFailed);
- return false;
+ // Particular watchpoints selected; delete them.
+ std::vector<uint32_t> wp_ids;
+ if (!VerifyWatchpointIDs(command, wp_ids))
+ {
+ result.AppendError("Invalid watchpoints specification.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+
+ int count = 0;
+ const size_t size = wp_ids.size();
+ for (size_t i = 0; i < size; ++i)
+ if (target->RemoveWatchpointByID(wp_ids[i]))
+ ++count;
+ result.AppendMessageWithFormat("%d watchpoints deleted.\n",count);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
}
- int count = 0;
- const size_t size = wp_ids.size();
- for (size_t i = 0; i < size; ++i)
- if (target->RemoveWatchpointByID(wp_ids[i]))
- ++count;
- result.AppendMessageWithFormat("%d watchpoints deleted.\n",count);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ return result.Succeeded();
}
- return result.Succeeded();
-}
+};
//-------------------------------------------------------------------------
-// CommandObjectWatchpointIgnore::CommandOptions
+// CommandObjectWatchpointIgnore
//-------------------------------------------------------------------------
-#pragma mark Ignore::CommandOptions
-CommandObjectWatchpointIgnore::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
- Options (interpreter),
- m_ignore_count (0)
+class CommandObjectWatchpointIgnore : public CommandObjectParsed
{
-}
-
-CommandObjectWatchpointIgnore::CommandOptions::~CommandOptions ()
-{
-}
-
-OptionDefinition
-CommandObjectWatchpointIgnore::CommandOptions::g_option_table[] =
-{
- { LLDB_OPT_SET_ALL, true, "ignore-count", 'i', required_argument, NULL, NULL, eArgTypeCount, "Set the number of times this watchpoint is skipped before stopping." },
- { 0, false, NULL, 0 , 0, NULL, 0, eArgTypeNone, NULL }
-};
+public:
+ CommandObjectWatchpointIgnore (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "watchpoint ignore",
+ "Set ignore count on the specified watchpoint(s). If no watchpoints are specified, set them all.",
+ NULL),
+ m_options (interpreter)
+ {
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back(arg);
+ }
-const OptionDefinition*
-CommandObjectWatchpointIgnore::CommandOptions::GetDefinitions ()
-{
- return g_option_table;
-}
+ virtual
+ ~CommandObjectWatchpointIgnore () {}
-Error
-CommandObjectWatchpointIgnore::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
-{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_options;
+ }
- switch (short_option)
+ class CommandOptions : public Options
{
- case 'i':
+ public:
+
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options (interpreter),
+ m_ignore_count (0)
{
- m_ignore_count = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
- if (m_ignore_count == UINT32_MAX)
- error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg);
}
- break;
- default:
- error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
- break;
- }
- return error;
-}
+ virtual
+ ~CommandOptions () {}
-void
-CommandObjectWatchpointIgnore::CommandOptions::OptionParsingStarting ()
-{
- m_ignore_count = 0;
-}
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
+ {
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointIgnore
-//-------------------------------------------------------------------------
-#pragma mark Ignore
+ switch (short_option)
+ {
+ case 'i':
+ {
+ m_ignore_count = Args::StringToUInt32(option_arg, UINT32_MAX, 0);
+ if (m_ignore_count == UINT32_MAX)
+ error.SetErrorStringWithFormat ("invalid ignore count '%s'", option_arg);
+ }
+ break;
+ default:
+ error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
+ break;
+ }
-CommandObjectWatchpointIgnore::CommandObjectWatchpointIgnore(CommandInterpreter &interpreter) :
- CommandObject(interpreter,
- "watchpoint ignore",
- "Set ignore count on the specified watchpoint(s). If no watchpoints are specified, set them all.",
- NULL),
- m_options (interpreter)
-{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back(arg);
-}
+ return error;
+ }
-CommandObjectWatchpointIgnore::~CommandObjectWatchpointIgnore()
-{
-}
+ void
+ OptionParsingStarting ()
+ {
+ m_ignore_count = 0;
+ }
-Options *
-CommandObjectWatchpointIgnore::GetOptions ()
-{
- return &m_options;
-}
+ const OptionDefinition *
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
-bool
-CommandObjectWatchpointIgnore::Execute(Args& args, CommandReturnObject &result)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (!CheckTargetForWatchpointOperations(target, result))
- return false;
- Mutex::Locker locker;
- target->GetWatchpointList().GetListMutex(locker);
-
- const WatchpointList &watchpoints = target->GetWatchpointList();
+ // Options table: Required for subclasses of Options.
- size_t num_watchpoints = watchpoints.GetSize();
+ static OptionDefinition g_option_table[];
- if (num_watchpoints == 0)
- {
- result.AppendError("No watchpoints exist to be ignored.");
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
+ // Instance variables to hold the values for command options.
- if (args.GetArgumentCount() == 0)
- {
- target->IgnoreAllWatchpoints(m_options.m_ignore_count);
- result.AppendMessageWithFormat("All watchpoints ignored. (%lu watchpoints)\n", num_watchpoints);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- else
+ uint32_t m_ignore_count;
+ };
+
+protected:
+ virtual bool
+ DoExecute (Args& command,
+ CommandReturnObject &result)
{
- // Particular watchpoints selected; ignore them.
- std::vector<uint32_t> wp_ids;
- if (!VerifyWatchpointIDs(args, wp_ids))
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (!CheckTargetForWatchpointOperations(target, result))
+ return false;
+
+ Mutex::Locker locker;
+ target->GetWatchpointList().GetListMutex(locker);
+
+ const WatchpointList &watchpoints = target->GetWatchpointList();
+
+ size_t num_watchpoints = watchpoints.GetSize();
+
+ if (num_watchpoints == 0)
{
- result.AppendError("Invalid watchpoints specification.");
+ result.AppendError("No watchpoints exist to be ignored.");
result.SetStatus(eReturnStatusFailed);
return false;
}
- int count = 0;
- const size_t size = wp_ids.size();
- for (size_t i = 0; i < size; ++i)
- if (target->IgnoreWatchpointByID(wp_ids[i], m_options.m_ignore_count))
- ++count;
- result.AppendMessageWithFormat("%d watchpoints ignored.\n",count);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
-
- return result.Succeeded();
-}
+ if (command.GetArgumentCount() == 0)
+ {
+ target->IgnoreAllWatchpoints(m_options.m_ignore_count);
+ result.AppendMessageWithFormat("All watchpoints ignored. (%lu watchpoints)\n", num_watchpoints);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ // Particular watchpoints selected; ignore them.
+ std::vector<uint32_t> wp_ids;
+ if (!VerifyWatchpointIDs(command, wp_ids))
+ {
+ result.AppendError("Invalid watchpoints specification.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointModify::CommandOptions
-//-------------------------------------------------------------------------
-#pragma mark Modify::CommandOptions
+ int count = 0;
+ const size_t size = wp_ids.size();
+ for (size_t i = 0; i < size; ++i)
+ if (target->IgnoreWatchpointByID(wp_ids[i], m_options.m_ignore_count))
+ ++count;
+ result.AppendMessageWithFormat("%d watchpoints ignored.\n",count);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
-CommandObjectWatchpointModify::CommandOptions::CommandOptions(CommandInterpreter &interpreter) :
- Options (interpreter),
- m_condition (),
- m_condition_passed (false)
-{
-}
+ return result.Succeeded();
+ }
-CommandObjectWatchpointModify::CommandOptions::~CommandOptions ()
-{
-}
+private:
+ CommandOptions m_options;
+};
+#pragma mark Ignore::CommandOptions
OptionDefinition
-CommandObjectWatchpointModify::CommandOptions::g_option_table[] =
+CommandObjectWatchpointIgnore::CommandOptions::g_option_table[] =
{
-{ LLDB_OPT_SET_ALL, false, "condition", 'c', required_argument, NULL, NULL, eArgTypeExpression, "The watchpoint stops only if this condition expression evaluates to true."},
-{ 0, false, NULL, 0 , 0, NULL, 0, eArgTypeNone, NULL }
+ { LLDB_OPT_SET_ALL, true, "ignore-count", 'i', required_argument, NULL, NULL, eArgTypeCount, "Set the number of times this watchpoint is skipped before stopping." },
+ { 0, false, NULL, 0 , 0, NULL, 0, eArgTypeNone, NULL }
};
-const OptionDefinition*
-CommandObjectWatchpointModify::CommandOptions::GetDefinitions ()
-{
- return g_option_table;
-}
-
-Error
-CommandObjectWatchpointModify::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
-{
- Error error;
- char short_option = (char) m_getopt_table[option_idx].val;
-
- switch (short_option)
- {
- case 'c':
- if (option_arg != NULL)
- m_condition.assign (option_arg);
- else
- m_condition.clear();
- m_condition_passed = true;
- break;
- default:
- error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
- break;
- }
-
- return error;
-}
-
-void
-CommandObjectWatchpointModify::CommandOptions::OptionParsingStarting ()
-{
- m_condition.clear();
- m_condition_passed = false;
-}
//-------------------------------------------------------------------------
// CommandObjectWatchpointModify
//-------------------------------------------------------------------------
#pragma mark Modify
-CommandObjectWatchpointModify::CommandObjectWatchpointModify (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "watchpoint modify",
- "Modify the options on a watchpoint or set of watchpoints in the executable. "
- "If no watchpoint is specified, act on the last created watchpoint. "
- "Passing an empty argument clears the modification.",
- NULL),
- m_options (interpreter)
+class CommandObjectWatchpointModify : public CommandObjectParsed
{
- CommandArgumentEntry arg;
- CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
- // Add the entry for the first argument for this command to the object's arguments vector.
- m_arguments.push_back (arg);
-}
+public:
-CommandObjectWatchpointModify::~CommandObjectWatchpointModify ()
-{
-}
-
-Options *
-CommandObjectWatchpointModify::GetOptions ()
-{
- return &m_options;
-}
-
-bool
-CommandObjectWatchpointModify::Execute
-(
- Args& args,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- if (!CheckTargetForWatchpointOperations(target, result))
- return false;
-
- Mutex::Locker locker;
- target->GetWatchpointList().GetListMutex(locker);
-
- const WatchpointList &watchpoints = target->GetWatchpointList();
-
- size_t num_watchpoints = watchpoints.GetSize();
-
- if (num_watchpoints == 0)
+ CommandObjectWatchpointModify (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "watchpoint modify",
+ "Modify the options on a watchpoint or set of watchpoints in the executable. "
+ "If no watchpoint is specified, act on the last created watchpoint. "
+ "Passing an empty argument clears the modification.",
+ NULL),
+ m_options (interpreter)
{
- result.AppendError("No watchpoints exist to be modified.");
- result.SetStatus(eReturnStatusFailed);
- return false;
+ CommandArgumentEntry arg;
+ CommandObject::AddIDsArgumentData(arg, eArgTypeWatchpointID, eArgTypeWatchpointIDRange);
+ // Add the entry for the first argument for this command to the object's arguments vector.
+ m_arguments.push_back (arg);
}
- if (args.GetArgumentCount() == 0)
+ virtual
+ ~CommandObjectWatchpointModify () {}
+
+ virtual Options *
+ GetOptions ()
{
- WatchpointSP wp_sp = target->GetLastCreatedWatchpoint();
- wp_sp->SetCondition(m_options.m_condition.c_str());
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ return &m_options;
}
- else
+
+ class CommandOptions : public Options
{
- // Particular watchpoints selected; set condition on them.
- std::vector<uint32_t> wp_ids;
- if (!VerifyWatchpointIDs(args, wp_ids))
+ public:
+
+ CommandOptions (CommandInterpreter &interpreter) :
+ Options (interpreter),
+ m_condition (),
+ m_condition_passed (false)
{
- result.AppendError("Invalid watchpoints specification.");
- result.SetStatus(eReturnStatusFailed);
- return false;
}
- int count = 0;
- const size_t size = wp_ids.size();
- for (size_t i = 0; i < size; ++i)
+ virtual
+ ~CommandOptions () {}
+
+ virtual Error
+ SetOptionValue (uint32_t option_idx, const char *option_arg)
{
- WatchpointSP wp_sp = watchpoints.FindByID(wp_ids[i]);
- if (wp_sp)
+ Error error;
+ char short_option = (char) m_getopt_table[option_idx].val;
+
+ switch (short_option)
{
- wp_sp->SetCondition(m_options.m_condition.c_str());
- ++count;
+ case 'c':
+ if (option_arg != NULL)
+ m_condition.assign (option_arg);
+ else
+ m_condition.clear();
+ m_condition_passed = true;
+ break;
+ default:
+ error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
+ break;
}
+
+ return error;
}
- result.AppendMessageWithFormat("%d watchpoints modified.\n",count);
- result.SetStatus (eReturnStatusSuccessFinishNoResult);
- }
- return result.Succeeded();
-}
+ void
+ OptionParsingStarting ()
+ {
+ m_condition.clear();
+ m_condition_passed = false;
+ }
+
+ const OptionDefinition*
+ GetDefinitions ()
+ {
+ return g_option_table;
+ }
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointSet
-//-------------------------------------------------------------------------
+ // Options table: Required for subclasses of Options.
-CommandObjectWatchpointSet::CommandObjectWatchpointSet (CommandInterpreter &interpreter) :
- CommandObjectMultiword (interpreter,
- "watchpoint set",
- "A set of commands for setting a watchpoint.",
- "watchpoint set <subcommand> [<subcommand-options>]")
-{
-
- LoadSubCommand ("variable", CommandObjectSP (new CommandObjectWatchpointSetVariable (interpreter)));
- LoadSubCommand ("expression", CommandObjectSP (new CommandObjectWatchpointSetExpression (interpreter)));
-}
+ static OptionDefinition g_option_table[];
-CommandObjectWatchpointSet::~CommandObjectWatchpointSet ()
-{
-}
+ // Instance variables to hold the values for command options.
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointSetVariable
-//-------------------------------------------------------------------------
-#pragma mark Set
+ std::string m_condition;
+ bool m_condition_passed;
+ };
-CommandObjectWatchpointSetVariable::CommandObjectWatchpointSetVariable (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "watchpoint set variable",
- "Set a watchpoint on a variable. "
- "Use the '-w' option to specify the type of watchpoint and "
- "the '-x' option to specify the byte size to watch for. "
- "If no '-w' option is specified, it defaults to read_write. "
- "If no '-x' option is specified, it defaults to the variable's "
- "byte size. "
- "Note that there are limited hardware resources for watchpoints. "
- "If watchpoint setting fails, consider disable/delete existing ones "
- "to free up resources.",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
- m_option_group (interpreter),
- m_option_watchpoint ()
-{
- SetHelpLong(
-"Examples: \n\
-\n\
- watchpoint set variable -w read_wriate my_global_var \n\
- # Watch my_global_var for read/write access, with the region to watch corresponding to the byte size of the data type.\n");
+protected:
+ virtual bool
+ DoExecute (Args& command, CommandReturnObject &result)
+ {
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ if (!CheckTargetForWatchpointOperations(target, result))
+ return false;
- CommandArgumentEntry arg;
- CommandArgumentData var_name_arg;
+ Mutex::Locker locker;
+ target->GetWatchpointList().GetListMutex(locker);
- // Define the only variant of this arg.
- var_name_arg.arg_type = eArgTypeVarName;
- var_name_arg.arg_repetition = eArgRepeatPlain;
+ const WatchpointList &watchpoints = target->GetWatchpointList();
- // Push the variant into the argument entry.
- arg.push_back (var_name_arg);
-
- // Push the data for the only argument into the m_arguments vector.
- m_arguments.push_back (arg);
+ size_t num_watchpoints = watchpoints.GetSize();
- // Absorb the '-w' and '-x' options into our option group.
- m_option_group.Append (&m_option_watchpoint, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
- m_option_group.Finalize();
-}
+ if (num_watchpoints == 0)
+ {
+ result.AppendError("No watchpoints exist to be modified.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
-CommandObjectWatchpointSetVariable::~CommandObjectWatchpointSetVariable ()
-{
-}
+ if (command.GetArgumentCount() == 0)
+ {
+ WatchpointSP wp_sp = target->GetLastCreatedWatchpoint();
+ wp_sp->SetCondition(m_options.m_condition.c_str());
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ // Particular watchpoints selected; set condition on them.
+ std::vector<uint32_t> wp_ids;
+ if (!VerifyWatchpointIDs(command, wp_ids))
+ {
+ result.AppendError("Invalid watchpoints specification.");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
-Options *
-CommandObjectWatchpointSetVariable::GetOptions ()
-{
- return &m_option_group;
-}
+ int count = 0;
+ const size_t size = wp_ids.size();
+ for (size_t i = 0; i < size; ++i)
+ {
+ WatchpointSP wp_sp = watchpoints.FindByID(wp_ids[i]);
+ if (wp_sp)
+ {
+ wp_sp->SetCondition(m_options.m_condition.c_str());
+ ++count;
+ }
+ }
+ result.AppendMessageWithFormat("%d watchpoints modified.\n",count);
+ result.SetStatus (eReturnStatusSuccessFinishNoResult);
+ }
-bool
-CommandObjectWatchpointSetVariable::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
- StackFrame *frame = exe_ctx.GetFramePtr();
- if (frame == NULL)
- {
- result.AppendError ("you must be stopped in a valid stack frame to set a watchpoint.");
- result.SetStatus (eReturnStatusFailed);
- return false;
+ return result.Succeeded();
}
- // If no argument is present, issue an error message. There's no way to set a watchpoint.
- if (command.GetArgumentCount() <= 0)
- {
- result.GetErrorStream().Printf("error: required argument missing; specify your program variable to watch for\n");
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
+private:
+ CommandOptions m_options;
+};
- // If no '-w' is specified, default to '-w read_write'.
- if (!m_option_watchpoint.watch_type_specified)
- {
- m_option_watchpoint.watch_type = OptionGroupWatchpoint::eWatchReadWrite;
- }
+#pragma mark Modify::CommandOptions
+OptionDefinition
+CommandObjectWatchpointModify::CommandOptions::g_option_table[] =
+{
+{ LLDB_OPT_SET_ALL, false, "condition", 'c', required_argument, NULL, NULL, eArgTypeExpression, "The watchpoint stops only if this condition expression evaluates to true."},
+{ 0, false, NULL, 0 , 0, NULL, 0, eArgTypeNone, NULL }
+};
- // We passed the sanity check for the command.
- // Proceed to set the watchpoint now.
- lldb::addr_t addr = 0;
- size_t size = 0;
+//-------------------------------------------------------------------------
+// CommandObjectWatchpointSetVariable
+//-------------------------------------------------------------------------
+#pragma mark SetVariable
- VariableSP var_sp;
- ValueObjectSP valobj_sp;
- Stream &output_stream = result.GetOutputStream();
+class CommandObjectWatchpointSetVariable : public CommandObjectParsed
+{
+public:
- // A simple watch variable gesture allows only one argument.
- if (command.GetArgumentCount() != 1) {
- result.GetErrorStream().Printf("error: specify exactly one variable to watch for\n");
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
+ CommandObjectWatchpointSetVariable (CommandInterpreter &interpreter) :
+ CommandObjectParsed (interpreter,
+ "watchpoint set variable",
+ "Set a watchpoint on a variable. "
+ "Use the '-w' option to specify the type of watchpoint and "
+ "the '-x' option to specify the byte size to watch for. "
+ "If no '-w' option is specified, it defaults to read_write. "
+ "If no '-x' option is specified, it defaults to the variable's "
+ "byte size. "
+ "Note that there are limited hardware resources for watchpoints. "
+ "If watchpoint setting fails, consider disable/delete existing ones "
+ "to free up resources.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
+ m_option_group (interpreter),
+ m_option_watchpoint ()
+ {
+ SetHelpLong(
+ "Examples: \n\
+ \n\
+ watchpoint set variable -w read_wriate my_global_var \n\
+ # Watch my_global_var for read/write access, with the region to watch corresponding to the byte size of the data type.\n");
+
+ CommandArgumentEntry arg;
+ CommandArgumentData var_name_arg;
+
+ // Define the only variant of this arg.
+ var_name_arg.arg_type = eArgTypeVarName;
+ var_name_arg.arg_repetition = eArgRepeatPlain;
+
+ // Push the variant into the argument entry.
+ arg.push_back (var_name_arg);
+
+ // Push the data for the only argument into the m_arguments vector.
+ m_arguments.push_back (arg);
+
+ // Absorb the '-w' and '-x' options into our option group.
+ m_option_group.Append (&m_option_watchpoint, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
+ m_option_group.Finalize();
+ }
+
+ virtual
+ ~CommandObjectWatchpointSetVariable () {}
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_option_group;
+ }
+
+protected:
+ virtual bool
+ DoExecute (Args& command,
+ CommandReturnObject &result)
+ {
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
+ StackFrame *frame = exe_ctx.GetFramePtr();
+ if (frame == NULL)
+ {
+ result.AppendError ("you must be stopped in a valid stack frame to set a watchpoint.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- // Things have checked out ok...
- Error error;
- uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember;
- valobj_sp = frame->GetValueForVariableExpressionPath (command.GetArgumentAtIndex(0),
- eNoDynamicValues,
- expr_path_options,
- var_sp,
- error);
- if (valobj_sp) {
- AddressType addr_type;
- addr = valobj_sp->GetAddressOf(false, &addr_type);
- if (addr_type == eAddressTypeLoad) {
- // We're in business.
- // Find out the size of this variable.
- size = m_option_watchpoint.watch_size == 0 ? valobj_sp->GetByteSize()
- : m_option_watchpoint.watch_size;
- }
- } 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",
- command.GetArgumentAtIndex(0));
- return false;
- }
+ // If no argument is present, issue an error message. There's no way to set a watchpoint.
+ if (command.GetArgumentCount() <= 0)
+ {
+ result.GetErrorStream().Printf("error: required argument missing; specify your program variable to watch for\n");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
- // Now it's time to create the watchpoint.
- uint32_t watch_type = m_option_watchpoint.watch_type;
- error.Clear();
- Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type, error).get();
- if (wp) {
- if (var_sp && var_sp->GetDeclaration().GetFile()) {
+ // If no '-w' is specified, default to '-w read_write'.
+ if (!m_option_watchpoint.watch_type_specified)
+ {
+ m_option_watchpoint.watch_type = OptionGroupWatchpoint::eWatchReadWrite;
+ }
+
+ // We passed the sanity check for the command.
+ // Proceed to set the watchpoint now.
+ lldb::addr_t addr = 0;
+ size_t size = 0;
+
+ VariableSP var_sp;
+ ValueObjectSP valobj_sp;
+ Stream &output_stream = result.GetOutputStream();
+
+ // A simple watch variable gesture allows only one argument.
+ if (command.GetArgumentCount() != 1) {
+ result.GetErrorStream().Printf("error: specify exactly one variable to watch for\n");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+
+ // Things have checked out ok...
+ Error error;
+ uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember;
+ valobj_sp = frame->GetValueForVariableExpressionPath (command.GetArgumentAtIndex(0),
+ eNoDynamicValues,
+ expr_path_options,
+ var_sp,
+ error);
+ if (valobj_sp) {
+ AddressType addr_type;
+ addr = valobj_sp->GetAddressOf(false, &addr_type);
+ if (addr_type == eAddressTypeLoad) {
+ // We're in business.
+ // Find out the size of this variable.
+ size = m_option_watchpoint.watch_size == 0 ? valobj_sp->GetByteSize()
+ : m_option_watchpoint.watch_size;
+ }
+ } 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",
+ command.GetArgumentAtIndex(0));
+ return false;
+ }
+
+ // Now it's time to create the watchpoint.
+ uint32_t watch_type = m_option_watchpoint.watch_type;
+ error.Clear();
+ Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type, error).get();
+ if (wp) {
+ if (var_sp && var_sp->GetDeclaration().GetFile()) {
+ StreamString ss;
+ // True to show fullpath for declaration file.
+ var_sp->GetDeclaration().DumpStopContext(&ss, true);
+ wp->SetDeclInfo(ss.GetString());
+ }
StreamString ss;
- // True to show fullpath for declaration file.
- var_sp->GetDeclaration().DumpStopContext(&ss, true);
- wp->SetDeclInfo(ss.GetString());
- }
- StreamString ss;
- output_stream.Printf("Watchpoint created: ");
- wp->GetDescription(&output_stream, lldb::eDescriptionLevelFull);
- output_stream.EOL();
- result.SetStatus(eReturnStatusSuccessFinishResult);
- } else {
- result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n",
- addr, size);
- if (error.AsCString(NULL))
- result.AppendError(error.AsCString());
- result.SetStatus(eReturnStatusFailed);
+ output_stream.Printf("Watchpoint created: ");
+ wp->GetDescription(&output_stream, lldb::eDescriptionLevelFull);
+ output_stream.EOL();
+ result.SetStatus(eReturnStatusSuccessFinishResult);
+ } else {
+ result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n",
+ addr, size);
+ if (error.AsCString(NULL))
+ result.AppendError(error.AsCString());
+ result.SetStatus(eReturnStatusFailed);
+ }
+
+ return result.Succeeded();
}
- return result.Succeeded();
-}
+private:
+ OptionGroupOptions m_option_group;
+ OptionGroupWatchpoint m_option_watchpoint;
+};
//-------------------------------------------------------------------------
// CommandObjectWatchpointSetExpression
//-------------------------------------------------------------------------
#pragma mark Set
-CommandObjectWatchpointSetExpression::CommandObjectWatchpointSetExpression (CommandInterpreter &interpreter) :
- CommandObject (interpreter,
- "watchpoint set expression",
- "Set a watchpoint on an address by supplying an expression. "
- "Use the '-w' option to specify the type of watchpoint and "
- "the '-x' option to specify the byte size to watch for. "
- "If no '-w' option is specified, it defaults to read_write. "
- "If no '-x' option is specified, it defaults to the target's "
- "pointer byte size. "
- "Note that there are limited hardware resources for watchpoints. "
- "If watchpoint setting fails, consider disable/delete existing ones "
- "to free up resources.",
- NULL,
- eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
- m_option_group (interpreter),
- m_option_watchpoint ()
+class CommandObjectWatchpointSetExpression : public CommandObjectRaw
{
- SetHelpLong(
-"Examples: \n\
-\n\
- watchpoint set expression -w write -x 1 -- foo + 32\n\
- # Watch write access for the 1-byte region pointed to by the address 'foo + 32'.\n");
+public:
- CommandArgumentEntry arg;
- CommandArgumentData expression_arg;
-
- // Define the only variant of this arg.
- expression_arg.arg_type = eArgTypeExpression;
- expression_arg.arg_repetition = eArgRepeatPlain;
+ CommandObjectWatchpointSetExpression (CommandInterpreter &interpreter) :
+ CommandObjectRaw (interpreter,
+ "watchpoint set expression",
+ "Set a watchpoint on an address by supplying an expression. "
+ "Use the '-w' option to specify the type of watchpoint and "
+ "the '-x' option to specify the byte size to watch for. "
+ "If no '-w' option is specified, it defaults to read_write. "
+ "If no '-x' option is specified, it defaults to the target's "
+ "pointer byte size. "
+ "Note that there are limited hardware resources for watchpoints. "
+ "If watchpoint setting fails, consider disable/delete existing ones "
+ "to free up resources.",
+ NULL,
+ eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
+ m_option_group (interpreter),
+ m_option_watchpoint ()
+ {
+ SetHelpLong(
+ "Examples: \n\
+ \n\
+ watchpoint set expression -w write -x 1 -- foo + 32\n\
+ # Watch write access for the 1-byte region pointed to by the address 'foo + 32'.\n");
+
+ CommandArgumentEntry arg;
+ CommandArgumentData expression_arg;
+
+ // Define the only variant of this arg.
+ expression_arg.arg_type = eArgTypeExpression;
+ expression_arg.arg_repetition = eArgRepeatPlain;
+
+ // Push the only variant into the argument entry.
+ arg.push_back (expression_arg);
+
+ // Push the data for the only argument into the m_arguments vector.
+ m_arguments.push_back (arg);
+
+ // Absorb the '-w' and '-x' options into our option group.
+ m_option_group.Append (&m_option_watchpoint, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
+ m_option_group.Finalize();
+ }
+
+
+ virtual
+ ~CommandObjectWatchpointSetExpression () {}
+
+ // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
+ virtual bool
+ WantsCompletion() { return true; }
+
+ virtual Options *
+ GetOptions ()
+ {
+ return &m_option_group;
+ }
+
+protected:
+ virtual bool
+ DoExecute (const char *raw_command, CommandReturnObject &result)
+ {
+ Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
+ ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
+ StackFrame *frame = exe_ctx.GetFramePtr();
+ if (frame == NULL)
+ {
+ result.AppendError ("you must be stopped in a valid stack frame to set a watchpoint.");
+ result.SetStatus (eReturnStatusFailed);
+ return false;
+ }
- // Push the only variant into the argument entry.
- arg.push_back (expression_arg);
-
- // Push the data for the only argument into the m_arguments vector.
- m_arguments.push_back (arg);
+ Args command(raw_command);
- // Absorb the '-w' and '-x' options into our option group.
- m_option_group.Append (&m_option_watchpoint, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
- m_option_group.Finalize();
-}
+ // Process possible options.
+ if (!ParseOptions (command, result))
+ return false;
-CommandObjectWatchpointSetExpression::~CommandObjectWatchpointSetExpression ()
-{
-}
+ // If no argument is present, issue an error message. There's no way to set a watchpoint.
+ if (command.GetArgumentCount() <= 0)
+ {
+ result.GetErrorStream().Printf("error: required argument missing; specify an expression to evaulate into the addres to watch for\n");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
-Options *
-CommandObjectWatchpointSetExpression::GetOptions ()
-{
- return &m_option_group;
-}
+ bool with_dash_w = m_option_watchpoint.watch_type_specified;
+ bool with_dash_x = (m_option_watchpoint.watch_size != 0);
-#include "llvm/ADT/StringRef.h"
-static inline void StripLeadingSpaces(llvm::StringRef &Str)
-{
- while (!Str.empty() && isspace(Str[0]))
- Str = Str.substr(1);
-}
-static inline llvm::StringRef StripOptionTerminator(llvm::StringRef &Str, bool with_dash_w, bool with_dash_x)
-{
- llvm::StringRef ExprStr = Str;
+ // If no '-w' is specified, default to '-w read_write'.
+ if (!with_dash_w)
+ {
+ m_option_watchpoint.watch_type = OptionGroupWatchpoint::eWatchReadWrite;
+ }
- // Get rid of the leading spaces first.
- StripLeadingSpaces(ExprStr);
+ // We passed the sanity check for the command.
+ // Proceed to set the watchpoint now.
+ lldb::addr_t addr = 0;
+ size_t size = 0;
+
+ VariableSP var_sp;
+ ValueObjectSP valobj_sp;
+ Stream &output_stream = result.GetOutputStream();
+
+ // We will process the raw command string to rid of the '-w', '-x', or '--'
+ llvm::StringRef raw_expr_str(raw_command);
+ std::string expr_str = StripOptionTerminator(raw_expr_str, with_dash_w, with_dash_x).str();
- // If there's no '-w' and no '-x', we can just return.
- if (!with_dash_w && !with_dash_x)
- return ExprStr;
+ // Sanity check for when the user forgets to terminate the option strings with a '--'.
+ if ((with_dash_w || with_dash_w) && expr_str.empty())
+ {
+ result.GetErrorStream().Printf("error: did you forget to enter the option terminator string \"--\"?\n");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
- // Otherwise, split on the "--" option terminator string, and return the rest of the string.
- ExprStr = ExprStr.split("--").second;
- StripLeadingSpaces(ExprStr);
- return ExprStr;
-}
-bool
-CommandObjectWatchpointSetExpression::ExecuteRawCommandString
-(
- const char *raw_command,
- CommandReturnObject &result
-)
-{
- Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
- ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
- StackFrame *frame = exe_ctx.GetFramePtr();
- if (frame == NULL)
- {
- result.AppendError ("you must be stopped in a valid stack frame to set a watchpoint.");
- result.SetStatus (eReturnStatusFailed);
- return false;
- }
+ // Use expression evaluation to arrive at the address to watch.
+ const bool coerce_to_id = true;
+ const bool unwind_on_error = true;
+ const bool keep_in_memory = false;
+ ExecutionResults expr_result = target->EvaluateExpression (expr_str.c_str(),
+ frame,
+ eExecutionPolicyOnlyWhenNeeded,
+ coerce_to_id,
+ unwind_on_error,
+ keep_in_memory,
+ eNoDynamicValues,
+ valobj_sp);
+ if (expr_result != eExecutionCompleted) {
+ result.GetErrorStream().Printf("error: expression evaluation of address to watch failed\n");
+ result.GetErrorStream().Printf("expression evaluated: %s\n", expr_str.c_str());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
- Args command(raw_command);
+ // Get the address to watch.
+ bool success = false;
+ addr = valobj_sp->GetValueAsUnsigned(0, &success);
+ if (!success) {
+ result.GetErrorStream().Printf("error: expression did not evaluate to an address\n");
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+ size = with_dash_x ? m_option_watchpoint.watch_size
+ : target->GetArchitecture().GetAddressByteSize();
- // Process possible options.
- if (!ParseOptions (command, result))
- return false;
+ // Now it's time to create the watchpoint.
+ uint32_t watch_type = m_option_watchpoint.watch_type;
+ Error error;
+ Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type, error).get();
+ if (wp) {
+ if (var_sp && var_sp->GetDeclaration().GetFile()) {
+ StreamString ss;
+ // True to show fullpath for declaration file.
+ var_sp->GetDeclaration().DumpStopContext(&ss, true);
+ wp->SetDeclInfo(ss.GetString());
+ }
+ StreamString ss;
+ output_stream.Printf("Watchpoint created: ");
+ wp->GetDescription(&output_stream, lldb::eDescriptionLevelFull);
+ output_stream.EOL();
+ result.SetStatus(eReturnStatusSuccessFinishResult);
+ } else {
+ result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n",
+ addr, size);
+ if (error.AsCString(NULL))
+ result.AppendError(error.AsCString());
+ result.SetStatus(eReturnStatusFailed);
+ }
- // If no argument is present, issue an error message. There's no way to set a watchpoint.
- if (command.GetArgumentCount() <= 0)
- {
- result.GetErrorStream().Printf("error: required argument missing; specify an expression to evaulate into the addres to watch for\n");
- result.SetStatus(eReturnStatusFailed);
- return false;
+ return result.Succeeded();
}
- bool with_dash_w = m_option_watchpoint.watch_type_specified;
- bool with_dash_x = (m_option_watchpoint.watch_size != 0);
+private:
+ OptionGroupOptions m_option_group;
+ OptionGroupWatchpoint m_option_watchpoint;
+};
- // If no '-w' is specified, default to '-w read_write'.
- if (!with_dash_w)
+//-------------------------------------------------------------------------
+// CommandObjectWatchpointSet
+//-------------------------------------------------------------------------
+#pragma mark Set
+
+class CommandObjectWatchpointSet : public CommandObjectMultiword
+{
+public:
+
+ CommandObjectWatchpointSet (CommandInterpreter &interpreter) :
+ CommandObjectMultiword (interpreter,
+ "watchpoint set",
+ "A set of commands for setting a watchpoint.",
+ "watchpoint set <subcommand> [<subcommand-options>]")
{
- m_option_watchpoint.watch_type = OptionGroupWatchpoint::eWatchReadWrite;
+
+ LoadSubCommand ("variable", CommandObjectSP (new CommandObjectWatchpointSetVariable (interpreter)));
+ LoadSubCommand ("expression", CommandObjectSP (new CommandObjectWatchpointSetExpression (interpreter)));
}
- // We passed the sanity check for the command.
- // Proceed to set the watchpoint now.
- lldb::addr_t addr = 0;
- size_t size = 0;
- VariableSP var_sp;
- ValueObjectSP valobj_sp;
- Stream &output_stream = result.GetOutputStream();
+ virtual
+ ~CommandObjectWatchpointSet () {}
- // We will process the raw command string to rid of the '-w', '-x', or '--'
- llvm::StringRef raw_expr_str(raw_command);
- std::string expr_str = StripOptionTerminator(raw_expr_str, with_dash_w, with_dash_x).str();
+};
- // Sanity check for when the user forgets to terminate the option strings with a '--'.
- if ((with_dash_w || with_dash_w) && expr_str.empty())
- {
- result.GetErrorStream().Printf("error: did you forget to enter the option terminator string \"--\"?\n");
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
+//-------------------------------------------------------------------------
+// CommandObjectMultiwordWatchpoint
+//-------------------------------------------------------------------------
+#pragma mark MultiwordWatchpoint
- // Use expression evaluation to arrive at the address to watch.
- const bool coerce_to_id = true;
- const bool unwind_on_error = true;
- const bool keep_in_memory = false;
- ExecutionResults expr_result = target->EvaluateExpression (expr_str.c_str(),
- frame,
- eExecutionPolicyOnlyWhenNeeded,
- coerce_to_id,
- unwind_on_error,
- keep_in_memory,
- eNoDynamicValues,
- valobj_sp);
- if (expr_result != eExecutionCompleted) {
- result.GetErrorStream().Printf("error: expression evaluation of address to watch failed\n");
- result.GetErrorStream().Printf("expression evaluated: %s\n", expr_str.c_str());
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
+CommandObjectMultiwordWatchpoint::CommandObjectMultiwordWatchpoint(CommandInterpreter &interpreter) :
+ CommandObjectMultiword (interpreter,
+ "watchpoint",
+ "A set of commands for operating on watchpoints.",
+ "watchpoint <command> [<command-options>]")
+{
+ bool status;
- // Get the address to watch.
- bool success = false;
- addr = valobj_sp->GetValueAsUnsigned(0, &success);
- if (!success) {
- result.GetErrorStream().Printf("error: expression did not evaluate to an address\n");
- result.SetStatus(eReturnStatusFailed);
- return false;
- }
- size = with_dash_x ? m_option_watchpoint.watch_size
- : target->GetArchitecture().GetAddressByteSize();
+ CommandObjectSP list_command_object (new CommandObjectWatchpointList (interpreter));
+ CommandObjectSP enable_command_object (new CommandObjectWatchpointEnable (interpreter));
+ CommandObjectSP disable_command_object (new CommandObjectWatchpointDisable (interpreter));
+ CommandObjectSP delete_command_object (new CommandObjectWatchpointDelete (interpreter));
+ CommandObjectSP ignore_command_object (new CommandObjectWatchpointIgnore (interpreter));
+ CommandObjectSP modify_command_object (new CommandObjectWatchpointModify (interpreter));
+ CommandObjectSP set_command_object (new CommandObjectWatchpointSet (interpreter));
- // Now it's time to create the watchpoint.
- uint32_t watch_type = m_option_watchpoint.watch_type;
- Error error;
- Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type, error).get();
- if (wp) {
- if (var_sp && var_sp->GetDeclaration().GetFile()) {
- StreamString ss;
- // True to show fullpath for declaration file.
- var_sp->GetDeclaration().DumpStopContext(&ss, true);
- wp->SetDeclInfo(ss.GetString());
- }
- StreamString ss;
- output_stream.Printf("Watchpoint created: ");
- wp->GetDescription(&output_stream, lldb::eDescriptionLevelFull);
- output_stream.EOL();
- result.SetStatus(eReturnStatusSuccessFinishResult);
- } else {
- result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n",
- addr, size);
- if (error.AsCString(NULL))
- result.AppendError(error.AsCString());
- result.SetStatus(eReturnStatusFailed);
- }
+ list_command_object->SetCommandName ("watchpoint list");
+ enable_command_object->SetCommandName("watchpoint enable");
+ disable_command_object->SetCommandName("watchpoint disable");
+ delete_command_object->SetCommandName("watchpoint delete");
+ ignore_command_object->SetCommandName("watchpoint ignore");
+ modify_command_object->SetCommandName("watchpoint modify");
+ set_command_object->SetCommandName("watchpoint set");
- return result.Succeeded();
+ status = LoadSubCommand ("list", list_command_object);
+ status = LoadSubCommand ("enable", enable_command_object);
+ status = LoadSubCommand ("disable", disable_command_object);
+ status = LoadSubCommand ("delete", delete_command_object);
+ status = LoadSubCommand ("ignore", ignore_command_object);
+ status = LoadSubCommand ("modify", modify_command_object);
+ status = LoadSubCommand ("set", set_command_object);
}
+
+CommandObjectMultiwordWatchpoint::~CommandObjectMultiwordWatchpoint()
+{
+}
+
Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.h (original)
+++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectWatchpoint.h Fri Jun 8 19:52:06 2012
@@ -34,285 +34,6 @@
~CommandObjectMultiwordWatchpoint ();
};
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointList
-//-------------------------------------------------------------------------
-
-class CommandObjectWatchpointList : public CommandObject
-{
-public:
- CommandObjectWatchpointList (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointList ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition *
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- lldb::DescriptionLevel m_level;
- };
-
-private:
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointEnable
-//-------------------------------------------------------------------------
-
-class CommandObjectWatchpointEnable : public CommandObject
-{
-public:
- CommandObjectWatchpointEnable (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointEnable ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointDisable
-//-------------------------------------------------------------------------
-
-class CommandObjectWatchpointDisable : public CommandObject
-{
-public:
- CommandObjectWatchpointDisable (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointDisable ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointDelete
-//-------------------------------------------------------------------------
-
-class CommandObjectWatchpointDelete : public CommandObject
-{
-public:
- CommandObjectWatchpointDelete (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointDelete ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
-private:
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointIgnore
-//-------------------------------------------------------------------------
-
-class CommandObjectWatchpointIgnore : public CommandObject
-{
-public:
- CommandObjectWatchpointIgnore (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointIgnore ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition *
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- uint32_t m_ignore_count;
- };
-
-private:
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointModify
-//-------------------------------------------------------------------------
-
-class CommandObjectWatchpointModify : public CommandObject
-{
-public:
-
- CommandObjectWatchpointModify (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointModify ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
- class CommandOptions : public Options
- {
- public:
-
- CommandOptions (CommandInterpreter &interpreter);
-
- virtual
- ~CommandOptions ();
-
- virtual Error
- SetOptionValue (uint32_t option_idx, const char *option_arg);
-
- void
- OptionParsingStarting ();
-
- const OptionDefinition*
- GetDefinitions ();
-
- // Options table: Required for subclasses of Options.
-
- static OptionDefinition g_option_table[];
-
- // Instance variables to hold the values for command options.
-
- std::string m_condition;
- bool m_condition_passed;
- };
-
-private:
- CommandOptions m_options;
-};
-
-//-------------------------------------------------------------------------
-// CommandObjectWatchpointSet
-//-------------------------------------------------------------------------
-
-class CommandObjectWatchpointSet : public CommandObjectMultiword
-{
-public:
-
- CommandObjectWatchpointSet (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointSet ();
-
-
-};
-
-class CommandObjectWatchpointSetVariable : public CommandObject
-{
-public:
-
- CommandObjectWatchpointSetVariable (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointSetVariable ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
-private:
- OptionGroupOptions m_option_group;
- OptionGroupWatchpoint m_option_watchpoint;
-};
-
-class CommandObjectWatchpointSetExpression : public CommandObject
-{
-public:
-
- CommandObjectWatchpointSetExpression (CommandInterpreter &interpreter);
-
- virtual
- ~CommandObjectWatchpointSetExpression ();
-
- virtual bool
- Execute (Args& command,
- CommandReturnObject &result)
- { return false; }
-
- virtual bool
- WantsRawCommandString() { return true; }
-
- // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString.
- virtual bool
- WantsCompletion() { return true; }
-
- virtual bool
- ExecuteRawCommandString (const char *raw_command,
- CommandReturnObject &result);
-
- virtual Options *
- GetOptions ();
-
-private:
- OptionGroupOptions m_option_group;
- OptionGroupWatchpoint m_option_watchpoint;
-};
-
} // namespace lldb_private
#endif // liblldb_CommandObjectWatchpoint_h_
Modified: lldb/branches/lldb-platform-work/source/Expression/ClangExpressionParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Expression/ClangExpressionParser.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Expression/ClangExpressionParser.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Expression/ClangExpressionParser.cpp Fri Jun 8 19:52:06 2012
@@ -300,6 +300,9 @@
{
m_compiler->getTargetOpts().Triple = llvm::sys::getDefaultTargetTriple();
}
+
+ if (m_compiler->getTargetOpts().Triple.find("ios") != std::string::npos)
+ m_compiler->getTargetOpts().ABI = "apcs-gnu";
// 3. Set up various important bits of infrastructure.
m_compiler->createDiagnostics(0, 0);
Modified: lldb/branches/lldb-platform-work/source/Expression/IRForTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Expression/IRForTarget.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Expression/IRForTarget.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Expression/IRForTarget.cpp Fri Jun 8 19:52:06 2012
@@ -1551,6 +1551,12 @@
llvm::Type *initializer_type = initializer->getType();
size_t size = m_target_data->getTypeAllocSize(initializer_type);
+ size_t align = m_target_data->getPrefTypeAlignment(initializer_type);
+
+ const size_t mask = (align - 1);
+ uint64_t aligned_offset = (offset + mask) & ~mask;
+ m_data_allocator->GetStream().PutNHex8(aligned_offset - offset, 0);
+ offset = aligned_offset;
lldb_private::DataBufferHeap data(size, '\0');
@@ -2060,6 +2066,7 @@
llvm::Instruction *inst = *user_iter;
ConstantFP *operand_constant_fp = dyn_cast<ConstantFP>(operand_val);
+ Type *operand_type = operand_constant_fp->getType();
if (operand_constant_fp)
{
@@ -2105,6 +2112,13 @@
uint64_t offset = m_data_allocator->GetStream().GetSize();
+ size_t align = m_target_data->getPrefTypeAlignment(operand_type);
+
+ const size_t mask = (align - 1);
+ uint64_t aligned_offset = (offset + mask) & ~mask;
+ m_data_allocator->GetStream().PutNHex8(aligned_offset - offset, 0);
+ offset = aligned_offset;
+
m_data_allocator->GetStream().Write(data.GetBytes(), operand_data_size);
llvm::Type *fp_ptr_ty = operand_constant_fp->getType()->getPointerTo();
Modified: lldb/branches/lldb-platform-work/source/Host/common/Mutex.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Host/common/Mutex.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Host/common/Mutex.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Host/common/Mutex.cpp Fri Jun 8 19:52:06 2012
@@ -141,19 +141,14 @@
void
Mutex::Locker::Lock (Mutex &mutex)
{
- pthread_mutex_t *mutex_ptr = mutex.GetMutex();
-
// We already have this mutex locked or both are NULL...
- if (m_mutex_ptr == mutex_ptr)
+ if (m_mutex_ptr == &mutex)
return;
Unlock ();
- if (mutex_ptr)
- {
- m_mutex_ptr = mutex_ptr;
- Mutex::Lock (m_mutex_ptr);
- }
+ m_mutex_ptr = &mutex;
+ m_mutex_ptr->Lock();
}
void
@@ -161,27 +156,23 @@
{
if (m_mutex_ptr)
{
- Mutex::Unlock (m_mutex_ptr);
+ m_mutex_ptr->Unlock ();
m_mutex_ptr = NULL;
}
}
bool
-Mutex::Locker::TryLock (Mutex &mutex)
+Mutex::Locker::TryLock (Mutex &mutex, const char *failure_message)
{
- pthread_mutex_t *mutex_ptr = mutex.GetMutex();
-
// We already have this mutex locked!
- if (m_mutex_ptr == mutex_ptr)
- return m_mutex_ptr != NULL;
+ if (m_mutex_ptr == &mutex)
+ return true;
Unlock ();
- if (mutex_ptr)
- {
- if (Mutex::TryLock (mutex_ptr) == 0)
- m_mutex_ptr = mutex_ptr;
- }
+ if (mutex.TryLock(failure_message) == 0)
+ m_mutex_ptr = &mutex;
+
return m_mutex_ptr != NULL;
}
@@ -273,100 +264,98 @@
return &m_mutex;
}
+//----------------------------------------------------------------------
+// Locks the mutex owned by this object, if the mutex is already
+// locked, the calling thread will block until the mutex becomes
+// available.
+//
+// RETURNS
+// The error code from the pthread_mutex_lock() function call.
+//----------------------------------------------------------------------
int
-Mutex::Lock (pthread_mutex_t *mutex_ptr)
+Mutex::Lock()
{
DEBUG_LOG ("[%4.4x/%4.4x] pthread_mutex_lock (%p)...\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), mutex_ptr);
#if ENABLE_MUTEX_ERROR_CHECKING
- error_check_mutex (mutex_ptr, eMutexActionAssertInitialized);
+ error_check_mutex (&m_mutex, eMutexActionAssertInitialized);
#endif
- int err = ::pthread_mutex_lock (mutex_ptr);
+ int err = ::pthread_mutex_lock (&m_mutex);
#if ENABLE_MUTEX_ERROR_CHECKING
if (err)
{
- Host::SetCrashDescriptionWithFormat ("%s error: pthread_mutex_lock(%p) => err = %i (%s)", __PRETTY_FUNCTION__, mutex_ptr, err, strerror(err));
+ Host::SetCrashDescriptionWithFormat ("%s error: pthread_mutex_lock(%p) => err = %i (%s)", __PRETTY_FUNCTION__, &m_mutex, err, strerror(err));
assert(err == 0);
}
#endif
- DEBUG_LOG ("[%4.4x/%4.4x] pthread_mutex_lock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), mutex_ptr, err);
+ DEBUG_LOG ("[%4.4x/%4.4x] pthread_mutex_lock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), &m_mutex, err);
return err;
}
+//----------------------------------------------------------------------
+// Attempts to lock the mutex owned by this object without blocking.
+// If the mutex is already locked, TryLock() will not block waiting
+// for the mutex, but will return an error condition.
+//
+// RETURNS
+// The error code from the pthread_mutex_trylock() function call.
+//----------------------------------------------------------------------
int
-Mutex::TryLock (pthread_mutex_t *mutex_ptr)
+Mutex::TryLock(const char *failure_message)
{
#if ENABLE_MUTEX_ERROR_CHECKING
- error_check_mutex (mutex_ptr, eMutexActionAssertInitialized);
+ error_check_mutex (&m_mutex, eMutexActionAssertInitialized);
#endif
- int err = ::pthread_mutex_trylock (mutex_ptr);
- DEBUG_LOG ("[%4.4x/%4.4x] pthread_mutex_trylock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), mutex_ptr, err);
+ int err = ::pthread_mutex_trylock (&m_mutex);
+ DEBUG_LOG ("[%4.4x/%4.4x] pthread_mutex_trylock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), &m_mutex, err);
return err;
}
+//----------------------------------------------------------------------
+// If the current thread holds the lock on the owned mutex, then
+// Unlock() will unlock the mutex. Calling Unlock() on this object
+// that the calling thread does not hold will result in undefined
+// behavior.
+//
+// RETURNS
+// The error code from the pthread_mutex_unlock() function call.
+//----------------------------------------------------------------------
int
-Mutex::Unlock (pthread_mutex_t *mutex_ptr)
+Mutex::Unlock()
{
#if ENABLE_MUTEX_ERROR_CHECKING
- error_check_mutex (mutex_ptr, eMutexActionAssertInitialized);
+ error_check_mutex (&m_mutex, eMutexActionAssertInitialized);
#endif
- int err = ::pthread_mutex_unlock (mutex_ptr);
+ int err = ::pthread_mutex_unlock (&m_mutex);
#if ENABLE_MUTEX_ERROR_CHECKING
if (err)
{
- Host::SetCrashDescriptionWithFormat ("%s error: pthread_mutex_unlock(%p) => err = %i (%s)", __PRETTY_FUNCTION__, mutex_ptr, err, strerror(err));
+ Host::SetCrashDescriptionWithFormat ("%s error: pthread_mutex_unlock(%p) => err = %i (%s)", __PRETTY_FUNCTION__, &m_mutex, err, strerror(err));
assert(err == 0);
}
#endif
- DEBUG_LOG ("[%4.4x/%4.4x] pthread_mutex_unlock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), mutex_ptr, err);
+ DEBUG_LOG ("[%4.4x/%4.4x] pthread_mutex_unlock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), &m_mutex, err);
return err;
}
-//----------------------------------------------------------------------
-// Locks the mutex owned by this object, if the mutex is already
-// locked, the calling thread will block until the mutex becomes
-// available.
-//
-// RETURNS
-// The error code from the pthread_mutex_lock() function call.
-//----------------------------------------------------------------------
-int
-Mutex::Lock()
-{
- return Mutex::Lock (&m_mutex);
-}
-
-//----------------------------------------------------------------------
-// Attempts to lock the mutex owned by this object without blocking.
-// If the mutex is already locked, TryLock() will not block waiting
-// for the mutex, but will return an error condition.
-//
-// RETURNS
-// The error code from the pthread_mutex_trylock() function call.
-//----------------------------------------------------------------------
+#ifdef LLDB_CONFIGURATION_DEBUG
int
-Mutex::TryLock()
+TrackingMutex::Unlock ()
{
- return Mutex::TryLock (&m_mutex);
+ if (!m_failure_message.empty())
+ Host::SetCrashDescriptionWithFormat ("Unlocking lock (on thread %p) that thread: %p failed to get: %s",
+ pthread_self(),
+ m_thread_that_tried,
+ m_failure_message.c_str());
+ assert (m_failure_message.empty());
+ return Mutex::Unlock();
}
+#endif
+
-//----------------------------------------------------------------------
-// If the current thread holds the lock on the owned mutex, then
-// Unlock() will unlock the mutex. Calling Unlock() on this object
-// that the calling thread does not hold will result in undefined
-// behavior.
-//
-// RETURNS
-// The error code from the pthread_mutex_unlock() function call.
-//----------------------------------------------------------------------
-int
-Mutex::Unlock()
-{
- return Mutex::Unlock (&m_mutex);
-}
Modified: lldb/branches/lldb-platform-work/source/Interpreter/CommandInterpreter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Interpreter/CommandInterpreter.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Interpreter/CommandInterpreter.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Interpreter/CommandInterpreter.cpp Fri Jun 8 19:52:06 2012
@@ -1562,35 +1562,7 @@
if (log)
log->Printf ("HandleCommand, command line after removing command name(s): '%s'", remainder.c_str());
-
- CommandOverrideCallback command_callback = cmd_obj->GetOverrideCallback();
- bool handled = false;
- if (wants_raw_input)
- {
- if (command_callback)
- {
- std::string full_command (cmd_obj->GetCommandName ());
- full_command += ' ';
- full_command += remainder;
- const char *argv[2] = { NULL, NULL };
- argv[0] = full_command.c_str();
- handled = command_callback (cmd_obj->GetOverrideCallbackBaton(), argv);
- }
- if (!handled)
- cmd_obj->ExecuteRawCommandString (remainder.c_str(), result);
- }
- else
- {
- Args cmd_args (remainder.c_str());
- if (command_callback)
- {
- Args full_args (cmd_obj->GetCommandName ());
- full_args.AppendArguments(cmd_args);
- handled = command_callback (cmd_obj->GetOverrideCallbackBaton(), full_args.GetConstArgumentVector());
- }
- if (!handled)
- cmd_obj->ExecuteWithOptions (cmd_args, result);
- }
+ cmd_obj->Execute (remainder.c_str(), result);
}
else
{
Modified: lldb/branches/lldb-platform-work/source/Interpreter/CommandObject.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Interpreter/CommandObject.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Interpreter/CommandObject.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Interpreter/CommandObject.cpp Fri Jun 8 19:52:06 2012
@@ -153,18 +153,6 @@
return NULL;
}
-Flags&
-CommandObject::GetFlags()
-{
- return m_flags;
-}
-
-const Flags&
-CommandObject::GetFlags() const
-{
- return m_flags;
-}
-
bool
CommandObject::ParseOptions
(
@@ -214,16 +202,12 @@
}
return true;
}
+
+
+
bool
-CommandObject::ExecuteWithOptions (Args& args, CommandReturnObject &result)
+CommandObject::CheckFlags (CommandReturnObject &result)
{
- for (size_t i = 0; i < args.GetArgumentCount(); ++i)
- {
- const char *tmp_str = args.GetArgumentAtIndex (i);
- if (tmp_str[0] == '`') // back-quote
- args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
- }
-
if (GetFlags().AnySet (CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused))
{
Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
@@ -274,12 +258,7 @@
}
}
}
-
- if (!ParseOptions (args, result))
- return false;
-
- // Call the command-specific version of 'Execute', passing it the already processed arguments.
- return Execute (args, result);
+ return true;
}
class CommandDictCommandPartialMatch
@@ -846,6 +825,63 @@
return NULL;
}
+bool
+CommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result)
+{
+ CommandOverrideCallback command_callback = GetOverrideCallback();
+ bool handled = false;
+ Args cmd_args (args_string);
+ if (command_callback)
+ {
+ Args full_args (GetCommandName ());
+ full_args.AppendArguments(cmd_args);
+ handled = command_callback (GetOverrideCallbackBaton(), full_args.GetConstArgumentVector());
+ }
+ if (!handled)
+ {
+ for (size_t i = 0; i < cmd_args.GetArgumentCount(); ++i)
+ {
+ const char *tmp_str = cmd_args.GetArgumentAtIndex (i);
+ if (tmp_str[0] == '`') // back-quote
+ cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
+ }
+
+ if (!CheckFlags(result))
+ return false;
+
+ if (!ParseOptions (cmd_args, result))
+ return false;
+
+ // Call the command-specific version of 'Execute', passing it the already processed arguments.
+ handled = DoExecute (cmd_args, result);
+ }
+ return handled;
+}
+
+bool
+CommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result)
+{
+ CommandOverrideCallback command_callback = GetOverrideCallback();
+ bool handled = false;
+ if (command_callback)
+ {
+ std::string full_command (GetCommandName ());
+ full_command += ' ';
+ full_command += args_string;
+ const char *argv[2] = { NULL, NULL };
+ argv[0] = full_command.c_str();
+ handled = command_callback (GetOverrideCallbackBaton(), argv);
+ }
+ if (!handled)
+ {
+ if (!CheckFlags(result))
+ return false;
+ else
+ handled = DoExecute (args_string, result);
+ }
+ return handled;
+}
+
static
const char *arch_helper()
{
Modified: lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectRegexCommand.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectRegexCommand.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectRegexCommand.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectRegexCommand.cpp Fri Jun 8 19:52:06 2012
@@ -30,7 +30,7 @@
const char *syntax,
uint32_t max_matches
) :
- CommandObject (interpreter, name, help, syntax),
+ CommandObjectRaw (interpreter, name, help, syntax),
m_max_matches (max_matches),
m_entries ()
{
@@ -45,18 +45,7 @@
bool
-CommandObjectRegexCommand::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- return false;
-}
-
-
-bool
-CommandObjectRegexCommand::ExecuteRawCommandString
+CommandObjectRegexCommand::DoExecute
(
const char *command,
CommandReturnObject &result
Modified: lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.cpp Fri Jun 8 19:52:06 2012
@@ -30,10 +30,10 @@
//-------------------------------------------------------------------------
CommandObjectScript::CommandObjectScript (CommandInterpreter &interpreter, ScriptLanguage script_lang) :
- CommandObject (interpreter,
- "script",
- "Pass an expression to the script interpreter for evaluation and return the results. Drop into the interactive interpreter if no expression is given.",
- "script [<script-expression-for-evaluation>]"),
+ CommandObjectRaw (interpreter,
+ "script",
+ "Pass an expression to the script interpreter for evaluation and return the results. Drop into the interactive interpreter if no expression is given.",
+ "script [<script-expression-for-evaluation>]"),
m_script_lang (script_lang)
{
}
@@ -43,7 +43,7 @@
}
bool
-CommandObjectScript::ExecuteRawCommandString
+CommandObjectScript::DoExecute
(
const char *command,
CommandReturnObject &result
@@ -74,21 +74,3 @@
return result.Succeeded();
}
-
-bool
-CommandObjectScript::WantsRawCommandString()
-{
- return true;
-}
-
-bool
-CommandObjectScript::Execute
-(
- Args& command,
- CommandReturnObject &result
-)
-{
- // everything should be handled in ExecuteRawCommandString
- return false;
-}
-
Modified: lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.h (original)
+++ lldb/branches/lldb-platform-work/source/Interpreter/CommandObjectScript.h Fri Jun 8 19:52:06 2012
@@ -22,7 +22,7 @@
// CommandObjectScript
//-------------------------------------------------------------------------
-class CommandObjectScript : public CommandObject
+class CommandObjectScript : public CommandObjectRaw
{
public:
@@ -32,15 +32,9 @@
virtual
~CommandObjectScript ();
- bool WantsRawCommandString();
-
- virtual bool
- ExecuteRawCommandString (const char *command,
- CommandReturnObject &result);
-
+protected:
virtual bool
- Execute (Args& command,
- CommandReturnObject &result);
+ DoExecute (const char *command, CommandReturnObject &result);
private:
lldb::ScriptLanguage m_script_lang;
Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp Fri Jun 8 19:52:06 2012
@@ -267,10 +267,10 @@
}
bool
-GDBRemoteCommunication::GetSequenceMutex (Mutex::Locker& locker)
+GDBRemoteCommunication::GetSequenceMutex (Mutex::Locker& locker, const char *failure_message)
{
if (IsRunning())
- return locker.TryLock (m_sequence_mutex);
+ return locker.TryLock (m_sequence_mutex, failure_message);
locker.Lock (m_sequence_mutex);
return true;
Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h (original)
+++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h Fri Jun 8 19:52:06 2012
@@ -59,7 +59,7 @@
size_t payload_length);
bool
- GetSequenceMutex (lldb_private::Mutex::Locker& locker);
+ GetSequenceMutex (lldb_private::Mutex::Locker& locker, const char *failure_message = NULL);
bool
CheckForPacket (const uint8_t *src,
@@ -242,7 +242,11 @@
// Classes that inherit from GDBRemoteCommunication can see and modify these
//------------------------------------------------------------------
uint32_t m_packet_timeout;
+#ifdef LLDB_CONFIGURATION_DEBUG
+ lldb_private::TrackingMutex m_sequence_mutex;
+#else
lldb_private::Mutex m_sequence_mutex; // Restrict access to sending/receiving packets to a single thread at a time
+#endif
lldb_private::Predicate<bool> m_public_is_running;
lldb_private::Predicate<bool> m_private_is_running;
History m_history;
Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp Fri Jun 8 19:52:06 2012
@@ -1940,7 +1940,7 @@
Mutex::Locker locker;
thread_ids.clear();
- if (GetSequenceMutex (locker))
+ if (GetSequenceMutex (locker, "ProcessGDBRemote::UpdateThreadList() failed due to not getting the sequence mutex"))
{
sequence_mutex_unavailable = false;
StringExtractorGDBRemote response;
@@ -1969,9 +1969,13 @@
}
else
{
+#if defined (LLDB_CONFIGURATION_DEBUG)
+ // assert(!"ProcessGDBRemote::UpdateThreadList() failed due to not getting the sequence mutex");
+#else
LogSP log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS));
if (log)
log->Printf("error: failed to get packet sequence mutex, not sending packet 'qfThreadInfo'");
+#endif
sequence_mutex_unavailable = true;
}
return thread_ids.size();
Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp Fri Jun 8 19:52:06 2012
@@ -183,7 +183,7 @@
if (!m_reg_valid[reg])
{
Mutex::Locker locker;
- if (gdb_comm.GetSequenceMutex (locker))
+ if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for read register."))
{
const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported();
ProcessSP process_sp (m_thread.GetProcess());
@@ -357,7 +357,7 @@
m_reg_data.GetByteOrder())) // dst byte order
{
Mutex::Locker locker;
- if (gdb_comm.GetSequenceMutex (locker))
+ if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for write register."))
{
const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported();
ProcessSP process_sp (m_thread.GetProcess());
@@ -445,12 +445,6 @@
else
{
LogSP log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS));
-#if LLDB_CONFIGURATION_DEBUG
- StreamString strm;
- gdb_comm.DumpHistory(strm);
- Host::SetCrashDescription (strm.GetData());
- assert (!"Didn't get sequence mutex for write register.");
-#else
if (log)
{
if (log->GetVerbose())
@@ -462,7 +456,6 @@
else
log->Printf("error: failed to get packet sequence mutex, not sending write register for \"%s\"", reg_info->name);
}
-#endif
}
}
return false;
@@ -484,7 +477,7 @@
StringExtractorGDBRemote response;
Mutex::Locker locker;
- if (gdb_comm.GetSequenceMutex (locker))
+ if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for read all registers."))
{
char packet[32];
const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported();
@@ -522,12 +515,6 @@
else
{
LogSP log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS));
-#if LLDB_CONFIGURATION_DEBUG
- StreamString strm;
- gdb_comm.DumpHistory(strm);
- Host::SetCrashDescription (strm.GetData());
- assert (!"Didn't get sequence mutex for read all registers.");
-#else
if (log)
{
if (log->GetVerbose())
@@ -539,7 +526,6 @@
else
log->Printf("error: failed to get packet sequence mutex, not sending read all registers");
}
-#endif
}
data_sp.reset();
@@ -563,7 +549,7 @@
StringExtractorGDBRemote response;
Mutex::Locker locker;
- if (gdb_comm.GetSequenceMutex (locker))
+ if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for write all registers."))
{
const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported();
ProcessSP process_sp (m_thread.GetProcess());
@@ -662,12 +648,6 @@
else
{
LogSP log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS));
-#if LLDB_CONFIGURATION_DEBUG
- StreamString strm;
- gdb_comm.DumpHistory(strm);
- Host::SetCrashDescription (strm.GetData());
- assert (!"Didn't get sequence mutex for write all registers.");
-#else
if (log)
{
if (log->GetVerbose())
@@ -679,7 +659,6 @@
else
log->Printf("error: failed to get packet sequence mutex, not sending write all registers");
}
-#endif
}
return false;
}
Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Fri Jun 8 19:52:06 2012
@@ -401,7 +401,8 @@
}
// Add some convenience registers (eax, ebx, ecx, edx, esi, edi, ebp, esp) to x86_64.
- if (target_arch.IsValid() && target_arch.GetMachine() == llvm::Triple::x86_64)
+ if ((target_arch.IsValid() && target_arch.GetMachine() == llvm::Triple::x86_64)
+ || (remote_arch.IsValid() && remote_arch.GetMachine() == llvm::Triple::x86_64))
m_register_info.Addx86_64ConvenienceRegisters();
// At this point, we can finalize our register info.
@@ -1189,9 +1190,6 @@
m_gdb_comm.GetCurrentThreadIDs (m_thread_ids, sequence_mutex_unavailable);
if (sequence_mutex_unavailable)
{
-#if defined (LLDB_CONFIGURATION_DEBUG)
- assert(!"ProcessGDBRemote::UpdateThreadList() failed due to not getting the sequence mutex");
-#endif
return false; // We just didn't get the list
}
return true;
Modified: lldb/branches/lldb-platform-work/test/functionalities/register/TestRegisters.py
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/test/functionalities/register/TestRegisters.py?rev=158251&r1=158250&r2=158251&view=diff
==============================================================================
--- lldb/branches/lldb-platform-work/test/functionalities/register/TestRegisters.py (original)
+++ lldb/branches/lldb-platform-work/test/functionalities/register/TestRegisters.py Fri Jun 8 19:52:06 2012
@@ -26,6 +26,13 @@
self.buildDefault()
self.convenience_registers()
+ def test_convenience_registers_with_process_attach(self):
+ """Test convenience registers after a 'process attach'."""
+ if not self.getArchitecture() in ['x86_64']:
+ self.skipTest("This test requires x86_64 as the architecture for the inferior")
+ self.buildDefault()
+ self.convenience_registers_with_process_attach()
+
def register_commands(self):
"""Test commands related to registers, in particular xmm registers."""
exe = os.path.join(os.getcwd(), "a.out")
@@ -88,6 +95,26 @@
self.expect("expr -- $ax == (($ah << 8) | $al)",
substrs = ['true'])
+ def convenience_registers_with_process_attach(self):
+ """Test convenience registers after a 'process attach'."""
+ exe = self.lldbHere
+
+ # Spawn a new process and don't display the stdout if not in TraceOn() mode.
+ import subprocess
+ popen = subprocess.Popen([exe, self.lldbOption],
+ stdout = open(os.devnull, 'w') if not self.TraceOn() else None)
+ if self.TraceOn():
+ print "pid of spawned process: %d" % popen.pid
+
+ self.runCmd("process attach -p %d" % popen.pid)
+
+ # Add a hook to kill the child process during teardown.
+ self.addTearDownHook(
+ lambda: popen.kill())
+
+ # Check that "register read eax" works.
+ self.runCmd("register read eax")
+
if __name__ == '__main__':
import atexit
More information about the lldb-commits
mailing list