bool repeat_on_empty_command = true,
bool no_context_switching = false);
- bool WasInterrupted() const;
-
//------------------------------------------------------------------
/// Execute a list of commands in sequence.
///
StringList &commands_help,
CommandObject::CommandMap &command_map);
- // An interruptible wrapper around the stream output
- void PrintCommandOutput(Stream &stream, llvm::StringRef str,
- bool interruptible);
-
- // A very simple state machine which models the command handling transitions
- enum class CommandHandlingState {
- eIdle,
- eInProgress,
- eInterrupted,
- };
-
- std::atomic<CommandHandlingState> m_command_state{
- CommandHandlingState::eIdle};
-
- void StartHandlingCommand();
- void FinishHandlingCommand();
- bool InterruptCommand();
-
Debugger &m_debugger; // The debugger session that this interpreter is
// associated with
ExecutionContextRef m_exe_ctx_ref; // The current execution context to use
result.GetOutputStream().EOL();
result.GetOutputStream().EOL();
}
- if (m_interpreter.WasInterrupted())
- break;
num_dumped++;
DumpModuleSymtab(
m_interpreter, result.GetOutputStream(),
result.GetOutputStream().EOL();
result.GetOutputStream().EOL();
}
- if (m_interpreter.WasInterrupted())
- break;
num_dumped++;
DumpModuleSymtab(m_interpreter, result.GetOutputStream(),
module, m_options.m_sort_order);
" modules.\n",
(uint64_t)num_modules);
for (size_t image_idx = 0; image_idx < num_modules; ++image_idx) {
- if (m_interpreter.WasInterrupted())
- break;
num_dumped++;
DumpModuleSections(
m_interpreter, result.GetOutputStream(),
FindModulesByName(target, arg_cstr, module_list, true);
if (num_matches > 0) {
for (size_t i = 0; i < num_matches; ++i) {
- if (m_interpreter.WasInterrupted())
- break;
Module *module = module_list.GetModulePointerAtIndex(i);
if (module) {
num_dumped++;
" modules.\n",
(uint64_t)num_modules);
for (uint32_t image_idx = 0; image_idx < num_modules; ++image_idx) {
- if (m_interpreter.WasInterrupted())
- break;
if (DumpModuleSymbolVendor(
result.GetOutputStream(),
target_modules.GetModulePointerAtIndexUnlocked(image_idx)))
FindModulesByName(target, arg_cstr, module_list, true);
if (num_matches > 0) {
for (size_t i = 0; i < num_matches; ++i) {
- if (m_interpreter.WasInterrupted())
- break;
Module *module = module_list.GetModulePointerAtIndex(i);
if (module) {
if (DumpModuleSymbolVendor(result.GetOutputStream(), module))
if (num_modules > 0) {
uint32_t num_dumped = 0;
for (uint32_t i = 0; i < num_modules; ++i) {
- if (m_interpreter.WasInterrupted())
- break;
if (DumpCompileUnitLineTable(
m_interpreter, result.GetOutputStream(),
target_modules.GetModulePointerAtIndexUnlocked(i),
char buffer[1024];
int num_printed =
snprintf(buffer, 1024, "%s %s", break_regexes[i][1], "-o");
- lldbassert(num_printed < 1024);
+ assert(num_printed < 1024);
UNUSED_IF_ASSERT_DISABLED(num_printed);
success =
tbreak_regex_cmd_ap->AddRegexCommand(break_regexes[i][0], buffer);
const lldb::CommandObjectSP &cmd_sp,
bool can_replace) {
if (cmd_sp.get())
- lldbassert((this == &cmd_sp->GetCommandInterpreter()) &&
- "tried to add a CommandObject from a different interpreter");
+ assert((this == &cmd_sp->GetCommandInterpreter()) &&
+ "tried to add a CommandObject from a different interpreter");
if (name.empty())
return false;
const lldb::CommandObjectSP &cmd_sp,
bool can_replace) {
if (cmd_sp.get())
- lldbassert((this == &cmd_sp->GetCommandInterpreter()) &&
- "tried to add a CommandObject from a different interpreter");
+ assert((this == &cmd_sp->GetCommandInterpreter()) &&
+ "tried to add a CommandObject from a different interpreter");
if (!name.empty()) {
// do not allow replacement of internal commands
lldb::CommandObjectSP &command_obj_sp,
llvm::StringRef args_string) {
if (command_obj_sp.get())
- lldbassert((this == &command_obj_sp->GetCommandInterpreter()) &&
- "tried to add a CommandObject from a different interpreter");
+ assert((this == &command_obj_sp->GetCommandInterpreter()) &&
+ "tried to add a CommandObject from a different interpreter");
std::unique_ptr<CommandAlias> command_alias_up(
new CommandAlias(*this, command_obj_sp, args_string, alias_name));
matches.Clear();
// Only max_return_elements == -1 is supported at present:
- lldbassert(max_return_elements == -1);
+ assert(max_return_elements == -1);
bool word_complete;
num_command_matches = HandleCompletionMatches(
parsed_line, cursor_index, cursor_char_position, match_start_point,
return total_bytes;
}
-void CommandInterpreter::StartHandlingCommand() {
- auto prev_state = m_command_state.exchange(CommandHandlingState::eInProgress);
- lldbassert(prev_state == CommandHandlingState::eIdle);
-}
-
-void CommandInterpreter::FinishHandlingCommand() {
- auto prev_state = m_command_state.exchange(CommandHandlingState::eIdle);
- lldbassert(prev_state != CommandHandlingState::eIdle);
-}
-
-bool CommandInterpreter::InterruptCommand() {
- auto in_progress = CommandHandlingState::eInProgress;
- return m_command_state.compare_exchange_strong(
- in_progress, CommandHandlingState::eInterrupted);
-}
-
-bool CommandInterpreter::WasInterrupted() const {
- return m_command_state == CommandHandlingState::eInterrupted;
-}
-
-void CommandInterpreter::PrintCommandOutput(Stream &stream, llvm::StringRef str,
- bool interruptible) {
- if (str.empty())
- return;
-
- if (interruptible) {
- // Split the output into lines and poll for interrupt requests
- const char *data = str.data();
- size_t size = str.size();
- while (size > 0 && !WasInterrupted()) {
- size_t chunk_size = 0;
- for (; chunk_size < size; ++chunk_size) {
- lldbassert(data[chunk_size] != '\0');
- if (data[chunk_size] == '\n') {
- ++chunk_size;
- break;
- }
- }
- chunk_size = stream.Write(data, chunk_size);
- lldbassert(size >= chunk_size);
- data += chunk_size;
- size -= chunk_size;
- }
- if (size > 0) {
- stream.Printf("\n... Interrupted.\n");
- }
- } else {
- stream.PutCString(str);
- }
-}
-
void CommandInterpreter::IOHandlerInputComplete(IOHandler &io_handler,
std::string &line) {
const bool is_interactive = io_handler.GetIsInteractive();
line.c_str());
}
- StartHandlingCommand();
-
lldb_private::CommandReturnObject result;
HandleCommand(line.c_str(), eLazyBoolCalculate, result);
if (!result.GetImmediateOutputStream()) {
llvm::StringRef output = result.GetOutputData();
- PrintCommandOutput(*io_handler.GetOutputStreamFile(), output,
- is_interactive);
+ if (!output.empty())
+ io_handler.GetOutputStreamFile()->PutCString(output);
}
// Now emit the command error text from the command we just executed
if (!result.GetImmediateErrorStream()) {
llvm::StringRef error = result.GetErrorData();
- PrintCommandOutput(*io_handler.GetErrorStreamFile(), error,
- is_interactive);
+ if (!error.empty())
+ io_handler.GetErrorStreamFile()->PutCString(error);
}
}
- FinishHandlingCommand();
-
switch (result.GetStatus()) {
case eReturnStatusInvalid:
case eReturnStatusSuccessFinishNoResult:
ExecutionContext exe_ctx(GetExecutionContext());
Process *process = exe_ctx.GetProcessPtr();
- if (InterruptCommand())
- return true;
-
if (process) {
StateType state = process->GetState();
if (StateIsRunningState(state)) {
result.AppendRawError(error_msg.GetString());
} else {
// We didn't have only one match, otherwise we wouldn't get here.
- lldbassert(num_matches == 0);
+ assert(num_matches == 0);
result.AppendErrorWithFormat("'%s' is not a valid command.\n",
next_word.c_str());
}