aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorFilippos Karapetis2009-11-04 14:22:17 +0000
committerFilippos Karapetis2009-11-04 14:22:17 +0000
commitc8fbac1517cd2cd60791d598fb1922846ff0b867 (patch)
treeaffd460231664aa124193e0611af1c05a89589b7 /engines/sci/engine
parentf83d7c6339258cef9d1c53d91a4e2d7b2637d1ec (diff)
downloadscummvm-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.cpp32
-rw-r--r--engines/sci/engine/savegame.cpp9
-rw-r--r--engines/sci/engine/seg_manager.cpp29
-rw-r--r--engines/sci/engine/seg_manager.h4
-rw-r--r--engines/sci/engine/state.cpp5
-rw-r--r--engines/sci/engine/state.h2
-rw-r--r--engines/sci/engine/vm.cpp2
-rw-r--r--engines/sci/engine/vm.h14
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