diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2020-05-09 22:02:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-09 22:02:52 +0200 |
commit | a4b829410c74aac4bb2c6df9f0446c3826278be7 (patch) | |
tree | 856087d60bc70fd64a8ac0fac70825c48efa9d33 /modules/gdscript/gdscript.cpp | |
parent | b61a496aa7d8eee0bb5505bf99ae9e8f447b9c0d (diff) | |
parent | 46bfe4452f44d0264346227abc3431c76ee717dc (diff) | |
download | redot-engine-a4b829410c74aac4bb2c6df9f0446c3826278be7.tar.gz |
Merge pull request #38481 from RandomShaper/improve_yield
Fix object leaks caused by unfulfilled yields
Diffstat (limited to 'modules/gdscript/gdscript.cpp')
-rw-r--r-- | modules/gdscript/gdscript.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 06ab9e226d..cdd5deb7ee 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -1052,6 +1052,16 @@ void GDScript::_init_rpc_methods_properties() { } GDScript::~GDScript() { + + { + MutexLock lock(GDScriptLanguage::get_singleton()->lock); + + while (SelfList<GDScriptFunctionState> *E = pending_func_states.first()) { + E->self()->_clear_stack(); + pending_func_states.remove(E); + } + } + for (Map<StringName, GDScriptFunction *>::Element *E = member_functions.front(); E; E = E->next()) { memdelete(E->get()); } @@ -1470,9 +1480,15 @@ GDScriptInstance::GDScriptInstance() { } GDScriptInstance::~GDScriptInstance() { - if (script.is_valid() && owner) { - MutexLock lock(GDScriptLanguage::singleton->lock); + MutexLock lock(GDScriptLanguage::get_singleton()->lock); + + while (SelfList<GDScriptFunctionState> *E = pending_func_states.first()) { + E->self()->_clear_stack(); + pending_func_states.remove(E); + } + + if (script.is_valid() && owner) { script->instances.erase(owner); } } |