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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sun Sep 6 15:01:00 CEST 2009


Revision: 43987
          http://scummvm.svn.sourceforge.net/scummvm/?rev=43987&view=rev
Author:   fingolfin
Date:     2009-09-06 13:01:00 +0000 (Sun, 06 Sep 2009)

Log Message:
-----------
SCI: Script::obj_indices is now protected

Add new methods init, allocateObject and getObject to class Script, and use them instead of directly accessing Script::obj_indices. Replace RAW_GET_CLASS_INDEX with Script::getObject()

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/memobj.cpp
    scummvm/trunk/engines/sci/engine/memobj.h
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp
    scummvm/trunk/engines/sci/engine/vm.h

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-09-06 13:00:30 UTC (rev 43986)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-09-06 13:01:00 UTC (rev 43987)
@@ -643,8 +643,8 @@
 	case MEM_OBJ_SCRIPT:
 		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 && (uint)idx < (*(Script *)mobj)._objects.size())
+			Object *obj = ((Script *)mobj)->getObject(reg.offset);
+			if (obj)
 				return KSIG_OBJECT;
 			else
 				return KSIG_REF;

Modified: scummvm/trunk/engines/sci/engine/memobj.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/memobj.cpp	2009-09-06 13:00:30 UTC (rev 43986)
+++ scummvm/trunk/engines/sci/engine/memobj.cpp	2009-09-06 13:01:00 UTC (rev 43987)
@@ -89,6 +89,34 @@
 	_codeBlocks.clear();
 }
 
+void Script::init() {
+	locals_offset = 0;
+	locals_block = NULL;
+
+	_codeBlocks.clear();
+
+	_markedAsDeleted = false;
+	relocated = 0;
+
+	obj_indices = new IntMapper();
+}
+
+Object *Script::allocateObject(uint16 offset) {
+	int idx = obj_indices->checkKey(offset, true);
+	if ((uint)idx == _objects.size())
+		_objects.push_back(Object());
+
+	return &_objects[idx];
+}
+
+Object *Script::getObject(uint16 offset) {
+	int idx = obj_indices->checkKey(offset, false);
+	if (idx >= 0 && (uint)idx < _objects.size())
+		return &_objects[idx];
+	else
+		return 0;
+}
+
 void Script::incrementLockers() {
 	lockers++;
 }
@@ -248,17 +276,16 @@
 	Script *script = this;
 
 	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 && (uint)idx < script->_objects.size()) {
+		Object *obj = getObject(addr.offset);
+		if (obj) {
 			// Note all local variables, if we have a local variable environment
 			if (script->locals_segment)
 				(*note)(param, make_reg(script->locals_segment, 0));
 
-			Object &obj = script->_objects[idx];
-			for (uint i = 0; i < obj._variables.size(); i++)
-				(*note)(param, obj._variables[i]);
+			for (uint i = 0; i < obj->_variables.size(); i++)
+				(*note)(param, obj->_variables[i]);
 		} else {
-			warning("Request for outgoing script-object reference at %04x:%04x yielded invalid index %d", PRINT_REG(addr), idx);
+			warning("Request for outgoing script-object reference at %04x:%04x failed", PRINT_REG(addr));
 		}
 	} else {
 		/*		warning("Unexpected request for outgoing script-object references at %04x:%04x", PRINT_REG(addr));*/

Modified: scummvm/trunk/engines/sci/engine/memobj.h
===================================================================
--- scummvm/trunk/engines/sci/engine/memobj.h	2009-09-06 13:00:30 UTC (rev 43986)
+++ scummvm/trunk/engines/sci/engine/memobj.h	2009-09-06 13:01:00 UTC (rev 43987)
@@ -248,8 +248,10 @@
 	byte *heap_start; /**< Start of heap if SCI1.1, NULL otherwise */
 	uint16 *export_table; /**< Abs. offset of the export table or 0 if not present */
 
+protected:
 	IntMapper *obj_indices;
 
+public:
 	int exports_nr; /**< Number of entries in the exports table */
 	int synonyms_nr; /**< Number of entries in the synonyms block */
 	int lockers; /**< Number of classes and objects that require this script */
@@ -296,6 +298,7 @@
 	}
 
 	void freeScript();
+	void init();
 
 	virtual bool isValidOffset(uint16 offset) const;
 	virtual byte *dereference(reg_t pointer, int *size);
@@ -306,6 +309,9 @@
 
 	virtual void saveLoadWithSerializer(Common::Serializer &ser);
 
+	Object *allocateObject(uint16 offset);
+	Object *getObject(uint16 offset);
+
 	// script lock operations
 
 	/** Increments the number of lockers of this script by one. */

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-06 13:00:30 UTC (rev 43986)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-06 13:01:00 UTC (rev 43987)
@@ -186,17 +186,9 @@
 	}
 
 	// Initialize objects
