diff options
author | David Schulz <david.schulz@qt.io> | 2017-04-10 14:53:32 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2017-04-11 07:32:14 +0000 |
commit | 34f1349c932ee352a90c9c4dcfc38a355e398305 (patch) | |
tree | 76ca5472bfc9384eef7ca9aabd695a94a26da5cb | |
parent | 873559b9c97570f7035c7f66f0447d09feff3136 (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.cpp | 11 | ||||
-rw-r--r-- | src/libs/qtcreatorcdbext/symbolgroup.cpp | 7 | ||||
-rw-r--r-- | src/libs/qtcreatorcdbext/symbolgroupvalue.cpp | 6 | ||||
-rw-r--r-- | src/libs/qtcreatorcdbext/symbolgroupvalue.h | 2 |
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); |