[Scummvm-git-logs] scummvm master -> 43a2e79dec1af6c49c5a061de1c745d2b4101c91
rvanlaar
noreply at scummvm.org
Tue Sep 20 14:15:30 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
43a2e79dec DIRECTOR: Cleanup memory leaks in LingoArchive
Commit: 43a2e79dec1af6c49c5a061de1c745d2b4101c91
https://github.com/scummvm/scummvm/commit/43a2e79dec1af6c49c5a061de1c745d2b4101c91
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-09-20T16:09:20+02:00
Commit Message:
DIRECTOR: Cleanup memory leaks in LingoArchive
Create a variable on ScriptContext to track if it's only in
lctxContexts to ease deletion.
Factories and scripts with script id < 0 are tracked and deleted on
~LingoArchive. The hashmaps lctxContexts and scriptContexts overlap in
the values. The forementioned factories and scripts with script id < 0
were only in lctxContext.
scriptContexts was already cleaned up in ~LingoArchive.
Changed paths:
engines/director/cast.cpp
engines/director/lingo/lingo-object.h
engines/director/lingo/lingo.cpp
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 63b52493f08..067df278111 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -1228,6 +1228,10 @@ void Cast::loadLingoContext(Common::SeekableReadStreamEndian &stream) {
error("Cast::loadLingoContext: Script already defined for type %s, id %d", scriptType2str(script->_scriptType), script->_id);
}
_lingoArchive->scriptContexts[script->_scriptType][script->_id] = script;
+ } else {
+ // Keep track of scripts that are not in scriptContexts
+ // Those scripts need to be cleaned up on ~LingoArchive
+ script->setOnlyInLctxContexts();
}
}
} else {
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index 4d9dc8981a1..a8cc87c15f0 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -200,6 +200,9 @@ public:
DatumHash _properties;
Common::HashMap<uint32, Datum> _objArray;
+private:
+ bool _onlyInLctxContexts = false;
+
public:
ScriptContext(Common::String name, ScriptType type = kNoneScript, int id = 0);
ScriptContext(const ScriptContext &sc);
@@ -208,6 +211,9 @@ public:
bool isFactory() const { return _objType == kFactoryObj; };
void setFactory(bool flag) { _objType = flag ? kFactoryObj : kScriptObj; }
+ void setOnlyInLctxContexts() { _onlyInLctxContexts = true; }
+ bool getOnlyInLctxContexts() { return _onlyInLctxContexts; }
+
Common::String asString() override;
Symbol getMethod(const Common::String &methodName) override;
bool hasProp(const Common::String &propName) override;
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 0059326518b..413d8bd85aa 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -227,6 +227,15 @@ void Lingo::reloadBuiltIns() {
}
LingoArchive::~LingoArchive() {
+
+ // First cleanup the ScriptContexts that are only in LctxContexts.
+ // LctxContexts has a huge overlap with scriptContexts.
+ for (ScriptContextHash::iterator it = lctxContexts.begin(); it != lctxContexts.end(); ++it){
+ ScriptContext *script = it->_value;
+ if (script->getOnlyInLctxContexts())
+ delete script;
+ }
+
for (int i = 0; i <= kMaxScriptType; i++) {
for (ScriptContextHash::iterator it = scriptContexts[i].begin(); it != scriptContexts[i].end(); ++it) {
*it->_value->_refCount -= 1;
More information about the Scummvm-git-logs
mailing list