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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Tue Sep 22 02:35:48 CEST 2009


Revision: 44242
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44242&view=rev
Author:   fingolfin
Date:     2009-09-22 00:35:46 +0000 (Tue, 22 Sep 2009)

Log Message:
-----------
SCI: SegmentObj's now set their type in constructor; replace central SegmentObj::createSegmentObj call in SegManager::allocSegment by several explicit 'new' statements; some extra cleanup

Modified Paths:
--------------
    scummvm/trunk/engines/sci/console.cpp
    scummvm/trunk/engines/sci/engine/game.cpp
    scummvm/trunk/engines/sci/engine/savegame.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.h
    scummvm/trunk/engines/sci/engine/segment.cpp
    scummvm/trunk/engines/sci/engine/segment.h

Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp	2009-09-21 21:39:00 UTC (rev 44241)
+++ scummvm/trunk/engines/sci/console.cpp	2009-09-22 00:35:46 UTC (rev 44242)
@@ -1332,7 +1332,7 @@
 				break;
 
 			case SEG_TYPE_STACK:
-				DebugPrintf("D  data stack (%d)", (*(DataStack *)mobj).nr);
+				DebugPrintf("D  data stack (%d)", (*(DataStack *)mobj)._capacity);
 				break;
 
 			case SEG_TYPE_SYS_STRINGS:
@@ -1423,7 +1423,7 @@
 	case SEG_TYPE_STACK: {
 		DataStack *stack = (DataStack *)mobj;
 		DebugPrintf("stack\n");
-		DebugPrintf("  %d (0x%x) entries\n", stack->nr, stack->nr);
+		DebugPrintf("  %d (0x%x) entries\n", stack->_capacity, stack->_capacity);
 	}
 	break;
 

Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp	2009-09-21 21:39:00 UTC (rev 44241)
+++ scummvm/trunk/engines/sci/engine/game.cpp	2009-09-22 00:35:46 UTC (rev 44242)
@@ -417,8 +417,8 @@
 	DataStack *stack;
 
 	stack = s->segMan->allocateStack(VM_STACK_SIZE, &s->stack_segment);
-	s->stack_base = stack->entries;
-	s->stack_top = s->stack_base + VM_STACK_SIZE;
+	s->stack_base = stack->_entries;
+	s->stack_top = stack->_entries + stack->_capacity;
 
 	if (!script_instantiate(s->resMan, s->segMan, 0)) {
 		warning("game_init(): Could not instantiate script 0");

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-09-21 21:39:00 UTC (rev 44241)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-09-22 00:35:46 UTC (rev 44242)
@@ -461,10 +461,10 @@
 }
 
 void DataStack::saveLoadWithSerializer(Common::Serializer &s) {
-	s.syncAsUint32LE(nr);
+	s.syncAsUint32LE(_capacity);
 	if (s.isLoading()) {
 		//free(entries);
-		entries = (reg_t *)calloc(nr, sizeof(reg_t));
+		_entries = (reg_t *)calloc(_capacity, sizeof(reg_t));
 	}
 }
 
@@ -561,8 +561,8 @@
 	DataStack *stack = (DataStack *)(retval->segMan->_heap[stack_seg]);
 
 	retval->stack_segment = stack_seg;
-	retval->stack_base = stack->entries;
-	retval->stack_top = retval->stack_base + VM_STACK_SIZE;
+	retval->stack_base = stack->_entries;
+	retval->stack_top = stack->_entries + stack->_capacity;
 }
 
 static void load_script(EngineState *s, Script *scr) {

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-21 21:39:00 UTC (rev 44241)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-22 00:35:46 UTC (rev 44242)
@@ -93,12 +93,10 @@
 	return seg;
 }
 
