[Scummvm-git-logs] scummvm master -> eddc90fa4542297ff01966d7403a28fcf2af30f1

djsrv dservilla at gmail.com
Wed Jun 24 14:59:46 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:
eddc90fa45 DIRECTOR: LINGO: Fix object memory leaks


Commit: eddc90fa4542297ff01966d7403a28fcf2af30f1
    https://github.com/scummvm/scummvm/commit/eddc90fa4542297ff01966d7403a28fcf2af30f1
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-24T10:57:56-04:00

Commit Message:
DIRECTOR: LINGO: Fix object memory leaks

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


diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 0dc1e27daa..eaa3ac2269 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -300,9 +300,7 @@ void Lingo::codeFactory(Common::String &name) {
 
 	_currentFactory = obj;
 	if (!_globalvars.contains(name)) {
-		_globalvars[name] = Datum();
-		_globalvars[name].type = OBJECT;
-		_globalvars[name].u.obj = obj;
+		_globalvars[name] = obj->ctx->_target;
 	} else {
 		warning("Factory '%s' already defined", name.c_str());
 	}
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index c878ef0ee1..143cdbdad7 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -108,14 +108,7 @@ void Lingo::openXLib(const Common::String &name, ObjectType type) {
 }
 
 Object *Object::clone() {
-	Object *res = new Object(*name, type, new ScriptContext(*ctx));
-	res->disposed = disposed;
-	res->properties = properties;
-	res->inheritanceLevel = inheritanceLevel + 1;
-	if (objArray) {
-		res->objArray = new Common::HashMap<uint32, Datum>(*objArray);
-	}
-	return res;
+	return new Object(*this);
 }
 
 Symbol Object::getMethod(const Common::String &methodName) {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 321cc8568a..1f0b8e44d7 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -290,6 +290,23 @@ struct Object {
 		}
 	}
 
+	Object(const Object &obj) {
+		name = new Common::String(*obj.name);
+		type = obj.type;
+		disposed = obj.disposed;
+		inheritanceLevel = obj.inheritanceLevel + 1;
+		properties = obj.properties;
+		ctx = new ScriptContext(*obj.ctx);
+		ctx->_target = this;
+		*ctx->_target.refCount -= 1;
+
+		if (obj.objArray) {
+			objArray = new Common::HashMap<uint32, Datum>(*obj.objArray);
+		} else {
+			objArray = nullptr;
+		}
+	}
+
 	virtual ~Object() {
 		delete name;
 		delete objArray;
diff --git a/engines/director/lingo/xlibs/fileio.cpp b/engines/director/lingo/xlibs/fileio.cpp
index 64bcf231ce..468e10bd2d 100644
--- a/engines/director/lingo/xlibs/fileio.cpp
+++ b/engines/director/lingo/xlibs/fileio.cpp
@@ -64,9 +64,7 @@ void FileIO::initialize(int type) {
 			ScriptContext *ctx = new ScriptContext(kNoneScript, Common::String(xlibName));
 			FileObject *xobj = new FileObject(kXObj, ctx);
 			xobj->initMethods();
-			g_lingo->_globalvars[xlibName] = Datum();
-			g_lingo->_globalvars[xlibName].type = OBJECT;
-			g_lingo->_globalvars[xlibName].u.obj = xobj;
+			g_lingo->_globalvars[xlibName] = xobj->ctx->_target;
 		} else {
 			warning("FileIO XObject already initialized");
 		}
@@ -95,11 +93,7 @@ void FileObject::initMethods() {
 }
 
 Object *FileObject::clone() {
-	FileObject *res = new FileObject(type, new ScriptContext(*ctx));
-	res->disposed = disposed;
-	res->properties = properties;
-	res->inheritanceLevel = inheritanceLevel + 1;
-	return res;
+	return new FileObject(*this);
 }
 
 void FileObject::dispose() {
diff --git a/engines/director/lingo/xlibs/fileio.h b/engines/director/lingo/xlibs/fileio.h
index d20bd65c61..2788abd4c1 100644
--- a/engines/director/lingo/xlibs/fileio.h
+++ b/engines/director/lingo/xlibs/fileio.h
@@ -65,6 +65,14 @@ struct FileObject : Object {
 		outStream = nullptr;
 	}
 
+	FileObject(const FileObject &obj) : Object(obj) {
+		filename = nullptr;
+		inFile = nullptr;
+		inStream = nullptr;
+		outFile = nullptr;
+		outStream = nullptr;
+	}
+
 	virtual ~FileObject() {
 		dispose();
 	}




More information about the Scummvm-git-logs mailing list