forked from qt-creator/qt-creator
Cdbext: Fix fetching partial variable
Avoid calling PyValue::childCount as it expands the values in front of the partial variable recursively. This outdates scopeEnd as it is fetched before the items are expanded, which again results in a too early return from that function. Fixes: QTCREATORBUG-24108 Change-Id: I0848cde88c6ff8019a4ab22ac1153598c20e563d Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -220,17 +220,13 @@ static PyObject *cdbext_listOfLocals(PyObject *, PyObject *args) // -> [ Value ]
|
|||||||
++currentPartialIname; // skip "local" part
|
++currentPartialIname; // skip "local" part
|
||||||
|
|
||||||
ULONG symbolGroupIndex = 0;
|
ULONG symbolGroupIndex = 0;
|
||||||
ULONG childEndIndex = 0;
|
|
||||||
for (;symbolGroupIndex < scopeEnd; ++symbolGroupIndex) {
|
for (;symbolGroupIndex < scopeEnd; ++symbolGroupIndex) {
|
||||||
PyValue value(symbolGroupIndex, symbolGroup);
|
PyValue value(symbolGroupIndex, symbolGroup);
|
||||||
if (childEndIndex <= symbolGroupIndex) { // do not return a child value
|
if (value.name() == *currentPartialIname) {
|
||||||
if (value.name() == *currentPartialIname) {
|
PyList_Append(locals, createPythonObject(value));
|
||||||
PyList_Append(locals, createPythonObject(value));
|
return locals;
|
||||||
return locals;
|
|
||||||
}
|
|
||||||
++childEndIndex;
|
|
||||||
}
|
}
|
||||||
childEndIndex += ULONG(value.childCount());
|
symbolGroupIndex += value.currentNumberOfDescendants();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -278,13 +278,18 @@ PyValue PyValue::childFromIndex(int index)
|
|||||||
|
|
||||||
int offset = index + 1;
|
int offset = index + 1;
|
||||||
for (ULONG childIndex = m_index + 1; childIndex < m_index + offset; ) {
|
for (ULONG childIndex = m_index + 1; childIndex < m_index + offset; ) {
|
||||||
const ULONG childDescendantCount = currentNumberOfDescendants(childIndex, m_symbolGroup);
|
const ULONG childDescendantCount = ::currentNumberOfDescendants(childIndex, m_symbolGroup);
|
||||||
childIndex += childDescendantCount + 1;
|
childIndex += childDescendantCount + 1;
|
||||||
offset += childDescendantCount;
|
offset += childDescendantCount;
|
||||||
}
|
}
|
||||||
return PyValue(m_index + offset, m_symbolGroup);
|
return PyValue(m_index + offset, m_symbolGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ULONG PyValue::currentNumberOfDescendants()
|
||||||
|
{
|
||||||
|
return ::currentNumberOfDescendants(m_index, m_symbolGroup);
|
||||||
|
}
|
||||||
|
|
||||||
PyValue PyValue::createValue(ULONG64 address, const PyType &type)
|
PyValue PyValue::createValue(ULONG64 address, const PyType &type)
|
||||||
{
|
{
|
||||||
if (debuggingValueEnabled()) {
|
if (debuggingValueEnabled()) {
|
||||||
|
@@ -55,6 +55,7 @@ public:
|
|||||||
PyValue childFromName(const std::string &name);
|
PyValue childFromName(const std::string &name);
|
||||||
PyValue childFromField(const PyField &field);
|
PyValue childFromField(const PyField &field);
|
||||||
PyValue childFromIndex(int index);
|
PyValue childFromIndex(int index);
|
||||||
|
ULONG currentNumberOfDescendants();
|
||||||
|
|
||||||
static PyValue createValue(ULONG64 address, const PyType &type);
|
static PyValue createValue(ULONG64 address, const PyType &type);
|
||||||
static int tag(const std::string &typeName);
|
static int tag(const std::string &typeName);
|
||||||
|
Reference in New Issue
Block a user