-SegmentObj *SegManager::allocSegment(SegmentType type, SegmentId *segid) {
+SegmentObj *SegManager::allocSegment(SegmentObj *mem, SegmentId *segid) {
 	// Find a free segment
 	*segid = findFreeSegment();
 
-	// Now allocate an object of the appropriate type...
-	SegmentObj *mem = SegmentObj::createSegmentObj(type);
 	if (!mem)
 		error("SegManager: invalid mobj");
 
@@ -114,14 +112,14 @@
 
 Script *SegManager::allocateScript(int script_nr, SegmentId *seg_id) {
 	// Check if the script already has an allocated segment. If it
-	// does have one, return it.
+	// does, return that segment.
 	*seg_id = _scriptSegMap.getVal(script_nr, 0);
 	if (*seg_id > 0) {
 		return (Script *)_heap[*seg_id];
 	}
 
 	// allocate the SegmentObj
-	SegmentObj *mem = allocSegment(SEG_TYPE_SCRIPT, seg_id);
+	SegmentObj *mem = allocSegment(new Script(), seg_id);
 
 	// Add the script to the "script id -> segment id" hashmap
 	_scriptSegMap[script_nr] = *seg_id;
@@ -572,7 +570,7 @@
 			VERIFY(locals->getType() == SEG_TYPE_LOCALS, "Re-used locals segment did not consist of local variables");
 			VERIFY(locals->script_id == scr->_nr, "Re-used locals segment belonged to other script");
 		} else
-			locals = (LocalVariables *)allocSegment(SEG_TYPE_LOCALS, &scr->_localsSegment);
+			locals = (LocalVariables *)allocSegment(new LocalVariables(), &scr->_localsSegment);
 
 		scr->_localsBlock = locals;
 		locals->script_id = scr->_nr;
@@ -704,23 +702,23 @@
 */
 
 DataStack *SegManager::allocateStack(int size, SegmentId *segid) {
-	SegmentObj *mobj = allocSegment(SEG_TYPE_STACK, segid);
+	SegmentObj *mobj = allocSegment(new DataStack(), segid);
 	DataStack *retval = (DataStack *)mobj;
 
-	retval->entries = (reg_t *)calloc(size, sizeof(reg_t));
-	retval->nr = size;
+	retval->_entries = (reg_t *)calloc(size, sizeof(reg_t));
+	retval->_capacity = size;
 
 	return retval;
 }
 
 SystemStrings *SegManager::allocateSysStrings(SegmentId *segid) {
-	return (SystemStrings *)allocSegment(SEG_TYPE_SYS_STRINGS, segid);
+	return (SystemStrings *)allocSegment(new SystemStrings(), segid);
 }
 
 SegmentId SegManager::allocateStringFrags() {
 	SegmentId segid;
 
-	allocSegment(SEG_TYPE_STRING_FRAG, &segid);
+	allocSegment(new StringFrag(), &segid);
 
 	return segid;
 }
@@ -769,7 +767,7 @@
 	int offset;
 
 	if (!Clones_seg_id) {
-		table = (CloneTable *)allocSegment(SEG_TYPE_CLONES, &(Clones_seg_id));
+		table = (CloneTable *)allocSegment(new CloneTable(), &(Clones_seg_id));
 	} else
 		table = (CloneTable *)_heap[Clones_seg_id];
 
@@ -828,7 +826,7 @@
 	int offset;
 
 	if (!Lists_seg_id)
-		allocSegment(SEG_TYPE_LISTS, &(Lists_seg_id));
+		allocSegment(new ListTable(), &(Lists_seg_id));
 	table = (ListTable *)_heap[Lists_seg_id];
 
 	offset = table->allocEntry();
@@ -842,7 +840,7 @@
 	int offset;
 
 	if (!Nodes_seg_id)
-		allocSegment(SEG_TYPE_NODES, &(Nodes_seg_id));
+		allocSegment(new NodeTable(), &(Nodes_seg_id));
 	table = (NodeTable *)_heap[Nodes_seg_id];
 
 	offset = table->allocEntry();
@@ -856,7 +854,7 @@
 	int offset;
 
 	if (!Hunks_seg_id)
-		allocSegment(SEG_TYPE_HUNK, &(Hunks_seg_id));
+		allocSegment(new HunkTable(), &(Hunks_seg_id));
 	table = (HunkTable *)_heap[Hunks_seg_id];
 
 	offset = table->allocEntry();
@@ -912,7 +910,7 @@
 
 byte *SegManager::allocDynmem(int size, const char *descr, reg_t *addr) {
 	SegmentId seg;
-	SegmentObj *mobj = allocSegment(SEG_TYPE_DYNMEM, &seg);
+	SegmentObj *mobj = allocSegment(new DynMem(), &seg);
 	*addr = make_reg(seg, 0);
 
 	DynMem &d = *(DynMem *)mobj;

Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h	2009-09-21 21:39:00 UTC (rev 44241)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h	2009-09-22 00:35:46 UTC (rev 44242)
@@ -373,7 +373,7 @@
 	SegmentId Hunks_seg_id; ///< ID of the (a) hunk segment
 
 private:
-	SegmentObj *allocSegment(SegmentType type, SegmentId *segid);
+	SegmentObj *allocSegment(SegmentObj *mem, SegmentId *segid);
 	LocalVariables *allocLocalsSegment(Script *scr, int count);
 	int deallocate(SegmentId seg, bool recursive);
 	int createClassTable();

Modified: scummvm/trunk/engines/sci/engine/segment.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.cpp	2009-09-21 21:39:00 UTC (rev 44241)
+++ scummvm/trunk/engines/sci/engine/segment.cpp	2009-09-22 00:35:46 UTC (rev 44242)
@@ -76,11 +76,11 @@
 	}
 
 	assert(mem);
-	mem->_type = type;
+	assert(mem->_type == type);
 	return mem;
 }
 
-Script::Script() {
+Script::Script() : SegmentObj(SEG_TYPE_SCRIPT) {
 	_nr = 0;
 	_buf = NULL;
 	_bufSize = 0;
@@ -251,14 +251,14 @@
 }
 
 bool DataStack::isValidOffset(uint16 offset) const {
-	return offset < nr * sizeof(reg_t);
+	return offset < _capacity * sizeof(reg_t);
 }
 
 byte *DataStack::dereference(reg_t pointer, int *size) {
 	if (size)
-		*size = nr * sizeof(reg_t);
+		*size = _capacity * sizeof(reg_t);
 
-	byte *base = (byte *)entries;
+	byte *base = (byte *)_entries;
 	return base + pointer.offset;
 }
 
@@ -401,9 +401,9 @@
 }
 
 void DataStack::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) {
-	fprintf(stderr, "Emitting %d stack entries\n", nr);
-	for (int i = 0; i < nr; i++)
-		(*note)(param, entries[i]);
+	fprintf(stderr, "Emitting %d stack entries\n", _capacity);
+	for (int i = 0; i < _capacity; i++)
+		(*note)(param, _entries[i]);
 	fprintf(stderr, "DONE");
 }
 

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2009-09-21 21:39:00 UTC (rev 44241)
+++ scummvm/trunk/engines/sci/engine/segment.h	2009-09-22 00:35:46 UTC (rev 44242)
@@ -59,6 +59,7 @@
 	static SegmentObj *createSegmentObj(SegmentType type);
 
 public:
