[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