[Scummvm-cvs-logs] SF.net SVN: scummvm:[55116] scummvm/trunk/engines/sci/engine/gc.cpp
thebluegr at users.sourceforge.net
thebluegr at users.sourceforge.net
Tue Jan 4 13:29:23 CET 2011
Revision: 55116
http://scummvm.svn.sourceforge.net/scummvm/?rev=55116&view=rev
Author: thebluegr
Date: 2011-01-04 12:29:23 +0000 (Tue, 04 Jan 2011)
Log Message:
-----------
SCI: Slight cleanup to the garbage collector
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/gc.cpp
Modified: scummvm/trunk/engines/sci/engine/gc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/gc.cpp 2011-01-04 09:09:56 UTC (rev 55115)
+++ scummvm/trunk/engines/sci/engine/gc.cpp 2011-01-04 12:29:23 UTC (rev 55116)
@@ -32,7 +32,7 @@
struct WorklistManager {
Common::Array<reg_t> _worklist;
- AddrSet _map;
+ AddrSet _map; // used for 2 contains() calls, inside push() and run_gc()
void push(reg_t reg) {
if (!reg.segment) // No numbers
@@ -69,20 +69,31 @@
return normal_map;
}
+static void processWorkList(SegManager *segMan, WorklistManager &wm, const Common::Array<SegmentObj *> &heap) {
+ SegmentId stackSegment = segMan->findSegmentByType(SEG_TYPE_STACK);
+ while (!wm._worklist.empty()) {
+ reg_t reg = wm._worklist.back();
+ wm._worklist.pop_back();
+ if (reg.segment != stackSegment) { // No need to repeat this one
+ debugC(kDebugLevelGC, "[GC] Checking %04x:%04x", PRINT_REG(reg));
+ if (reg.segment < heap.size() && heap[reg.segment]) {
+ // Valid heap object? Find its outgoing references!
+ wm.pushArray(heap[reg.segment]->listAllOutgoingReferences(reg));
+ }
+ }
+ }
+}
AddrSet *findAllActiveReferences(EngineState *s) {
- SegManager *segMan = s->_segMan;
- AddrSet *normal_map = NULL;
- WorklistManager wm;
- uint i;
-
assert(!s->_executionStack.empty());
- // Initialise
- // Init: Registers
+ WorklistManager wm;
+
+ // Initialize registers
wm.push(s->r_acc);
wm.push(s->r_prev);
- // Init: Value Stack
+
+ // Initialize value stack
// We do this one by hand since the stack doesn't know the current execution stack
Common::List<ExecStack>::iterator iter = s->_executionStack.reverse_begin();
@@ -93,9 +104,8 @@
assert((iter != s->_executionStack.end()) && ((*iter).type != EXEC_STACK_TYPE_KERNEL));
ExecStack &xs = *iter;
- reg_t *pos;
- for (pos = s->stack_base; pos < xs.sp; pos++)
+ for (reg_t *pos = s->stack_base; pos < xs.sp; pos++)
wm.push(*pos);
debugC(kDebugLevelGC, "[GC] -- Finished adding value stack");
@@ -115,10 +125,11 @@
debugC(kDebugLevelGC, "[GC] -- Finished adding execution stack");
- const Common::Array<SegmentObj *> &heap = segMan->getSegments();
+ const Common::Array<SegmentObj *> &heap = s->_segMan->getSegments();
+ uint heapSize = heap.size();
// Init: Explicitly loaded scripts
- for (i = 1; i < heap.size(); i++) {
+ for (uint i = 1; i < heapSize; i++) {
if (heap[i] && heap[i]->getType() == SEG_TYPE_SCRIPT) {
Script *script = (Script *)heap[i];
@@ -130,24 +141,9 @@
debugC(kDebugLevelGC, "[GC] -- Finished explicitly loaded scripts, done with root set");
- // Run Worklist Algorithm
- SegmentId stack_seg = segMan->findSegmentByType(SEG_TYPE_STACK);
- while (!wm._worklist.empty()) {
- reg_t reg = wm._worklist.back();
- wm._worklist.pop_back();
- if (reg.segment != stack_seg) { // No need to repeat this one
- debugC(kDebugLevelGC, "[GC] Checking %04x:%04x", PRINT_REG(reg));
- if (reg.segment < heap.size() && heap[reg.segment]) {
- // Valid heap object? Find its outgoing references!
- wm.pushArray(heap[reg.segment]->listAllOutgoingReferences(reg));
- }
- }
- }
+ processWorkList(s->_segMan, wm, heap);
- // Normalise
- normal_map = normalizeAddresses(segMan, wm._map);
-
- return normal_map;
+ return normalizeAddresses(s->_segMan, wm._map);
}
void run_gc(EngineState *s) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list