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

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Tue Sep 22 16:33:46 CEST 2009


Revision: 44261
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44261&view=rev
Author:   thebluegr
Date:     2009-09-22 14:33:46 +0000 (Tue, 22 Sep 2009)

Log Message:
-----------
- Merged scriptObjInit0() and scriptObjInit11()
- Replaced some cases where getSciVersion() is used with _resMan->sciVersion(), as getSciVersion() will fail with the fallback detector (as the engine is not initialized). Object property accessors still crash currently, when used with the fallback detector

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

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-22 12:51:41 UTC (rev 44260)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-22 14:33:46 UTC (rev 44261)
@@ -130,18 +130,18 @@
 void Script::setScriptSize(int script_nr, ResourceManager *resMan) {
 	Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, script_nr), 0);
 	Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, script_nr), 0);
-	bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
+	bool oldScriptHeader = (resMan->sciVersion() == SCI_VERSION_0_EARLY);
 
 	_scriptSize = script->size;
 	_heapSize = 0; // Set later
 
-	if (!script || (getSciVersion() >= SCI_VERSION_1_1 && !heap)) {
+	if (!script || (resMan->sciVersion() >= SCI_VERSION_1_1 && !heap)) {
 		error("SegManager::setScriptSize: failed to load %s", !script ? "script" : "heap");
 	}
 	if (oldScriptHeader) {
 		_bufSize = script->size + READ_LE_UINT16(script->data) * 2;
 		//locals_size = READ_LE_UINT16(script->data) * 2;
-	} else if (getSciVersion() < SCI_VERSION_1_1) {
+	} else if (resMan->sciVersion() < SCI_VERSION_1_1) {
 		_bufSize = script->size;
 	} else {
 		_bufSize = script->size + heap->size;
@@ -458,104 +458,61 @@
 	}
 }
 
-Object *Script::scriptObjInit0(reg_t obj_pos) {
+Object *Script::scriptObjInit(reg_t obj_pos, SciVersion version) {
 	Object *obj;
 
-	obj_pos.offset -= SCRIPT_OBJECT_MAGIC_OFFSET;
+	if (version < SCI_VERSION_1_1)
+		obj_pos.offset += 8;	// magic offset (SCRIPT_OBJECT_MAGIC_OFFSET)
+
 	VERIFY(obj_pos.offset < _bufSize, "Attempt to initialize object beyond end of script\n");
 
 	obj = allocateObject(obj_pos.offset);
 
 	VERIFY(obj_pos.offset + SCRIPT_FUNCTAREAPTR_OFFSET < (int)_bufSize, "Function area pointer stored beyond end of script\n");
 
-	{
-		byte *data = (byte *)(_buf + obj_pos.offset);
-		uint16 *funct_area = (uint16 *)(data + READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET));
-		int variables_nr;
-		int functions_nr;
-		int is_class;
+	byte *data = (byte *)(_buf + obj_pos.offset);
+	uint16 *funct_area = 0;
+	bool isClass;
 
-		obj->_flags = 0;
-		obj->_pos = obj_pos;
+	if (version < SCI_VERSION_1_1) {
+		obj->variable_names_nr = READ_LE_UINT16(data + SCRIPT_SELECTORCTR_OFFSET);
+		obj->base_vars = 0;
+		funct_area = (uint16 *)(data + READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET));
+		obj->methods_nr = READ_LE_UINT16(funct_area - 1);
+		isClass = READ_LE_UINT16(data + 4) & SCRIPT_INFO_CLASS;	// SCRIPT_INFO_OFFSET
+	} else {
+		obj->variable_names_nr = READ_LE_UINT16(data + 2);
+		obj->base_vars = (uint16 *)(_buf + READ_LE_UINT16(data + 4));
+		funct_area = (uint16 *)(_buf + READ_LE_UINT16(data + 6));
+		obj->methods_nr = READ_LE_UINT16(funct_area);
+		isClass = READ_LE_UINT16(data + 14) & SCRIPT_INFO_CLASS;
+	}
 
-		VERIFY((byte *)funct_area < _buf + _bufSize, "Function area pointer references beyond end of script");
+	obj->_flags = 0;
+	obj->_pos = obj_pos;
+	obj->base_method = funct_area;
 
-		variables_nr = READ_LE_UINT16(data + SCRIPT_SELECTORCTR_OFFSET);
-		functions_nr = READ_LE_UINT16(funct_area - 1);
-		is_class = READ_LE_UINT16(data + SCRIPT_INFO_OFFSET) & SCRIPT_INFO_CLASS;
+	VERIFY((byte *)funct_area < _buf + _bufSize, "Function area pointer references beyond end of script");
 
-		obj->base_method = funct_area;
-		obj->base_vars = NULL;
-
-		VERIFY((byte *)funct_area + functions_nr * 2
+	if (version < SCI_VERSION_1_1) {
+		VERIFY((byte *)funct_area + obj->methods_nr * 2
 		       // add again for classes, since those also store selectors
-		       + (is_class ? functions_nr * 2 : 0) < _buf + _bufSize, "Function area extends beyond end of script");
-
-		obj->_variables.resize(variables_nr);
-
-		obj->methods_nr = functions_nr;
-		obj->base = _buf;
-		obj->base_obj = data;
-
-		for (int i = 0; i < variables_nr; i++)
-			obj->_variables[i] = make_reg(0, READ_LE_UINT16(data + (i * 2)));
+		       + (isClass ? obj->methods_nr * 2 : 0) < _buf + _bufSize, "Function area extends beyond end of script");
+	} else {
+		VERIFY(((byte *)funct_area + obj->variable_names_nr) < _buf + _bufSize, "Function area extends beyond end of script");
 	}
 
-	return obj;
-}
+	obj->_variables.resize(obj->variable_names_nr);
 
