aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/segment.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/segment.h')
-rw-r--r--engines/sci/engine/segment.h88
1 files changed, 50 insertions, 38 deletions
diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h
index c3ce671632..ffde01f934 100644
--- a/engines/sci/engine/segment.h
+++ b/engines/sci/engine/segment.h
@@ -149,11 +149,11 @@ struct LocalVariables : public SegmentObj {
Common::Array<reg_t> _locals;
public:
- LocalVariables(): SegmentObj(SEG_TYPE_LOCALS) {
- script_id = 0;
- }
+ LocalVariables(): SegmentObj(SEG_TYPE_LOCALS), script_id(0) { }
- virtual bool isValidOffset(uint16 offset) const;
+ virtual bool isValidOffset(uint16 offset) const {
+ return offset < _locals.size() * 2;
+ }
virtual SegmentRef dereference(reg_t pointer);
virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const;
virtual Common::Array<reg_t> listAllOutgoingReferences(reg_t object) const;
@@ -167,18 +167,19 @@ struct DataStack : SegmentObj {
reg_t *_entries;
public:
- DataStack() : SegmentObj(SEG_TYPE_STACK) {
- _capacity = 0;
- _entries = NULL;
- }
+ DataStack() : SegmentObj(SEG_TYPE_STACK), _capacity(0), _entries(NULL) { }
~DataStack() {
free(_entries);
_entries = NULL;
}
- virtual bool isValidOffset(uint16 offset) const;
+ virtual bool isValidOffset(uint16 offset) const {
+ return offset < _capacity * 2;
+ }
virtual SegmentRef dereference(reg_t pointer);
- virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const;
+ virtual reg_t findCanonicAddress(SegManager *segMan, reg_t addr) const {
+ return make_reg(addr.segment, 0);
+ }
virtual Common::Array<reg_t> listAllOutgoingReferences(reg_t object) const;
virtual void saveLoadWithSerializer(Common::Serializer &ser);
@@ -210,7 +211,7 @@ struct Hunk {
};
template<typename T>
-struct Table : public SegmentObj {
+struct SegmentObjTable : public SegmentObj {
typedef T value_type;
struct Entry : public T {
int next_free; /* Only used for free entries */
@@ -224,7 +225,7 @@ struct Table : public SegmentObj {
Common::Array<Entry> _table;
public:
- Table(SegmentType type) : SegmentObj(type) {
+ SegmentObjTable(SegmentType type) : SegmentObj(type) {
initTable();
}
@@ -278,8 +279,8 @@ public:
/* CloneTable */
-struct CloneTable : public Table<Clone> {
- CloneTable() : Table<Clone>(SEG_TYPE_CLONES) {}
+struct CloneTable : public SegmentObjTable<Clone> {
+ CloneTable() : SegmentObjTable<Clone>(SEG_TYPE_CLONES) {}
virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
virtual Common::Array<reg_t> listAllOutgoingReferences(reg_t object) const;
@@ -289,10 +290,12 @@ struct CloneTable : public Table<Clone> {
/* NodeTable */
-struct NodeTable : public Table<Node> {
- NodeTable() : Table<Node>(SEG_TYPE_NODES) {}
+struct NodeTable : public SegmentObjTable<Node> {
+ NodeTable() : SegmentObjTable<Node>(SEG_TYPE_NODES) {}
- virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
+ virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr) {
+ freeEntry(sub_addr.offset);
+ }
virtual Common::Array<reg_t> listAllOutgoingReferences(reg_t object) const;
virtual void saveLoadWithSerializer(Common::Serializer &ser);
@@ -300,10 +303,12 @@ struct NodeTable : public Table<Node> {
/* ListTable */
-struct ListTable : public Table<List> {
- ListTable() : Table<List>(SEG_TYPE_LISTS) {}
+struct ListTable : public SegmentObjTable<List> {
+ ListTable() : SegmentObjTable<List>(SEG_TYPE_LISTS) {}
- virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
+ virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr) {
+ freeEntry(sub_addr.offset);
+ }
virtual Common::Array<reg_t> listAllOutgoingReferences(reg_t object) const;
virtual void saveLoadWithSerializer(Common::Serializer &ser);
@@ -311,8 +316,8 @@ struct ListTable : public Table<List> {
/* HunkTable */
-struct HunkTable : public Table<Hunk> {
- HunkTable() : Table<Hunk>(SEG_TYPE_HUNK) {}
+struct HunkTable : public SegmentObjTable<Hunk> {
+ HunkTable() : SegmentObjTable<Hunk>(SEG_TYPE_HUNK) {}
void freeEntryContents(int idx) {
free(_table[idx].mem);
@@ -320,11 +325,13 @@ struct HunkTable : public Table<Hunk> {
}
virtual void freeEntry(int idx) {
- Table<Hunk>::freeEntry(idx);
+ SegmentObjTable<Hunk>::freeEntry(idx);
freeEntryContents(idx);
}
- virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
+ virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr) {
+ freeEntry(sub_addr.offset);
+ }
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
@@ -343,10 +350,17 @@ public:
_buf = NULL;
}
- virtual bool isValidOffset(uint16 offset) const;
+ virtual bool isValidOffset(uint16 offset) const {
+ return offset < _size;
+ }
virtual SegmentRef dereference(reg_t pointer);
- virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const;
- virtual Common::Array<reg_t> listAllDeallocatable(SegmentId segId) const;
+ virtual reg_t findCanonicAddress(SegManager *segMan, reg_t addr) const {
+ return make_reg(addr.segment, 0);
+ }
+ virtual Common::Array<reg_t> listAllDeallocatable(SegmentId segId) const {
+ const reg_t r = make_reg(segId, 0);
+ return Common::Array<reg_t>(&r, 1);
+ }
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
@@ -356,12 +370,7 @@ public:
template <typename T>
class SciArray {
public:
- SciArray() {
- _type = -1;
- _data = NULL;
- _size = 0;
- _actualSize = 0;
- }
+ SciArray() : _type(-1), _data(NULL), _size(0), _actualSize(0) { }
SciArray(const SciArray<T> &array) {
_type = array._type;
@@ -476,8 +485,8 @@ public:
void fromString(const Common::String &string);
};
-struct ArrayTable : public Table<SciArray<reg_t> > {
- ArrayTable() : Table<SciArray<reg_t> >(SEG_TYPE_ARRAY) {}
+struct ArrayTable : public SegmentObjTable<SciArray<reg_t> > {
+ ArrayTable() : SegmentObjTable<SciArray<reg_t> >(SEG_TYPE_ARRAY) {}
virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
virtual Common::Array<reg_t> listAllOutgoingReferences(reg_t object) const;
@@ -486,10 +495,13 @@ struct ArrayTable : public Table<SciArray<reg_t> > {
SegmentRef dereference(reg_t pointer);
};
-struct StringTable : public Table<SciString> {
- StringTable() : Table<SciString>(SEG_TYPE_STRING) {}
+struct StringTable : public SegmentObjTable<SciString> {
+ StringTable() : SegmentObjTable<SciString>(SEG_TYPE_STRING) {}
- virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
+ virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr) {
+ _table[sub_addr.offset].destroy();
+ freeEntry(sub_addr.offset);
+ }
void saveLoadWithSerializer(Common::Serializer &ser);
SegmentRef dereference(reg_t pointer);