aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2017-04-10 14:53:32 +0200
committerDavid Schulz <david.schulz@qt.io>2017-04-11 07:32:14 +0000
commit34f1349c932ee352a90c9c4dcfc38a355e398305 (patch)
tree76ca5472bfc9384eef7ca9aabd695a94a26da5cb
parent873559b9c97570f7035c7f66f0447d09feff3136 (diff)
Debugger: Fix assigning values to locals
Change-Id: I366f597ee54e3c3d916bac2879c4c02b59ee2e83 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r--src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp11
-rw-r--r--src/libs/qtcreatorcdbext/symbolgroup.cpp7
-rw-r--r--src/libs/qtcreatorcdbext/symbolgroupvalue.cpp6
-rw-r--r--src/libs/qtcreatorcdbext/symbolgroupvalue.h2
4 files changed, 17 insertions, 9 deletions
diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
index b9d68e9102..f98205db72 100644
--- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
+++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
@@ -850,10 +850,15 @@ extern "C" HRESULT CALLBACK assign(CIDebugClient *client, PCSTR argsIn)
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
- const int currentFrame = ExtensionContext::instance().symbolGroupFrame();
+ int currentFrame = ExtensionContext::instance().symbolGroupFrame();
if (currentFrame < 0) {
- errorMessage = "No current frame.";
- break;
+ CIDebugControl *control = ExtensionCommandContext::instance()->control();
+ DEBUG_STACK_FRAME frame;
+ if (FAILED(control->GetStackTrace(0, 0, 0, &frame, 1, NULL))) {
+ errorMessage = "No current frame.";
+ break;
+ }
+ currentFrame = frame.FrameNumber;
}
SymbolGroup *symGroup = ExtensionContext::instance().symbolGroup(exc.symbols(), exc.threadId(), currentFrame, &errorMessage);
if (!symGroup)
diff --git a/src/libs/qtcreatorcdbext/symbolgroup.cpp b/src/libs/qtcreatorcdbext/symbolgroup.cpp
index ed9cb0f248..5ea3e8930e 100644
--- a/src/libs/qtcreatorcdbext/symbolgroup.cpp
+++ b/src/libs/qtcreatorcdbext/symbolgroup.cpp
@@ -465,8 +465,11 @@ bool SymbolGroup::assign(const std::string &nodeName,
return false;
}
- return (node->dumperType() & KT_Editable) ? // Edit complex types
- assignType(node, valueEncoding, value, ctx, errorMessage) :
+ int kt = node->dumperType();
+ if (kt < 0)
+ kt = knownType(node->type(), KnownTypeAutoStripPointer | KnownTypeHasClassPrefix);
+ return (kt & KT_Editable) ? // Edit complex types
+ assignType(node, kt, valueEncoding, value, ctx, errorMessage) :
node->assign(value, errorMessage);
}
diff --git a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp
index 9c5ff7bc25..d27e6bdf1f 100644
--- a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp
+++ b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp
@@ -3552,17 +3552,17 @@ static inline bool assignStdString(SymbolGroupNode *n,
return true;
}
-bool assignType(SymbolGroupNode *n, int valueEncoding, const std::string &value,
+bool assignType(SymbolGroupNode *n, int knownType, int valueEncoding, const std::string &value,
const SymbolGroupValueContext &ctx, std::string *errorMessage)
{
- switch (n->dumperType()) {
+ switch (knownType) {
case KT_QString:
return assignQString(n, valueEncoding, value, ctx, errorMessage);
case KT_QByteArray:
return assignQByteArray(n, valueEncoding, value, ctx, errorMessage);
case KT_StdString:
case KT_StdWString:
- return assignStdString(n, n->dumperType(), valueEncoding, value, ctx, errorMessage);
+ return assignStdString(n, knownType, valueEncoding, value, ctx, errorMessage);
default:
break;
}
diff --git a/src/libs/qtcreatorcdbext/symbolgroupvalue.h b/src/libs/qtcreatorcdbext/symbolgroupvalue.h
index 61c5a67523..b2c89cba47 100644
--- a/src/libs/qtcreatorcdbext/symbolgroupvalue.h
+++ b/src/libs/qtcreatorcdbext/symbolgroupvalue.h
@@ -286,7 +286,7 @@ enum AssignEncoding
AssignHexEncodedUtf16
};
-bool assignType(SymbolGroupNode *n, int valueEncoding, const std::string &value,
+bool assignType(SymbolGroupNode *n, int knownType, int valueEncoding, const std::string &value,
const SymbolGroupValueContext &ctx,
std::string *errorMessage);