[Scummvm-git-logs] scummvm master -> 3d408ec3516f7c29314d8ae8fb7916f31c9cd9aa

moralrecordings noreply at scummvm.org
Sat Jun 20 01:40:47 UTC 2026


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
3d408ec351 Revert "DIRECTOR: Keep track of context when working with factories"


Commit: 3d408ec3516f7c29314d8ae8fb7916f31c9cd9aa
    https://github.com/scummvm/scummvm/commit/3d408ec3516f7c29314d8ae8fb7916f31c9cd9aa
Author: Scott Percival (code at moral.net.au)
Date: 2026-06-20T09:28:41+08:00

Commit Message:
Revert "DIRECTOR: Keep track of context when working with factories"

Keeping a Movie pointer in the Cast doesn't match the lifetime of
Movie, and causes a use-after-free crash following a movie switch.

This reverts commit 379e0dcde6887185af651dbb5e9636dd3655e039.

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


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index b9d8ba07068..7f403b7cd5e 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -1806,7 +1806,6 @@ void Cast::loadLingoContext(Common::SeekableReadStreamEndian &stream) {
 				if (_lingoArchive->getScriptContext(script->_scriptType, script->_id)) {
 					error("Cast::loadLingoContext: Script already defined for type %s, id %d", scriptType2str(script->_scriptType), script->_id);
 				}
-				script->_cast = this;
 				_lingoArchive->scriptContexts[script->_scriptType][script->_id] = script;
 				_lingoArchive->patchScriptHandler(script->_scriptType, CastMemberID(script->_id, _castLibID));
 			} else {
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 43f08651f59..d6be2246252 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -92,7 +92,6 @@ public:
 	void loadArchive();
 	void setArchive(Common::SharedPtr<Archive> archive);
 	Common::SharedPtr<Archive> getArchive() const { return _castArchive; };
-	Movie *getMovie() const { return _movie; }
 	Common::String getMacName() const { return _macName; }
 	Common::String getCastName() const { return _castName; }
 	void setCastName(const Common::String &name) { _castName = name; }
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index d73993e97a5..6d1a422f89c 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -47,7 +47,6 @@
 
 #include "director/director.h"
 #include "director/debugger.h"
-#include "director/cast.h"
 #include "director/movie.h"
 #include "director/score.h"
 #include "director/sprite.h"
@@ -259,18 +258,6 @@ void Lingo::pushContext(const Symbol funcSym, bool allowRetVal, Datum defaultRet
 		_state->context->incRefCount();
 	}
 
-	// Run the handler in the window that owns its script (MIAW scoping); mirrors c_tell().
-	fp->retWindow = nullptr;
-	if (funcSym.ctx && funcSym.ctx->_cast && funcSym.ctx->_cast->getMovie()) {
-		Window *targetWindow = funcSym.ctx->_cast->getMovie()->getWindow();
-		Window *currentWindow = _vm->getCurrentWindow();
-		if (targetWindow && targetWindow != currentWindow) {
-			fp->retWindow = currentWindow;
-			currentWindow->moveLingoState(targetWindow);
-			_vm->setCurrentWindow(targetWindow);
-		}
-	}
-
 	DatumHash *localvars = new DatumHash;
 	if (funcSym.anonymous && _state->localVars) {
 		// Execute anonymous functions within the current var frame.
@@ -377,16 +364,8 @@ void Lingo::popContext(bool aborting) {
 		printCallStack(_state->pc);
 	}
 
-	// Undo the pushContext window switch.
-	Window *retWindow = fp->retWindow;
-
 	delete fp;
 
-	if (retWindow && _vm->getCurrentWindow() != retWindow) {
-		_vm->getCurrentWindow()->moveLingoState(retWindow);
-		_vm->setCurrentWindow(retWindow);
-	}
-
 	g_debugger->popContextHook();
 }
 
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index fd191216170..4355af923f4 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -577,7 +577,6 @@ ScriptContext::ScriptContext(const ScriptContext &sc) : Object<ScriptContext>(sc
 
 	_id = sc._id;
 	_castLibHint = sc._castLibHint;
-	_cast = sc._cast;
 }
 
 ScriptContext::~ScriptContext() {
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index b56717251e4..ebd29576ad4 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -217,7 +217,6 @@ public:
 	int _scriptId;
 	uint16 _parentNumber;
 	uint16 _castLibHint;
-	Cast *_cast = nullptr;	// owning cast (MIAW scoping)
 	Common::Array<Common::String> _functionNames; // used by cb_localcall
 	Common::HashMap<Common::String, Common::Array<uint32>> _functionByteOffsets;
 	SymbolHash _functionHandlers;
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 95ab781a34e..d11bbe941ad 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -401,7 +401,6 @@ void LingoArchive::addCode(const Common::U32String &code, ScriptType type, uint1
 
 	ScriptContext *sc = g_lingo->_compiler->compileLingo(code, this, type, CastMemberID(id, cast->_castLibID), contextName, false, preprocFlags);
 	if (sc) {
-		sc->_cast = cast;
 		scriptContexts[type][id] = sc;
 		sc->incRefCount();
 	}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 2f30e6f1902..e140baedd48 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -46,7 +46,6 @@ class Cast;
 class ScriptContext;
 class DirectorEngine;
 class Frame;
-class Window;
 class LingoCompiler;
 struct Breakpoint;
 
@@ -263,7 +262,6 @@ struct CFrame {	/* proc/func call stack frame */
 	Datum			defaultRetVal;		/* default return value */
 	int				paramCount;			/* original number of arguments submitted */
 	Common::Array<Datum> paramList;		/* original argument list */
-	Window			*retWindow;			/* window to restore on return */
 };
 
 struct LingoEvent {




More information about the Scummvm-git-logs mailing list