aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/qtcreatorcdbext
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2020-04-28 15:48:36 +0200
committerEike Ziller <eike.ziller@qt.io>2020-04-28 15:48:36 +0200
commite9661e43cbbb934e1aca7941685e2035c7dbde56 (patch)
tree438839660dff750585b4182bcb3711bf98e2e8a9 /src/libs/qtcreatorcdbext
parent6efed7140b37616b6a6882dd9096d1edafedd089 (diff)
parent05f746cfd029c0232bb5880c50d0b0d7d17f0cc5 (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.cpp103
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;
}