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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sun May 3 11:21:08 CEST 2009


Revision: 40269
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40269&view=rev
Author:   fingolfin
Date:     2009-05-03 09:21:08 +0000 (Sun, 03 May 2009)

Log Message:
-----------
SCI: Changed various params of type MemObject* to the more specific type Script&

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.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-05-03 09:20:21 UTC (rev 40268)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-05-03 09:21:08 UTC (rev 40269)
@@ -148,33 +148,33 @@
 	return mem;
 }
 
-void SegManager::setScriptSize(MemObject *mem, EngineState *s, int script_nr) {
+void SegManager::setScriptSize(Script &scr, EngineState *s, int script_nr) {
 	Resource *script = s->resmgr->findResource(kResourceTypeScript, script_nr, 0);
 	Resource *heap = s->resmgr->findResource(kResourceTypeHeap, script_nr, 0);
 
-	mem->data.script.script_size = script->size;
-	mem->data.script.heap_size = 0; // Set later
+	scr.script_size = script->size;
+	scr.heap_size = 0; // Set later
 
 	if (!script || (s->version >= SCI_VERSION(1, 001, 000) && !heap)) {
 		sciprintf("%s: failed to load %s\n", __FUNCTION__, !script ? "script" : "heap");
 		return;
 	}
 	if (s->version < SCI_VERSION_FTU_NEW_SCRIPT_HEADER) {
-		mem->data.script.buf_size = script->size + READ_LE_UINT16(script->data) * 2;
+		scr.buf_size = script->size + READ_LE_UINT16(script->data) * 2;
 		//locals_size = READ_LE_UINT16(script->data) * 2;
 	} else if (s->version < SCI_VERSION(1, 001, 000)) {
-		mem->data.script.buf_size = script->size;
+		scr.buf_size = script->size;
 	} else {
-		mem->data.script.buf_size = script->size + heap->size;
-		mem->data.script.heap_size = heap->size;
+		scr.buf_size = script->size + heap->size;
+		scr.heap_size = heap->size;
 
 		// Ensure that the start of the heap resource can be word-aligned.
 		if (script->size & 2) {
-			mem->data.script.buf_size++;
-			mem->data.script.script_size++;
+			scr.buf_size++;
+			scr.script_size++;
 		}
 
-		if (mem->data.script.buf_size > 65535) {
+		if (scr.buf_size > 65535) {
 			sciprintf("Script and heap sizes combined exceed 64K.\n"
 			          "This means a fundamental design bug was made in SCI\n"
 			          "regarding SCI1.1 games.\nPlease report this so it can be"
@@ -184,44 +184,42 @@
 	}
 }
 
-int SegManager::initialiseScript(MemObject *mem, EngineState *s, int script_nr) {
+int SegManager::initialiseScript(Script &scr, EngineState *s, int script_nr) {
 	// allocate the script.buf
-	Script *scr;
 
-	setScriptSize(mem, s, script_nr);
-	mem->data.script.buf = (byte*) sci_malloc(mem->data.script.buf_size);
+	setScriptSize(scr, s, script_nr);
+	scr.buf = (byte*)sci_malloc(scr.buf_size);
 
-	dbgPrint("mem->data.script.buf ", mem->data.script.buf);
-	if (!mem->data.script.buf) {
-		freeScript(mem);
+	dbgPrint("scr.buf ", scr.buf);
+	if (!scr.buf) {
+		freeScript(scr);
 		sciprintf("SegManager: Not enough memory space for script size");
-		mem->data.script.buf_size = 0;
+		scr.buf_size = 0;
 		return 0;
 	}
 
 	// Initialize objects
-	scr = &(mem->data.script);
-	scr->objects = NULL;
-	scr->objects_allocated = 0;
-	scr->objects_nr = 0; // No objects recorded yet
+	scr.objects = NULL;
+	scr.objects_allocated = 0;
+	scr.objects_nr = 0; // No objects recorded yet
 
-	scr->locals_offset = 0;
-	scr->locals_block = NULL;
+	scr.locals_offset = 0;
+	scr.locals_block = NULL;
 
-	scr->code = NULL;
-	scr->code_blocks_nr = 0;
-	scr->code_blocks_allocated = 0;
+	scr.code = NULL;
+	scr.code_blocks_nr = 0;
+	scr.code_blocks_allocated = 0;
 
-	scr->nr = script_nr;
-	scr->marked_as_deleted = 0;
-	scr->relocated = 0;
+	scr.nr = script_nr;
+	scr.marked_as_deleted = 0;
+	scr.relocated = 0;
 
-	scr->obj_indices = new IntMapper();
+	scr.obj_indices = new IntMapper();
 
 	if (s->version >= SCI_VERSION(1, 001, 000))
-		scr->heap_start = scr->buf + scr->script_size;
+		scr.heap_start = scr.buf + scr.script_size;
 	else
-		scr->heap_start = scr->buf;
+		scr.heap_start = scr.buf;
 
 	return 1;
 }
@@ -236,7 +234,7 @@
 
 	switch (mobj->type) {
 	case MEM_OBJ_SCRIPT:
-		freeScript(mobj);
+		freeScript(mobj->data.script);
 
 		mobj->data.script.buf = NULL;
 		if (recursive && mobj->data.script.locals_segment)
@@ -387,32 +385,30 @@
 	object->variables = NULL;
 };*/
 
-void SegManager::freeScript(MemObject *mem) {
-	if (!mem)
-		return;
-	if (mem->data.script.buf) {
-		free(mem->data.script.buf);
-		mem->data.script.buf = NULL;
-		mem->data.script.buf_size = 0;
+void SegManager::freeScript(Script &scr) {
+	if (scr.buf) {
+		free(scr.buf);
+		scr.buf = NULL;
+		scr.buf_size = 0;
 	}
-	if (mem->data.script.objects) {
+	if (scr.objects) {
 		int i;
 
-		for (i = 0; i < mem->data.script.objects_nr; i++) {
-			Object* object = &mem->data.script.objects[i];
+		for (i = 0; i < scr.objects_nr; i++) {
+			Object* object = &scr.objects[i];
 			if (object->variables) {
 				free(object->variables);
 				object->variables = NULL;
 				object->variables_nr = 0;
 			}
 		}
-		free(mem->data.script.objects);
-		mem->data.script.objects = NULL;
-		mem->data.script.objects_nr = 0;
+		free(scr.objects);
+		scr.objects = NULL;
+		scr.objects_nr = 0;
 	}
 
-	delete mem->data.script.obj_indices;
-	free(mem->data.script.code);
+	delete scr.obj_indices;
+	free(scr.code);
 }
 
 // memory operations
@@ -426,21 +422,16 @@
 
 int16 SegManager::getHeap(reg_t reg) {
 	MemObject *mem_obj;
-	memObjType mem_type;
 
 	VERIFY(check(reg.segment), "Invalid seg id");
 	mem_obj = heap[reg.segment];
-	mem_type = mem_obj->type;
 
-	switch (mem_type) {
+	switch (mem_obj->type) {
 	case MEM_OBJ_SCRIPT:
 		VERIFY(reg.offset + 1 < (uint16)mem_obj->data.script.buf_size, "invalid offset\n");
 		return (mem_obj->data.script.buf[reg.offset] | (mem_obj->data.script.buf[reg.offset+1]) << 8);
-	case MEM_OBJ_CLONES:
-		sciprintf("memcpy for clones hasn't been implemented yet\n");
-		break;
 	default:
-		sciprintf("unknown mem obj type\n");
+		error("SegManager::getHeap: unsupported mem obj type %d", mem_obj->type);
 		break;
 	}
 	return 0; // never get here

Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h	2009-05-03 09:20:21 UTC (rev 40268)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h	2009-05-03 09:21:08 UTC (rev 40269)
@@ -58,7 +58,7 @@
 
 	// 1. Scripts
 
-	void freeScript(MemObject* mem);
+	void freeScript(Script &scr);
 
 	// Allocate a script into the segment manager
 	// Parameters: (int) script_nr: number of the script to load
@@ -379,7 +379,7 @@
 	void scriptRelocateExportsSci11(int seg);
 	void scriptInitialiseObjectsSci11(EngineState *s, int seg);
 	int scriptMarkedDeleted(int script_nr);
-	int initialiseScript(MemObject *mem, EngineState *s, int script_nr);
+	int initialiseScript(Script &scr, EngineState *s, int script_nr);
 
 public: // TODO: make private
 	IntMapper *id_seg_map; // id - script id; seg - index of heap
@@ -413,7 +413,7 @@
 	int relocateObject(Object *obj, SegmentId segment, int location);
 
 	int findFreeId(int *id);
-	static void setScriptSize(MemObject *mem, EngineState *s, int script_nr);
+	static void setScriptSize(Script &scr, EngineState *s, int script_nr);
 	Object *scriptObjInit0(EngineState *s, reg_t obj_pos);
 	Object *scriptObjInit11(EngineState *s, reg_t obj_pos);
 

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-05-03 09:20:21 UTC (rev 40268)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-05-03 09:21:08 UTC (rev 40269)
@@ -1702,7 +1702,8 @@
 		} else {
 			seg_id = seg;
 			mem = s->seg_manager->heap[seg];
-			s->seg_manager->freeScript(mem);
+			assert(mem);
+			s->seg_manager->freeScript(mem->data.script);
 		}
 	} else if (!(mem = s->seg_manager->allocateScript(s, script_nr, &seg_id))) {  // ALL YOUR SCRIPT BASE ARE BELONG TO US
 		sciprintf("Not enough heap space for script size 0x%x of script 0x%x, should this happen?`\n", (*script)->size, script_nr);
@@ -1710,7 +1711,7 @@
 		return 0;
 	}
 
-	s->seg_manager->initialiseScript(mem, s, script_nr);
+	s->seg_manager->initialiseScript(mem->data.script, s, script_nr);
 
 	reg.segment = seg_id;
 	reg.offset = 0;


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