void TeamWindow::_SetActiveBreakpoint(UserBreakpoint* breakpoint) { if (breakpoint == fActiveBreakpoint) return; if (fActiveBreakpoint != NULL) fActiveBreakpoint->ReleaseReference(); fActiveBreakpoint = breakpoint; if (fActiveBreakpoint != NULL) { fActiveBreakpoint->AcquireReference(); // get the breakpoint's function (more exactly: some function instance) AutoLocker< ::Team> locker(fTeam); Function* function = fTeam->FunctionByID( breakpoint->Location().GetFunctionID()); FunctionInstance* functionInstance = function != NULL ? function->FirstInstance() : NULL; BReference<FunctionInstance> functionInstanceReference( functionInstance); locker.Unlock(); fActiveSourceObject = ACTIVE_SOURCE_BREAKPOINT; _SetActiveFunction(functionInstance); // scroll to the breakpoint's source code line number (it is not done // automatically, if the active function remains the same) _ScrollToActiveFunction(); } }
status_t Team::GetStatementAtSourceLocation(SourceCode* sourceCode, const SourceLocation& location, Statement*& _statement) { TRACE_CODE("Team::GetStatementAtSourceLocation(%p, (%" B_PRId32 ", %" B_PRId32 "))\n", sourceCode, location.Line(), location.Column()); // If we're lucky the source code can provide us with a statement. if (DisassembledCode* code = dynamic_cast<DisassembledCode*>(sourceCode)) { Statement* statement = code->StatementAtLocation(location); if (statement == NULL) return B_ENTRY_NOT_FOUND; statement->AcquireReference(); _statement = statement; return B_OK; } // Go the long and stony way over the source file and the team debug info. // get the source file for the source code LocatableFile* sourceFile = sourceCode->GetSourceFile(); if (sourceFile == NULL) return B_ENTRY_NOT_FOUND; // get the function at the source location Function* function = fDebugInfo->FunctionAtSourceLocation(sourceFile, location); if (function == NULL) return B_ENTRY_NOT_FOUND; // Get some function instance and ask its image debug info to provide us // with a statement. FunctionInstance* functionInstance = function->FirstInstance(); if (functionInstance == NULL) return B_ENTRY_NOT_FOUND; FunctionDebugInfo* functionDebugInfo = functionInstance->GetFunctionDebugInfo(); return functionDebugInfo->GetSpecificImageDebugInfo() ->GetStatementAtSourceLocation(functionDebugInfo, location, _statement); }
status_t TeamDebugInfo::LoadSourceCode(LocatableFile* file, FileSourceCode*& _sourceCode) { AutoLocker<BLocker> locker(fLock); // If we don't know the source file, there's nothing we can do. SourceFileEntry* entry = fSourceFiles->Lookup(file); if (entry == NULL) return B_ENTRY_NOT_FOUND; // the source might already be loaded FileSourceCode* sourceCode = entry->GetSourceCode(); if (sourceCode != NULL) { sourceCode->AcquireReference(); _sourceCode = sourceCode; return B_OK; } // get the source language from some function's image debug info Function* function = entry->FunctionAt(0); if (function == NULL) return B_ENTRY_NOT_FOUND; FunctionDebugInfo* functionDebugInfo = function->FirstInstance()->GetFunctionDebugInfo(); SourceLanguage* language; status_t error = functionDebugInfo->GetSpecificImageDebugInfo() ->GetSourceLanguage(functionDebugInfo, language); if (error != B_OK) return error; BReference<SourceLanguage> languageReference(language, true); // no source code yet // locker.Unlock(); // TODO: It would be nice to unlock here, but we need to iterate through // the images below. We could clone the list, acquire references, and // unlock. Then we have to compare the list with the then current list when // we're done loading. // load the source file SourceFile* sourceFile; error = fFileManager->LoadSourceFile(file, sourceFile); if (error != B_OK) return error; // create the source code sourceCode = new(std::nothrow) FileSourceCode(file, sourceFile, language); sourceFile->ReleaseReference(); if (sourceCode == NULL) return B_NO_MEMORY; BReference<FileSourceCode> sourceCodeReference(sourceCode, true); error = sourceCode->Init(); if (error != B_OK) return error; // Iterate through all images that know the source file and ask them to add // information. bool anyInfo = false; for (int32 i = 0; ImageDebugInfo* imageDebugInfo = fImages.ItemAt(i); i++) anyInfo |= imageDebugInfo->AddSourceCodeInfo(file, sourceCode) == B_OK; if (!anyInfo) return B_ENTRY_NOT_FOUND; entry->SetSourceCode(sourceCode); _sourceCode = sourceCodeReference.Detach(); return B_OK; }