aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2009-05-19 00:34:10 +0000
committerMax Horn2009-05-19 00:34:10 +0000
commit136fcb3810c556c3a5d0e71ac1cf878c7538eb50 (patch)
treedb1435e1d7cf6b777fb8bb9535ce0cc5639bba0c
parent4755fcb130036f34ec5a3191138b2a3de2140896 (diff)
downloadscummvm-rg350-136fcb3810c556c3a5d0e71ac1cf878c7538eb50.tar.gz
scummvm-rg350-136fcb3810c556c3a5d0e71ac1cf878c7538eb50.tar.bz2
scummvm-rg350-136fcb3810c556c3a5d0e71ac1cf878c7538eb50.zip
SCI: Introduce a new subclass StringFrag of MemObject (does nothing right now); switched MemObject to subclass Common::Serializable
svn-id: r40714
-rw-r--r--engines/sci/engine/savegame.cpp121
-rw-r--r--engines/sci/engine/seg_manager.cpp2
-rw-r--r--engines/sci/engine/vm.h29
-rw-r--r--engines/sci/engine/vm_types.h3
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<reg_t>(s, obj._locals);
+void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) {
+ s.syncAsSint32LE(script_id);
+ syncArray<reg_t>(s, _locals);
}
template <>
@@ -319,30 +319,48 @@ void sync_Table(Common::Serializer &s, T &obj) {
syncArray<typename T::Entry>(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<CloneTable>(s, *this);
+}
+
+void NodeTable::saveLoadWithSerializer(Common::Serializer &s) {
+ sync_Table<NodeTable>(s, *this);
+}
+
+void ListTable::saveLoadWithSerializer(Common::Serializer &s) {
+ sync_Table<ListTable>(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<Object>(s, obj._objects);
+ syncArray<Object>(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<CloneTable>(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<ListTable>(s, *(ListTable *)mobj);
- break;
- case MEM_OBJ_NODES:
- sync_Table<NodeTable>(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<Clone> {
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<Clone> {
struct NodeTable : public Table<Node> {
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<Node> {
struct ListTable : public Table<List> {
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<Hunk> {
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;