diff options
author | Filippos Karapetis | 2009-11-04 14:22:17 +0000 |
---|---|---|
committer | Filippos Karapetis | 2009-11-04 14:22:17 +0000 |
commit | c8fbac1517cd2cd60791d598fb1922846ff0b867 (patch) | |
tree | affd460231664aa124193e0611af1c05a89589b7 /engines/sci/engine | |
parent | f83d7c6339258cef9d1c53d91a4e2d7b2637d1ec (diff) | |
download | scummvm-rg350-c8fbac1517cd2cd60791d598fb1922846ff0b867.tar.gz scummvm-rg350-c8fbac1517cd2cd60791d598fb1922846ff0b867.tar.bz2 scummvm-rg350-c8fbac1517cd2cd60791d598fb1922846ff0b867.zip |
- Changed the segment manager to be a static part of the engine, and stopped deleting and recreating it when restoring games
- Merged game_exit(), script_free_vm_memory() and script_free_engine()
- Cleanup
svn-id: r45666
Diffstat (limited to 'engines/sci/engine')
-rw-r--r-- | engines/sci/engine/game.cpp | 32 | ||||
-rw-r--r-- | engines/sci/engine/savegame.cpp | 9 | ||||
-rw-r--r-- | engines/sci/engine/seg_manager.cpp | 29 | ||||
-rw-r--r-- | engines/sci/engine/seg_manager.h | 4 | ||||
-rw-r--r-- | engines/sci/engine/state.cpp | 5 | ||||
-rw-r--r-- | engines/sci/engine/state.h | 2 | ||||
-rw-r--r-- | engines/sci/engine/vm.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/vm.h | 14 |
8 files changed, 38 insertions, 59 deletions
diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index 94e49ab33f..6802888a3f 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -304,7 +304,6 @@ int game_init_sound(EngineState *s, int sound_flags) { // Architectural stuff: Init/Unintialize engine int script_init_engine(EngineState *s) { - s->_segMan = new SegManager(s->resMan); s->_msgState = new MessageState(s->_segMan); s->gc_countdown = GC_INTERVAL - 1; @@ -350,23 +349,6 @@ int script_init_engine(EngineState *s) { return 0; } -void script_free_vm_memory(EngineState *s) { - debug(2, "Freeing VM memory"); - - if (s->_segMan) - s->_segMan->_classtable.clear(); - - // Close all opened file handles - s->_fileHandles.clear(); - s->_fileHandles.resize(5); -} - -void script_free_engine(EngineState *s) { - script_free_vm_memory(s); - - debug(2, "Freeing state-dependant data"); -} - void script_free_breakpoints(EngineState *s) { Breakpoint *bp, *bp_next; @@ -451,11 +433,11 @@ int game_exit(EngineState *s) { game_init_sound(s, SFX_STATE_FLAG_NOSOUND); } - s->_segMan->_classtable.clear(); - delete s->_segMan; - s->_segMan = 0; - - debug(2, "Freeing miscellaneous data..."); + // Note: It's a bad idea to delete the segment manager here. + // This function is called right after a game is loaded, and + // the segment manager has already been initialized from the + // save game. Deleting or resetting it here will result in + // invalidating the loaded save state // TODO Free parser segment here @@ -465,6 +447,10 @@ int game_exit(EngineState *s) { _free_graphics_input(s); + // Close all opened file handles + s->_fileHandles.clear(); + s->_fileHandles.resize(5); + return 0; } diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 406c450107..6f3aee8539 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -257,11 +257,8 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { static void sync_SegManagerPtr(Common::Serializer &s, ResourceManager *&resMan, SegManager *&obj) { s.skip(1, VER(9), VER(9)); // obsolete: used to be a flag indicating if we got sci11 or not - if (s.isLoading()) { - // FIXME: Do in-place loading at some point, instead of creating a new EngineState instance from scratch. - delete obj; - obj = new SegManager(resMan); - } + if (s.isLoading()) + obj->resetSegMan(); obj->saveLoadWithSerializer(s); } @@ -737,7 +734,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { } // FIXME: Do in-place loading at some point, instead of creating a new EngineState instance from scratch. - retval = new EngineState(s->resMan, s->_kernel, s->_voc, s->_gui, s->_audio); + retval = new EngineState(s->resMan, s->_kernel, s->_voc, s->_segMan, s->_gui, s->_audio); // Copy some old data retval->gfx_state = s->gfx_state; diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 2af038185b..79f2e88f9e 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -57,21 +57,34 @@ SegManager::SegManager(ResourceManager *resMan) { _exportsAreWide = false; _resMan = resMan; - int result = 0; - - result = createClassTable(); - - if (result) - error("SegManager: Failed to initialize class table"); + createClassTable(); } // Destroy the object, free the memorys if allocated before SegManager::~SegManager() { + resetSegMan(); +} + +void SegManager::resetSegMan() { // Free memory for (uint i = 0; i < _heap.size(); i++) { if (_heap[i]) deallocate(i, false); } + + _heap.clear(); + + // And reinitialize + _heap.push_back(0); + + Clones_seg_id = 0; + Lists_seg_id = 0; + Nodes_seg_id = 0; + Hunks_seg_id = 0; + + // Reinitialize class table + _classtable.clear(); + createClassTable(); } SegmentId SegManager::findFreeSegment() const { @@ -1218,7 +1231,7 @@ int SegManager::freeDynmem(reg_t addr) { return 0; // OK } -int SegManager::createClassTable() { +void SegManager::createClassTable() { Resource *vocab996 = _resMan->findResource(ResourceId(kResourceTypeVocab, 996), 1); if (!vocab996) @@ -1235,8 +1248,6 @@ int SegManager::createClassTable() { } _resMan->unlockResource(vocab996); - - return 0; } } // End of namespace Sci diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 1a9d20dea3..2e785b1341 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -58,6 +58,8 @@ public: */ ~SegManager(); + void resetSegMan(); + virtual void saveLoadWithSerializer(Common::Serializer &ser); // 1. Scripts @@ -456,7 +458,7 @@ private: SegmentObj *allocSegment(SegmentObj *mem, SegmentId *segid); LocalVariables *allocLocalsSegment(Script *scr, int count); int deallocate(SegmentId seg, bool recursive); - int createClassTable(); + void createClassTable(); SegmentId findFreeSegment() const; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 06cace2b99..7336bc71d6 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -32,8 +32,8 @@ namespace Sci { -EngineState::EngineState(ResourceManager *res, Kernel *kernel, Vocabulary *voc, SciGui *gui, AudioPlayer *audio) -: resMan(res), _kernel(kernel), _voc(voc), _gui(gui), _audio(audio), _dirseeker(this) { +EngineState::EngineState(ResourceManager *res, Kernel *kernel, Vocabulary *voc, SegManager *segMan, SciGui *gui, AudioPlayer *audio) +: resMan(res), _kernel(kernel), _voc(voc), _segMan(segMan), _gui(gui), _audio(audio), _dirseeker(this) { gfx_state = 0; @@ -96,7 +96,6 @@ EngineState::EngineState(ResourceManager *res, Kernel *kernel, Vocabulary *voc, _gameObj = NULL_REG; - _segMan = 0; gc_countdown = 0; successor = 0; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 21ccb2a07a..e368953aea 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -116,7 +116,7 @@ public: struct EngineState : public Common::Serializable { public: - EngineState(ResourceManager *res, Kernel *kernel, Vocabulary *voc, SciGui *gui, AudioPlayer *audio); + EngineState(ResourceManager *res, Kernel *kernel, Vocabulary *voc, SegManager *segMan, SciGui *gui, AudioPlayer *audio); virtual ~EngineState(); virtual void saveLoadWithSerializer(Common::Serializer &ser); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a629e7fabd..e086b8c836 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1796,7 +1796,6 @@ static EngineState *_game_run(EngineState *&s, int restoring) { s->_executionStackPosChanged = false; game_exit(s); - script_free_engine(s); script_init_engine(s); game_init(s); s->_sound.sfx_reset_player(); @@ -1811,7 +1810,6 @@ static EngineState *_game_run(EngineState *&s, int restoring) { successor = s->successor; if (successor) { game_exit(s); - script_free_vm_memory(s); delete s; s = successor; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index d09cb27e30..391338ec09 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -420,20 +420,6 @@ void script_debug(EngineState *s, bool bp); int script_init_engine(EngineState *); /** - * Frees all additional memory associated with a EngineState block - * @param[in] s The EngineState whose elements should be cleared - */ -void script_free_engine(EngineState *s); - -/** - * Frees all script memory (heap, hunk, and class tables). - * This operation is implicit in script_free_engine(), but is required for - * restoring the game state. - * @param[in] s The EngineState to free - */ -void script_free_vm_memory(EngineState *s); - -/** * Looks up a selector and returns its type and value * varindex is written to iff it is non-NULL and the selector indicates a property of the object. * @param[in] segMan The Segment Manager |