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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sun May 10 21:17:51 CEST 2009


Revision: 40431
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40431&view=rev
Author:   fingolfin
Date:     2009-05-10 19:17:51 +0000 (Sun, 10 May 2009)

Log Message:
-----------
SCI: Changed object list in Script instances to use Common:::Array

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/gc.cpp
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/savegame.cpp
    scummvm/trunk/engines/sci/engine/scriptconsole.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.cpp
    scummvm/trunk/engines/sci/engine/vm.h

Modified: scummvm/trunk/engines/sci/engine/gc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/gc.cpp	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/gc.cpp	2009-05-10 19:17:51 UTC (rev 40431)
@@ -118,15 +118,12 @@
 			Script *script = (Script *)sm->_heap[i];
 
 			if (script->lockers) { // Explicitly loaded?
-				int obj_nr;
-
 				// Locals, if present
 				wm.push(make_reg(script->locals_segment, 0));
 
 				// All objects (may be classes, may be indirectly reachable)
-				for (obj_nr = 0; obj_nr < script->objects_nr; obj_nr++) {
-					Object *obj = script->objects + obj_nr;
-					wm.push(obj->pos);
+				for (uint obj_nr = 0; obj_nr < script->_objects.size(); obj_nr++) {
+					wm.push(script->_objects[obj_nr].pos);
 				}
 			}
 		}

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-05-10 19:17:51 UTC (rev 40431)
@@ -673,7 +673,7 @@
 		if (reg.offset <= (*(Script *)mobj).buf_size && reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET
 		        && RAW_IS_OBJECT((*(Script *)mobj).buf + reg.offset)) {
 			int idx = RAW_GET_CLASS_INDEX((Script *)mobj, reg);
-			if (idx >= 0 && idx < (*(Script *)mobj).objects_nr)
+			if (idx >= 0 && (uint)idx < (*(Script *)mobj)._objects.size())
 				return KSIG_OBJECT;
 			else
 				return KSIG_REF;

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-05-10 19:17:51 UTC (rev 40431)
@@ -277,7 +277,8 @@
 		sync_reg_t(s, obj.locals[i]);
 }
 
