CDB: Fix code model scope detection when stopping at function scope.

that is, setting a break point at the opening brace or at function.
Set StackFrame::from correctly.
This commit is contained in:
Friedemann Kleint
2009-10-19 10:59:46 +02:00
parent 074d477fb0
commit f240ceb4e6
2 changed files with 19 additions and 12 deletions

View File

@@ -88,6 +88,7 @@ bool CdbStackTraceContext::init(unsigned long frameCount, QString * /*errorMessa
if (debugCDB) if (debugCDB)
qDebug() << Q_FUNC_INFO << frameCount; qDebug() << Q_FUNC_INFO << frameCount;
const QChar exclamationMark = QLatin1Char('!');
m_frameContexts.resize(frameCount); m_frameContexts.resize(frameCount);
qFill(m_frameContexts, static_cast<CdbStackFrameContext*>(0)); qFill(m_frameContexts, static_cast<CdbStackFrameContext*>(0));
@@ -102,7 +103,11 @@ bool CdbStackTraceContext::init(unsigned long frameCount, QString * /*errorMessa
frame.address = QString::fromLatin1("0x%1").arg(instructionOffset, 0, 16); frame.address = QString::fromLatin1("0x%1").arg(instructionOffset, 0, 16);
m_cif->debugSymbols->GetNameByOffsetWide(instructionOffset, wszBuf, MAX_PATH, 0, 0); m_cif->debugSymbols->GetNameByOffsetWide(instructionOffset, wszBuf, MAX_PATH, 0, 0);
// Determine function and module, if available
frame.function = QString::fromUtf16(reinterpret_cast<const ushort *>(wszBuf)); frame.function = QString::fromUtf16(reinterpret_cast<const ushort *>(wszBuf));
const int moduleSepPos = frame.function.indexOf(exclamationMark);
if (moduleSepPos != -1)
frame.from = frame.function.mid(0, moduleSepPos);
ULONG ulLine; ULONG ulLine;
ULONG64 ul64Displacement; ULONG64 ul64Displacement;

View File

@@ -365,16 +365,24 @@ int getUninitializedVariablesI(const CPlusPlus::Snapshot &snapshot,
const CPlusPlus::Symbol *symbolAtLine = doc->findSymbolAt(line, 0); const CPlusPlus::Symbol *symbolAtLine = doc->findSymbolAt(line, 0);
if (!symbolAtLine) if (!symbolAtLine)
return 4; return 4;
// First figure out the function to do a safety name check. // First figure out the function to do a safety name check
// and the innermost scope at cursor position
const CPlusPlus::Function *function = 0; const CPlusPlus::Function *function = 0;
const bool hitFunction = symbolAtLine->isFunction(); const CPlusPlus::Scope *innerMostScope = 0;
if (hitFunction) { if (symbolAtLine->isFunction()) {
function = symbolAtLine->asFunction(); function = symbolAtLine->asFunction();
if (function->memberCount() == 1) // Skip over function block
if (CPlusPlus::Block *block = function->memberAt(0)->asBlock())
innerMostScope = block->members();
} else { } else {
if (CPlusPlus::Scope *functionScope = symbolAtLine->enclosingFunctionScope()) if (const CPlusPlus::Scope *functionScope = symbolAtLine->enclosingFunctionScope()) {
function = functionScope->owner()->asFunction(); function = functionScope->owner()->asFunction();
innerMostScope = symbolAtLine->isBlock() ?
symbolAtLine->asBlock()->members() :
symbolAtLine->enclosingBlockScope();
}
} }
if (!function) if (!function || !innerMostScope)
return 7; return 7;
// Compare function names with a bit off fuzz, // Compare function names with a bit off fuzz,
// skipping modules from a CDB symbol "lib!foo" or namespaces // skipping modules from a CDB symbol "lib!foo" or namespaces
@@ -388,13 +396,7 @@ int getUninitializedVariablesI(const CPlusPlus::Snapshot &snapshot,
if (previousChar != ':' && previousChar != '!' ) if (previousChar != ':' && previousChar != '!' )
return 11; return 11;
} }
// Starting from the innermost block scope, collect // Starting from the innermost block scope, collect declarations.
// declarations.
const CPlusPlus::Scope *innerMostScope = hitFunction ?
symbolAtLine->asFunction()->members() :
symbolAtLine->enclosingBlockScope();
if (!innerMostScope)
return 15;
SeenHash seenHash; SeenHash seenHash;
blockRecursion(overview, innerMostScope, line, uninitializedVariables, &seenHash); blockRecursion(overview, innerMostScope, line, uninitializedVariables, &seenHash);
return 0; return 0;