[Scummvm-cvs-logs] SF.net SVN: scummvm:[40376] scummvm/trunk/engines/sci/engine

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Fri May 8 11:54:07 CEST 2009


Revision: 40376
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40376&view=rev
Author:   fingolfin
Date:     2009-05-08 09:54:06 +0000 (Fri, 08 May 2009)

Log Message:
-----------
SCI: Moved findCanonicAddress from SegInterface to MemObject

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/gc.cpp
    scummvm/trunk/engines/sci/engine/scriptdebug.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.h
    scummvm/trunk/engines/sci/engine/vm.h

Modified: scummvm/trunk/engines/sci/engine/gc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/gc.cpp	2009-05-08 09:53:49 UTC (rev 40375)
+++ scummvm/trunk/engines/sci/engine/gc.cpp	2009-05-08 09:54:06 UTC (rev 40376)
@@ -51,15 +51,15 @@
 	}
 };
 
-static reg_t_hash_map *normalise_hashmap_ptrs(reg_t_hash_map &nonnormal_map, const Common::Array<SegInterface *> &interfaces) {
+static reg_t_hash_map *normalise_hashmap_ptrs(SegManager *sm, reg_t_hash_map &nonnormal_map) {
 	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) {
 		reg_t reg = i->_key;
-		SegInterface *interfce = (reg.segment < interfaces.size()) ? interfaces[reg.segment] : NULL;
+		MemObject *mobj = (reg.segment < sm->_heap.size()) ? sm->_heap[reg.segment] : NULL;
 
-		if (interfce) {
-			reg = interfce->findCanonicAddress(reg);
+		if (mobj) {
+			reg = mobj->findCanonicAddress(sm, reg);
 			normal_map->setVal(reg, true);
 		}
 	}
@@ -156,7 +156,7 @@
 	}
 
 	// Normalise
-	normal_map = normalise_hashmap_ptrs(wm._map, interfaces);
+	normal_map = normalise_hashmap_ptrs(sm, wm._map);
 
 	// Cleanup
 	for (i = 1; i < sm->_heap.size(); i++)

Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-05-08 09:53:49 UTC (rev 40375)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-05-08 09:54:06 UTC (rev 40376)
@@ -2792,13 +2792,6 @@
 		sciprintf("  "PREG"\n", PRINT_REG(addr));
 }
 
-#define GET_SEG_INTERFACE(seg_id) \
-	SegInterface *seg_interface = s->seg_manager->getSegInterface(seg_id);	\
-	if (!seg_interface) {								\
-		sciprintf("Unknown segment : %x\n", seg_id);				\
-		return 1;								\
-	}
-
 static int c_gc_show_reachable(EngineState *s) {
 	reg_t addr = cmd_params[0].reg;
 
@@ -2832,13 +2825,15 @@
 static int c_gc_normalise(EngineState *s) {
 	reg_t addr = cmd_params[0].reg;
 
-	GET_SEG_INTERFACE(addr.segment);
+	MemObject *mobj = GET_SEGMENT_ANY(*s->seg_manager, addr.segment);
+	if (!mobj) {
+		sciprintf("Unknown segment : %x\n", addr.segment);
+		return 1;
+	}
 
-	addr = seg_interface->findCanonicAddress(addr);
+	addr = mobj->findCanonicAddress(s->seg_manager, addr);
 	sciprintf(" "PREG"\n", PRINT_REG(addr));
 
-	delete seg_interface;
-
 	return 0;
 }
 

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-05-08 09:53:49 UTC (rev 40375)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-05-08 09:54:06 UTC (rev 40376)
@@ -1188,20 +1188,15 @@
 	VERIFY(_mobj->getType() == _typeId, "Invalid MemObject type");
 }
 
-reg_t SegInterface::findCanonicAddress(reg_t addr) {
-	return addr;
-}
-
 //-------------------- base --------------------
 class SegInterfaceBase : public SegInterface {
 protected:
 	SegInterfaceBase(SegManager *segmgr, MemObject *mobj, SegmentId segId, MemObjectType typeId) :
 		SegInterface(segmgr, mobj, segId, typeId) {}
 public:
-	reg_t findCanonicAddress(reg_t addr);
 };
 
-reg_t SegInterfaceBase::findCanonicAddress(reg_t addr) {
+reg_t Script::findCanonicAddress(SegManager *segmgr, reg_t addr) {
 	addr.offset = 0;
 	return addr;
 }
@@ -1210,6 +1205,11 @@
 	(*note)(param, make_reg(segId, 0));
 }
 
