aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/seg_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/seg_manager.cpp')
-rw-r--r--engines/sci/engine/seg_manager.cpp84
1 files changed, 32 insertions, 52 deletions
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index fff7a72b4e..55257c8265 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -83,8 +83,7 @@ SegManager::SegManager(bool sci1_1) {
id_seg_map->checkKey(reserved_id, true); // reserve 0 for seg_id
reserved_id--; // reserved_id runs in the reversed direction to make sure no one will use it.
- heap_size = DEFAULT_SCRIPTS;
- heap = (MemObject **)sci_calloc(heap_size, sizeof(MemObject *));
+ _heap.resize(DEFAULT_SCRIPTS);
Clones_seg_id = 0;
Lists_seg_id = 0;
@@ -94,11 +93,6 @@ SegManager::SegManager(bool sci1_1) {
exports_wide = 0;
isSci1_1 = sci1_1;
- // initialize the heap pointers
- for (uint i = 0; i < heap_size; i++) {
- heap[i] = NULL;
- }
-
// gc initialisation
gc_mark_bits = 0;
}
@@ -106,14 +100,12 @@ SegManager::SegManager(bool sci1_1) {
// Destroy the object, free the memorys if allocated before
SegManager::~SegManager() {
// Free memory
- for (uint i = 0; i < heap_size; i++) {
- if (heap[i])
+ for (uint i = 0; i < _heap.size(); i++) {
+ if (_heap[i])
deallocate(i, false);
}
delete id_seg_map;
-
- free(heap);
}
// allocate a memory for script from heap
@@ -130,7 +122,7 @@ MemObject *SegManager::allocateScript(EngineState *s, int script_nr, int* seg_id
seg = id_seg_map->checkKey(script_nr, true, &was_added);
if (!was_added) {
*seg_id = seg;
- return heap[*seg_id];
+ return _heap[*seg_id];
}
// allocate the MemObject
@@ -225,7 +217,7 @@ int SegManager::deallocate(int seg, bool recursive) {
VERIFY(check(seg), "invalid seg id");
int i;
- mobj = heap[seg];
+ mobj = _heap[seg];
id_seg_map->removeKey(mobj->getSegMgrId());
switch (mobj->getType()) {
@@ -293,7 +285,7 @@ int SegManager::deallocate(int seg, bool recursive) {
}
free(mobj);
- heap[seg] = NULL;
+ _heap[seg] = NULL;
return 1;
}
@@ -319,10 +311,10 @@ int SegManager::scriptIsMarkedAsDeleted(SegmentId seg) {
if (!check(seg))
return 0;
- if (heap[seg]->getType() != MEM_OBJ_SCRIPT)
+ if (_heap[seg]->getType() != MEM_OBJ_SCRIPT)
return 0;
- scr = &(heap[seg]->data.script);
+ scr = &(_heap[seg]->data.script);
return scr->marked_as_deleted;
}
@@ -343,31 +335,19 @@ MemObject *SegManager::memObjAllocate(SegmentId segid, int hash_id, memObjType t
return NULL;
}
- if (segid >= (int)heap_size) {
- void *temp;
- int oldhs = heap_size;
-
- if (segid >= (int)heap_size * 2) {
+ if (segid >= (int)_heap.size()) {
+ if (segid >= (int)_heap.size() * 2) {
sciprintf("SegManager: hash_map error or others??");
return NULL;
}
- heap_size *= 2;
- temp = sci_realloc((void *)heap, heap_size * sizeof(MemObject *));
- if (!temp) {
- sciprintf("SegManager: Not enough memory space for script size");
- return NULL;
- }
- heap = (MemObject **)temp;
-
- // Clear pointers
- memset(heap + oldhs, 0, sizeof(MemObject *) * (heap_size - oldhs));
+ _heap.resize(_heap.size() * 2);
}
mem->data.tmp_dummy._segmgrId = hash_id;
mem->data.tmp_dummy._type = type;
// hook it to the heap
- heap[segid] = mem;
+ _heap[segid] = mem;
return mem;
}
@@ -418,7 +398,7 @@ int16 SegManager::getHeap(reg_t reg) {
MemObject *mem_obj;
VERIFY(check(reg.segment), "Invalid seg id");
- mem_obj = heap[reg.segment];
+ mem_obj = _heap[reg.segment];
switch (mem_obj->getType()) {
case MEM_OBJ_SCRIPT:
@@ -439,16 +419,16 @@ int SegManager::segGet(int script_id) const {
Script *SegManager::getScript(const int id, idFlag flag) {
const int seg = (flag == SCRIPT_ID) ? segGet(id) : id;
- if (seg < 0 || (uint)seg >= heap_size) {
+ if (seg < 0 || (uint)seg >= _heap.size()) {
error("SegManager::getScript(%d,%d): seg id %x out of bounds", id, flag, seg);
}
- if (!heap[seg]) {
+ if (!_heap[seg]) {
error("SegManager::getScript(%d,%d): seg id %x is not in memory", id, flag, seg);
}
- if (heap[seg]->getType() != MEM_OBJ_SCRIPT) {
- error("SegManager::getScript(%d,%d): seg id %x refers to type %d != MEM_OBJ_SCRIPT", id, flag, seg, heap[seg]->getType());
+ if (_heap[seg]->getType() != MEM_OBJ_SCRIPT) {
+ error("SegManager::getScript(%d,%d): seg id %x refers to type %d != MEM_OBJ_SCRIPT", id, flag, seg, _heap[seg]->getType());
}
- return &(heap[seg]->data.script);
+ return &(_heap[seg]->data.script);
}
// validate the seg
@@ -456,10 +436,10 @@ Script *SegManager::getScript(const int id, idFlag flag) {
// false - invalid seg
// true - valid seg
bool SegManager::check(int seg) {
- if (seg < 0 || (uint)seg >= heap_size) {
+ if (seg < 0 || (uint)seg >= _heap.size()) {
return false;
}
- if (!heap[seg]) {
+ if (!_heap[seg]) {
sciprintf("SegManager: seg %x is removed from memory, but not removed from hash_map\n", seg);
return false;
}
@@ -548,7 +528,7 @@ int SegManager::relocateBlock(reg_t *block, int block_location, int block_items,
}
block[index].segment = segment; // Perform relocation
if (isSci1_1)
- block[index].offset += heap[segment]->data.script.script_size;
+ block[index].offset += _heap[segment]->data.script.script_size;
return 1;
}
@@ -808,7 +788,7 @@ LocalVariables *SegManager::allocLocalsSegment(Script *scr, int count) {
LocalVariables *locals;
if (scr->locals_segment) {
- mobj = heap[scr->locals_segment];
+ mobj = _heap[scr->locals_segment];
VERIFY(mobj != NULL, "Re-used locals segment was NULL'd out");
VERIFY(mobj->getType() == MEM_OBJ_LOCALS, "Re-used locals segment did not consist of local variables");
VERIFY(mobj->data.locals.script_id == scr->nr, "Re-used locals segment belonged to other script");
@@ -1074,7 +1054,7 @@ Clone *SegManager::alloc_Clone(reg_t *addr) {
mobj = allocNonscriptSegment(MEM_OBJ_CLONES, &(Clones_seg_id));
mobj->data.clones.initTable();
} else
- mobj = heap[Clones_seg_id];
+ mobj = _heap[Clones_seg_id];
table = &(mobj->data.clones);
offset = table->allocEntry();
@@ -1092,7 +1072,7 @@ List *SegManager::alloc_List(reg_t *addr) {
mobj = allocNonscriptSegment(MEM_OBJ_LISTS, &(Lists_seg_id));
mobj->data.lists.initTable();
} else
- mobj = heap[Lists_seg_id];
+ mobj = _heap[Lists_seg_id];
table = &(mobj->data.lists);
offset = table->allocEntry();
@@ -1110,7 +1090,7 @@ Node *SegManager::alloc_Node(reg_t *addr) {
mobj = allocNonscriptSegment(MEM_OBJ_NODES, &(Nodes_seg_id));
mobj->data.nodes.initTable();
} else
- mobj = heap[Nodes_seg_id];
+ mobj = _heap[Nodes_seg_id];
table = &(mobj->data.nodes);
offset = table->allocEntry();
@@ -1128,7 +1108,7 @@ Hunk *SegManager::alloc_Hunk(reg_t *addr) {
mobj = allocNonscriptSegment(MEM_OBJ_HUNK, &(Hunks_seg_id));
mobj->data.hunks.initTable();
} else
- mobj = heap[Hunks_seg_id];
+ mobj = _heap[Hunks_seg_id];
table = &(mobj->data.hunks);
offset = table->allocEntry();
@@ -1144,13 +1124,13 @@ byte *SegManager::dereference(reg_t pointer, int *size) {
byte *base = NULL;
int count;
- if (!pointer.segment || (pointer.segment >= heap_size) || !heap[pointer.segment]) {
+ if (!pointer.segment || (pointer.segment >= _heap.size()) || !_heap[pointer.segment]) {
sciprintf("Error: Attempt to dereference invalid pointer "PREG"!\n",
PRINT_REG(pointer));
return NULL; /* Invalid */
}
- mobj = heap[pointer.segment];
+ mobj = _heap[pointer.segment];
switch (mobj->getType()) {
case MEM_OBJ_SCRIPT:
@@ -1221,9 +1201,9 @@ unsigned char *SegManager::allocDynmem(int size, const char *descr, reg_t *addr)
}
const char *SegManager::getDescription(reg_t addr) {
- MemObject *mobj = heap[addr.segment];
+ MemObject *mobj = _heap[addr.segment];
- if (addr.segment >= heap_size)
+ if (addr.segment >= _heap.size())
return "";
switch (mobj->getType()) {
@@ -1235,7 +1215,7 @@ const char *SegManager::getDescription(reg_t addr) {
}
int SegManager::freeDynmem(reg_t addr) {
- if (addr.segment <= 0 || addr.segment >= heap_size || !heap[addr.segment] || heap[addr.segment]->getType() != MEM_OBJ_DYNMEM)
+ if (addr.segment <= 0 || addr.segment >= _heap.size() || !_heap[addr.segment] || _heap[addr.segment]->getType() != MEM_OBJ_DYNMEM)
return 1; // error
deallocate(addr.segment, true);
@@ -1603,7 +1583,7 @@ SegInterface *SegManager::getSegInterface(SegmentId segid) {
return NULL; // Invalid segment
SegInterface *retval = NULL;
- MemObject *mobj = heap[segid];
+ MemObject *mobj = _heap[segid];
switch (mobj->getType()) {
case MEM_OBJ_SCRIPT:
retval = new SegInterfaceScript(this, mobj, segid);