-static void sync_Object(Common::Serializer &s, Object &obj) {
+template <>
+void syncWithSerializer(Common::Serializer &s, Object &obj) {
 	s.syncAsSint32LE(obj.flags);
 	sync_reg_t(s, obj.pos);
 	s.syncAsSint32LE(obj.variables_nr);
@@ -291,11 +292,6 @@
 }
 
 template <>
-void syncWithSerializer(Common::Serializer &s, Clone &obj) {
-	sync_Object(s, obj);
-}
-
-template <>
 void syncWithSerializer(Common::Serializer &s, List &obj) {
 	sync_reg_t(s, obj.first);
 	sync_reg_t(s, obj.last);
@@ -341,13 +337,22 @@
 	s.syncAsSint32LE(obj.exports_nr);
 	s.syncAsSint32LE(obj.synonyms_nr);
 	s.syncAsSint32LE(obj.lockers);
-	s.syncAsSint32LE(obj.objects_allocated);
-	s.syncAsSint32LE(obj.objects_nr);
 
-	if (!obj.objects && obj.objects_allocated)
-		obj.objects = (Object *)sci_calloc(obj.objects_allocated, sizeof(Object));
-	for (int i = 0; i < obj.objects_allocated; ++i)
-		sync_Object(s, obj.objects[i]);
+#if 1
+	uint len = obj._objects.size();
+	s.syncAsUint32LE(len); 	// Used to be obj.objects_allocated
+	s.skip(4); 	// Used to be obj.objects_nr
+	// Resize the array if loading.
+	if (s.isLoading())
+		obj._objects.resize(len);
+	Common::Array<Object>::iterator i;
+	for (i = obj._objects.begin(); i != obj._objects.end(); ++i) {
+		syncWithSerializer<Object>(s, *i);
+	}
+#else
+	s.skip(4); 	// Used to be obj.objects_allocated
+	syncArray<Object>(s, obj._objects);
+#endif
 
 	s.syncAsSint32LE(obj.locals_offset);
 	s.syncAsSint32LE(obj.locals_segment);
@@ -585,14 +590,13 @@
 
 // FIXME: The following should likely become a SegManager method
 static void reconstruct_scripts(EngineState *s, SegManager *self) {
-	uint i;
+	uint i, j;
 	MemObject *mobj;
 	for (i = 0; i < self->_heap.size(); i++) {
 		if (self->_heap[i]) {
 			mobj = self->_heap[i];
 			switch (mobj->getType())  {
 			case MEM_OBJ_SCRIPT: {
-				int j;
 				Script *scr = (Script *)mobj;
 
 				load_script(s, i);
@@ -606,10 +610,10 @@
 				if (!self->isSci1_1)
 					scr->export_table += 3;
 
-				for (j = 0; j < scr->objects_nr; j++) {
-					byte *data = scr->buf + scr->objects[j].pos.offset;
-					scr->objects[j].base = scr->buf;
-					scr->objects[j].base_obj = data;
+				for (j = 0; j < scr->_objects.size(); j++) {
+					byte *data = scr->buf + scr->_objects[j].pos.offset;
+					scr->_objects[j].base = scr->buf;
+					scr->_objects[j].base_obj = data;
 				}
 				break;
 			}
@@ -624,34 +628,33 @@
 			mobj = self->_heap[i];
 			switch (mobj->getType())  {
 			case MEM_OBJ_SCRIPT: {
-				int j;
 				Script *scr = (Script *)mobj;
 
-				for (j = 0; j < scr->objects_nr; j++) {
-					byte *data = scr->buf + scr->objects[j].pos.offset;
+				for (j = 0; j < scr->_objects.size(); j++) {
+					byte *data = scr->buf + scr->_objects[j].pos.offset;
 
 					if (self->isSci1_1) {
 						uint16 *funct_area = (uint16 *) (scr->buf + READ_LE_UINT16( data + 6 ));
 						uint16 *prop_area = (uint16 *) (scr->buf + READ_LE_UINT16( data + 4 ));
 
-						scr->objects[j].base_method = funct_area;
-						scr->objects[j].base_vars = prop_area;
+						scr->_objects[j].base_method = funct_area;
+						scr->_objects[j].base_vars = prop_area;
 					} else {
 						int funct_area = READ_LE_UINT16( data + SCRIPT_FUNCTAREAPTR_OFFSET );
 						Object *base_obj;
 
-						base_obj = obj_get(s, scr->objects[j].variables[SCRIPT_SPECIES_SELECTOR]);
+						base_obj = obj_get(s, scr->_objects[j].variables[SCRIPT_SPECIES_SELECTOR]);
 
 						if (!base_obj) {
 							sciprintf("Object without a base class: Script %d, index %d (reg address "PREG"\n",
-								  scr->nr, j, PRINT_REG(scr->objects[j].variables[SCRIPT_SPECIES_SELECTOR]));
+								  scr->nr, j, PRINT_REG(scr->_objects[j].variables[SCRIPT_SPECIES_SELECTOR]));
 							continue;
 						}
-						scr->objects[j].variable_names_nr = base_obj->variables_nr;
-						scr->objects[j].base_obj = base_obj->base_obj;
+						scr->_objects[j].variable_names_nr = base_obj->variables_nr;
+						scr->_objects[j].base_obj = base_obj->base_obj;
 
-						scr->objects[j].base_method = (uint16 *) (data + funct_area);
-						scr->objects[j].base_vars = (uint16 *) (data + scr->objects[j].variable_names_nr * 2 + SCRIPT_SELECTOR_OFFSET);
+						scr->_objects[j].base_method = (uint16 *)(data + funct_area);
+						scr->_objects[j].base_vars = (uint16 *)(data + scr->_objects[j].variable_names_nr * 2 + SCRIPT_SELECTOR_OFFSET);
 					}
 				}
 				break;

Modified: scummvm/trunk/engines/sci/engine/scriptconsole.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptconsole.cpp	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/scriptconsole.cpp	2009-05-10 19:17:51 UTC (rev 40431)
@@ -312,7 +312,7 @@
 
 			if (mobj) {
 				if (mobj->getType() == MEM_OBJ_SCRIPT)
-					max_index = (*(Script *)mobj).objects_nr;
+					max_index = (*(Script *)mobj)._objects.size();
 				else if (mobj->getType() == MEM_OBJ_CLONES)
 					max_index = (*(CloneTable *)mobj).max_entry;
 			}
@@ -325,7 +325,7 @@
 				objpos.segment = i;
 
 				if (mobj->getType() == MEM_OBJ_SCRIPT) {
-					obj = (*(Script *)mobj).objects + idx;
+					obj = &(*(Script *)mobj)._objects[idx];
 					objpos.offset = obj->pos.offset;
 				} else if (mobj->getType() == MEM_OBJ_CLONES) {
 					obj = &((*(CloneTable *)mobj).table[idx]);

Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-05-10 19:17:51 UTC (rev 40431)
@@ -388,7 +388,6 @@
 	switch (mobj->getType()) {
 
 	case MEM_OBJ_SCRIPT: {
-		int i;
 		Script *scr = (Script *)mobj;
 		sciprintf("script.%03d locked by %d, bufsize=%d (%x)\n", scr->nr, scr->lockers, (uint)scr->buf_size, (uint)scr->buf_size);
 		if (scr->export_table)
@@ -403,10 +402,10 @@
 		else
 			sciprintf("  Locals : none\n");
 
-		sciprintf("  Objects: %4d\n", scr->objects_nr);
-		for (i = 0; i < scr->objects_nr; i++) {
+		sciprintf("  Objects: %4d\n", scr->_objects.size());
+		for (uint i = 0; i < scr->_objects.size(); i++) {
 			sciprintf("    ");
-			print_obj_head(s, scr->objects + i);
+			print_obj_head(s, &scr->_objects[i]);
 		}
 	}
 	break;

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-05-10 19:17:51 UTC (rev 40431)
@@ -189,10 +189,6 @@
 	}
 
 	// Initialize objects
-	scr.objects = NULL;
-	scr.objects_allocated = 0;
-	scr.objects_nr = 0; // No objects recorded yet
-
 	scr.locals_offset = 0;
 	scr.locals_block = NULL;
 
@@ -370,19 +366,10 @@
 	buf = NULL;
 	buf_size = 0;
 
-	if (objects) {
-		for (int i = 0; i < objects_nr; i++) {
-			Object *object = &objects[i];
-			if (object->variables) {
-				free(object->variables);
-				object->variables = NULL;
-				object->variables_nr = 0;
-			}
-		}
-		free(objects);
-		objects = NULL;
-		objects_nr = 0;
+	for (uint i = 0; i < _objects.size(); i++) {
+		free(_objects[i].variables);
 	}
+	_objects.clear();
 
 	delete obj_indices;
 	obj_indices = 0;
@@ -578,17 +565,18 @@
 			continue; // FIXME: A hack pending investigation
 
 		if (!relocateLocal(scr, block.segment, pos)) {
-			int k, done = 0;
+			bool done = false;
+			uint k;
 
-			for (k = 0; !done && k < scr->objects_nr; k++) {
-				if (relocateObject(scr->objects + k, block.segment, pos))
-					done = 1;
+			for (k = 0; !done && k < scr->_objects.size(); k++) {
+				if (relocateObject(&scr->_objects[k], block.segment, pos))
+					done = true;
 			}
 
-			for (k = 0; !done && k < scr->code_blocks_nr; k++) {
+			for (k = 0; !done && (int)k < scr->code_blocks_nr; k++) {
 				if (pos >= scr->code[k].pos.offset &&
 				        pos < scr->code[k].pos.offset + scr->code[k].size)
-					done = 1;
+					done = true;
 			}
 
 			if (!done) {
@@ -598,8 +586,8 @@
 					sciprintf("- locals: %d at %04x\n", scr->locals_block->nr, scr->locals_offset);
 				else
 					sciprintf("- No locals\n");
-				for (k = 0; k < scr->objects_nr; k++)
-					sciprintf("- obj#%d at %04x w/ %d vars\n", k, scr->objects[k].pos.offset, scr->objects[k].variables_nr);
+				for (k = 0; k < scr->_objects.size(); k++)
+					sciprintf("- obj#%d at %04x w/ %d vars\n", k, scr->_objects[k].pos.offset, scr->_objects[k].variables_nr);
 // SQ3 script 71 has broken relocation entries.
 // Since this is mainstream, we can't break out as we used to do.
 				sciprintf("Trying to continue anyway...\n");
@@ -624,11 +612,12 @@
 		int pos = READ_LE_UINT16(scr->heap_start + block.offset + 2 + (i * 2)) + scr->script_size;
 
 		if (!relocateLocal(scr, block.segment, pos)) {
-			int k, done = 0;
+			bool done = false;
+			uint k;
 
-			for (k = 0; !done && k < scr->objects_nr; k++) {
-				if (relocateObject(scr->objects + k, block.segment, pos))
-					done = 1;
+			for (k = 0; !done && k < scr->_objects.size(); k++) {
+				if (relocateObject(&scr->_objects[k], block.segment, pos))
+					done = true;
 			}
 
 			if (!done) {
@@ -638,8 +627,8 @@
 					sciprintf("- locals: %d at %04x\n", scr->locals_block->nr, scr->locals_offset);
 				else
 					sciprintf("- No locals\n");
-				for (k = 0; k < scr->objects_nr; k++)
-					sciprintf("- obj#%d at %04x w/ %d vars\n", k, scr->objects[k].pos.offset, scr->objects[k].variables_nr);
+				for (k = 0; k < scr->_objects.size(); k++)
+					sciprintf("- obj#%d at %04x w/ %d vars\n", k, scr->_objects[k].pos.offset, scr->_objects[k].variables_nr);
 				sciprintf("Triggering breakpoint...\n");
 				BREAKPOINT();
 			}
@@ -661,20 +650,13 @@
 
 	VERIFY(base < scr->buf_size, "Attempt to initialize object beyond end of script\n");
 
-	if (!scr->objects) {
-		scr->objects_allocated = DEFAULT_OBJECTS;
-		scr->objects = (Object *)sci_malloc(sizeof(Object) * scr->objects_allocated);
-	}
-	if (scr->objects_nr == scr->objects_allocated) {
-		scr->objects_allocated += DEFAULT_OBJECTS_INCREMENT;
-		scr->objects = (Object *)sci_realloc(scr->objects, sizeof(Object) * scr->objects_allocated);
-	}
-
 	temp = make_reg(obj_pos.segment, base);
+
 	id = scr->obj_indices->checkKey(base, true);
-	scr->objects_nr++;
+	if ((uint)id == scr->_objects.size())
+		scr->_objects.push_back(Object());
 
-	obj = scr->objects + id;
+	obj = &scr->_objects[id];
 
 	VERIFY(base + SCRIPT_FUNCTAREAPTR_OFFSET  < scr->buf_size, "Function area pointer stored beyond end of script\n");
 
@@ -724,19 +706,11 @@
 
 	VERIFY(base < (uint16)scr->buf_size, "Attempt to initialize object beyond end of script\n");
 
-	if (!scr->objects) {
-		scr->objects_allocated = DEFAULT_OBJECTS;
-		scr->objects = (Object *)sci_malloc(sizeof(Object) * scr->objects_allocated);
-	}
-	if (scr->objects_nr == scr->objects_allocated) {
-		scr->objects_allocated += DEFAULT_OBJECTS_INCREMENT;
-		scr->objects = (Object *)sci_realloc(scr->objects, sizeof(Object) * scr->objects_allocated);
-	}
-
 	id = scr->obj_indices->checkKey(obj_pos.offset, true);
-	scr->objects_nr++;
+	if ((uint)id == scr->_objects.size())
+		scr->_objects.push_back(Object());
 
-	obj = scr->objects + id;
+	obj = &scr->_objects[id];
 
 	VERIFY(base + SCRIPT_FUNCTAREAPTR_OFFSET < (uint16)scr->buf_size, "Function area pointer stored beyond end of script\n");
 
@@ -912,20 +886,6 @@
 	}
 }
 
-void SegManager::scriptFreeUnusedObjects(SegmentId seg) {
-	Script *scr = getScript(seg, SEG_ID);
-	if (scr->objects_allocated > scr->objects_nr) {
-		if (scr->objects_nr)
-			scr->objects = (Object *)sci_realloc(scr->objects, sizeof(Object) * scr->objects_nr);
-		else {
-			if (scr->objects_allocated)
-				free(scr->objects);
-			scr->objects = NULL;
-		}
-		scr->objects_allocated = scr->objects_nr;
-	}
-}
-
 /*
 static char *SegManager::dynprintf(char *msg, ...) {
 	va_list argp;
@@ -1208,18 +1168,16 @@
 
 	if (addr.offset <= script->buf_size && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(script->buf + addr.offset)) {
 		int idx = RAW_GET_CLASS_INDEX(script, addr);
-		if (idx >= 0 && idx < script->objects_nr) {
-			Object *obj = script->objects + idx;
-			int i;
-
+		if (idx >= 0 && (uint)idx < script->_objects.size()) {
 			// Note all local variables, if we have a local variable environment
 			if (script->locals_segment)
 				(*note)(param, make_reg(script->locals_segment, 0));
 
-			for (i = 0; i < obj->variables_nr; i++)
-				(*note)(param, obj->variables[i]);
+			Object &obj = script->_objects[idx];
+			for (int i = 0; i < obj.variables_nr; i++)
+				(*note)(param, obj.variables[i]);
 		} else {
-			fprintf(stderr, "Request for outgoing script-object reference at "PREG" yielded invalid index %d\n", PRINT_REG(addr), idx);
+			warning("Request for outgoing script-object reference at "PREG" yielded invalid index %d", PRINT_REG(addr), idx);
 		}
 	} else {
 		/*		fprintf(stderr, "Unexpected request for outgoing script-object references at "PREG"\n", PRINT_REG(addr));*/

Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h	2009-05-10 19:17:51 UTC (rev 40431)
@@ -186,12 +186,6 @@
 	// objects have been instantiated, or a run-time error will occur.
 	void scriptRelocate(reg_t block);
 
-	// Deallocates all unused but allocated entries for objects
-	// Parameters: (SegmentId) segid: segment of the script to prune in this way
-	// These entries are created during script instantiation; deallocating them
-	// frees up some additional memory.
-	void scriptFreeUnusedObjects(SegmentId segid);
-
 	// Sets the script-relative offset of the exports table
 	// Parameters: (int) offset: The script-relative exports table offset
 	//	       (int) id: ID of the script or script segment to write to

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-05-10 19:17:51 UTC (rev 40431)
@@ -1876,8 +1876,6 @@
 	if (relocation >= 0)
 		s->seg_manager->scriptRelocate(make_reg(reg.segment, relocation));
 
-	s->seg_manager->scriptFreeUnusedObjects(reg.segment);
-
 	return reg.segment;		// instantiation successful
 }
 
@@ -2094,8 +2092,8 @@
 			if (offset.offset <= (*(Script *)memobj).buf_size && offset.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET
 			        && RAW_IS_OBJECT((*(Script *)memobj).buf + offset.offset)) {
 				idx = RAW_GET_CLASS_INDEX((Script *)memobj, offset);
-				if (idx >= 0 && idx < (*(Script *)memobj).objects_nr)
-					obj = (*(Script *)memobj).objects + idx;
+				if (idx >= 0 && (uint)idx < (*(Script *)memobj)._objects.size())
+					obj = &(*(Script *)memobj)._objects[idx];
 			}
 		}
 	}

Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h	2009-05-10 19:17:11 UTC (rev 40430)
+++ scummvm/trunk/engines/sci/engine/vm.h	2009-05-10 19:17:51 UTC (rev 40431)
@@ -277,6 +277,8 @@
 	uint16 *base_method; /**< Pointer to the method selector area for this object */
 	uint16 *base_vars; /**< Pointer to the varselector area for this object */
 	reg_t *variables;
+
+	Object() { memset(this, 0, sizeof(*this)); }
 };
 
 struct CodeBlock {
@@ -323,11 +325,12 @@
 	int synonyms_nr; /**< Number of entries in the synonyms block */
 	int lockers; /**< Number of classes and objects that require this script */
 
-	Object *objects; /**< Table for objects, contains property variables */
-	/* Indexed by the value stored at SCRIPT_LOCALVARPTR_OFFSET,
-	** see VM_OBJECT_[GS]ET_INDEX()  */
-	int objects_nr; /**< Number of objects and classes */
-	int objects_allocated; /**< Number of allocated objects */
+	/**
+	 * Table for objects, contains property variables.
+	 * Indexed by the value stored at SCRIPT_LOCALVARPTR_OFFSET,
+	 * see VM_OBJECT_[GS]ET_INDEX()
+	 */
+	Common::Array<Object> _objects;
 
 	int locals_offset;
 	int locals_segment; /**< The local variable segment */
@@ -353,10 +356,6 @@
 
 		obj_indices = NULL;
 
-		objects = NULL;
-		objects_allocated = 0;
-		objects_nr = 0;
-
 		locals_offset = 0;
 		locals_segment = 0;
 		locals_block = 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