diff options
author | Eike Ziller <eike.ziller@qt.io> | 2020-04-28 15:48:36 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-04-28 15:48:36 +0200 |
commit | e9661e43cbbb934e1aca7941685e2035c7dbde56 (patch) | |
tree | 438839660dff750585b4182bcb3711bf98e2e8a9 /src/libs/qtcreatorcdbext | |
parent | 6efed7140b37616b6a6882dd9096d1edafedd089 (diff) | |
parent | 05f746cfd029c0232bb5880c50d0b0d7d17f0cc5 (diff) |
Merge remote-tracking branch 'origin/4.12'
Conflicts:
cmake/QtCreatorIDEBranding.cmake
qbs/modules/qtc/qtc.qbs
qtcreator_ide_branding.pri
src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
Change-Id: If6963d1ef7b5a1ea6343f68c8e7ce6fb5f482f21
Diffstat (limited to 'src/libs/qtcreatorcdbext')
-rw-r--r-- | src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp | 103 |
1 files changed, 60 insertions, 43 deletions
diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index bcadbbf294..f60ad90cc9 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -160,7 +160,7 @@ static const CommandDescription commandDescriptions[] = { {"assign","Assigns a value to a variable in current symbol group.", "[-t token] [-h] <iname=value>\n" "-h Data are hex-encoded, binary data\n" - "-u Data are hex-encoded, UTF16 data" + "-e iname is an hex-encoded expression to be evaluated " }, {"threads","Lists threads in GDBMI format.","[-t token]"}, {"registers","Lists registers in GDBMI format","[-t token]"}, @@ -899,60 +899,77 @@ extern "C" HRESULT CALLBACK assign(CIDebugClient *client, PCSTR argsIn) ExtensionCommandContext exc(client); std::string errorMessage; - bool success = false; bool encoded = false; + bool evaluateExpression = false; int token = 0; - do { - StringList tokens = commandTokens<StringList>(argsIn, &token); - if (token == 0) // partial message - return S_OK; - - if (tokens.empty()) { - errorMessage = singleLineUsage(commandDescriptions[CmdAssign]); - break; - } - + StringList tokens = commandTokens<StringList>(argsIn, &token); + while (!tokens.empty()) { if (tokens.front() == "-h") { encoded = true; tokens.pop_front(); + continue; } - if (tokens.empty()) { - errorMessage = singleLineUsage(commandDescriptions[CmdAssign]); - break; + if (tokens.front() == "-e") { + evaluateExpression = true; + tokens.pop_front(); + continue; } + break; + }; - // Parse 'assign locals.x=5' - const std::string::size_type equalsPos = tokens.front().find('='); - if (equalsPos == std::string::npos) { - errorMessage = singleLineUsage(commandDescriptions[CmdAssign]); - break; - } - const std::string iname = tokens.front().substr(0, equalsPos); - const std::string value = tokens.front().substr(equalsPos + 1, tokens.front().size() - equalsPos - 1); - // get the symbolgroup - int currentFrame = ExtensionContext::instance().symbolGroupFrame(); - if (currentFrame < 0) { - CIDebugControl *control = ExtensionCommandContext::instance()->control(); - DEBUG_STACK_FRAME frame; - if (FAILED(control->GetStackTrace(0, 0, 0, &frame, 1, NULL))) { - errorMessage = "No current frame."; - break; + // Parse 'assign locals.x=5' + const std::string::size_type equalsPos = tokens.empty() ? std::string::npos + : tokens.front().find('='); + if (equalsPos == std::string::npos) { + errorMessage = singleLineUsage(commandDescriptions[CmdAssign]); + } else { + std::string iname = tokens.front().substr(0, equalsPos); + const std::string value = tokens.front().substr(equalsPos + 1, + tokens.front().size() - equalsPos - 1); + SymbolGroup *symGroup = nullptr; + if (evaluateExpression) { + WatchesSymbolGroup *watchesSymGroup + = ExtensionContext::instance().watchesSymbolGroup(exc.symbols(), &errorMessage); + std::string tempAssignIname = "watch.tmpassign"; + if (watchesSymGroup) { + if (watchesSymGroup->addWatch(exc.symbols(), + tempAssignIname, + stringFromHex(iname), + &errorMessage)) { + iname = tempAssignIname; + symGroup = watchesSymGroup; + } + } + } else { + // get the symbolgroup + int currentFrame = ExtensionContext::instance().symbolGroupFrame(); + if (currentFrame < 0) { + CIDebugControl *control = ExtensionCommandContext::instance()->control(); + DEBUG_STACK_FRAME frame; + if (FAILED(control->GetStackTrace(0, 0, 0, &frame, 1, NULL))) + errorMessage = "No current frame."; + else + currentFrame = frame.FrameNumber; + } + if (currentFrame >= 0) { + symGroup = ExtensionContext::instance().symbolGroup(exc.symbols(), + exc.threadId(), + currentFrame, + &errorMessage); } - currentFrame = frame.FrameNumber; } - SymbolGroup *symGroup = ExtensionContext::instance().symbolGroup(exc.symbols(), exc.threadId(), currentFrame, &errorMessage); - if (!symGroup) - break; - success = symGroup->assign(iname, encoded ? stringFromHex(value) : value, - SymbolGroupValueContext(exc.dataSpaces(), exc.symbols()), - &errorMessage); - } while (false); + if (symGroup + && symGroup->assign(iname, + encoded ? stringFromHex(value) : value, + SymbolGroupValueContext(exc.dataSpaces(), exc.symbols()), + &errorMessage)) { + ExtensionContext::instance().report('R', token, 0, "assign", "Ok"); + return S_OK; + } + } - if (success) - ExtensionContext::instance().report('R', token, 0, "assign", "Ok"); - else - ExtensionContext::instance().report('N', token, 0, "assign", errorMessage.c_str()); + ExtensionContext::instance().report('N', token, 0, "assign", errorMessage.c_str()); return S_OK; } |