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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Sun Sep 5 17:34:25 CEST 2010


Revision: 52565
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52565&view=rev
Author:   m_kiewitz
Date:     2010-09-05 15:34:25 +0000 (Sun, 05 Sep 2010)

Log Message:
-----------
SCI: kClone cleanup

and fixing possible crash & typo

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kscripts.cpp
    scummvm/trunk/engines/sci/engine/segment.h

Modified: scummvm/trunk/engines/sci/engine/kscripts.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kscripts.cpp	2010-09-05 15:26:00 UTC (rev 52564)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp	2010-09-05 15:34:25 UTC (rev 52565)
@@ -143,23 +143,23 @@
 }
 
 reg_t kClone(EngineState *s, int argc, reg_t *argv) {
-	reg_t parent_addr = argv[0];
-	const Object *parent_obj = s->_segMan->getObject(parent_addr);
-	const bool parentIsClone = parent_obj->isClone();
-	reg_t clone_addr;
-	Clone *clone_obj; // same as Object*
+	reg_t parentAddr = argv[0];
+	const Object *parentObj = s->_segMan->getObject(parentAddr);
+	reg_t cloneAddr;
+	Clone *cloneObj; // same as Object*
 
-	if (!parent_obj) {
-		error("Attempt to clone non-object/class at %04x:%04x failed", PRINT_REG(parent_addr));
+	if (!parentObj) {
+		error("Attempt to clone non-object/class at %04x:%04x failed", PRINT_REG(parentAddr));
 		return NULL_REG;
 	}
 
-	debugC(2, kDebugLevelMemory, "Attempting to clone from %04x:%04x", PRINT_REG(parent_addr));
+	debugC(2, kDebugLevelMemory, "Attempting to clone from %04x:%04x", PRINT_REG(parentAddr));
 
-	clone_obj = s->_segMan->allocateClone(&clone_addr);
+	uint16 infoSelector = readSelectorValue(s->_segMan, parentAddr, SELECTOR(_info_));
+	cloneObj = s->_segMan->allocateClone(&cloneAddr);
 
-	if (!clone_obj) {
-		error("Cloning %04x:%04x failed-- internal error", PRINT_REG(parent_addr));
+	if (!cloneObj) {
+		error("Cloning %04x:%04x failed-- internal error", PRINT_REG(parentAddr));
 		return NULL_REG;
 	}
 
@@ -168,24 +168,25 @@
 	// invalidate all pointers, references and iterators to data in the clones
 	// segment.
 	//
-	// The reason why it might invalidate those is, that the segement code
+	// The reason why it might invalidate those is, that the segment code
 	// (Table) uses Common::Array for internal storage. Common::Array now
 	// might invalidate references to its contained data, when it has to
 	// extend the internal storage size.
-	if (parentIsClone)
-		parent_obj = s->_segMan->getObject(parent_addr);
+	if (infoSelector & kInfoFlagClone)
+		parentObj = s->_segMan->getObject(parentAddr);
 
-	*clone_obj = *parent_obj;
+	*cloneObj = *parentObj;
 
 	// Mark as clone
-	clone_obj->markAsClone(); // sets bit 0 of -info- selector
-	clone_obj->setSpeciesSelector(clone_obj->getPos());
-	if (parent_obj->isClass())
-		clone_obj->setSuperClassSelector(parent_obj->getPos());
-	s->_segMan->getScript(parent_obj->getPos().segment)->incrementLockers();
-	s->_segMan->getScript(clone_obj->getPos().segment)->incrementLockers();
+	writeSelectorValue(s->_segMan, cloneAddr, SELECTOR(_info_), infoSelector | kInfoFlagClone);
 
-	return clone_addr;
+	cloneObj->setSpeciesSelector(cloneObj->getPos());
+	if (parentObj->isClass())
+		cloneObj->setSuperClassSelector(parentObj->getPos());
+	s->_segMan->getScript(parentObj->getPos().segment)->incrementLockers();
+	s->_segMan->getScript(cloneObj->getPos().segment)->incrementLockers();
+
+	return cloneAddr;
 }
 
 extern void _k_view_list_mark_free(EngineState *s, reg_t off);

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2010-09-05 15:26:00 UTC (rev 52564)
+++ scummvm/trunk/engines/sci/engine/segment.h	2010-09-05 15:34:25 UTC (rev 52565)
@@ -290,9 +290,6 @@
 	bool isClass() const { return (getInfoSelector().offset & kInfoFlagClass); }
 	const Object *getClass(SegManager *segMan) const;
 
-	void markAsClone() { setInfoSelector(make_reg(0, getInfoSelector().offset | kInfoFlagClone)); }
-	bool isClone() const { return (getInfoSelector().offset & kInfoFlagClone); }
-
 	void markAsFreed() { _flags |= OBJECT_FLAG_FREED; }
 	bool isFreed() const { return _flags & OBJECT_FLAG_FREED; }
 


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