Call Host_NotifyMapLoaded when clearing g_symbolDB

Otherwise DolphinQt will have a stale symbol list and
you can get nullptr dereferences when trying to use it.
This commit is contained in:
JosJuice 2019-05-01 17:32:45 +02:00
parent d9999f406b
commit 8fd6f8f6e9
5 changed files with 24 additions and 3 deletions

View File

@ -42,6 +42,11 @@ void SymbolDB::List()
INFO_LOG(OSHLE, "%zu functions known in this program above.", m_functions.size()); INFO_LOG(OSHLE, "%zu functions known in this program above.", m_functions.size());
} }
bool SymbolDB::IsEmpty() const
{
return m_functions.empty();
}
void SymbolDB::Clear(const char* prefix) void SymbolDB::Clear(const char* prefix)
{ {
// TODO: honor prefix // TODO: honor prefix

View File

@ -78,6 +78,7 @@ public:
const XFuncMap& Symbols() const { return m_functions; } const XFuncMap& Symbols() const { return m_functions; }
XFuncMap& AccessSymbols() { return m_functions; } XFuncMap& AccessSymbols() { return m_functions; }
bool IsEmpty() const;
void Clear(const char* prefix = ""); void Clear(const char* prefix = "");
void List(); void List();
void Index(); void Index();

View File

@ -383,7 +383,11 @@ bool CBoot::BootUp(std::unique_ptr<BootParameters> boot)
{ {
SConfig& config = SConfig::GetInstance(); SConfig& config = SConfig::GetInstance();
g_symbolDB.Clear(); if (!g_symbolDB.IsEmpty())
{
g_symbolDB.Clear();
UpdateDebugger_MapLoaded();
}
// PAL Wii uses NTSC framerate and linecount in 60Hz modes // PAL Wii uses NTSC framerate and linecount in 60Hz modes
VideoInterface::Preset(DiscIO::IsNTSC(config.m_region) || VideoInterface::Preset(DiscIO::IsNTSC(config.m_region) ||

View File

@ -35,6 +35,7 @@
#include "Core/HLE/HLE.h" #include "Core/HLE/HLE.h"
#include "Core/HW/DVD/DVDInterface.h" #include "Core/HW/DVD/DVDInterface.h"
#include "Core/HW/SI/SI.h" #include "Core/HW/SI/SI.h"
#include "Core/Host.h"
#include "Core/IOS/ES/ES.h" #include "Core/IOS/ES/ES.h"
#include "Core/IOS/ES/Formats.h" #include "Core/IOS/ES/Formats.h"
#include "Core/PatchEngine.h" #include "Core/PatchEngine.h"
@ -724,7 +725,11 @@ void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::stri
if (Core::IsRunning()) if (Core::IsRunning())
{ {
// TODO: have a callback mechanism for title changes? // TODO: have a callback mechanism for title changes?
g_symbolDB.Clear(); if (!g_symbolDB.IsEmpty())
{
g_symbolDB.Clear();
Host_NotifyMapLoaded();
}
CBoot::LoadMapFromFilename(); CBoot::LoadMapFromFilename();
HLE::Reload(); HLE::Reload();
PatchEngine::Reload(); PatchEngine::Reload();

View File

@ -20,6 +20,7 @@
#include "Core/HW/DVD/DVDInterface.h" #include "Core/HW/DVD/DVDInterface.h"
#include "Core/HW/Memmap.h" #include "Core/HW/Memmap.h"
#include "Core/HW/SystemTimers.h" #include "Core/HW/SystemTimers.h"
#include "Core/Host.h"
#include "Core/PowerPC/PPCSymbolDB.h" #include "Core/PowerPC/PPCSymbolDB.h"
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
@ -52,11 +53,16 @@ bool Load()
NOTICE_LOG(IOS, "Reinitialised hardware."); NOTICE_LOG(IOS, "Reinitialised hardware.");
// Load symbols for the IPL if they exist. // Load symbols for the IPL if they exist.
g_symbolDB.Clear(); if (!g_symbolDB.IsEmpty())
{
g_symbolDB.Clear();
Host_NotifyMapLoaded();
}
if (g_symbolDB.LoadMap(File::GetUserPath(D_MAPS_IDX) + "mios-ipl.map")) if (g_symbolDB.LoadMap(File::GetUserPath(D_MAPS_IDX) + "mios-ipl.map"))
{ {
::HLE::Clear(); ::HLE::Clear();
::HLE::PatchFunctions(); ::HLE::PatchFunctions();
Host_NotifyMapLoaded();
} }
const PowerPC::CoreMode core_mode = PowerPC::GetMode(); const PowerPC::CoreMode core_mode = PowerPC::GetMode();