[Scummvm-git-logs] scummvm master -> 53b9a14c2902b7d266454243d8f9484c28768987
djsrv
dservilla at gmail.com
Mon Sep 6 00:48:58 UTC 2021
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
ef082abc6e DIRECTOR: LINGO: Fix replaced script memory leak
fa01b6d434 DIRECTOR: LINGO: Don't warn when replacing script is expected
53b9a14c29 DIRECTOR: LINGO: Fix ID list memory leaks
Commit: ef082abc6e66676e50fda4cbc31b84939ad69f1c
https://github.com/scummvm/scummvm/commit/ef082abc6e66676e50fda4cbc31b84939ad69f1c
Author: djsrv (dservilla at gmail.com)
Date: 2021-09-05T20:38:56-04:00
Commit Message:
DIRECTOR: LINGO: Fix replaced script memory leak
Changed paths:
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index b741d1b61d..c2022563f8 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -255,10 +255,9 @@ void LingoArchive::addCode(const Common::U32String &code, ScriptType type, uint1
"***********\n%s\n\n***********", scriptType2str(type), type, id, utf8ToPrintable(g_director->getCurrentPath()).c_str(), utf8ToPrintable(cast->getMacName()).c_str(), code.encode().c_str());
if (getScriptContext(type, id)) {
- // We can't undefine context data because it could be used in e.g. symbols.
- // Although it has a legit case when kTheScriptText re sets code.
- // Warn on double definitions.
+ // Replace the pre-existing context but warn about it.
warning("Script already defined for type %d, id %d", type, id);
+ removeCode(type, id);
}
Common::String contextName;
@@ -274,6 +273,18 @@ void LingoArchive::addCode(const Common::U32String &code, ScriptType type, uint1
}
}
+void LingoArchive::removeCode(ScriptType type, uint16 id) {
+ ScriptContext *ctx = getScriptContext(type, id);
+ if (!ctx)
+ return;
+
+ *ctx->_refCount -= 1;
+ if (*ctx->_refCount <= 0) {
+ delete ctx;
+ }
+ scriptContexts[type].erase(id);
+}
+
void Lingo::printStack(const char *s, uint pc) {
Common::String stack(s);
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 04e4ca4ea1..9ac73cc545 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -270,6 +270,7 @@ struct LingoArchive {
Common::String getName(uint16 id);
void addCode(const Common::U32String &code, ScriptType type, uint16 id, const char *scriptName = nullptr);
+ void removeCode(ScriptType type, uint16 id);
void addCodeV4(Common::SeekableReadStreamEndian &stream, uint16 lctxIndex, const Common::String &archName, uint16 version);
void addNamesV4(Common::SeekableReadStreamEndian &stream);
};
Commit: fa01b6d43468c00970a6b879ee8a1c94ab320aad
https://github.com/scummvm/scummvm/commit/fa01b6d43468c00970a6b879ee8a1c94ab320aad
Author: djsrv (dservilla at gmail.com)
Date: 2021-09-05T20:38:59-04:00
Commit Message:
DIRECTOR: LINGO: Don't warn when replacing script is expected
Changed paths:
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-events.cpp
engines/director/lingo/lingo-object.cpp
engines/director/lingo/lingo-the.cpp
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 633154b5a7..2ba02dfb5b 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1850,7 +1850,7 @@ void LB::b_installMenu(int nargs) {
while (mainArchive->getScriptContext(kEventScript, commandId)) {
commandId++;
}
- mainArchive->addCode(command.decode(Common::kMacRoman), kEventScript, commandId);
+ mainArchive->replaceCode(command.decode(Common::kMacRoman), kEventScript, commandId);
submenuText += Common::String::format("[%d];", commandId);
} else {
submenuText += ';';
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 206189e927..f7213ae05e 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -106,7 +106,7 @@ void Movie::setPrimaryEventHandler(LEvent event, const Common::String &code) {
debugC(3, kDebugLingoExec, "setting primary event handler (%s)", _lingo->_eventHandlerTypes[event]);
LingoArchive *mainArchive = getMainLingoArch();
mainArchive->primaryEventHandlers[event] = code;
- mainArchive->addCode(code, kEventScript, event);
+ mainArchive->replaceCode(code, kEventScript, event);
}
void Movie::queueSpriteEvent(Common::Queue<LingoEvent> &queue, LEvent event, int eventId, int spriteId) {
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 168f63a131..a3ac76939f 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -715,7 +715,7 @@ bool CastMember::setField(int field, const Datum &d) {
warning("CastMember::setField(): CastMember info for %d not found", _castId);
return false;
}
- _cast->_lingoArchive->addCode(*d.u.s, kCastScript, _castId);
+ _cast->_lingoArchive->replaceCode(*d.u.s, kCastScript, _castId);
castInfo->script = d.asString();
return true;
case kTheWidth:
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index f2ba681ccf..16a605f578 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1219,7 +1219,7 @@ void Lingo::setTheMenuItemEntity(int entity, Datum &menuId, int field, Datum &me
int commandId = 100;
while (mainArchive->getScriptContext(kEventScript, commandId))
commandId++;
- mainArchive->addCode(d.asString(), kEventScript, commandId);
+ mainArchive->replaceCode(d.asString(), kEventScript, commandId);
if (menuId.type == STRING && menuItemId.type == STRING)
g_director->_wm->setMenuItemAction(menuId.asString(), menuItemId.asString(), commandId);
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index c2022563f8..3df404a68c 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -256,6 +256,8 @@ void LingoArchive::addCode(const Common::U32String &code, ScriptType type, uint1
if (getScriptContext(type, id)) {
// Replace the pre-existing context but warn about it.
+ // For cases where replacing the script context is expected (e.g. 'when' event handlers)
+ // use replaceCode instead of addCode.
warning("Script already defined for type %d, id %d", type, id);
removeCode(type, id);
}
@@ -285,6 +287,11 @@ void LingoArchive::removeCode(ScriptType type, uint16 id) {
scriptContexts[type].erase(id);
}
+void LingoArchive::replaceCode(const Common::U32String &code, ScriptType type, uint16 id, const char *scriptName) {
+ removeCode(type, id);
+ addCode(code, type, id, scriptName);
+}
+
void Lingo::printStack(const char *s, uint pc) {
Common::String stack(s);
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 9ac73cc545..e5f0369f5a 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -271,6 +271,7 @@ struct LingoArchive {
void addCode(const Common::U32String &code, ScriptType type, uint16 id, const char *scriptName = nullptr);
void removeCode(ScriptType type, uint16 id);
+ void replaceCode(const Common::U32String &code, ScriptType type, uint16 id, const char *scriptName = nullptr);
void addCodeV4(Common::SeekableReadStreamEndian &stream, uint16 lctxIndex, const Common::String &archName, uint16 version);
void addNamesV4(Common::SeekableReadStreamEndian &stream);
};
Commit: 53b9a14c2902b7d266454243d8f9484c28768987
https://github.com/scummvm/scummvm/commit/53b9a14c2902b7d266454243d8f9484c28768987
Author: djsrv (dservilla at gmail.com)
Date: 2021-09-05T20:38:59-04:00
Commit Message:
DIRECTOR: LINGO: Fix ID list memory leaks
Changed paths:
engines/director/lingo/lingo-ast.h
diff --git a/engines/director/lingo/lingo-ast.h b/engines/director/lingo/lingo-ast.h
index 0bcaf11f20..b66dc9c7f8 100644
--- a/engines/director/lingo/lingo-ast.h
+++ b/engines/director/lingo/lingo-ast.h
@@ -396,7 +396,7 @@ struct GlobalNode : StmtNode {
GlobalNode(IDList *namesIn) : StmtNode(kGlobalNode), names(namesIn) {}
virtual ~GlobalNode() {
- delete names;
+ deleteList(names);
}
virtual bool accept(NodeVisitor *visitor) {
return visitor->visitGlobalNode(this);
@@ -410,7 +410,7 @@ struct PropertyNode : StmtNode {
PropertyNode(IDList *namesIn) : StmtNode(kPropertyNode), names(namesIn) {}
virtual ~PropertyNode() {
- delete names;
+ deleteList(names);
}
virtual bool accept(NodeVisitor *visitor) {
return visitor->visitPropertyNode(this);
@@ -424,7 +424,7 @@ struct InstanceNode : StmtNode {
InstanceNode(IDList *namesIn) : StmtNode(kInstanceNode), names(namesIn) {}
virtual ~InstanceNode() {
- delete names;
+ deleteList(names);
}
virtual bool accept(NodeVisitor *visitor) {
return visitor->visitInstanceNode(this);
More information about the Scummvm-git-logs
mailing list