[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