-	scr.locals_offset = 0;
-	scr.locals_block = NULL;
-
-	scr._codeBlocks.clear();
-
+	scr.init();
 	scr.nr = script_nr;
-	scr._markedAsDeleted = false;
-	scr.relocated = 0;
 
-	scr.obj_indices = new IntMapper();
-
 	if (_resMan->sciVersion() >= SCI_VERSION_1_1)
 		scr.heap_start = scr.buf + scr.script_size;
 	else
@@ -463,23 +455,15 @@
 
 Object *SegManager::scriptObjInit0(reg_t obj_pos) {
 	Object *obj;
-	int id;
 	SciVersion version = _resMan->sciVersion();	// for the offset defines
-	unsigned int base = obj_pos.offset - SCRIPT_OBJECT_MAGIC_OFFSET;
-	reg_t temp;
+	uint base = obj_pos.offset - SCRIPT_OBJECT_MAGIC_OFFSET;
 
 	Script *scr = getScript(obj_pos.segment);
 
 	VERIFY(base < scr->buf_size, "Attempt to initialize object beyond end of script\n");
 
-	temp = make_reg(obj_pos.segment, base);
+	obj = scr->allocateObject(base);
 
-	id = scr->obj_indices->checkKey(base, true);
-	if ((uint)id == scr->_objects.size())
-		scr->_objects.push_back(Object());
-
-	obj = &scr->_objects[id];
-
 	VERIFY(base + SCRIPT_FUNCTAREAPTR_OFFSET  < scr->buf_size, "Function area pointer stored beyond end of script\n");
 
 	{
@@ -491,7 +475,7 @@
 		int i;
 
 		obj->flags = 0;
-		obj->pos = temp;
+		obj->pos = make_reg(obj_pos.segment, base);
 
 		VERIFY(base + funct_area < scr->buf_size, "Function area pointer references beyond end of script");
 
@@ -520,21 +504,16 @@
 
 Object *SegManager::scriptObjInit11(reg_t obj_pos) {
 	Object *obj;
-	int id;
-	int base = obj_pos.offset;
+	uint base = obj_pos.offset;
 
 	Script *scr = getScript(obj_pos.segment);
 
-	VERIFY(base < (uint16)scr->buf_size, "Attempt to initialize object beyond end of script\n");
+	VERIFY(base < scr->buf_size, "Attempt to initialize object beyond end of script\n");
 
-	id = scr->obj_indices->checkKey(obj_pos.offset, true);
-	if ((uint)id == scr->_objects.size())
-		scr->_objects.push_back(Object());
+	obj = scr->allocateObject(base);
 
-	obj = &scr->_objects[id];
+	VERIFY(base + SCRIPT_FUNCTAREAPTR_OFFSET < scr->buf_size, "Function area pointer stored beyond end of script\n");
 
-	VERIFY(base + SCRIPT_FUNCTAREAPTR_OFFSET < (uint16)scr->buf_size, "Function area pointer stored beyond end of script\n");
-
 	{
 		byte *data = (byte *)(scr->buf + base);
 		uint16 *funct_area = (uint16 *)(scr->buf + READ_LE_UINT16(data + 6));

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-09-06 13:00:30 UTC (rev 43986)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-09-06 13:01:00 UTC (rev 43987)
@@ -1936,7 +1936,6 @@
 	MemObject *mobj = GET_OBJECT_SEGMENT(*segMan, offset.segment);
 	SciVersion version = segMan->sciVersion();
 	Object *obj = NULL;
-	int idx;
 
 	if (mobj != NULL) {
 		if (mobj->getType() == MEM_OBJ_CLONES) {
@@ -1947,9 +1946,7 @@
 			Script *scr = (Script *)mobj;
 			if (offset.offset <= scr->buf_size && offset.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET
 			        && RAW_IS_OBJECT(scr->buf + offset.offset)) {
-				idx = RAW_GET_CLASS_INDEX(scr, offset);
-				if (idx >= 0 && (uint)idx < scr->_objects.size())
-					obj = &scr->_objects[idx];
+				obj = scr->getObject(offset.offset);
 			}
 		}
 	}

Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h	2009-09-06 13:00:30 UTC (rev 43986)
+++ scummvm/trunk/engines/sci/engine/vm.h	2009-09-06 13:01:00 UTC (rev 43987)
@@ -117,7 +117,6 @@
 	reg_t reg; /**< offset; script-relative offset, segment: 0 if not instantiated */
 };
 
-#define RAW_GET_CLASS_INDEX(scr, reg) ((scr)->obj_indices->checkKey(reg.offset, false))
 #define RAW_IS_OBJECT(datablock) (READ_LE_UINT16(((byte *) datablock) + SCRIPT_OBJECT_MAGIC_OFFSET) == SCRIPT_OBJECT_MAGIC_NUMBER)
 
 #define IS_CLASS(obj) (obj->_variables[SCRIPT_INFO_SELECTOR].offset & SCRIPT_INFO_CLASS)


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