-Object *Script::scriptObjInit11(reg_t obj_pos) {
-	Object *obj;
+	obj->base = _buf;
+	obj->base_obj = data;
 
-	VERIFY(obj_pos.offset < _bufSize, "Attempt to initialize object beyond end of script\n");
+	for (int i = 0; i < obj->variable_names_nr; i++)
+		obj->_variables[i] = make_reg(0, READ_LE_UINT16(data + (i * 2)));
 
-	obj = allocateObject(obj_pos.offset);
-
-	VERIFY(obj_pos.offset + SCRIPT_FUNCTAREAPTR_OFFSET < (int)_bufSize, "Function area pointer stored beyond end of script\n");
-
-	{
-		byte *data = (byte *)(_buf + obj_pos.offset);
-		uint16 *funct_area = (uint16 *)(_buf + READ_LE_UINT16(data + 6));
-		uint16 *prop_area = (uint16 *)(_buf + READ_LE_UINT16(data + 4));
-		int variables_nr;
-		int functions_nr;
-		int is_class;
-
-		obj->_flags = 0;
-		obj->_pos = obj_pos;
-
-		VERIFY((byte *)funct_area < _buf + _bufSize, "Function area pointer references beyond end of script");
-
-		variables_nr = READ_LE_UINT16(data + 2);
-		functions_nr = READ_LE_UINT16(funct_area);
-		is_class = READ_LE_UINT16(data + 14) & SCRIPT_INFO_CLASS;
-
-		obj->base_method = funct_area;
-		obj->base_vars = prop_area;
-
-		VERIFY(((byte *)funct_area + functions_nr) < _buf + _bufSize, "Function area extends beyond end of script");
-
-		obj->variable_names_nr = variables_nr;
-		obj->_variables.resize(variables_nr);
-
-		obj->methods_nr = functions_nr;
-		obj->base = _buf;
-		obj->base_obj = data;
-
-		for (int i = 0; i < variables_nr; i++)
-			obj->_variables[i] = make_reg(0, READ_LE_UINT16(data + (i * 2)));
-	}
-
 	return obj;
 }
 
