Author: zturner Date: Wed Oct 5 15:03:37 2016 New Revision: 283370 URL: http://llvm.org/viewvc/llvm-project?rev=283370&view=rev Log: Convert various CommandInterpreter functions to StringRef.
Modified: lldb/trunk/include/lldb/Interpreter/Args.h lldb/trunk/include/lldb/Interpreter/CommandObject.h lldb/trunk/include/lldb/Interpreter/CommandObjectRegexCommand.h lldb/trunk/source/Commands/CommandObjectArgs.cpp lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp lldb/trunk/source/Commands/CommandObjectBreakpointCommand.cpp lldb/trunk/source/Commands/CommandObjectCommands.cpp lldb/trunk/source/Commands/CommandObjectDisassemble.cpp lldb/trunk/source/Commands/CommandObjectFrame.cpp lldb/trunk/source/Commands/CommandObjectLog.cpp lldb/trunk/source/Interpreter/Args.cpp Modified: lldb/trunk/include/lldb/Interpreter/Args.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/Args.h?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/include/lldb/Interpreter/Args.h (original) +++ lldb/trunk/include/lldb/Interpreter/Args.h Wed Oct 5 15:03:37 2016 @@ -18,6 +18,7 @@ #include <vector> // Other libraries and framework includes +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" // Project includes #include "lldb/Core/Error.h" @@ -136,6 +137,7 @@ public: /// The number or arguments in this object. //------------------------------------------------------------------ size_t GetArgumentCount() const; + bool empty() const { return GetArgumentCount() == 0; } //------------------------------------------------------------------ /// Gets the NULL terminated C string argument pointer for the @@ -147,6 +149,8 @@ public: //------------------------------------------------------------------ const char *GetArgumentAtIndex(size_t idx) const; + llvm::ArrayRef<ArgEntry> entries() const { return m_entries; } + char GetArgumentQuoteCharAtIndex(size_t idx) const; //------------------------------------------------------------------ @@ -315,9 +319,6 @@ public: Error ParseOptions(Options &options, ExecutionContext *execution_context, lldb::PlatformSP platform_sp, bool require_validation); - size_t FindArgumentIndexForOption(Option *long_options, - int long_options_index); - bool IsPositionalArgument(const char *arg); // The following works almost identically to ParseOptions, except that no @@ -459,6 +460,9 @@ public: size_t *argument_index = nullptr) const; private: + size_t FindArgumentIndexForOption(Option *long_options, + int long_options_index) const; + std::vector<ArgEntry> m_entries; std::vector<char *> m_argv; Modified: lldb/trunk/include/lldb/Interpreter/CommandObject.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandObject.h?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/include/lldb/Interpreter/CommandObject.h (original) +++ lldb/trunk/include/lldb/Interpreter/CommandObject.h Wed Oct 5 15:03:37 2016 @@ -108,6 +108,7 @@ public: typedef std::map<std::string, lldb::CommandObjectSP> CommandMap; + // TODO: Change arguments and all derived classes to use StringRef. CommandObject(CommandInterpreter &interpreter, const char *name, const char *help = nullptr, const char *syntax = nullptr, uint32_t flags = 0); Modified: lldb/trunk/include/lldb/Interpreter/CommandObjectRegexCommand.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandObjectRegexCommand.h?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/include/lldb/Interpreter/CommandObjectRegexCommand.h (original) +++ lldb/trunk/include/lldb/Interpreter/CommandObjectRegexCommand.h Wed Oct 5 15:03:37 2016 @@ -27,6 +27,7 @@ namespace lldb_private { class CommandObjectRegexCommand : public CommandObjectRaw { public: + // TODO: Convert this class to use StringRefs. CommandObjectRegexCommand(CommandInterpreter &interpreter, const char *name, const char *help, const char *syntax, uint32_t max_matches, uint32_t completion_type_mask, Modified: lldb/trunk/source/Commands/CommandObjectArgs.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectArgs.cpp?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectArgs.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectArgs.cpp Wed Oct 5 15:03:37 2016 @@ -29,6 +29,8 @@ #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" +#include "llvm/ADT/StringSwitch.h" + using namespace lldb; using namespace lldb_private; @@ -101,10 +103,7 @@ bool CommandObjectArgs::DoExecute(Args & return false; } - const size_t num_args = args.GetArgumentCount(); - size_t arg_index; - - if (!num_args) { + if (args.empty()) { result.AppendError("args requires at least one argument"); result.SetStatus(eReturnStatusFailed); return false; @@ -143,73 +142,71 @@ bool CommandObjectArgs::DoExecute(Args & ValueList value_list; - for (arg_index = 0; arg_index < num_args; ++arg_index) { - const char *arg_type_cstr = args.GetArgumentAtIndex(arg_index); + for (auto &arg_entry : args.entries()) { + llvm::StringRef arg_type = arg_entry.ref; Value value; value.SetValueType(Value::eValueTypeScalar); CompilerType compiler_type; - char *int_pos; - if ((int_pos = strstr(const_cast<char *>(arg_type_cstr), "int"))) { + llvm::StringRef int_type = arg_type; + std::size_t int_pos = arg_type.find("int"); + if (int_pos != llvm::StringRef::npos) { Encoding encoding = eEncodingSint; int width = 0; - if (int_pos > arg_type_cstr + 1) { - result.AppendErrorWithFormat("Invalid format: %s.\n", arg_type_cstr); + if (int_pos > 1) { + result.AppendErrorWithFormat("Invalid format: %s.\n", + arg_entry.c_str()); result.SetStatus(eReturnStatusFailed); return false; } - if (int_pos == arg_type_cstr + 1 && arg_type_cstr[0] != 'u') { - result.AppendErrorWithFormat("Invalid format: %s.\n", arg_type_cstr); + if (int_pos == 1 && arg_type[0] != 'u') { + result.AppendErrorWithFormat("Invalid format: %s.\n", + arg_entry.c_str()); result.SetStatus(eReturnStatusFailed); return false; } - if (arg_type_cstr[0] == 'u') { + if (arg_type[0] == 'u') { encoding = eEncodingUint; } - char *width_pos = int_pos + 3; + llvm::StringRef width_spec = arg_type.drop_front(int_pos + 3); - if (!strcmp(width_pos, "8_t")) - width = 8; - else if (!strcmp(width_pos, "16_t")) - width = 16; - else if (!strcmp(width_pos, "32_t")) - width = 32; - else if (!strcmp(width_pos, "64_t")) - width = 64; - else { - result.AppendErrorWithFormat("Invalid format: %s.\n", arg_type_cstr); + auto exp_result = llvm::StringSwitch<llvm::Optional<int>>(width_spec) + .Case("8_t", 8) + .Case("16_t", 16) + .Case("32_t", 32) + .Case("64_t", 64) + .Default(llvm::None); + if (!exp_result.hasValue()) { + result.AppendErrorWithFormat("Invalid format: %s.\n", + arg_entry.c_str()); result.SetStatus(eReturnStatusFailed); return false; } + width = *exp_result; + compiler_type = type_system->GetBuiltinTypeForEncodingAndBitSize(encoding, width); if (!compiler_type.IsValid()) { result.AppendErrorWithFormat( "Couldn't get Clang type for format %s (%s integer, width %d).\n", - arg_type_cstr, (encoding == eEncodingSint ? "signed" : "unsigned"), - width); + arg_entry.c_str(), + (encoding == eEncodingSint ? "signed" : "unsigned"), width); result.SetStatus(eReturnStatusFailed); return false; } - } else if (strchr(arg_type_cstr, '*')) { - if (!strcmp(arg_type_cstr, "void*")) - compiler_type = - type_system->GetBasicTypeFromAST(eBasicTypeVoid).GetPointerType(); - else if (!strcmp(arg_type_cstr, "char*")) - compiler_type = - type_system->GetBasicTypeFromAST(eBasicTypeChar).GetPointerType(); - else { - result.AppendErrorWithFormat("Invalid format: %s.\n", arg_type_cstr); - result.SetStatus(eReturnStatusFailed); - return false; - } + } else if (arg_type == "void*") { + compiler_type = + type_system->GetBasicTypeFromAST(eBasicTypeVoid).GetPointerType(); + } else if (arg_type == "char*") { + compiler_type = + type_system->GetBasicTypeFromAST(eBasicTypeChar).GetPointerType(); } else { - result.AppendErrorWithFormat("Invalid format: %s.\n", arg_type_cstr); + result.AppendErrorWithFormat("Invalid format: %s.\n", arg_entry.c_str()); result.SetStatus(eReturnStatusFailed); return false; } @@ -226,10 +223,10 @@ bool CommandObjectArgs::DoExecute(Args & result.GetOutputStream().Printf("Arguments : \n"); - for (arg_index = 0; arg_index < num_args; ++arg_index) { - result.GetOutputStream().Printf("%" PRIu64 " (%s): ", (uint64_t)arg_index, - args.GetArgumentAtIndex(arg_index)); - value_list.GetValueAtIndex(arg_index)->Dump(&result.GetOutputStream()); + for (auto entry : llvm::enumerate(args.entries())) { + result.GetOutputStream().Printf("%" PRIu64 " (%s): ", (uint64_t)entry.Index, + entry.Value.c_str()); + value_list.GetValueAtIndex(entry.Index)->Dump(&result.GetOutputStream()); result.GetOutputStream().Printf("\n"); } Modified: lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp Wed Oct 5 15:03:37 2016 @@ -1113,7 +1113,7 @@ protected: return false; } - if (command.GetArgumentCount() == 0) { + if (command.empty()) { // No breakpoint selected; enable all currently set breakpoints. target->EnableAllBreakpoints(); result.AppendMessageWithFormat("All breakpoints enabled. (%" PRIu64 @@ -1226,7 +1226,7 @@ protected: return false; } - if (command.GetArgumentCount() == 0) { + if (command.empty()) { // No breakpoint selected; disable all currently set breakpoints. target->DisableAllBreakpoints(); result.AppendMessageWithFormat("All breakpoints disabled. (%" PRIu64 @@ -1400,7 +1400,7 @@ protected: Stream &output_stream = result.GetOutputStream(); - if (command.GetArgumentCount() == 0) { + if (command.empty()) { // No breakpoint selected; show info about all currently set breakpoints. result.AppendMessage("Current breakpoints:"); for (size_t i = 0; i < num_breakpoints; ++i) { @@ -1693,7 +1693,7 @@ protected: return false; } - if (command.GetArgumentCount() == 0) { + if (command.empty()) { if (!m_options.m_force && !m_interpreter.Confirm( "About to delete all breakpoints, do you want to do that?", @@ -2295,7 +2295,7 @@ protected: target->GetBreakpointList().GetListMutex(lock); BreakpointIDList valid_bp_ids; - if (command.GetArgumentCount() > 0) { + if (!command.empty()) { CommandObjectMultiwordBreakpoint::VerifyBreakpointIDs( command, target, result, &valid_bp_ids); @@ -2397,7 +2397,7 @@ void CommandObjectMultiwordBreakpoint::V Args temp_args; - if (args.GetArgumentCount() == 0) { + if (args.empty()) { if (target->GetLastCreatedBreakpoint()) { valid_ids->AddBreakpointID(BreakpointID( target->GetLastCreatedBreakpoint()->GetID(), LLDB_INVALID_BREAK_ID)); Modified: lldb/trunk/source/Commands/CommandObjectBreakpointCommand.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectBreakpointCommand.cpp?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectBreakpointCommand.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectBreakpointCommand.cpp Wed Oct 5 15:03:37 2016 @@ -562,7 +562,7 @@ protected: return false; } - if (command.GetArgumentCount() == 0) { + if (command.empty()) { result.AppendError( "No breakpoint specified from which to delete the commands"); result.SetStatus(eReturnStatusFailed); @@ -653,7 +653,7 @@ protected: return false; } - if (command.GetArgumentCount() == 0) { + if (command.empty()) { result.AppendError( "No breakpoint specified for which to list the commands"); result.SetStatus(eReturnStatusFailed); Modified: lldb/trunk/source/Commands/CommandObjectCommands.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectCommands.cpp?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectCommands.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectCommands.cpp Wed Oct 5 15:03:37 2016 @@ -306,9 +306,8 @@ protected: }; bool DoExecute(Args &command, CommandReturnObject &result) override { - const size_t argc = command.GetArgumentCount(); - if (argc == 1) { - const char *filename = command.GetArgumentAtIndex(0); + if (command.GetArgumentCount() == 1) { + llvm::StringRef filename = command.GetArgumentAtIndex(0); FileSpec cmd_file(filename, true); ExecutionContext *exe_ctx = nullptr; // Just use the default context. @@ -600,9 +599,7 @@ protected: std::string raw_command_string(remainder); Args args(raw_command_string.c_str()); - size_t argc = args.GetArgumentCount(); - - if (argc < 2) { + if (args.GetArgumentCount() < 2) { result.AppendError("'command alias' requires at least two arguments"); result.SetStatus(eReturnStatusFailed); return false; @@ -610,6 +607,8 @@ protected: // Get the alias command. + // TODO: Convert this function to use StringRef. Requires converting + // GetCommandObjectForCommand. const std::string alias_command = args.GetArgumentAtIndex(0); if (alias_command.size() > 1 && alias_command[0] == '-') { result.AppendError("aliases starting with a dash are not supported"); @@ -719,6 +718,9 @@ protected: return false; } + // TODO: Convert these to StringRefs. Should convert other dependent + // functions (CommandExists, UserCommandExists, AliasExists, AddAlias, + // etc at the same time. const std::string alias_command = args.GetArgumentAtIndex(0); const std::string actual_command = args.GetArgumentAtIndex(1); @@ -744,11 +746,11 @@ protected: OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP(new OptionArgVector); - while (cmd_obj->IsMultiwordObject() && args.GetArgumentCount() > 0) { + while (cmd_obj->IsMultiwordObject() && !args.empty()) { if (argc >= 3) { - const std::string sub_command = args.GetArgumentAtIndex(0); - assert(sub_command.length() != 0); - subcommand_obj_sp = cmd_obj->GetSubcommandSP(sub_command.c_str()); + llvm::StringRef sub_command = args.GetArgumentAtIndex(0); + assert(!sub_command.empty()); + subcommand_obj_sp = cmd_obj->GetSubcommandSP(sub_command.data()); if (subcommand_obj_sp) { sub_cmd_obj = subcommand_obj_sp.get(); use_subcommand = true; @@ -759,7 +761,7 @@ protected: result.AppendErrorWithFormat( "'%s' is not a valid sub-command of '%s'. " "Unable to create alias.\n", - sub_command.c_str(), actual_command.c_str()); + sub_command.data(), actual_command.c_str()); result.SetStatus(eReturnStatusFailed); return false; } @@ -770,7 +772,7 @@ protected: std::string args_string; - if (args.GetArgumentCount() > 0) { + if (!args.empty()) { CommandObjectSP tmp_sp = m_interpreter.GetCommandSPExact(cmd_obj->GetCommandName(), false); if (use_subcommand) @@ -847,44 +849,48 @@ protected: CommandObject::CommandMap::iterator pos; CommandObject *cmd_obj; - if (args.GetArgumentCount() != 0) { - const char *command_name = args.GetArgumentAtIndex(0); - cmd_obj = m_interpreter.GetCommandObject(command_name); - if (cmd_obj) { - if (m_interpreter.CommandExists(command_name)) { - if (cmd_obj->IsRemovable()) { - result.AppendErrorWithFormat( - "'%s' is not an alias, it is a debugger command which can be " - "removed using the 'command delete' command.\n", - command_name); - } else { - result.AppendErrorWithFormat( - "'%s' is a permanent debugger command and cannot be removed.\n", - command_name); - } - result.SetStatus(eReturnStatusFailed); + if (args.empty()) { + result.AppendError("must call 'unalias' with a valid alias"); + result.SetStatus(eReturnStatusFailed); + return false; + } + + // TODO: Convert this function to return a StringRef. Should also convert + // dependent functions GetCommandObject, CommandExists, RemoveAlias, + // AliasExists, etc. + const char *command_name = args.GetArgumentAtIndex(0); + cmd_obj = m_interpreter.GetCommandObject(command_name); + if (cmd_obj) { + if (m_interpreter.CommandExists(command_name)) { + if (cmd_obj->IsRemovable()) { + result.AppendErrorWithFormat( + "'%s' is not an alias, it is a debugger command which can be " + "removed using the 'command delete' command.\n", + command_name); } else { - if (!m_interpreter.RemoveAlias(command_name)) { - if (m_interpreter.AliasExists(command_name)) - result.AppendErrorWithFormat( - "Error occurred while attempting to unalias '%s'.\n", - command_name); - else - result.AppendErrorWithFormat("'%s' is not an existing alias.\n", - command_name); - result.SetStatus(eReturnStatusFailed); - } else - result.SetStatus(eReturnStatusSuccessFinishNoResult); + result.AppendErrorWithFormat( + "'%s' is a permanent debugger command and cannot be removed.\n", + command_name); } - } else { - result.AppendErrorWithFormat( - "'%s' is not a known command.\nTry 'help' to see a " - "current list of commands.\n", - command_name); result.SetStatus(eReturnStatusFailed); + } else { + if (!m_interpreter.RemoveAlias(command_name)) { + if (m_interpreter.AliasExists(command_name)) + result.AppendErrorWithFormat( + "Error occurred while attempting to unalias '%s'.\n", + command_name); + else + result.AppendErrorWithFormat("'%s' is not an existing alias.\n", + command_name); + result.SetStatus(eReturnStatusFailed); + } else + result.SetStatus(eReturnStatusSuccessFinishNoResult); } } else { - result.AppendError("must call 'unalias' with a valid alias"); + result.AppendErrorWithFormat( + "'%s' is not a known command.\nTry 'help' to see a " + "current list of commands.\n", + command_name); result.SetStatus(eReturnStatusFailed); } @@ -925,31 +931,32 @@ protected: bool DoExecute(Args &args, CommandReturnObject &result) override { CommandObject::CommandMap::iterator pos; - if (args.GetArgumentCount() != 0) { - const char *command_name = args.GetArgumentAtIndex(0); - if (m_interpreter.CommandExists(command_name)) { - if (m_interpreter.RemoveCommand(command_name)) { - result.SetStatus(eReturnStatusSuccessFinishNoResult); - } else { - result.AppendErrorWithFormat( - "'%s' is a permanent debugger command and cannot be removed.\n", - command_name); - result.SetStatus(eReturnStatusFailed); - } + if (args.empty()) { + result.AppendErrorWithFormat("must call '%s' with one or more valid user " + "defined regular expression command names", + GetCommandName()); + result.SetStatus(eReturnStatusFailed); + } + + // TODO: Convert this to accept a stringRef. + const char *command_name = args.GetArgumentAtIndex(0); + if (m_interpreter.CommandExists(command_name)) { + if (m_interpreter.RemoveCommand(command_name)) { + result.SetStatus(eReturnStatusSuccessFinishNoResult); } else { - StreamString error_msg_stream; - const bool generate_apropos = true; - const bool generate_type_lookup = false; - CommandObjectHelp::GenerateAdditionalHelpAvenuesMessage( - &error_msg_stream, command_name, nullptr, nullptr, generate_apropos, - generate_type_lookup); - result.AppendErrorWithFormat("%s", error_msg_stream.GetData()); + result.AppendErrorWithFormat( + "'%s' is a permanent debugger command and cannot be removed.\n", + command_name); result.SetStatus(eReturnStatusFailed); } } else { - result.AppendErrorWithFormat("must call '%s' with one or more valid user " - "defined regular expression command names", - GetCommandName()); + StreamString error_msg_stream; + const bool generate_apropos = true; + const bool generate_type_lookup = false; + CommandObjectHelp::GenerateAdditionalHelpAvenuesMessage( + &error_msg_stream, command_name, nullptr, nullptr, generate_apropos, + generate_type_lookup); + result.AppendErrorWithFormat("%s", error_msg_stream.GetData()); result.SetStatus(eReturnStatusFailed); } @@ -1064,48 +1071,49 @@ protected: result.AppendError("usage: 'command regex <command-name> " "[s/<regex1>/<subst1>/ s/<regex2>/<subst2>/ ...]'\n"); result.SetStatus(eReturnStatusFailed); - } else { - Error error; - const char *name = command.GetArgumentAtIndex(0); - m_regex_cmd_ap.reset(new CommandObjectRegexCommand( - m_interpreter, name, m_options.GetHelp(), m_options.GetSyntax(), 10, - 0, true)); - - if (argc == 1) { - Debugger &debugger = m_interpreter.GetDebugger(); - bool color_prompt = debugger.GetUseColor(); - const bool multiple_lines = true; // Get multiple lines - IOHandlerSP io_handler_sp(new IOHandlerEditline( - debugger, IOHandler::Type::Other, - "lldb-regex", // Name of input reader for history - llvm::StringRef("> "), // Prompt - llvm::StringRef(), // Continuation prompt - multiple_lines, color_prompt, - 0, // Don't show line numbers - *this)); + return false; + } - if (io_handler_sp) { - debugger.PushIOHandler(io_handler_sp); - result.SetStatus(eReturnStatusSuccessFinishNoResult); - } - } else { - for (size_t arg_idx = 1; arg_idx < argc; ++arg_idx) { - llvm::StringRef arg_strref(command.GetArgumentAtIndex(arg_idx)); - bool check_only = false; - error = AppendRegexSubstitution(arg_strref, check_only); - if (error.Fail()) - break; - } + Error error; + const char *name = command.GetArgumentAtIndex(0); + m_regex_cmd_ap.reset( + new CommandObjectRegexCommand(m_interpreter, name, m_options.GetHelp(), + m_options.GetSyntax(), 10, 0, true)); - if (error.Success()) { - AddRegexCommandToInterpreter(); - } + if (argc == 1) { + Debugger &debugger = m_interpreter.GetDebugger(); + bool color_prompt = debugger.GetUseColor(); + const bool multiple_lines = true; // Get multiple lines + IOHandlerSP io_handler_sp(new IOHandlerEditline( + debugger, IOHandler::Type::Other, + "lldb-regex", // Name of input reader for history + llvm::StringRef("> "), // Prompt + llvm::StringRef(), // Continuation prompt + multiple_lines, color_prompt, + 0, // Don't show line numbers + *this)); + + if (io_handler_sp) { + debugger.PushIOHandler(io_handler_sp); + result.SetStatus(eReturnStatusSuccessFinishNoResult); } - if (error.Fail()) { - result.AppendError(error.AsCString()); - result.SetStatus(eReturnStatusFailed); + } else { + for (size_t arg_idx = 1; arg_idx < argc; ++arg_idx) { + llvm::StringRef arg_strref(command.GetArgumentAtIndex(arg_idx)); + bool check_only = false; + error = AppendRegexSubstitution(arg_strref, check_only); + if (error.Fail()) + break; + } + + if (error.Success()) { + AddRegexCommandToInterpreter(); } } + if (error.Fail()) { + result.AppendError(error.AsCString()); + result.SetStatus(eReturnStatusFailed); + } return result.Succeeded(); } @@ -1254,6 +1262,7 @@ private: return llvm::makeArrayRef(g_regex_options); } + // TODO: Convert these functions to return StringRefs. const char *GetHelp() { return (m_help.empty() ? nullptr : m_help.c_str()); } @@ -1532,33 +1541,26 @@ protected: return false; } - size_t argc = command.GetArgumentCount(); - if (0 == argc) { + if (command.empty()) { result.AppendError("command script import needs one or more arguments"); result.SetStatus(eReturnStatusFailed); return false; } - for (size_t i = 0; i < argc; i++) { - std::string path = command.GetArgumentAtIndex(i); + for (auto &entry : command.entries()) { Error error; const bool init_session = true; // FIXME: this is necessary because CommandObject::CheckRequirements() - // assumes that - // commands won't ever be recursively invoked, but it's actually possible - // to craft - // a Python script that does other "command script imports" in - // __lldb_init_module - // the real fix is to have recursive commands possible with a - // CommandInvocation object - // separate from the CommandObject itself, so that recursive command - // invocations - // won't stomp on each other (wrt to execution contents, options, and - // more) + // assumes that commands won't ever be recursively invoked, but it's + // actually possible to craft a Python script that does other "command + // script imports" in __lldb_init_module the real fix is to have recursive + // commands possible with a CommandInvocation object separate from the + // CommandObject itself, so that recursive command invocations won't stomp + // on each other (wrt to execution contents, options, and more) m_exe_ctx.Clear(); if (m_interpreter.GetScriptInterpreter()->LoadScriptingModule( - path.c_str(), m_options.m_allow_reload, init_session, error)) { + entry.c_str(), m_options.m_allow_reload, init_session, error)) { result.SetStatus(eReturnStatusSuccessFinishNoResult); } else { result.AppendErrorWithFormat("module importing failed: %s", @@ -1752,9 +1754,7 @@ protected: return false; } - size_t argc = command.GetArgumentCount(); - - if (argc != 1) { + if (command.GetArgumentCount() != 1) { result.AppendError("'command script add' requires one argument"); result.SetStatus(eReturnStatusFailed); return false; @@ -1892,9 +1892,7 @@ public: protected: bool DoExecute(Args &command, CommandReturnObject &result) override { - size_t argc = command.GetArgumentCount(); - - if (argc != 1) { + if (command.GetArgumentCount() != 1) { result.AppendError("'command script delete' requires one argument"); result.SetStatus(eReturnStatusFailed); return false; Modified: lldb/trunk/source/Commands/CommandObjectDisassemble.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectDisassemble.cpp?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectDisassemble.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectDisassemble.cpp Wed Oct 5 15:03:37 2016 @@ -300,7 +300,7 @@ bool CommandObjectDisassemble::DoExecute result.SetStatus(eReturnStatusSuccessFinishResult); - if (command.GetArgumentCount() != 0) { + if (!command.empty()) { result.AppendErrorWithFormat( "\"disassemble\" arguments are specified as options.\n"); const int terminal_width = Modified: lldb/trunk/source/Commands/CommandObjectFrame.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectFrame.cpp?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectFrame.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectFrame.cpp Wed Oct 5 15:03:37 2016 @@ -533,7 +533,7 @@ protected: const Format format = m_option_format.GetFormat(); options.SetFormat(format); - if (command.GetArgumentCount() > 0) { + if (!command.empty()) { VariableList regex_var_list; // If we have any args to the variable command, we will make Modified: lldb/trunk/source/Commands/CommandObjectLog.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectLog.cpp?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectLog.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectLog.cpp Wed Oct 5 15:03:37 2016 @@ -182,22 +182,24 @@ protected: 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 - char log_file[PATH_MAX]; - if (m_options.log_file) - m_options.log_file.GetPath(log_file, sizeof(log_file)); - else - log_file[0] = '\0'; - bool success = m_interpreter.GetDebugger().EnableLog( - channel.c_str(), args.GetConstArgumentVector(), log_file, - m_options.log_options, result.GetErrorStream()); - if (success) - result.SetStatus(eReturnStatusSuccessFinishNoResult); - else - result.SetStatus(eReturnStatusFailed); + return false; } + + // Store into a std::string since we're about to shift the channel off. + std::string channel = args.GetArgumentAtIndex(0); + args.Shift(); // Shift off the channel + char log_file[PATH_MAX]; + if (m_options.log_file) + m_options.log_file.GetPath(log_file, sizeof(log_file)); + else + log_file[0] = '\0'; + bool success = m_interpreter.GetDebugger().EnableLog( + channel.c_str(), args.GetConstArgumentVector(), log_file, + m_options.log_options, result.GetErrorStream()); + if (success) + result.SetStatus(eReturnStatusSuccessFinishNoResult); + else + result.SetStatus(eReturnStatusFailed); return result.Succeeded(); } @@ -240,33 +242,32 @@ public: protected: bool DoExecute(Args &args, CommandReturnObject &result) override { - const size_t argc = args.GetArgumentCount(); - if (argc == 0) { + if (args.empty()) { result.AppendErrorWithFormat( "%s takes a log channel and one or more log types.\n", m_cmd_name.c_str()); - } else { - Log::Callbacks log_callbacks; + return false; + } - std::string channel(args.GetArgumentAtIndex(0)); - args.Shift(); // Shift off the channel - if (Log::GetLogChannelCallbacks(ConstString(channel.c_str()), - log_callbacks)) { - log_callbacks.disable(args.GetConstArgumentVector(), - &result.GetErrorStream()); + Log::Callbacks log_callbacks; + + const std::string channel = args.GetArgumentAtIndex(0); + args.Shift(); // Shift off the channel + if (Log::GetLogChannelCallbacks(ConstString(channel), log_callbacks)) { + log_callbacks.disable(args.GetConstArgumentVector(), + &result.GetErrorStream()); + result.SetStatus(eReturnStatusSuccessFinishNoResult); + } else if (channel == "all") { + Log::DisableAllLogChannels(&result.GetErrorStream()); + } else { + LogChannelSP log_channel_sp(LogChannel::FindPlugin(channel.data())); + if (log_channel_sp) { + log_channel_sp->Disable(args.GetConstArgumentVector(), + &result.GetErrorStream()); result.SetStatus(eReturnStatusSuccessFinishNoResult); - } else if (channel == "all") { - Log::DisableAllLogChannels(&result.GetErrorStream()); - } else { - LogChannelSP log_channel_sp(LogChannel::FindPlugin(channel.c_str())); - if (log_channel_sp) { - log_channel_sp->Disable(args.GetConstArgumentVector(), - &result.GetErrorStream()); - result.SetStatus(eReturnStatusSuccessFinishNoResult); - } else - result.AppendErrorWithFormat("Invalid log channel '%s'.\n", - args.GetArgumentAtIndex(0)); - } + } else + result.AppendErrorWithFormat("Invalid log channel '%s'.\n", + channel.data()); } return result.Succeeded(); } @@ -301,30 +302,28 @@ public: protected: bool DoExecute(Args &args, CommandReturnObject &result) override { - const size_t argc = args.GetArgumentCount(); - if (argc == 0) { + if (args.empty()) { Log::ListAllLogChannels(&result.GetOutputStream()); result.SetStatus(eReturnStatusSuccessFinishResult); } else { - for (size_t i = 0; i < argc; ++i) { + for (auto &entry : args.entries()) { Log::Callbacks log_callbacks; - std::string channel(args.GetArgumentAtIndex(i)); - if (Log::GetLogChannelCallbacks(ConstString(channel.c_str()), + if (Log::GetLogChannelCallbacks(ConstString(entry.ref), log_callbacks)) { log_callbacks.list_categories(&result.GetOutputStream()); result.SetStatus(eReturnStatusSuccessFinishResult); - } else if (channel == "all") { + } else if (entry.ref == "all") { Log::ListAllLogChannels(&result.GetOutputStream()); result.SetStatus(eReturnStatusSuccessFinishResult); } else { - LogChannelSP log_channel_sp(LogChannel::FindPlugin(channel.c_str())); + LogChannelSP log_channel_sp(LogChannel::FindPlugin(entry.c_str())); if (log_channel_sp) { log_channel_sp->ListCategories(&result.GetOutputStream()); result.SetStatus(eReturnStatusSuccessFinishNoResult); } else result.AppendErrorWithFormat("Invalid log channel '%s'.\n", - args.GetArgumentAtIndex(0)); + entry.c_str()); } } } @@ -348,45 +347,41 @@ public: protected: bool DoExecute(Args &args, CommandReturnObject &result) override { - const size_t argc = args.GetArgumentCount(); result.SetStatus(eReturnStatusFailed); - if (argc == 1) { - const char *sub_command = args.GetArgumentAtIndex(0); + if (args.GetArgumentCount() == 1) { + llvm::StringRef sub_command = args.GetArgumentAtIndex(0); - if (strcasecmp(sub_command, "enable") == 0) { + if (sub_command.equals_lower("enable")) { Timer::SetDisplayDepth(UINT32_MAX); result.SetStatus(eReturnStatusSuccessFinishNoResult); - } else if (strcasecmp(sub_command, "disable") == 0) { + } else if (sub_command.equals_lower("disable")) { Timer::DumpCategoryTimes(&result.GetOutputStream()); Timer::SetDisplayDepth(0); result.SetStatus(eReturnStatusSuccessFinishResult); - } else if (strcasecmp(sub_command, "dump") == 0) { + } else if (sub_command.equals_lower("dump")) { Timer::DumpCategoryTimes(&result.GetOutputStream()); result.SetStatus(eReturnStatusSuccessFinishResult); - } else if (strcasecmp(sub_command, "reset") == 0) { + } else if (sub_command.equals_lower("reset")) { Timer::ResetCategoryTimes(); result.SetStatus(eReturnStatusSuccessFinishResult); } - } else if (argc == 2) { - const char *sub_command = args.GetArgumentAtIndex(0); - - if (strcasecmp(sub_command, "enable") == 0) { - bool success; - uint32_t depth = - StringConvert::ToUInt32(args.GetArgumentAtIndex(1), 0, 0, &success); - if (success) { - Timer::SetDisplayDepth(depth); - result.SetStatus(eReturnStatusSuccessFinishNoResult); - } else + } else if (args.GetArgumentCount() == 2) { + llvm::StringRef sub_command = args.GetArgumentAtIndex(0); + llvm::StringRef param = args.GetArgumentAtIndex(1); + + if (sub_command.equals_lower("enable")) { + uint32_t depth; + if (param.consumeInteger(0, depth)) { result.AppendError( "Could not convert enable depth to an unsigned integer."); - } - if (strcasecmp(sub_command, "increment") == 0) { + } else { + Timer::SetDisplayDepth(depth); + result.SetStatus(eReturnStatusSuccessFinishNoResult); + } + } else if (sub_command.equals_lower("increment")) { bool success; - bool increment = Args::StringToBoolean( - llvm::StringRef::withNullAsEmpty(args.GetArgumentAtIndex(1)), false, - &success); + bool increment = Args::StringToBoolean(param, false, &success); if (success) { Timer::SetQuiet(!increment); result.SetStatus(eReturnStatusSuccessFinishNoResult); Modified: lldb/trunk/source/Interpreter/Args.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/Args.cpp?rev=283370&r1=283369&r2=283370&view=diff ============================================================================== --- lldb/trunk/source/Interpreter/Args.cpp (original) +++ lldb/trunk/source/Interpreter/Args.cpp Wed Oct 5 15:03:37 2016 @@ -25,6 +25,7 @@ #include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" @@ -925,16 +926,15 @@ bool Args::ContainsEnvironmentVariable(l return false; // Check each arg to see if it matches the env var name. - for (size_t i = 0; i < GetArgumentCount(); ++i) { - auto arg_value = llvm::StringRef::withNullAsEmpty(GetArgumentAtIndex(i)); - + for (auto arg : llvm::enumerate(m_entries)) { llvm::StringRef name, value; - std::tie(name, value) = arg_value.split('='); - if (name == env_var_name) { - if (argument_index) - *argument_index = i; - return true; - } + std::tie(name, value) = arg.Value.ref.split('='); + if (name != env_var_name) + continue; + + if (argument_index) + *argument_index = arg.Index; + return true; } // We didn't find a match. @@ -942,26 +942,21 @@ bool Args::ContainsEnvironmentVariable(l } size_t Args::FindArgumentIndexForOption(Option *long_options, - int long_options_index) { + int long_options_index) const { char short_buffer[3]; char long_buffer[255]; ::snprintf(short_buffer, sizeof(short_buffer), "-%c", long_options[long_options_index].val); ::snprintf(long_buffer, sizeof(long_buffer), "--%s", long_options[long_options_index].definition->long_option); - size_t end = GetArgumentCount(); - size_t idx = 0; - while (idx < end) { - if ((::strncmp(GetArgumentAtIndex(idx), short_buffer, - strlen(short_buffer)) == 0) || - (::strncmp(GetArgumentAtIndex(idx), long_buffer, strlen(long_buffer)) == - 0)) { - return idx; - } - ++idx; + + for (auto entry : llvm::enumerate(m_entries)) { + if (entry.Value.ref.startswith(short_buffer) || + entry.Value.ref.startswith(long_buffer)) + return entry.Index; } - return end; + return size_t(-1); } bool Args::IsPositionalArgument(const char *arg) { @@ -1094,28 +1089,29 @@ void Args::ParseAliasOptions(Options &op // given) from the argument list. Also remove them from the // raw_input_string, if one was passed in. size_t idx = FindArgumentIndexForOption(long_options, long_options_index); - if (idx < GetArgumentCount()) { + if (idx == size_t(-1)) + continue; + + if (raw_input_string.size() > 0) { + const char *tmp_arg = GetArgumentAtIndex(idx); + size_t pos = raw_input_string.find(tmp_arg); + if (pos != std::string::npos) + raw_input_string.erase(pos, strlen(tmp_arg)); + } + ReplaceArgumentAtIndex(idx, llvm::StringRef()); + if ((long_options[long_options_index].definition->option_has_arg != + OptionParser::eNoArgument) && + (OptionParser::GetOptionArgument() != nullptr) && + (idx + 1 < GetArgumentCount()) && + (strcmp(OptionParser::GetOptionArgument(), + GetArgumentAtIndex(idx + 1)) == 0)) { if (raw_input_string.size() > 0) { - const char *tmp_arg = GetArgumentAtIndex(idx); + const char *tmp_arg = GetArgumentAtIndex(idx + 1); size_t pos = raw_input_string.find(tmp_arg); if (pos != std::string::npos) raw_input_string.erase(pos, strlen(tmp_arg)); } - ReplaceArgumentAtIndex(idx, llvm::StringRef()); - if ((long_options[long_options_index].definition->option_has_arg != - OptionParser::eNoArgument) && - (OptionParser::GetOptionArgument() != nullptr) && - (idx + 1 < GetArgumentCount()) && - (strcmp(OptionParser::GetOptionArgument(), - GetArgumentAtIndex(idx + 1)) == 0)) { - if (raw_input_string.size() > 0) { - const char *tmp_arg = GetArgumentAtIndex(idx + 1); - size_t pos = raw_input_string.find(tmp_arg); - if (pos != std::string::npos) - raw_input_string.erase(pos, strlen(tmp_arg)); - } - ReplaceArgumentAtIndex(idx + 1, llvm::StringRef()); - } + ReplaceArgumentAtIndex(idx + 1, llvm::StringRef()); } } } @@ -1160,13 +1156,10 @@ void Args::ParseArgsForCompletion(Option auto opt_defs = options.GetDefinitions(); // Fooey... OptionParser::Parse permutes the GetArgumentVector to move the - // options to the front. - // So we have to build another Arg and pass that to OptionParser::Parse so it - // doesn't - // change the one we have. + // options to the front. So we have to build another Arg and pass that to + // OptionParser::Parse so it doesn't change the one we have. - std::vector<const char *> dummy_vec( - GetArgumentVector(), GetArgumentVector() + GetArgumentCount() + 1); + std::vector<char *> dummy_vec = m_argv; bool failed_once = false; uint32_t dash_dash_pos = -1; @@ -1175,9 +1168,9 @@ void Args::ParseArgsForCompletion(Option bool missing_argument = false; int long_options_index = -1; - val = OptionParser::Parse( - dummy_vec.size() - 1, const_cast<char *const *>(&dummy_vec.front()), - sstr.GetData(), long_options, &long_options_index); + val = + OptionParser::Parse(dummy_vec.size() - 1, &dummy_vec[0], sstr.GetData(), + long_options, &long_options_index); if (val == -1) { // When we're completing a "--" which is the last option on line, _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits