[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