[Scummvm-git-logs] scummvm master -> 15ee7ba98aa36099eda1c12bd35ddb14ec17367e

rvanlaar noreply at scummvm.org
Sat Sep 24 21:21:52 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:
15ee7ba98a DIRECTOR: LINGO: fix memory leaks for lingo tests


Commit: 15ee7ba98aa36099eda1c12bd35ddb14ec17367e
    https://github.com/scummvm/scummvm/commit/15ee7ba98aa36099eda1c12bd35ddb14ec17367e
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-09-24T23:21:38+02:00

Commit Message:
DIRECTOR: LINGO: fix memory leaks for lingo tests

The Lingo tests were failing because of memory leaks.
- `move` overwrote an existing cast without deleting it
- `puppetTransition` was set but not removed on class destruction
- the *.lingo test files were opened but never removed

Changed paths:
    engines/director/cast.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo.cpp
    engines/director/window.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 454862efe93..3a3a7695205 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -204,6 +204,8 @@ CastMember *Cast::setCastMember(CastMemberID castId, CastMember *cast) {
 
 bool Cast::eraseCastMember(CastMemberID castId) {
 	if (_loadedCast->contains(castId.member)) {
+		CastMember *member = _loadedCast->getVal(castId.member);
+		delete member;
 		_loadedCast->erase(castId.member);
 		return true;
 	}
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 5d77c51306f..64e2d39ee87 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1885,8 +1885,8 @@ void LB::b_findEmpty(int nargs) {
 	Datum res;
 
 	if (d.u.cast->member > c_end) {
-		d.type = INT;
-		g_lingo->push(d);
+		res = d.u.cast->member;
+		g_lingo->push(res);
 		return;
 	}
 
@@ -2173,9 +2173,10 @@ void LB::b_move(int nargs) {
 
 	movie->getScore()->renderFrame(frame, kRenderForceUpdate);
 
+	g_director->getCurrentMovie()->eraseCastMember(dest.asMemberID());
+	
 	CastMember *toMove = g_director->getCurrentMovie()->getCastMember(src.asMemberID());
-	CastMember *toReplace = new CastMember(*toMove);
-	toReplace->_type = kCastTypeNull;
+	CastMember *toReplace = new CastMember(toMove->getCast(), src.asMemberID().member);
 	g_director->getCurrentMovie()->createOrReplaceCastMember(dest.asMemberID(), toMove);
 	g_director->getCurrentMovie()->createOrReplaceCastMember(src.asMemberID(), toReplace);
 
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 716a05628be..51454cd5913 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1293,6 +1293,7 @@ void Lingo::runTests() {
 
 			counter++;
 		}
+		delete stream;
 
 		inFile.close();
 	}
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index 96d71e73b5c..cc2efe6b983 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -76,6 +76,8 @@ Window::~Window() {
 		delete _macBinary;
 		_macBinary = nullptr;
 	}
+	if (_puppetTransition)
+		delete _puppetTransition;
 
 	for (auto &it: _callstack) {
 		delete it;




More information about the Scummvm-git-logs mailing list