aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/gc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/gc.cpp')
-rw-r--r--engines/sci/engine/gc.cpp72
1 files changed, 30 insertions, 42 deletions
diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp
index 484c0ec41d..295455cad9 100644
--- a/engines/sci/engine/gc.cpp
+++ b/engines/sci/engine/gc.cpp
@@ -45,9 +45,8 @@ new_worklist() {
}
static void
-worklist_push(worklist_t **wlp, reg_t_hash_map_ptr hashmap, reg_t reg) {
+worklist_push(worklist_t **wlp, reg_t_hash_map *hashmap, reg_t reg) {
worklist_t *wl = *wlp;
- char added;
if (!reg.segment) /* No numbers */
return;
@@ -56,11 +55,12 @@ worklist_push(worklist_t **wlp, reg_t_hash_map_ptr hashmap, reg_t reg) {
sciprintf("[GC] Adding "PREG"\n", PRINT_REG(reg));
#endif
- reg_t_hash_map_check_value(hashmap, reg, 1, &added);
-
- if (!added)
+
+ if (hashmap->contains(reg))
return; /* already dealt with it */
+ hashmap->setVal(reg, true);
+
if (!wl || wl->used == WORKLIST_CHUNK_SIZE)
*wlp = wl = fresh_worklist(wl);
@@ -101,41 +101,29 @@ free_worklist(worklist_t *wl) {
}
}
-typedef struct {
- seg_interface_t **interfaces;
- int interfaces_nr;
- reg_t_hash_map_ptr normal_map;
-} normaliser_t;
-
-void
-store_normalised(void *pre_normaliser, reg_t reg, int _) {
- seg_interface_t *interfce;
- normaliser_t *normaliser = (normaliser_t *) pre_normaliser;
- interfce = (reg.segment < normaliser->interfaces_nr)
- ? normaliser->interfaces[reg.segment]
- : NULL;
-
- if (interfce) {
- reg = interfce->find_canonic_address(interfce, reg);
- reg_t_hash_map_check_value(normaliser->normal_map, reg, 1, NULL);
+static reg_t_hash_map *
+normalise_hashmap_ptrs(reg_t_hash_map *nonnormal_map, seg_interface_t **interfaces, int interfaces_nr) {
+ reg_t_hash_map *normal_map = new reg_t_hash_map();
+
+ for (reg_t_hash_map::iterator i = nonnormal_map->begin(); i != nonnormal_map->end(); ++i) {
+ seg_interface_t *interfce;
+ reg_t reg = i->_key;
+ interfce = (reg.segment < interfaces_nr)
+ ? interfaces[reg.segment]
+ : NULL;
+
+ if (interfce) {
+ reg = interfce->find_canonic_address(interfce, reg);
+ normal_map->setVal(reg, true);
+ }
}
-}
-
-static reg_t_hash_map_ptr
-normalise_hashmap_ptrs(reg_t_hash_map_ptr nonnormal_map, seg_interface_t **interfaces, int interfaces_nr) {
- normaliser_t normaliser;
- normaliser.normal_map = new_reg_t_hash_map();
- normaliser.interfaces_nr = interfaces_nr;
- normaliser.interfaces = interfaces;
- apply_to_reg_t_hash_map(nonnormal_map, &normaliser, &store_normalised);
-
- return normaliser.normal_map;
+ return normal_map;
}
typedef struct {
- reg_t_hash_map_ptr nonnormal_map;
+ reg_t_hash_map *nonnormal_map;
worklist_t **worklist_ref;
} worklist_manager_t;
@@ -145,12 +133,12 @@ add_outgoing_refs(void *pre_wm, reg_t addr) {
worklist_push(wm->worklist_ref, wm->nonnormal_map, addr);
}
-reg_t_hash_map_ptr
+reg_t_hash_map *
find_all_used_references(state_t *s) {
seg_manager_t *sm = &(s->seg_manager);
seg_interface_t **interfaces = (seg_interface_t**)sci_calloc(sizeof(seg_interface_t *), sm->heap_size);
- reg_t_hash_map_ptr nonnormal_map = new_reg_t_hash_map();
- reg_t_hash_map_ptr normal_map = NULL;
+ reg_t_hash_map *nonnormal_map = new reg_t_hash_map();
+ reg_t_hash_map *normal_map = NULL;
worklist_t *worklist = new_worklist();
worklist_manager_t worklist_manager;
int i;
@@ -248,7 +236,7 @@ find_all_used_references(state_t *s) {
if (interfaces[i])
interfaces[i]->deallocate_self(interfaces[i]);
sci_free(interfaces);
- free_reg_t_hash_map(nonnormal_map);
+ delete nonnormal_map;
return normal_map;
}
@@ -259,15 +247,15 @@ typedef struct {
char *segnames[MEM_OBJ_MAX + 1];
int segcount[MEM_OBJ_MAX + 1];
#endif
- reg_t_hash_map_ptr use_map;
+ reg_t_hash_map *use_map;
} deallocator_t;
void
free_unless_used(void *pre_use_map, reg_t addr) {
deallocator_t *deallocator = (deallocator_t *) pre_use_map;
- reg_t_hash_map_ptr use_map = deallocator->use_map;
+ reg_t_hash_map *use_map = deallocator->use_map;
- if (0 > reg_t_hash_map_check_value(use_map, addr, 0, NULL)) {
+ if (!use_map->contains(addr)) {
/* Not found -> we can free it */
deallocator->interfce->free_at_address(deallocator->interfce, addr);
#ifdef DEBUG_GC
@@ -306,7 +294,7 @@ run_gc(state_t *s) {
deallocator.interfce->deallocate_self(deallocator.interfce);
}
- free_reg_t_hash_map(deallocator.use_map);
+ delete deallocator.use_map;
#ifdef DEBUG_GC
{