From 136fcb3810c556c3a5d0e71ac1cf878c7538eb50 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 19 May 2009 00:34:10 +0000 Subject: SCI: Introduce a new subclass StringFrag of MemObject (does nothing right now); switched MemObject to subclass Common::Serializable svn-id: r40714 --- engines/sci/engine/savegame.cpp | 121 +++++++++++++++++-------------------- engines/sci/engine/seg_manager.cpp | 2 +- engines/sci/engine/vm.h | 29 ++++++--- engines/sci/engine/vm_types.h | 3 - 4 files changed, 75 insertions(+), 80 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 0dbea5229d..0e9fa28457 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -271,9 +271,9 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { sync_sfx_state_t(s, sound); } -static void sync_LocalVariables(Common::Serializer &s, LocalVariables &obj) { - s.syncAsSint32LE(obj.script_id); - syncArray(s, obj._locals); +void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { + s.syncAsSint32LE(script_id); + syncArray(s, _locals); } template <> @@ -319,30 +319,48 @@ void sync_Table(Common::Serializer &s, T &obj) { syncArray(s, obj._table); } -static void sync_Script(Common::Serializer &s, Script &obj) { - s.syncAsSint32LE(obj.nr); - s.syncAsUint32LE(obj.buf_size); - s.syncAsUint32LE(obj.script_size); - s.syncAsUint32LE(obj.heap_size); +void CloneTable::saveLoadWithSerializer(Common::Serializer &s) { + sync_Table(s, *this); +} + +void NodeTable::saveLoadWithSerializer(Common::Serializer &s) { + sync_Table(s, *this); +} + +void ListTable::saveLoadWithSerializer(Common::Serializer &s) { + sync_Table(s, *this); +} + +void HunkTable::saveLoadWithSerializer(Common::Serializer &s) { + if (s.isLoading()) { + initTable(); + } +} + +void Script::saveLoadWithSerializer(Common::Serializer &s) { + s.syncAsSint32LE(nr); + s.syncAsUint32LE(buf_size); + s.syncAsUint32LE(script_size); + s.syncAsUint32LE(heap_size); // FIXME: revamp obj_indices handling - if (!obj.obj_indices) { + if (!obj_indices) { assert(s.isLoading()); - obj.obj_indices = new IntMapper(); + obj_indices = new IntMapper(); } - obj.obj_indices->saveLoadWithSerializer(s); + obj_indices->saveLoadWithSerializer(s); - s.syncAsSint32LE(obj.exports_nr); - s.syncAsSint32LE(obj.synonyms_nr); - s.syncAsSint32LE(obj.lockers); + s.syncAsSint32LE(exports_nr); + s.syncAsSint32LE(synonyms_nr); + s.syncAsSint32LE(lockers); - syncArray(s, obj._objects); + syncArray(s, _objects); - s.syncAsSint32LE(obj.locals_offset); - s.syncAsSint32LE(obj.locals_segment); + s.syncAsSint32LE(locals_offset); + s.syncAsSint32LE(locals_segment); - s.syncAsSint32LE(obj._markedAsDeleted); + s.syncAsSint32LE(_markedAsDeleted); } static void sync_SystemString(Common::Serializer &s, SystemString &obj) { @@ -354,29 +372,33 @@ static void sync_SystemString(Common::Serializer &s, SystemString &obj) { syncCStr(s, (char **)&obj.value); } -static void sync_SystemStrings(Common::Serializer &s, SystemStrings &obj) { +void SystemStrings::saveLoadWithSerializer(Common::Serializer &s) { for (int i = 0; i < SYS_STRINGS_MAX; ++i) - sync_SystemString(s, obj.strings[i]); + sync_SystemString(s, strings[i]); } -static void sync_DynMem(Common::Serializer &s, DynMem &obj) { - s.syncAsSint32LE(obj._size); - syncCStr(s, &obj._description); - if (!obj._buf && obj._size) { - obj._buf = (byte *)calloc(obj._size, 1); +void DynMem::saveLoadWithSerializer(Common::Serializer &s) { + s.syncAsSint32LE(_size); + syncCStr(s, &_description); + if (!_buf && _size) { + _buf = (byte *)calloc(_size, 1); } - if (obj._size) - s.syncBytes(obj._buf, obj._size); + if (_size) + s.syncBytes(_buf, _size); } -static void sync_DataStack(Common::Serializer &s, DataStack &obj) { - s.syncAsUint32LE(obj.nr); +void DataStack::saveLoadWithSerializer(Common::Serializer &s) { + s.syncAsUint32LE(nr); if (s.isLoading()) { - //free(obj.entries); - obj.entries = (reg_t *)calloc(obj.nr, sizeof(reg_t)); + //free(entries); + entries = (reg_t *)calloc(nr, sizeof(reg_t)); } } +void StringFrag::saveLoadWithSerializer(Common::Serializer &s) { + // TODO +} + #pragma mark - static void sync_songlib_t(Common::Serializer &s, songlib_t &obj) { @@ -422,42 +444,7 @@ static void sync_MemObjPtr(Common::Serializer &s, MemObject *&mobj) { } s.syncAsSint32LE(mobj->_segmgrId); - switch (type) { - case MEM_OBJ_SCRIPT: - sync_Script(s, *(Script *)mobj); - break; - case MEM_OBJ_CLONES: - sync_Table(s, *(CloneTable *)mobj); - break; - case MEM_OBJ_LOCALS: - sync_LocalVariables(s, *(LocalVariables *)mobj); - break; - case MEM_OBJ_SYS_STRINGS: - sync_SystemStrings(s, *(SystemStrings *)mobj); - break; - case MEM_OBJ_STACK: - sync_DataStack(s, *(DataStack *)mobj); - break; - case MEM_OBJ_HUNK: - if (s.isLoading()) { - (*(HunkTable *)mobj).initTable(); - } - break; - case MEM_OBJ_STRING_FRAG: - break; - case MEM_OBJ_LISTS: - sync_Table(s, *(ListTable *)mobj); - break; - case MEM_OBJ_NODES: - sync_Table(s, *(NodeTable *)mobj); - break; - case MEM_OBJ_DYNMEM: - sync_DynMem(s, *(DynMem *)mobj); - break; - default: - error("Unknown MemObject type %d", type); - break; - } + mobj->saveLoadWithSerializer(s); } diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index f55cad20c1..a4e9bba27f 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -254,7 +254,7 @@ MemObject *MemObject::createMemObject(MemObjectType type) { mem = new HunkTable(); break; case MEM_OBJ_STRING_FRAG: - mem = new MemObject(); // FIXME: This is a temporary hack until MEM_OBJ_STRING_FRAG is implemented + mem = new StringFrag(); break; case MEM_OBJ_LISTS: mem = new ListTable(); diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index a6e232472e..c187179bb8 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -28,7 +28,7 @@ /* VM and kernel declarations */ -//#include "common/serializer.h" +#include "common/serializer.h" #include "sci/engine/vm_types.h" // for reg_t #include "common/util.h" @@ -55,7 +55,7 @@ enum MemObjectType { MEM_OBJ_MAX // For sanity checking }; -struct MemObject /* : public Common::Serializable */ { +struct MemObject : public Common::Serializable { MemObjectType _type; int _segmgrId; /**< Internal value used by the seg_manager's hash map */ @@ -103,6 +103,11 @@ public: }; +// TODO: Implement the following class +struct StringFrag : public MemObject { + virtual void saveLoadWithSerializer(Common::Serializer &ser); +}; + struct IntMapper; enum { @@ -144,7 +149,7 @@ public: virtual byte *dereference(reg_t pointer, int *size); -// virtual void saveLoadWithSerializer(Common::Serializer &ser); + virtual void saveLoadWithSerializer(Common::Serializer &ser); }; /** Number of bytes to be allocated for the stack */ @@ -255,7 +260,7 @@ public: virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr); virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); -// virtual void saveLoadWithSerializer(Common::Serializer &ser); + virtual void saveLoadWithSerializer(Common::Serializer &ser); }; /** Clone has been marked as 'freed' */ @@ -366,7 +371,7 @@ public: virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note); virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); -// virtual void saveLoadWithSerializer(Common::Serializer &ser); + virtual void saveLoadWithSerializer(Common::Serializer &ser); // script lock operations @@ -479,7 +484,7 @@ public: virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr); virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); -// virtual void saveLoadWithSerializer(Common::Serializer &ser); + virtual void saveLoadWithSerializer(Common::Serializer &ser); }; #define CLONE_USED -1 @@ -560,8 +565,6 @@ public: } virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note); - -// virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -569,6 +572,8 @@ public: struct CloneTable : public Table { virtual void freeAtAddress(SegManager *segmgr, reg_t sub_addr); virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); + + virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -576,6 +581,8 @@ struct CloneTable : public Table { struct NodeTable : public Table { virtual void freeAtAddress(SegManager *segmgr, reg_t sub_addr); virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); + + virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -583,6 +590,8 @@ struct NodeTable : public Table { struct ListTable : public Table { virtual void freeAtAddress(SegManager *segmgr, reg_t sub_addr); virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); + + virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -593,6 +602,8 @@ struct HunkTable : public Table { free(_table[idx].mem); } + + virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -615,7 +626,7 @@ public: virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr); virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note); -// virtual void saveLoadWithSerializer(Common::Serializer &ser); + virtual void saveLoadWithSerializer(Common::Serializer &ser); }; /** Contains selector IDs for a few selected selectors */ diff --git a/engines/sci/engine/vm_types.h b/engines/sci/engine/vm_types.h index 7412532a3b..1dedf9cea5 100644 --- a/engines/sci/engine/vm_types.h +++ b/engines/sci/engine/vm_types.h @@ -63,9 +63,6 @@ typedef int Selector; #define PSTK "ST:%04x" #define PRINT_STK(v) (unsigned) (v - s->stack_base) -// String fragment -typedef reg_t *StringFrag; - static inline reg_t make_reg(int segment, int offset) { reg_t r; r.offset = offset; -- cgit v1.2.3