[Scummvm-cvs-logs] SF.net SVN: scummvm:[44138] scummvm/trunk/engines/sci
thebluegr at users.sourceforge.net
thebluegr at users.sourceforge.net
Thu Sep 17 10:51:38 CEST 2009
Revision: 44138
http://scummvm.svn.sourceforge.net/scummvm/?rev=44138&view=rev
Author: thebluegr
Date: 2009-09-17 08:51:38 +0000 (Thu, 17 Sep 2009)
Log Message:
-----------
Changed the way object selectors are accessed, by removing the relevant defines and adding appropriate methods to the Object structure
Modified Paths:
--------------
scummvm/trunk/engines/sci/console.cpp
scummvm/trunk/engines/sci/engine/kscripts.cpp
scummvm/trunk/engines/sci/engine/memobj.h
scummvm/trunk/engines/sci/engine/savegame.cpp
scummvm/trunk/engines/sci/engine/scriptdebug.cpp
scummvm/trunk/engines/sci/engine/seg_manager.cpp
scummvm/trunk/engines/sci/engine/state.cpp
scummvm/trunk/engines/sci/engine/vm.cpp
scummvm/trunk/engines/sci/engine/vm.h
Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/console.cpp 2009-09-17 08:51:38 UTC (rev 44138)
@@ -3065,13 +3065,14 @@
DebugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(pos), s->segMan->getObjectName(pos),
obj->_variables.size(), obj->methods_nr);
- if (!(obj->_variables[SCRIPT_INFO_SELECTOR].offset & SCRIPT_INFO_CLASS))
- var_container = s->segMan->getObject(obj->_variables[SCRIPT_SUPERCLASS_SELECTOR]);
+ if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS))
+ var_container = s->segMan->getObject(obj->getSuperClassSelector(version));
DebugPrintf(" -- member variables:\n");
for (i = 0; (uint)i < obj->_variables.size(); i++) {
printf(" ");
if (i < var_container->variable_names_nr) {
- DebugPrintf("[%03x] %s = ", VM_OBJECT_GET_VARSELECTOR(var_container, i), selector_name(s, VM_OBJECT_GET_VARSELECTOR(var_container, i)));
+ uint16 varSelector = var_container->getVarSelector(i, version);
+ DebugPrintf("[%03x] %s = ", varSelector, selector_name(s, varSelector));
} else
DebugPrintf("p#%x = ", i);
@@ -3086,8 +3087,8 @@
}
DebugPrintf(" -- methods:\n");
for (i = 0; i < obj->methods_nr; i++) {
- reg_t fptr = VM_OBJECT_READ_FUNCTION(obj, i);
- DebugPrintf(" [%03x] %s = %04x:%04x\n", VM_OBJECT_GET_FUNCSELECTOR(obj, i), selector_name(s, VM_OBJECT_GET_FUNCSELECTOR(obj, i)), PRINT_REG(fptr));
+ reg_t fptr = obj->getFunction(i, version);
+ DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i, version), selector_name(s, obj->getFuncSelector(i, version)), PRINT_REG(fptr));
}
if (s->segMan->_heap[pos.segment]->getType() == SEG_TYPE_SCRIPT)
DebugPrintf("\nOwner script:\t%d\n", s->segMan->getScript(pos.segment)->_nr);
Modified: scummvm/trunk/engines/sci/engine/kscripts.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kscripts.cpp 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp 2009-09-17 08:51:38 UTC (rev 44138)
@@ -204,10 +204,10 @@
SciVersion version = s->resMan->sciVersion(); // for the selector defines
// Mark as clone
- clone_obj->_variables[SCRIPT_INFO_SELECTOR].offset = SCRIPT_INFO_CLONE;
- clone_obj->_variables[SCRIPT_SPECIES_SELECTOR] = clone_obj->pos;
- if (IS_CLASS(parent_obj))
- clone_obj->_variables[SCRIPT_SUPERCLASS_SELECTOR] = parent_obj->pos;
+ clone_obj->setInfoSelector(make_reg(0, SCRIPT_INFO_CLONE), version);
+ clone_obj->setSpeciesSelector(clone_obj->pos, version);
+ if (parent_obj->isClass(version))
+ clone_obj->setSuperClassSelector(parent_obj->pos, version);
s->segMan->getScript(parent_obj->pos.segment)->incrementLockers();
s->segMan->getScript(clone_obj->pos.segment)->incrementLockers();
@@ -230,7 +230,7 @@
SciVersion version = s->resMan->sciVersion(); // for the selector defines
- if (victim_obj->_variables[SCRIPT_INFO_SELECTOR].offset != SCRIPT_INFO_CLONE) {
+ if (victim_obj->getInfoSelector(version).offset != SCRIPT_INFO_CLONE) {
//warning("Attempt to dispose something other than a clone at %04x", offset);
// SCI silently ignores this behaviour; some games actually depend on it
return s->r_acc;
Modified: scummvm/trunk/engines/sci/engine/memobj.h
===================================================================
--- scummvm/trunk/engines/sci/engine/memobj.h 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/engine/memobj.h 2009-09-17 08:51:38 UTC (rev 44138)
@@ -198,6 +198,7 @@
/** Clone has been marked as 'freed' */
#define OBJECT_FLAG_FREED (0x1 << 0)
+// TODO: convert to class, perhaps?
struct Object {
int flags;
reg_t pos; /**< Object offset within its script; for clones, this is their base */
@@ -208,6 +209,67 @@
uint16 *base_method; /**< Pointer to the method selector area for this object */
uint16 *base_vars; /**< Pointer to the varselector area for this object */
Common::Array<reg_t> _variables;
+
+ uint16 getVarSelector(uint16 i, SciVersion version) {
+ if (version < SCI_VERSION_1_1)
+ return READ_LE_UINT16(base_obj + _variables.size() * 2 + i * 2);
+ else
+ return *(base_vars + i);
+ }
+
+ reg_t getSpeciesSelector(SciVersion version) {
+ return _variables[version < SCI_VERSION_1_1 ? 0 : 5];
+ }
+
+ void setSpeciesSelector(reg_t value, SciVersion version) {
+ _variables[version < SCI_VERSION_1_1 ? 0 : 5] = value;
+ }
+
+ reg_t getSuperClassSelector(SciVersion version) {
+ return _variables[version < SCI_VERSION_1_1 ? 1 : 6];
+ }
+
+ void setSuperClassSelector(reg_t value, SciVersion version) {
+ _variables[version < SCI_VERSION_1_1 ? 1 : 6] = value;
+ }
+
+ reg_t getInfoSelector(SciVersion version) {
+ return _variables[version < SCI_VERSION_1_1 ? 2 : 7];
+ }
+
+ void setInfoSelector(reg_t value, SciVersion version) {
+ _variables[version < SCI_VERSION_1_1 ? 2 : 7] = value;
+ }
+
+ reg_t getNameSelector(SciVersion version) {
+ return _variables[version < SCI_VERSION_1_1 ? 3 : 8];
+ }
+
+ void setNameSelector(reg_t value, SciVersion version) {
+ _variables[version < SCI_VERSION_1_1 ? 3 : 8] = value;
+ }
+
+ reg_t getClassScriptSelector() {
+ return _variables[4];
+ }
+
+ void setClassScriptSelector(reg_t value) {
+ _variables[4] = value;
+ }
+
+ uint16 getFuncSelector(uint16 i, SciVersion version) {
+ uint16 offset = (version < SCI_VERSION_1_1) ? i : i * 2 + 1;
+ return READ_LE_UINT16((byte *) (base_method + offset));
+ }
+
+ reg_t getFunction(uint16 i, SciVersion version) {
+ uint16 offset = (version < SCI_VERSION_1_1) ? methods_nr + 1 + i : i * 2 + 2;
+ return make_reg(pos.segment, READ_LE_UINT16((byte *) (base_method + offset)));
+ }
+
+ bool isClass(SciVersion version) {
+ return (getInfoSelector(version).offset & SCRIPT_INFO_CLASS);
+ }
};
struct CodeBlock {
@@ -215,28 +277,6 @@
int size;
};
-#define VM_OBJECT_GET_VARSELECTOR(obj, i) \
- (version < SCI_VERSION_1_1 ? \
- READ_LE_UINT16(obj->base_obj + obj->_variables.size() * 2 + i*2) : \
- *(obj->base_vars + i))
-#define VM_OBJECT_READ_PROPERTY(obj, i) (obj->_variables[i])
-#define VM_OBJECT_GET_FUNCSELECTOR(obj, i) \
- (version < SCI_VERSION_1_1 ? \
- READ_LE_UINT16((byte *) (obj->base_method + i)) : \
- READ_LE_UINT16((byte *) (obj->base_method + i*2 + 1)))
-#define VM_OBJECT_READ_FUNCTION(obj, i) \
- (version < SCI_VERSION_1_1 ? \
- make_reg(obj->pos.segment, \
- READ_LE_UINT16((byte *) (obj->base_method \
- + obj->methods_nr + 1 \
- + i))) : \
- make_reg(obj->pos.segment, \
- READ_LE_UINT16((byte *) (obj->base_method \
- + i * 2 + 2))))
-
-
-
-
class Script : public SegmentObj {
public:
int _nr; /**< Script number */
Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp 2009-09-17 08:51:38 UTC (rev 44138)
@@ -613,11 +613,11 @@
int funct_area = READ_LE_UINT16( data + SCRIPT_FUNCTAREAPTR_OFFSET );
Object *base_obj;
- base_obj = s->segMan->getObject(scr->_objects[j]._variables[SCRIPT_SPECIES_SELECTOR]);
+ base_obj = s->segMan->getObject(scr->_objects[j].getSpeciesSelector(version));
if (!base_obj) {
warning("Object without a base class: Script %d, index %d (reg address %04x:%04x",
- scr->_nr, j, PRINT_REG(scr->_objects[j]._variables[SCRIPT_SPECIES_SELECTOR]));
+ scr->_nr, j, PRINT_REG(scr->_objects[j].getSpeciesSelector(version)));
continue;
}
scr->_objects[j].variable_names_nr = base_obj->_variables.size();
Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp 2009-09-17 08:51:38 UTC (rev 44138)
@@ -81,8 +81,8 @@
if (segMan->sciVersion() < SCI_VERSION_1_1)
selectoroffset = ((byte *)(obj->base_obj)) + SCRIPT_SELECTOR_OFFSET + selectors * 2;
else {
- if (!(obj->_variables[SCRIPT_INFO_SELECTOR].offset & SCRIPT_INFO_CLASS)) {
- obj = segMan->getObject(obj->_variables[SCRIPT_SUPERCLASS_SELECTOR]);
+ if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS)) {
+ obj = segMan->getObject(obj->getSuperClassSelector(version));
selectoroffset = (byte *)obj->base_vars;
} else
selectoroffset = (byte *)obj->base_vars;
Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp 2009-09-17 08:51:38 UTC (rev 44138)
@@ -266,11 +266,11 @@
if (!obj)
return "<no such object>";
- reg_t nameReg = obj->_variables[SCRIPT_NAME_SELECTOR];
+ reg_t nameReg = obj->getNameSelector(version);
if (nameReg.isNull())
return "<no name>";
- const char *name = derefString(obj->_variables[SCRIPT_NAME_SELECTOR]);
+ const char *name = derefString(nameReg);
if (!name)
return "<invalid name>";
@@ -678,8 +678,8 @@
#endif
// Copy base from species class, as we need its selector IDs
- obj->_variables[SCRIPT_SUPERCLASS_SELECTOR] =
- getClassAddress(obj->_variables[SCRIPT_SUPERCLASS_SELECTOR].offset, SCRIPT_GET_LOCK, NULL_REG);
+ obj->setSuperClassSelector(
+ getClassAddress(obj->getSuperClassSelector(version).offset, SCRIPT_GET_LOCK, NULL_REG), version);
// Set the -classScript- selector to the script number.
// FIXME: As this selector is filled in at run-time, it is likely
@@ -687,7 +687,7 @@
// uses this selector together with -propDict- to compare classes.
// For the purpose of Obj::isKindOf, using the script number appears
// to be sufficient.
- obj->_variables[SCRIPT_CLASSSCRIPT_SELECTOR] = make_reg(0, scr->_nr);
+ obj->setClassScriptSelector(make_reg(0, scr->_nr));
seeker += READ_LE_UINT16(seeker + 2) * 2;
}
@@ -809,7 +809,7 @@
continue;
CloneTable::Entry &seeker = ct->_table[j];
- base_obj = getObject(seeker._variables[SCRIPT_SPECIES_SELECTOR]);
+ base_obj = getObject(seeker.getSpeciesSelector(version));
if (!base_obj) {
warning("Clone entry without a base class: %d", j);
seeker.base = NULL;
Modified: scummvm/trunk/engines/sci/engine/state.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/state.cpp 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/engine/state.cpp 2009-09-17 08:51:38 UTC (rev 44138)
@@ -335,7 +335,7 @@
SciVersion EngineState::detectLofsType() {
if (_lofsType == SCI_VERSION_AUTODETECT) {
- SciVersion version = segMan->sciVersion(); // FIXME: for VM_OBJECT_READ_FUNCTION
+ SciVersion version = segMan->sciVersion();
// This detection only works (and is only needed) pre-SCI1.1
if (version >= SCI_VERSION_1_1) {
@@ -355,7 +355,7 @@
// Check methods of the Game class for lofs operations
if (obj) {
for (int m = 0; m < obj->methods_nr; m++) {
- reg_t fptr = VM_OBJECT_READ_FUNCTION(obj, m);
+ reg_t fptr = obj->getFunction(m, version);
Script *script = segMan->getScript(fptr.segment);
Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/engine/vm.cpp 2009-09-17 08:51:38 UTC (rev 44138)
@@ -1406,8 +1406,8 @@
int selector_name_offset = varnum * 2 + SCRIPT_SELECTOR_OFFSET;
buf = obj->base_obj + selector_name_offset;
} else {
- if (!(obj->_variables[SCRIPT_INFO_SELECTOR].offset & SCRIPT_INFO_CLASS))
- obj = segMan->getObject(obj->_variables[SCRIPT_SUPERCLASS_SELECTOR]);
+ if (!(obj->getInfoSelector(version).offset & SCRIPT_INFO_CLASS))
+ obj = segMan->getObject(obj->getSuperClassSelector(version));
buf = (byte *)obj->base_vars;
varnum = obj->_variables[1].toUint16();
@@ -1428,7 +1428,7 @@
int i;
for (i = 0; i < funcnum; i++)
- if (VM_OBJECT_GET_FUNCSELECTOR(obj, i) == slc) // Found it?
+ if (obj->getFuncSelector(i, version) == slc) // Found it?
return i; // report success
return -1; // Failed
@@ -1445,13 +1445,13 @@
if (index >= 0) {
if (fptr) {
- *fptr = VM_OBJECT_READ_FUNCTION(obj, index);
+ *fptr = obj->getFunction(index, version);
}
return kSelectorMethod;
} else {
- seg_id = obj->_variables[SCRIPT_SUPERCLASS_SELECTOR].segment;
- obj = segMan->getObject(obj->_variables[SCRIPT_SUPERCLASS_SELECTOR]);
+ seg_id = obj->getSuperClassSelector(version).segment;
+ obj = segMan->getObject(obj->getSuperClassSelector(version));
}
}
@@ -1475,15 +1475,15 @@
PRINT_REG(obj_location));
}
- if (IS_CLASS(obj))
+ if (obj->isClass(version))
species = obj;
else
- species = segMan->getObject(obj->_variables[SCRIPT_SPECIES_SELECTOR]);
+ species = segMan->getObject(obj->getSpeciesSelector(version));
if (!obj) {
error("lookup_selector(): Error while looking up Species class.\nOriginal address was %04x:%04x. Species address was %04x:%04x",
- PRINT_REG(obj_location), PRINT_REG(obj->_variables[SCRIPT_SPECIES_SELECTOR]));
+ PRINT_REG(obj_location), PRINT_REG(obj->getSpeciesSelector(version)));
return kSelectorNone;
}
@@ -1694,14 +1694,14 @@
Object *base_obj;
// Instantiate the superclass, if neccessary
- obj->_variables[SCRIPT_SPECIES_SELECTOR] = INST_LOOKUP_CLASS(obj->_variables[SCRIPT_SPECIES_SELECTOR].offset);
+ obj->setSpeciesSelector(INST_LOOKUP_CLASS(obj->getSpeciesSelector(version).offset), version);
- base_obj = segMan->getObject(obj->_variables[SCRIPT_SPECIES_SELECTOR]);
+ base_obj = segMan->getObject(obj->getSpeciesSelector(version));
obj->variable_names_nr = base_obj->_variables.size();
obj->base_obj = base_obj->base_obj;
// Copy base from species class, as we need its selector IDs
- obj->_variables[SCRIPT_SUPERCLASS_SELECTOR] = INST_LOOKUP_CLASS(obj->_variables[SCRIPT_SUPERCLASS_SELECTOR].offset);
+ obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector(version).offset), version);
} // if object or class
break;
case SCI_OBJ_POINTERS: // A relocation table
Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h 2009-09-17 02:27:34 UTC (rev 44137)
+++ scummvm/trunk/engines/sci/engine/vm.h 2009-09-17 08:51:38 UTC (rev 44138)
@@ -68,11 +68,9 @@
/** Offset of the name pointer */
#define SCRIPT_NAME_OFFSET (version < SCI_VERSION_1_1 ? 14 -8 : 16)
-#define SCRIPT_NAME_SELECTOR (version < SCI_VERSION_1_1 ? 3 : 8)
/** Object-relative offset of the -info- selector */
#define SCRIPT_INFO_OFFSET (version < SCI_VERSION_1_1 ? 12 -8 : 14)
-#define SCRIPT_INFO_SELECTOR (version < SCI_VERSION_1_1 ? 2 : 7)
/** Flag fo the -info- selector */
#define SCRIPT_INFO_CLONE 0x0001
@@ -91,17 +89,9 @@
#define SCRIPT_SUPERCLASS_OFFSET (version < SCI_VERSION_1_1 ? 10 -8 : 12)
-/*---------------------------------*/
-/* Script selector index variables */
-/*---------------------------------*/
-#define SCRIPT_SPECIES_SELECTOR (version < SCI_VERSION_1_1 ? 0 : 5)
-#define SCRIPT_SUPERCLASS_SELECTOR (version < SCI_VERSION_1_1 ? 1 : 6)
-#define SCRIPT_CLASSSCRIPT_SELECTOR 4
-
/** Magic adjustment value for lofsa and lofss */
#define SCRIPT_LOFS_MAGIC 3
-
/** Stack pointer value: Use predecessor's value */
#define CALL_SP_CARRY NULL
@@ -119,9 +109,6 @@
#define RAW_IS_OBJECT(datablock) (READ_LE_UINT16(((byte *) datablock) + SCRIPT_OBJECT_MAGIC_OFFSET) == SCRIPT_OBJECT_MAGIC_NUMBER)
-#define IS_CLASS(obj) (obj->_variables[SCRIPT_INFO_SELECTOR].offset & SCRIPT_INFO_CLASS)
-
-
/** Contains selector IDs for a few selected selectors */
struct selector_map_t {
Selector init; /**< Init function */
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