+	SegmentObj(SegmentType type) : _type(type) {}
 	virtual ~SegmentObj() {}
 
 	inline SegmentType getType() const { return _type; }
@@ -113,6 +114,8 @@
 
 // TODO: Implement the following class
 struct StringFrag : public SegmentObj {
+	StringFrag() : SegmentObj(SEG_TYPE_STRING_FRAG) {}
+
 	virtual bool isValidOffset(uint16 offset) const { return false; }
 
 	virtual void saveLoadWithSerializer(Common::Serializer &ser);
@@ -139,7 +142,7 @@
 	SystemString strings[SYS_STRINGS_MAX];
 
 public:
-	SystemStrings() {
+	SystemStrings() : SegmentObj(SEG_TYPE_SYS_STRINGS) {
 		memset(strings, 0, sizeof(strings));
 	}
 	~SystemStrings() {
@@ -168,7 +171,7 @@
 	Common::Array<reg_t> _locals;
 
 public:
-	LocalVariables() {
+	LocalVariables(): SegmentObj(SEG_TYPE_LOCALS) {
 		script_id = 0;
 	}
 
@@ -450,17 +453,17 @@
 
 /** Data stack */
 struct DataStack : SegmentObj {
-	int nr; /**< Number of stack entries */
-	reg_t *entries;
+	int _capacity; /**< Number of stack entries */
+	reg_t *_entries;
 
 public:
-	DataStack() {
-		nr = 0;
-		entries = NULL;
+	DataStack() : SegmentObj(SEG_TYPE_STACK) {
+		_capacity = 0;
+		_entries = NULL;
 	}
 	~DataStack() {
-		free(entries);
-		entries = NULL;
+		free(_entries);
+		_entries = NULL;
 	}
 
 	virtual bool isValidOffset(uint16 offset) const;
@@ -509,7 +512,7 @@
 	Common::Array<Entry> _table;
 
 public:
-	Table() {
+	Table(SegmentType type) : SegmentObj(type) {
 		initTable();
 	}
 
@@ -562,6 +565,8 @@
 
 /* CloneTable */
 struct CloneTable : public Table<Clone> {
+	CloneTable() : Table<Clone>(SEG_TYPE_CLONES) {}
+
 	virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
 	virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
 
@@ -571,6 +576,8 @@
 
 /* NodeTable */
 struct NodeTable : public Table<Node> {
+	NodeTable() : Table<Node>(SEG_TYPE_NODES) {}
+
 	virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
 	virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
 
@@ -580,6 +587,8 @@
 
 /* ListTable */
 struct ListTable : public Table<List> {
+	ListTable() : Table<List>(SEG_TYPE_LISTS) {}
+
 	virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr);
 	virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note);
 
@@ -589,6 +598,8 @@
 
 /* HunkTable */
 struct HunkTable : public Table<Hunk> {
+	HunkTable() : Table<Hunk>(SEG_TYPE_HUNK) {}
+
 	virtual void freeEntry(int idx) {
 		Table<Hunk>::freeEntry(idx);
 
@@ -606,7 +617,7 @@
 	byte *_buf;
 
 public:
-	DynMem() : _size(0), _buf(0) {}
+	DynMem() : SegmentObj(SEG_TYPE_DYNMEM), _size(0), _buf(0) {}
 	~DynMem() {
 		free(_buf);
 		_buf = NULL;


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