From: Mikhail Kurinnoi Date: Fri, 15 Dec 2023 14:37:58 +0000 (+0300) Subject: Fix CLI `print` command evaluation parser. X-Git-Tag: accepted/tizen/unified/riscv/20240111.091737~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=24955f6eda0cac3ae61b44dbf4263b3e9847fb8a;p=sdk%2Ftools%2Fnetcoredbg.git Fix CLI `print` command evaluation parser. Fix CLI `print` command completion, will use variable/args names from proper frame now. --- diff --git a/src/protocols/cliprotocol.cpp b/src/protocols/cliprotocol.cpp index 3972273..b6e4aa0 100644 --- a/src/protocols/cliprotocol.cpp +++ b/src/protocols/cliprotocol.cpp @@ -981,7 +981,7 @@ void CLIProtocol::EmitOutputEvent(OutputCategory category, string_view output, s template <> -HRESULT CLIProtocol::doCommand(const std::vector &args_orig, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args_orig, std::string &output) { lock_guard lock(m_mutex); @@ -1057,7 +1057,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &unmutable_args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &unmutable_args, std::string &output) { HRESULT Status = E_FAIL; Breakpoint breakpoint; @@ -1099,7 +1099,7 @@ HRESULT CLIProtocol::doCommand(const std::vector } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &outStr) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &outStr) { if (args.size() < 2) { @@ -1163,7 +1163,7 @@ HRESULT CLIProtocol::doCommand(const std::vector } template <> -HRESULT CLIProtocol::doCommand(const std::vector &, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &, std::string &output) { { lock_guard lock(m_mutex); @@ -1197,7 +1197,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &) { std::unordered_set ids; for (const std::string &idStr : args) @@ -1214,7 +1214,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { { lock_guard lock(m_mutex); @@ -1231,7 +1231,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &) { int count = 0, sub = 0; @@ -1267,7 +1267,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &) { int count = 0, sub = 0; @@ -1303,7 +1303,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { if (args.empty()) { @@ -1317,13 +1317,13 @@ HRESULT CLIProtocol::doCommand(const std::vector } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { return StepCommand(args, output, IDebugger::StepType::STEP_OUT); } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { lock_guard lock(m_mutex); @@ -1374,14 +1374,14 @@ HRESULT CLIProtocol::doCommand(const std::vector } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { printHelp(CommandsList::commands_list, args.empty() ? string_view{} : string_view{args[0]}); return S_OK; } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { { lock_guard lock(m_mutex); @@ -1420,7 +1420,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector& args, std::string& output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector& args, std::string& output) { const static string_view header[] {"#", "Enb", "Rslvd", "Hits", "Source/Function"}; const static string_view data[] { "99999", "Y", "N", "999999999", "" }; @@ -1508,7 +1508,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &, std::string &output) { { lock_guard lock(m_mutex); @@ -1533,7 +1533,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { HRESULT status = S_OK; int line = m_sourceLine; @@ -1651,7 +1651,7 @@ HRESULT CLIProtocol::doCommand(const std::vector } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { return StepCommand(args, output, IDebugger::StepType::STEP_OVER); } @@ -1684,7 +1684,7 @@ HRESULT CLIProtocol::PrintVariable(const Variable &v, std::ostringstream &ss, bo } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &input, const std::vector &args, std::string &output) { ThreadId threadId; FrameId frameId; @@ -1696,7 +1696,12 @@ HRESULT CLIProtocol::doCommand(const std::vector if (!args.empty()) { - m_lastPrintArg = args[0]; + // In order to get expression from input string that contain command and spaces (for example, ` p "test"`): + // 1) find first 'p' (could be "p" or "print" only here); + // 2) find first ' ' (after command we have at least one space for sure); + // 3) find first not ' ' (skip all spaces before expression); + // Note, we don't check errors here, since at this point `input` string have "p "/"print " substrings for sure. + m_lastPrintArg = input.substr(input.find_first_not_of(' ', input.find_first_of(' ', input.find_first_of('p')))); } else if (m_lastPrintArg.empty()) { @@ -1718,7 +1723,7 @@ HRESULT CLIProtocol::doCommand(const std::vector } template <> -HRESULT CLIProtocol::doCommand(const std::vector &, std::string &) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &, std::string &) { // no mutex locking needed here m_exit = true; @@ -1728,7 +1733,7 @@ HRESULT CLIProtocol::doCommand(const std::vector } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { unique_lock lock(m_mutex); @@ -1771,7 +1776,7 @@ HRESULT CLIProtocol::doCommand(const std::vector & } template <> -HRESULT CLIProtocol::doCommand(const std::vector& args, std::string& output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector& args, std::string& output) { unique_lock lock(m_mutex); @@ -1809,14 +1814,14 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { return StepCommand(args, output, IDebugger::StepType::STEP_IN); } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { // check arguments if (args.empty()) @@ -1847,7 +1852,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &, std::string &) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &, std::string &) { lock_guard lock(m_mutex); @@ -1860,21 +1865,21 @@ HRESULT CLIProtocol::doCommand(const std::vector template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { printf("Argument(s) required: see 'help set' for details.\n"); return S_FALSE; } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { printHelp(CommandsList::info_commands, args.empty() ? string_view{} : string_view{args[0]}); return S_OK; } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { printHelp(CommandsList::info_commands, args.empty() ? string_view{} : string_view{args[0]}); return S_OK; @@ -1882,14 +1887,14 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { printf("Argument(s) required: see 'help save' for details.\n"); return S_FALSE; } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { if (args.empty()) { @@ -1957,7 +1962,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { printHelp(CommandsList::save_commands, args.empty() ? string_view{} : string_view{args[0]}); return S_OK; @@ -1965,7 +1970,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { lock_guard lock(m_mutex); m_execArgs = args; @@ -1973,7 +1978,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { if (args.empty() || (args[0] != "0" && args[0] != "1")) return E_INVALIDARG; @@ -1983,7 +1988,7 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { if (args.empty() || (args[0] != "0" && args[0] != "1")) return E_INVALIDARG; @@ -1993,28 +1998,28 @@ HRESULT CLIProtocol::doCommand(const std::vector -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &, const std::vector &args, std::string &output) { printHelp(CommandsList::set_commands, args.empty() ? string_view{} : string_view{args[0]}); return S_OK; } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &input, const std::vector &args, std::string &output) { - return doCommand(args, output); + return doCommand(input, args, output); } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &input, const std::vector &args, std::string &output) { - return doCommand(args, output); + return doCommand(input, args, output); } template <> -HRESULT CLIProtocol::doCommand(const std::vector &args, std::string &output) +HRESULT CLIProtocol::doCommand(const std::string &input, const std::vector &args, std::string &output) { - return doCommand(args, output); + return doCommand(input, args, output); } @@ -2082,7 +2087,9 @@ void CLIProtocol::completion_handler(string_view prefix, c const static unsigned QueryLimit = 30; auto thread = m_sharedDebugger->GetLastStoppedThreadId(); - auto frame = FrameLevel{0}; + m_mutex.lock(); + auto frame = FrameLevel{m_frameIdx}; + m_mutex.unlock(); unsigned count; auto counter = [&](const char *) { return ++count, true; }; @@ -2350,7 +2357,7 @@ HRESULT CLIProtocol::execCommands(LineReader&& lr, bool printCommands) while (tokenizer.Next(result)) args.push_back(result); - hr = (this->*func)(args, output); + hr = (this->*func)(str, args, output); have_result = true; }; diff --git a/src/protocols/cliprotocol.h b/src/protocols/cliprotocol.h index 76f0adf..0434d7a 100644 --- a/src/protocols/cliprotocol.h +++ b/src/protocols/cliprotocol.h @@ -140,11 +140,11 @@ private: using CLIParams = Expose; // Type of the member function pointer, which handles every user command. - typedef HRESULT (CLIProtocol::*HandlerFunc)(const std::vector &args, std::string &output); + typedef HRESULT (CLIProtocol::*HandlerFunc)(const std::string &input, const std::vector &args, std::string &output); // This function template should be explicitly specialized by command tag // to handle each particular user command. - template HRESULT doCommand(const std::vector &, std::string &); + template HRESULT doCommand(const std::string &, const std::vector &, std::string &); // This type maps particular command tag to particular specialization // of `doCommand` function. This is required to dispatch commands handlers.