[Scummvm-git-logs] scummvm master -> 4e33136e385b18425866a76bdcf17f70c156e66b

djsrv dservilla at gmail.com
Tue Jul 7 22:05:48 UTC 2020


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:
4e33136e38 DIRECTOR: LINGO: Fix segfault when loading factory


Commit: 4e33136e385b18425866a76bdcf17f70c156e66b
    https://github.com/scummvm/scummvm/commit/4e33136e385b18425866a76bdcf17f70c156e66b
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-07T18:05:20-04:00

Commit Message:
DIRECTOR: LINGO: Fix segfault when loading factory

Changed paths:
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-object.h


diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index e901c1c3b9..9d0ff0fb8c 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -908,6 +908,7 @@ ScriptContext *Lingo::compileLingoV4(Common::SeekableSubReadStreamEndian &stream
 		}
 		debugC(1, kDebugCompile, "Add V4 bytecode for factory '%s' with id %d", factoryName.c_str(), castId);
 
+		_assemblyContext = new ScriptContext(factoryName, _assemblyArchive, scriptType, castId);
 		codeFactory(factoryName);
 	} else {
 		debugC(1, kDebugCompile, "Add V4 bytecode for type %s with id %d", scriptType2str(scriptType), castId);
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index f7cb85b084..a69829fa50 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -286,6 +286,7 @@ void Lingo::varCreate(const Common::String &name, bool global, DatumHash *localv
 void Lingo::codeFactory(Common::String &name) {
 	// FIXME: The factory's context should not be tied to the LingoArchive
 	// but bytecode needs it to resolve names
+	_assemblyContext->setName(name);
 	_assemblyContext->setFactory(true);
 	if (!_globalvars.contains(name)) {
 		_globalvars[name] = _assemblyContext;
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index df54d20bde..9c940d7c84 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -47,9 +47,11 @@ public:
 	virtual int *getRefCount() const = 0;
 	virtual int getInheritanceLevel() const = 0;
 
+	virtual void setName(const Common::String &name) = 0;
+	virtual void dispose() = 0;
+
 	virtual Common::String asString() = 0;
 	virtual AbstractObject *clone() = 0;
-	virtual void dispose() = 0;
 	virtual Symbol getMethod(const Common::String &methodName) = 0;
 	virtual bool hasProp(const Common::String &propName) = 0;
 	virtual Datum getProp(const Common::String &propName) = 0;
@@ -107,6 +109,9 @@ public:
 	virtual int *getRefCount() const { return _refCount; };
 	virtual int getInheritanceLevel() const { return _inheritanceLevel; };
 
+	virtual void setName(const Common::String &name) { _name = name; };
+	virtual void dispose() { _disposed = true; };
+
 	virtual Common::String asString() {
 		return Common::String::format("object: #%s %d %p", _name.c_str(), _inheritanceLevel, (void *)this);
 	};
@@ -115,10 +120,6 @@ public:
 		return new Derived(static_cast<Derived const &>(*this));
 	};
 
-	virtual void dispose() {
-		_disposed = true;
-	};
-
 	virtual Symbol getMethod(const Common::String &methodName) {
 		if (_disposed) {
 			error("Method '%s' called on disposed object <%s>", methodName.c_str(), asString().c_str());




More information about the Scummvm-git-logs mailing list