[Scummvm-cvs-logs] SF.net SVN: scummvm:[52562] scummvm/trunk/engines/sci/engine
m_kiewitz at users.sourceforge.net
m_kiewitz at users.sourceforge.net
Sun Sep 5 17:09:50 CEST 2010
Revision: 52562
http://scummvm.svn.sourceforge.net/scummvm/?rev=52562&view=rev
Author: m_kiewitz
Date: 2010-09-05 15:09:50 +0000 (Sun, 05 Sep 2010)
Log Message:
-----------
SCI: merging -info- stuff in Clone/DisposeClone
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 14:59:09 UTC (rev 52561)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp 2010-09-05 15:09:50 UTC (rev 52562)
@@ -178,17 +178,13 @@
*clone_obj = *parent_obj;
// Mark as clone
- clone_obj->markAsClone();
+ clone_obj->markAsClone(); // sets -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();
- // Mark as clone for scripts as well
- uint16 infoSelector = readSelectorValue(s->_segMan, clone_addr, SELECTOR(_info_));
- writeSelectorValue(s->_segMan, clone_addr, SELECTOR(_info_), (infoSelector & 0x7fff) | 1);
-
return clone_addr;
}
@@ -204,17 +200,12 @@
return s->r_acc;
}
- if (!object->isClone()) {
- // SCI silently ignores non-clones; some games actually depend on it
- return s->r_acc;
- }
-
// SCI uses this technique to find out, if it's a clone and if it's supposed to get freed
// At least kq4early relies on this behaviour. The scripts clone "Sound", then set bit 1 manually
// and call kDisposeClone later. In that case we may not free it, otherwise we will run into issues
// later, because kIsObject would then return false and Sound object wouldn't get checked.
uint16 infoSelector = readSelectorValue(s->_segMan, obj, SELECTOR(_info_));
- if ((infoSelector & 3) == 1)
+ if ((infoSelector & 3) == kInfoFlagClone)
object->markAsFreed();
return s->r_acc;
Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h 2010-09-05 14:59:09 UTC (rev 52561)
+++ scummvm/trunk/engines/sci/engine/segment.h 2010-09-05 15:09:50 UTC (rev 52562)
@@ -290,7 +290,7 @@
bool isClass() const { return (getInfoSelector().offset & kInfoFlagClass); }
const Object *getClass(SegManager *segMan) const;
- void markAsClone() { setInfoSelector(make_reg(0, kInfoFlagClone)); }
+ void markAsClone() { setInfoSelector(make_reg(0, getInfoSelector().offset | kInfoFlagClone)); }
bool isClone() const { return (getInfoSelector().offset & kInfoFlagClone); }
void markAsFreed() { _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