[Scummvm-git-logs] scummvm master -> 40da239e764dbb2623ec5b6063dc19a5a19ec572

djsrv dservilla at gmail.com
Thu Aug 5 00:01:18 UTC 2021


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:
40da239e76 DIRECTOR: LINGO: Expect extra values on stack when aborting


Commit: 40da239e764dbb2623ec5b6063dc19a5a19ec572
    https://github.com/scummvm/scummvm/commit/40da239e764dbb2623ec5b6063dc19a5a19ec572
Author: djsrv (dservilla at gmail.com)
Date: 2021-08-04T20:00:43-04:00

Commit Message:
DIRECTOR: LINGO: Expect extra values on stack when aborting

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index a527e5275a..b3436a65c3 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -317,7 +317,7 @@ void Lingo::pushContext(const Symbol funcSym, bool allowRetVal, Datum defaultRet
 	}
 }
 
-void Lingo::popContext() {
+void Lingo::popContext(bool aborting) {
 	Common::Array<CFrame *> &callstack = _vm->getCurrentWindow()->_callstack;
 
 	debugC(5, kDebugLingoExec, "Popping frame %d", callstack.size());
@@ -335,7 +335,15 @@ void Lingo::popContext() {
 			g_lingo->push(fp->defaultRetVal);
 		}
 	} else if (_stack.size() > fp->stackSizeBefore) {
-		error("handler %s returned extra %d values", fp->sp.name->c_str(), _stack.size() - fp->stackSizeBefore);
+		if (aborting) {
+			// Since we're aborting execution, we should expect that some extra
+			// values are left on the stack.
+			while (_stack.size() > fp->stackSizeBefore) {
+				g_lingo->pop();
+			}
+		} else {
+			error("handler %s returned extra %d values", fp->sp.name->c_str(), _stack.size() - fp->stackSizeBefore);
+		}
 	} else {
 		error("handler %s popped extra %d values", fp->sp.name->c_str(), fp->stackSizeBefore - _stack.size());
 	}
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 138a9c2173..2a2fb47309 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -444,7 +444,7 @@ void Lingo::execute() {
 	if (_abort || _vm->getCurrentMovie()->getScore()->_playState == kPlayStopped) {
 		// Clean up call stack
 		while (_vm->getCurrentWindow()->_callstack.size()) {
-			popContext();
+			popContext(true);
 		}
 	}
 	_abort = false;
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 71d8f662d9..99510fba52 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -317,7 +317,7 @@ public:
 	void loadStateFromWindow();
 	void saveStateToWindow();
 	void pushContext(const Symbol funcSym, bool allowRetVal, Datum defaultRetVal);
-	void popContext();
+	void popContext(bool aborting = false);
 	bool hasFrozenContext();
 	void cleanLocalVars();
 	void varAssign(const Datum &var, const Datum &value);




More information about the Scummvm-git-logs mailing list