+reg_t DynMem::findCanonicAddress(SegManager *segmgr, reg_t addr) {
+	addr.offset = 0;
+	return addr;
+}
+
 void DynMem::listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) {
 	(*note)(param, make_reg(segId, 0));
 }
@@ -1327,13 +1327,11 @@
 public:
 	SegInterfaceLocals(SegManager *segmgr, MemObject *mobj, SegmentId segId) :
 		SegInterface(segmgr, mobj, segId, MEM_OBJ_LOCALS) {}
-	reg_t findCanonicAddress(reg_t addr);
 };
 
-reg_t SegInterfaceLocals::findCanonicAddress(reg_t addr) {
-	LocalVariables *locals = (LocalVariables *)_mobj;
+reg_t LocalVariables::findCanonicAddress(SegManager *segmgr, reg_t addr) {
 	// Reference the owning script
-	SegmentId owner_seg = _segmgr->segGet(locals->script_id);
+	SegmentId owner_seg = segmgr->segGet(script_id);
 
 	assert(owner_seg >= 0);
 
@@ -1353,10 +1351,9 @@
 public:
 	SegInterfaceStack(SegManager *segmgr, MemObject *mobj, SegmentId segId) :
 		SegInterface(segmgr, mobj, segId, MEM_OBJ_STACK) {}
-	reg_t findCanonicAddress(reg_t addr);
 };
 
-reg_t SegInterfaceStack::findCanonicAddress(reg_t addr) {
+reg_t DataStack::findCanonicAddress(SegManager *segmgr, reg_t addr) {
 	addr.offset = 0;
 	return addr;
 }

Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h	2009-05-08 09:53:49 UTC (rev 40375)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h	2009-05-08 09:54:06 UTC (rev 40376)
@@ -452,12 +452,6 @@
 	// Deallocates the segment interface
 	virtual ~SegInterface() {}
 
-	// Finds the canonic address associated with sub_reg
-	// Parameters: (reg_t) sub_addr: The base address whose canonic address is to be found
-	// For each valid address a, there exists a canonic address c(a) such that c(a) = c(c(a)).
-	// This address "governs" a in the sense that deallocating c(a) will deallocate a.
-	virtual reg_t findCanonicAddress(reg_t sub_addr);
-
 	// Get the memory object
 	MemObject *getMobj() { return _mobj; }
 

Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h	2009-05-08 09:53:49 UTC (rev 40375)
+++ scummvm/trunk/engines/sci/engine/vm.h	2009-05-08 09:54:06 UTC (rev 40376)
@@ -77,6 +77,12 @@
 	inline MemObjectType getType() const { return _type; }
 	inline int getSegMgrId() const { return _segmgrId; }
 
+	// Finds the canonic address associated with sub_reg
+	// Parameters: (reg_t) sub_addr: The base address whose canonic address is to be found
+	// For each valid address a, there exists a canonic address c(a) such that c(a) = c(c(a)).
+	// This address "governs" a in the sense that deallocating c(a) will deallocate a.
+	virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr) { return sub_addr; }
+
 	// Deallocates all memory associated with the specified address
 	// Parameters: (reg_t) sub_addr: The address (within the given segment) to deallocate
 	virtual void freeAtAddress(SegManager *segmgr, reg_t sub_addr) {}
@@ -251,6 +257,7 @@
 	}
 
 	virtual byte *dereference(reg_t pointer, int *size);
+	virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr);
 	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note);
 
 //	virtual void saveLoadWithSerializer(Common::Serializer &ser);
@@ -368,6 +375,7 @@
 	void freeScript();
 
 	virtual byte *dereference(reg_t pointer, int *size);
+	virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr);
 	virtual void freeAtAddress(SegManager *segmgr, reg_t sub_addr);
 	virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note);
 	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note);
@@ -391,6 +399,7 @@
 	}
 
 	virtual byte *dereference(reg_t pointer, int *size);
+	virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr);
 	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note);
 
 //	virtual void saveLoadWithSerializer(Common::Serializer &ser);
@@ -555,6 +564,7 @@
 	}
 
 	virtual byte *dereference(reg_t pointer, int *size);
+	virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr);
 	virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note);
 
 //	virtual void saveLoadWithSerializer(Common::Serializer &ser);


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