mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-08 20:07:11 +00:00
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:
parent
4755fcb130
commit
136fcb3810
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user