status_t TeamDebugInfo::LoadImageDebugInfo(const ImageInfo& imageInfo, LocatableFile* imageFile, ImageDebugInfo*& _imageDebugInfo) { ImageDebugInfo* imageDebugInfo = new(std::nothrow) ImageDebugInfo( imageInfo); if (imageDebugInfo == NULL) return B_NO_MEMORY; ObjectDeleter<ImageDebugInfo> imageDebugInfoDeleter(imageDebugInfo); for (int32 i = 0; SpecificTeamDebugInfo* specificTeamInfo = fSpecificInfos.ItemAt(i); i++) { SpecificImageDebugInfo* specificImageInfo; status_t error = specificTeamInfo->CreateImageDebugInfo(imageInfo, imageFile, specificImageInfo); if (error == B_OK) { if (!imageDebugInfo->AddSpecificInfo(specificImageInfo)) { delete specificImageInfo; return B_NO_MEMORY; } } else if (error == B_NO_MEMORY) return error; // fail only when out of memory } status_t error = imageDebugInfo->FinishInit(); if (error != B_OK) return error; _imageDebugInfo = imageDebugInfoDeleter.Detach(); return B_OK; }
status_t TeamDebugInfo::LoadImageDebugInfo(const ImageInfo& imageInfo, LocatableFile* imageFile, ImageDebugInfoLoadingState& _state, ImageDebugInfo*& _imageDebugInfo) { ImageDebugInfo* imageDebugInfo = new(std::nothrow) ImageDebugInfo( imageInfo); if (imageDebugInfo == NULL) return B_NO_MEMORY; BReference<ImageDebugInfo> imageDebugInfoReference(imageDebugInfo, true); for (int32 i = 0; SpecificTeamDebugInfo* specificTeamInfo = fSpecificInfos.ItemAt(i); i++) { SpecificImageDebugInfo* specificImageInfo; status_t error = specificTeamInfo->CreateImageDebugInfo(imageInfo, imageFile, _state, specificImageInfo); if (error == B_OK) { if (!imageDebugInfo->AddSpecificInfo(specificImageInfo)) { delete specificImageInfo; return B_NO_MEMORY; } } else if (_state.UserInputRequired()) { _state.SetSpecificInfoIndex(i); return error; } else if (error == B_NO_MEMORY) return error; // fail only when out of memory _state.ClearSpecificDebugInfoLoadingState(); // if we made it this far, then we're done with current specific // info, and its corresponding state object, if any, is no longer // needed } status_t error = imageDebugInfo->FinishInit(fDebuggerInterface); if (error != B_OK) return error; if (fMainFunction == NULL) { FunctionInstance* instance = imageDebugInfo->MainFunction(); if (instance != NULL) fMainFunction = instance; } _imageDebugInfo = imageDebugInfoReference.Detach(); return B_OK; }