Remove all state scripts that were created

This fixes a memory leak that also occurs in the original game
This commit is contained in:
smallmodel 2025-02-18 21:08:44 +01:00
parent a1d47cf64a
commit 47a447dbb0
No known key found for this signature in database
GPG key ID: 9F2D623CEDF08512
2 changed files with 18 additions and 5 deletions

View file

@ -1,6 +1,6 @@
/* /*
=========================================================================== ===========================================================================
Copyright (C) 2024 the OpenMoHAA team Copyright (C) 2025 the OpenMoHAA team
This file is part of OpenMoHAA source code. This file is part of OpenMoHAA source code.
@ -686,10 +686,17 @@ void GameScript::ArchiveCodePos(Archiver& arc, unsigned char **codePos)
void GameScript::Close(void) void GameScript::Close(void)
{ {
// Free up catch blocks
for (int i = m_CatchBlocks.NumObjects(); i > 0; i--) { for (int i = m_CatchBlocks.NumObjects(); i > 0; i--) {
delete m_CatchBlocks.ObjectAt(i); delete m_CatchBlocks.ObjectAt(i);
} }
// Added in OPM
// Free up allocated state scripts
for (int i = m_StateScripts.NumObjects(); i > 0; i--) {
delete m_StateScripts.ObjectAt(i);
}
m_CatchBlocks.FreeObjectList(); m_CatchBlocks.FreeObjectList();
if (m_ProgToSource) { if (m_ProgToSource) {
@ -814,7 +821,11 @@ StateScript *GameScript::CreateCatchStateScript(unsigned char *try_begin_code_po
StateScript *GameScript::CreateSwitchStateScript(void) StateScript *GameScript::CreateSwitchStateScript(void)
{ {
return new StateScript; StateScript *stateScript = new StateScript;
m_StateScripts.AddObject(stateScript);
return stateScript;
} }
StateScript *GameScript::GetCatchStateScript(unsigned char *in, unsigned char *& out) StateScript *GameScript::GetCatchStateScript(unsigned char *in, unsigned char *& out)
@ -927,7 +938,8 @@ void ScriptThreadLabel::Execute(Listener *listener, Event *ev) const
Execute(listener, *ev); Execute(listener, *ev);
} }
void ScriptThreadLabel::Execute(Listener *pSelf, const SafePtr<Listener>& listener, const SafePtr<Listener>& param) const void ScriptThreadLabel::Execute(Listener *pSelf, const SafePtr<Listener>& listener, const SafePtr<Listener>& param)
const
{ {
if (!m_Script) { if (!m_Script) {
return; return;

View file

@ -1,6 +1,6 @@
/* /*
=========================================================================== ===========================================================================
Copyright (C) 2024 the OpenMoHAA team Copyright (C) 2025 the OpenMoHAA team
This file is part of OpenMoHAA source code. This file is part of OpenMoHAA source code.
@ -119,6 +119,7 @@ class GameScript : public AbstractScript
protected: protected:
// try/throw variable // try/throw variable
Container<CatchBlock *> m_CatchBlocks; Container<CatchBlock *> m_CatchBlocks;
Container<StateScript *> m_StateScripts;
public: public:
// program variables // program variables