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.h57
1 files changed, 21 insertions, 36 deletions
diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h
index 97a6cb585f..add5f4c57c 100644
--- a/engines/sci/engine/segment.h
+++ b/engines/sci/engine/segment.h
@@ -227,7 +227,7 @@ template<typename T>
struct SegmentObjTable : public SegmentObj {
typedef T value_type;
struct Entry {
- T data;
+ T *data;
int next_free; /* Only used for free entries */
};
enum { HEAPENTRY_INVALID = -1 };
@@ -243,6 +243,14 @@ public:
initTable();
}
+ ~SegmentObjTable() {
+ for (uint i = 0; i < _table.size(); i++) {
+ if (isValidEntry(i)) {
+ freeEntry(i);
+ }
+ }
+ }
+
void initTable() {
entries_used = 0;
first_free = HEAPENTRY_INVALID;
@@ -256,10 +264,13 @@ public:
first_free = _table[oldff].next_free;
_table[oldff].next_free = oldff;
+ assert(_table[oldff].data == nullptr);
+ _table[oldff].data = new T;
return oldff;
} else {
uint newIdx = _table.size();
_table.push_back(Entry());
+ _table.back().data = new T;
_table[newIdx].next_free = newIdx; // Tag as 'valid'
return newIdx;
}
@@ -278,6 +289,8 @@ public:
::error("Table::freeEntry: Attempt to release invalid table index %d", idx);
_table[idx].next_free = first_free;
+ delete _table[idx].data;
+ _table[idx].data = nullptr;
first_free = idx;
entries_used--;
}
@@ -292,8 +305,8 @@ public:
uint size() const { return _table.size(); }
- T &at(uint index) { return _table[index].data; }
- const T &at(uint index) const { return _table[index].data; }
+ T &at(uint index) { return *_table[index].data; }
+ const T &at(uint index) const { return *_table[index].data; }
T &operator[](uint index) { return at(index); }
const T &operator[](uint index) const { return at(index); }
@@ -353,8 +366,8 @@ struct HunkTable : public SegmentObjTable<Hunk> {
}
virtual void freeEntry(int idx) {
- SegmentObjTable<Hunk>::freeEntry(idx);
freeEntryContents(idx);
+ SegmentObjTable<Hunk>::freeEntry(idx);
}
virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr) {
@@ -792,42 +805,14 @@ public:
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
-struct BitmapTable : public SegmentObjTable<SciBitmap *> {
- BitmapTable() : SegmentObjTable<SciBitmap *>(SEG_TYPE_BITMAP) {}
-
- virtual ~BitmapTable() {
- for (uint i = 0; i < _table.size(); i++) {
- if (isValidEntry(i)) {
- freeEntryContents(i);
- }
- }
- }
-
- int allocEntry() {
- int offset = SegmentObjTable<SciBitmap *>::allocEntry();
- at(offset) = new SciBitmap;
- return offset;
- }
-
- void freeEntryContents(const int offset) {
- delete at(offset);
- at(offset) = nullptr;
- }
-
- virtual void freeEntry(const int offset) override {
- SegmentObjTable<SciBitmap *>::freeEntry(offset);
- freeEntryContents(offset);
- }
-
- virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr) override {
- freeEntry(sub_addr.getOffset());
- }
+struct BitmapTable : public SegmentObjTable<SciBitmap> {
+ BitmapTable() : SegmentObjTable<SciBitmap>(SEG_TYPE_BITMAP) {}
SegmentRef dereference(reg_t pointer) {
SegmentRef ret;
ret.isRaw = true;
- ret.maxSize = at(pointer.getOffset())->getRawSize();
- ret.raw = at(pointer.getOffset())->getRawData();
+ ret.maxSize = at(pointer.getOffset()).getRawSize();
+ ret.raw = at(pointer.getOffset()).getRawData();
return ret;
}