[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