-Object *Script::scriptObjInit(reg_t obj_pos) {
-	if (getSciVersion() < SCI_VERSION_1_1)
-		return scriptObjInit0(obj_pos);
-	else
-		return scriptObjInit11(obj_pos);
-}
-
 LocalVariables *SegManager::allocLocalsSegment(Script *scr, int count) {
 	if (!count) { // No locals
 		scr->_localsSegment = 0;
@@ -594,7 +551,7 @@
 
 	VERIFY(location.offset + 1 < (uint16)scr->_bufSize, "Locals beyond end of script\n");
 
-	if (getSciVersion() >= SCI_VERSION_1_1)
+	if (_resMan->sciVersion() >= SCI_VERSION_1_1)
 		count = READ_LE_UINT16(scr->_buf + location.offset - 2);
 	else
 		count = (READ_LE_UINT16(scr->_buf + location.offset - 2) - 4) >> 1;
@@ -661,7 +618,7 @@
 
 		reg.segment = seg;
 		reg.offset = seeker - scr->_buf;
-		obj = scr->scriptObjInit(reg);
+		obj = scr->scriptObjInit(reg, _resMan->sciVersion());
 
 #if 0
 		if (obj->_variables[5].offset != 0xffff) {

Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h	2009-09-22 12:51:41 UTC (rev 44260)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h	2009-09-22 14:33:46 UTC (rev 44261)
@@ -380,8 +380,6 @@
 	Hunk *alloc_Hunk(reg_t *);
 
 	SegmentId findFreeSegment() const;
-	Object *scriptObjInit0(reg_t obj_pos);
-	Object *scriptObjInit11(reg_t obj_pos);
 
 	/**
 	 * Check segment validity

Modified: scummvm/trunk/engines/sci/engine/segment.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.cpp	2009-09-22 12:51:41 UTC (rev 44260)
+++ scummvm/trunk/engines/sci/engine/segment.cpp	2009-09-22 14:33:46 UTC (rev 44261)
@@ -137,7 +137,7 @@
 
 	_nr = script_nr;
 
-	if (getSciVersion() >= SCI_VERSION_1_1)
+	if (resMan->sciVersion() >= SCI_VERSION_1_1)
 		_heapStart = _buf + _scriptSize;
 	else
 		_heapStart = _buf;

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2009-09-22 12:51:41 UTC (rev 44260)
+++ scummvm/trunk/engines/sci/engine/segment.h	2009-09-22 14:33:46 UTC (rev 44261)
@@ -351,7 +351,7 @@
 	 * @returns			A newly created Object describing the object,
 	 * 					stored within the relevant script
 	 */
-	Object *scriptObjInit(reg_t obj_pos);
+	Object *scriptObjInit(reg_t obj_pos, SciVersion version);
 
 	/**
 	 * Processes a relocation block witin a script
@@ -369,9 +369,6 @@
 	int relocateBlock(Common::Array<reg_t> &block, int block_location, SegmentId segment, int location);
 	int relocateObject(Object &obj, SegmentId segment, int location);
 
-	Object *scriptObjInit0(reg_t obj_pos);
-	Object *scriptObjInit11(reg_t obj_pos);
-
 public:
 	// script lock operations
 

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-09-22 12:51:41 UTC (rev 44260)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-09-22 14:33:46 UTC (rev 44261)
@@ -1590,7 +1590,7 @@
 			break;
 		case SCI_OBJ_OBJECT:
 		case SCI_OBJ_CLASS: { // object or class?
-			Object *obj = scr->scriptObjInit(addr);
+			Object *obj = scr->scriptObjInit(addr, resMan->sciVersion());
 			Object *base_obj;
 
 			// Instantiate the superclass, if neccessary


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