[Scummvm-cvs-logs] SF.net SVN: scummvm:[33582] residual/trunk/engine

aquadran at users.sourceforge.net aquadran at users.sourceforge.net
Sun Aug 3 15:02:46 CEST 2008


Revision: 33582
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33582&view=rev
Author:   aquadran
Date:     2008-08-03 13:02:45 +0000 (Sun, 03 Aug 2008)

Log Message:
-----------
fixed save/restore lua state

Modified Paths:
--------------
    residual/trunk/engine/lua/lrestore.cpp
    residual/trunk/engine/lua/lsave.cpp
    residual/trunk/engine/lua/lstate.cpp
    residual/trunk/engine/main.cpp
    residual/trunk/engine/savegame.cpp
    residual/trunk/engine/savegame.h

Modified: residual/trunk/engine/lua/lrestore.cpp
===================================================================
--- residual/trunk/engine/lua/lrestore.cpp	2008-08-03 12:53:12 UTC (rev 33581)
+++ residual/trunk/engine/lua/lrestore.cpp	2008-08-03 13:02:45 UTC (rev 33582)
@@ -1,3 +1,9 @@
+#include "common/endian.h"
+#include "common/debug.h"
+
+#include "engine/engine.h"
+#include "engine/savegame.h"
+
 #include "engine/lua/ltask.h"
 #include "engine/lua/lauxlib.h"
 #include "engine/lua/lmem.h"
@@ -9,9 +15,6 @@
 #include "engine/lua/lstring.h"
 #include "engine/lua/lua.h"
 
-#include "common/endian.h"
-#include "common/debug.h"
-
 RestoreCallback restoreCallbackPtr = NULL;
 
 static void restoreObjectValue(TObject *object, RestoreSint32 restoreSint32, RestoreUint32 restoreUint32) {
@@ -251,32 +254,35 @@
 	maxStringsLength = restoreSint32();
 	char *tempStringBuffer = (char *)luaM_malloc(maxStringsLength);
 
+	//printf("1: %d\n", g_engine->_savedState->getBufferPos());
+
 	int32 i;
 	for (i = 0; i < arrayStringsCount; i++) {
 		arraysObj->idObj.low = restoreSint32();
 		arraysObj->idObj.hi = restoreSint32();
 		int32 constIndex = restoreSint32();
-		lua_Type tag = (lua_Type)restoreSint32();
-		PointerId ptr;
-		ptr.low = restoreUint32();
-		ptr.hi = restoreUint32();
 
 		TaggedString *tempString;
 		if (constIndex != -1) {
+			TObject obj;
+			restoreObjectValue(&obj, restoreSint32, restoreUint32);
 			int32 length = restoreSint32();
 			restoreStream(tempStringBuffer, length);
 			tempString = luaS_newlstr(tempStringBuffer, length);
-			tempString->u.s.globalval.ttype = tag;
-			tempString->u.s.globalval.value.ts = (TaggedString *)makePointerFromId(ptr);
+			tempString->u.s.globalval = obj;
 		} else {
+			PointerId ptr;
+			lua_Type tag = (lua_Type)restoreSint32();
+			ptr.low = restoreUint32();
+			ptr.hi = restoreUint32();
 			if (tag == 0)
 				tempString = luaS_createudata((void *)makePointerFromId(ptr), LUA_ANYTAG);
 			else
 				tempString = luaS_createudata((void *)makePointerFromId(ptr), tag);
 			if (restoreCallbackPtr) {
-				PointerId ptr = makeIdFromPointer(tempString->u.s.globalval.value.ts);
-				ptr = restoreCallbackPtr(tempString->u.s.globalval.ttype, ptr, restoreSint32);
-				tempString->u.s.globalval.value.ts = (TaggedString *)makePointerFromId(ptr);
+				PointerId ptr = makeIdFromPointer(tempString->u.d.v);
+				ptr = restoreCallbackPtr(tempString->u.d.tag, ptr, restoreSint32);
+				tempString->u.d.v = makePointerFromId(ptr);
 			}
 		}
 		tempString->constindex = constIndex;
@@ -285,6 +291,8 @@
 	}
 	luaM_free(tempStringBuffer);
 
+	//printf("2: %d\n", g_engine->_savedState->getBufferPos());
+
 	int32 l;
 	Closure *tempClosure;
 	arraysObj = (ArrayIDObj *)luaM_malloc(sizeof(ArrayIDObj) * arrayClosuresCount);

Modified: residual/trunk/engine/lua/lsave.cpp
===================================================================
--- residual/trunk/engine/lua/lsave.cpp	2008-08-03 12:53:12 UTC (rev 33581)
+++ residual/trunk/engine/lua/lsave.cpp	2008-08-03 13:02:45 UTC (rev 33582)
@@ -1,3 +1,9 @@
+#include "engine/savegame.h"
+#include "engine/engine.h"
+
+#include "common/endian.h"
+#include "common/debug.h"
+
 #include "engine/lua/ltask.h"
 #include "engine/lua/lauxlib.h"
 #include "engine/lua/lmem.h"
@@ -9,9 +15,6 @@
 #include "engine/lua/lstring.h"
 #include "engine/lua/lua.h"
 
-#include "common/endian.h"
-#include "common/debug.h"
-
 PointerId makeIdFromPointer(void *ptr) {
 	PointerId pointer;
 
@@ -218,6 +221,8 @@
 	// save maximum length for string
 	saveSint32(maxStringLength);
 
+	//printf("1: %d\n", g_engine->_savedState->getBufferPos());
+
 	// save hash tables for strings and user data
 	TaggedString *tempString;
 	for (i = 0; i < NUM_HASHS; i++) {
@@ -234,16 +239,18 @@
 					saveStream(tempString->str, tempString->u.s.len);
 				} else {
 					if (saveCallbackPtr) {
-						PointerId ptr = makeIdFromPointer(tempString->u.s.globalval.value.ts);
-						ptr = saveCallbackPtr(tempString->u.s.globalval.ttype, ptr, saveSint32);
-						tempString->u.s.globalval.value.ts = (TaggedString *)makePointerFromId(ptr);
+						PointerId ptr = makeIdFromPointer(tempString->u.d.v);
+						ptr = saveCallbackPtr(tempString->u.d.tag, ptr, saveSint32);
+						tempString->u.d.v = makePointerFromId(ptr);
 					}
-					saveObjectValue(&tempString->u.s.globalval, saveSint32, saveUint32);
+					saveObjectValue((TObject *)&tempString->u.d, saveSint32, saveUint32);
 				}
 			}
 		}
 	}
