SCI: Introduce a new subclass StringFrag of MemObject (does nothing right now); switched MemObject to subclass Common::Serializable

svn-id: r40714
This commit is contained in:
Max Horn 2009-05-19 00:34:10 +00:00
parent 4755fcb130
commit 136fcb3810
4 changed files with 75 additions and 80 deletions

View File

@ -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);
}

View File

@ -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();

View File

@ -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 */

View File

@ -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;