PRIVATE: fix memory leaks

This commit is contained in:
neuromancer 2021-02-18 21:19:05 -03:00 committed by Eugene Sandulenko
parent d0e43c93b5
commit a65366edea
4 changed files with 53 additions and 24 deletions

View file

@ -42,7 +42,7 @@ void fChgMode(ArgArray args) {
g_private->_mode = args[0].u.val; g_private->_mode = args[0].u.val;
Common::String *s = new Common::String(args[1].u.str); Common::String *s = new Common::String(args[1].u.str);
g_private->_nextSetting = s; g_private->setNextSetting(s);
if (g_private->_mode == 0) { if (g_private->_mode == 0) {
g_private->setOrigin(kOriginZero); g_private->setOrigin(kOriginZero);
@ -104,7 +104,7 @@ void fgoto(ArgArray args) {
// assert types // assert types
debugC(1, kPrivateDebugScript, "goto(%s)", args[0].u.str); debugC(1, kPrivateDebugScript, "goto(%s)", args[0].u.str);
Common::String *s = new Common::String(args[0].u.str); Common::String *s = new Common::String(args[0].u.str);
g_private->_nextSetting = s; g_private->setNextSetting(s);
} }
@ -112,7 +112,7 @@ void fSyncSound(ArgArray args) {
// assert types // assert types
debugC(1, kPrivateDebugScript, "SyncSound(%s, %s)", args[0].u.str, args[1].u.str); debugC(1, kPrivateDebugScript, "SyncSound(%s, %s)", args[0].u.str, args[1].u.str);
Common::String *nextSetting = new Common::String(args[1].u.str); Common::String *nextSetting = new Common::String(args[1].u.str);
g_private->_nextSetting = nextSetting; g_private->setNextSetting(nextSetting);
Common::String s(args[0].u.str); Common::String s(args[0].u.str);
if (s != "\"\"") { if (s != "\"\"") {
@ -135,6 +135,7 @@ void fLoadGame(ArgArray args) {
m->nextSetting = NULL; m->nextSetting = NULL;
m->flag1 = NULL; m->flag1 = NULL;
m->flag2 = NULL; m->flag2 = NULL;
free(g_private->_loadGameMask);
g_private->_loadGameMask = m; g_private->_loadGameMask = m;
g_private->_masks.push_front(*m); g_private->_masks.push_front(*m);
} }
@ -149,6 +150,7 @@ void fSaveGame(ArgArray args) {
m->nextSetting = NULL; m->nextSetting = NULL;
m->flag1 = NULL; m->flag1 = NULL;
m->flag2 = NULL; m->flag2 = NULL;
free(g_private->_saveGameMask);
g_private->_saveGameMask = m; g_private->_saveGameMask = m;
g_private->_masks.push_front(*m); g_private->_masks.push_front(*m);
} }
@ -171,7 +173,7 @@ void fPoliceBust(ArgArray args) {
if (args[1].u.val == 2) { if (args[1].u.val == 2) {
// Unclear what it means // Unclear what it means
} else if (args[1].u.val == 3) { } else if (args[1].u.val == 3) {
g_private->_nextSetting = new Common::String(kMainDesktop); g_private->setNextSetting(new Common::String(kMainDesktop));
g_private->_mode = 0; g_private->_mode = 0;
g_private->setOrigin(kOriginZero); g_private->setOrigin(kOriginZero);
} else } else
@ -199,8 +201,9 @@ void fBustMovie(ArgArray args) {
g_private->playSound(s, 1, false, false); g_private->playSound(s, 1, false, false);
} }
delete g_private->_nextMovie;
g_private->_nextMovie = new Common::String(pv); g_private->_nextMovie = new Common::String(pv);
g_private->_nextSetting = new Common::String(args[0].u.str); g_private->setNextSetting(new Common::String(args[0].u.str));
} }
void fDossierAdd(ArgArray args) { void fDossierAdd(ArgArray args) {
@ -452,14 +455,15 @@ void fViewScreen(ArgArray args) {
void fTransition(ArgArray args) { void fTransition(ArgArray args) {
// assert types // assert types
debugC(1, kPrivateDebugScript, "Transition(%s, %s)", args[0].u.str, args[1].u.str); debugC(1, kPrivateDebugScript, "Transition(%s, %s)", args[0].u.str, args[1].u.str);
delete g_private->_nextMovie;
g_private->_nextMovie = new Common::String(args[0].u.str); g_private->_nextMovie = new Common::String(args[0].u.str);
g_private->_nextSetting = new Common::String(args[1].u.str); g_private->setNextSetting(new Common::String(args[1].u.str));
} }
void fResume(ArgArray args) { void fResume(ArgArray args) {
// assert types // assert types
debugC(1, kPrivateDebugScript, "Resume(%d)", args[0].u.val); // this value is always 1 debugC(1, kPrivateDebugScript, "Resume(%d)", args[0].u.val); // this value is always 1
g_private->_nextSetting = g_private->_pausedSetting; g_private->setNextSetting(g_private->_pausedSetting);
g_private->_pausedSetting = NULL; g_private->_pausedSetting = NULL;
g_private->_mode = 1; g_private->_mode = 1;
g_private->setOrigin(kOriginOne); g_private->setOrigin(kOriginOne);
@ -472,16 +476,17 @@ void fMovie(ArgArray args) {
Common::String *nextSetting = new Common::String(args[1].u.str); Common::String *nextSetting = new Common::String(args[1].u.str);
if (!g_private->_playedMovies.contains(*movie) && *movie != "\"\"") { if (!g_private->_playedMovies.contains(*movie) && *movie != "\"\"") {
delete g_private->_nextMovie;
g_private->_nextMovie = movie; g_private->_nextMovie = movie;
g_private->_playedMovies.setVal(*movie, true); g_private->_playedMovies.setVal(*movie, true);
g_private->_nextSetting = nextSetting; g_private->setNextSetting(nextSetting);
} else if (*movie == "\"\"") { } else if (*movie == "\"\"") {
g_private->_repeatedMovieExit = *nextSetting; g_private->_repeatedMovieExit = *nextSetting;
debugC(1, kPrivateDebugScript, "repeated movie exit is %s", nextSetting->c_str()); debugC(1, kPrivateDebugScript, "repeated movie exit is %s", nextSetting->c_str());
} else { } else {
debugC(1, kPrivateDebugScript, "movie %s already played", movie->c_str()); debugC(1, kPrivateDebugScript, "movie %s already played", movie->c_str());
g_private->_nextSetting = &(g_private->_repeatedMovieExit); g_private->setNextSetting(new Common::String(g_private->_repeatedMovieExit));
} }
} }
@ -626,6 +631,7 @@ void fSoundArea(ArgArray args) {
m->nextSetting = NULL; m->nextSetting = NULL;
m->flag1 = NULL; m->flag1 = NULL;
m->flag2 = NULL; m->flag2 = NULL;
free(g_private->_AMRadioArea);
g_private->_AMRadioArea = m; g_private->_AMRadioArea = m;
g_private->_masks.push_front(*m); g_private->_masks.push_front(*m);
} else if (n == "kPoliceRadio") { } else if (n == "kPoliceRadio") {
@ -636,6 +642,7 @@ void fSoundArea(ArgArray args) {
m->nextSetting = NULL; m->nextSetting = NULL;
m->flag1 = NULL; m->flag1 = NULL;
m->flag2 = NULL; m->flag2 = NULL;
free(g_private->_policeRadioArea);
g_private->_policeRadioArea = m; g_private->_policeRadioArea = m;
g_private->_masks.push_front(*m); g_private->_masks.push_front(*m);
} else if (n == "kPhone") { } else if (n == "kPhone") {
@ -646,6 +653,7 @@ void fSoundArea(ArgArray args) {
m->nextSetting = NULL; m->nextSetting = NULL;
m->flag1 = NULL; m->flag1 = NULL;
m->flag2 = NULL; m->flag2 = NULL;
free(g_private->_phoneArea);
g_private->_phoneArea = m; g_private->_phoneArea = m;
g_private->_masks.push_front(*m); g_private->_masks.push_front(*m);
} }
@ -659,7 +667,7 @@ void fAskSave(ArgArray args) {
// This is not needed, since scummvm will take care of this // This is not needed, since scummvm will take care of this
debugC(1, kPrivateDebugScript, "WARNING: AskSave is partially implemented"); debugC(1, kPrivateDebugScript, "WARNING: AskSave is partially implemented");
Common::String *s = new Common::String(args[0].u.str); Common::String *s = new Common::String(args[0].u.str);
g_private->_nextSetting = s; g_private->setNextSetting(s);
} }
void fTimer(ArgArray args) { void fTimer(ArgArray args) {
@ -675,7 +683,7 @@ void fTimer(ArgArray args) {
if (delay > 0) { if (delay > 0) {
assert(g_private->installTimer(delay, s)); assert(g_private->installTimer(delay, s));
} else if (delay == 0) { } else if (delay == 0) {
g_private->_nextSetting = s; g_private->setNextSetting(s);
} else { } else {
assert(0); assert(0);
} }

View file

@ -75,7 +75,6 @@ typedef struct Setting {
// Settings // Settings
typedef Common::HashMap<Common::String, Setting *> SettingMap; typedef Common::HashMap<Common::String, Setting *> SettingMap;
class SettingMaps { class SettingMaps {

View file

@ -121,6 +121,13 @@ void PrivateEngine::initializePath(const Common::FSNode &gamePath) {
SearchMan.addDirectory(gamePath.getPath(), gamePath, 0, 10); SearchMan.addDirectory(gamePath.getPath(), gamePath, 0, 10);
} }
void PrivateEngine::setNextSetting(Common::String *_ns) {
if (_ns)
debug("deleting %s", _ns->c_str());
delete _nextSetting;
_nextSetting = _ns;
}
void PrivateEngine::setOrigin(const int point[2]) { void PrivateEngine::setOrigin(const int point[2]) {
delete _origin; delete _origin;
_origin = new Common::Point(point[0], point[1]);; _origin = new Common::Point(point[0], point[1]);;
@ -190,7 +197,7 @@ Common::Error PrivateEngine::run() {
if (saveSlot >= 0) { // load the savegame if (saveSlot >= 0) { // load the savegame
loadGameState(saveSlot); loadGameState(saveSlot);
} else { } else {
_nextSetting = new Common::String(kGoIntro); setNextSetting(new Common::String(kGoIntro));
} }
while (!shouldQuit()) { while (!shouldQuit()) {
@ -251,12 +258,14 @@ Common::Error PrivateEngine::run() {
removeTimer(); removeTimer();
_videoDecoder = new Video::SmackerDecoder(); _videoDecoder = new Video::SmackerDecoder();
playVideo(*_nextMovie); playVideo(*_nextMovie);
delete(_nextMovie);
_nextMovie = NULL; _nextMovie = NULL;
continue; continue;
} }
if (_nextVS != NULL && *_currentSetting == kMainDesktop) { if (_nextVS != NULL && *_currentSetting == kMainDesktop) {
loadImage(*_nextVS, 160, 120); loadImage(*_nextVS, 160, 120);
drawScreen();
} }
if (_videoDecoder) { if (_videoDecoder) {
@ -276,9 +285,10 @@ Common::Error PrivateEngine::run() {
removeTimer(); removeTimer();
debugC(1, kPrivateDebugFunction, "Executing %s", _nextSetting->c_str()); debugC(1, kPrivateDebugFunction, "Executing %s", _nextSetting->c_str());
clearAreas(); clearAreas();
_currentSetting = _nextSetting; // This pointer will be free after load
_currentSetting = new Common::String(*_nextSetting);
settings.load(_nextSetting); settings.load(_nextSetting);
_nextSetting = NULL; setNextSetting(NULL);
execute(prog); execute(prog);
changeCursor("default"); changeCursor("default");
drawScreen(); drawScreen();
@ -293,12 +303,20 @@ Common::Error PrivateEngine::run() {
void PrivateEngine::clearAreas() { void PrivateEngine::clearAreas() {
_exits.clear(); _exits.clear();
_masks.clear(); _masks.clear();
free(_loadGameMask);
_loadGameMask = NULL; _loadGameMask = NULL;
free(_saveGameMask);
_saveGameMask = NULL; _saveGameMask = NULL;
free(_policeRadioArea);
_policeRadioArea = NULL; _policeRadioArea = NULL;
free(_AMRadioArea);
_AMRadioArea = NULL; _AMRadioArea = NULL;
free(_phoneArea);
_phoneArea = NULL; _phoneArea = NULL;
free(_dossierNextSuspectMask);
_dossierNextSuspectMask = NULL; _dossierNextSuspectMask = NULL;
free(_dossierPrevSuspectMask);
_dossierPrevSuspectMask = NULL; _dossierPrevSuspectMask = NULL;
} }
@ -334,9 +352,9 @@ void PrivateEngine::checkPoliceBust() {
uint policeIndex = maps.variables.getVal(kPoliceIndex)->u.val; uint policeIndex = maps.variables.getVal(kPoliceIndex)->u.val;
_policeBustSetting = _currentSetting; _policeBustSetting = _currentSetting;
if (policeIndex <= 13) { if (policeIndex <= 13) {
_nextSetting = new Common::String(kPOGoBustMovie); setNextSetting(new Common::String(kPOGoBustMovie));
} else { } else {
_nextSetting = new Common::String(kPoliceBustFromMO); setNextSetting(new Common::String(kPoliceBustFromMO));
} }
clearAreas(); clearAreas();
_policeBustEnabled = false; _policeBustEnabled = false;
@ -421,7 +439,7 @@ void PrivateEngine::selectPauseMovie(Common::Point mousePos) {
if (!window.contains(mousePos)) { if (!window.contains(mousePos)) {
if ( _pausedSetting == NULL) { if ( _pausedSetting == NULL) {
_pausedSetting = _currentSetting; _pausedSetting = _currentSetting;
_nextSetting = new Common::String(kPauseMovie); setNextSetting(new Common::String(kPauseMovie));
} }
} }
} }
@ -458,7 +476,7 @@ void PrivateEngine::selectExit(Common::Point mousePos) {
} }
if (ns != NULL) { if (ns != NULL) {
//debug("Exit selected %s", ns->c_str()); //debug("Exit selected %s", ns->c_str());
_nextSetting = ns; setNextSetting(new Common::String(*ns));
} }
} }
@ -492,7 +510,7 @@ void PrivateEngine::selectMask(Common::Point mousePos) {
} }
if (ns != NULL) { if (ns != NULL) {
//debug("Mask selected %s", ns->c_str()); //debug("Mask selected %s", ns->c_str());
_nextSetting = ns; setNextSetting(new Common::String(*ns));
} }
} }
@ -577,6 +595,7 @@ bool PrivateEngine::selectDossierNextSuspect(Common::Point mousePos) {
loadDossier(); loadDossier();
drawMask(_dossierNextSuspectMask->surf); drawMask(_dossierNextSuspectMask->surf);
drawMask(_dossierPrevSuspectMask->surf); drawMask(_dossierPrevSuspectMask->surf);
drawScreen();
} }
return true; return true;
} }
@ -594,6 +613,7 @@ bool PrivateEngine::selectDossierPrevSuspect(Common::Point mousePos) {
loadDossier(); loadDossier();
drawMask(_dossierNextSuspectMask->surf); drawMask(_dossierNextSuspectMask->surf);
drawMask(_dossierPrevSuspectMask->surf); drawMask(_dossierPrevSuspectMask->surf);
drawScreen();
} }
return true; return true;
} }
@ -655,7 +675,7 @@ void PrivateEngine::restartGame() {
Common::Error PrivateEngine::loadGameStream(Common::SeekableReadStream *stream) { Common::Error PrivateEngine::loadGameStream(Common::SeekableReadStream *stream) {
Common::Serializer s(stream, nullptr); Common::Serializer s(stream, nullptr);
debugC(1, kPrivateDebugFunction, "loadGameStream"); debugC(1, kPrivateDebugFunction, "loadGameStream");
_nextSetting = new Common::String(kStartGame); setNextSetting(new Common::String(kStartGame));
int val; int val;
for (NameList::iterator it = maps.variableList.begin(); it != maps.variableList.end(); ++it) { for (NameList::iterator it = maps.variableList.begin(); it != maps.variableList.end(); ++it) {
@ -1012,7 +1032,7 @@ char *PrivateEngine::getRandomPhoneClip(const char *clip, int i, int j) {
// Timers // Timers
void timerCallback(void *refCon) { void timerCallback(void *refCon) {
g_private->removeTimer(); g_private->removeTimer();
g_private->_nextSetting = (Common::String *)refCon; g_private->setNextSetting((Common::String *)refCon);
} }
bool PrivateEngine::installTimer(uint32 delay, Common::String *ns) { bool PrivateEngine::installTimer(uint32 delay, Common::String *ns) {

View file

@ -121,7 +121,7 @@ typedef Common::HashMap<Common::String, bool> PlayedMediaTable;
class PrivateEngine : public Engine { class PrivateEngine : public Engine {
private: private:
Common::RandomSource *_rnd; Common::RandomSource *_rnd;
Common::String *_nextSetting;
Graphics::PixelFormat _pixelFormat; Graphics::PixelFormat _pixelFormat;
Image::ImageDecoder *_image; Image::ImageDecoder *_image;
int _screenW, _screenH; int _screenW, _screenH;
@ -198,7 +198,9 @@ public:
// global state // global state
const Common::Point *_origin; const Common::Point *_origin;
void setOrigin(const int[2]); void setOrigin(const int[2]);
Common::String *_nextSetting;
void setNextSetting(Common::String *);
Common::String *_currentSetting; Common::String *_currentSetting;
bool _toTake; bool _toTake;