-	
+
+	//printf("2: %d\n", g_engine->_savedState->getBufferPos());
+
 	Closure *tempClosure = (Closure *)L->rootcl.next;
 	while (tempClosure) {
 		saveUint32(makeIdFromPointer(tempClosure).low);

Modified: residual/trunk/engine/lua/lstate.cpp
===================================================================
--- residual/trunk/engine/lua/lstate.cpp	2008-08-03 12:53:12 UTC (rev 33581)
+++ residual/trunk/engine/lua/lstate.cpp	2008-08-03 13:02:45 UTC (rev 33582)
@@ -94,7 +94,6 @@
 	luaM_free(L->Mbuffer);
 	luaM_free(L);
 	L = NULL;
-	lua_iolibclose();
 #ifdef LUA_DEBUG
 	printf("total de blocos: %ld\n", numblocks);
 	printf("total de memoria: %ld\n", totalmem);

Modified: residual/trunk/engine/main.cpp
===================================================================
--- residual/trunk/engine/main.cpp	2008-08-03 12:53:12 UTC (rev 33581)
+++ residual/trunk/engine/main.cpp	2008-08-03 13:02:45 UTC (rev 33582)
@@ -166,6 +166,7 @@
 	if (g_lua_initialized) {
 		lua_removelibslists();
 		lua_close();
+		lua_iolibclose();
 		g_lua_initialized = false;
 	}
 	if (g_registry) {

Modified: residual/trunk/engine/savegame.cpp
===================================================================
--- residual/trunk/engine/savegame.cpp	2008-08-03 12:53:12 UTC (rev 33581)
+++ residual/trunk/engine/savegame.cpp	2008-08-03 13:02:45 UTC (rev 33582)
@@ -108,6 +108,13 @@
 	_currentSection = 0;
 }
 
+uint32 SaveGame::getBufferPos() {
+	if (_saving)
+		return _sectionSize;
+	else
+		return _sectionPtr;
+}
+
 void SaveGame::read(void *data, int size) {
 	if (_saving)
 		error("SaveGame::readBlock called when storing a savegame!");

Modified: residual/trunk/engine/savegame.h
===================================================================
--- residual/trunk/engine/savegame.h	2008-08-03 12:53:12 UTC (rev 33581)
+++ residual/trunk/engine/savegame.h	2008-08-03 13:02:45 UTC (rev 33582)
@@ -51,6 +51,7 @@
 
 	uint32 beginSection(uint32 sectionTag);
 	void endSection();
+	uint32 getBufferPos();
 	void read(void *data, int size);
 	void write(const void *data, int size);
 	uint32 readLEUint32();


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