SCI: Move some selector related function into a new file selector.cpp
svn-id: r44171
This commit is contained in:
parent
eb77efda78
commit
f2d2276c4a
4 changed files with 212 additions and 180 deletions
|
@ -1393,110 +1393,6 @@ void run_vm(EngineState *s, int restoring) {
|
|||
}
|
||||
}
|
||||
|
||||
static int _obj_locate_varselector(SegManager *segMan, Object *obj, Selector slc) {
|
||||
// Determines if obj explicitly defines slc as a varselector
|
||||
// Returns -1 if not found
|
||||
byte *buf;
|
||||
uint varnum;
|
||||
|
||||
if (getSciVersion() < SCI_VERSION_1_1) {
|
||||
varnum = obj->variable_names_nr;
|
||||
int selector_name_offset = varnum * 2 + SCRIPT_SELECTOR_OFFSET;
|
||||
buf = obj->base_obj + selector_name_offset;
|
||||
} else {
|
||||
if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS))
|
||||
obj = segMan->getObject(obj->getSuperClassSelector());
|
||||
|
||||
buf = (byte *)obj->base_vars;
|
||||
varnum = obj->_variables[1].toUint16();
|
||||
}
|
||||
|
||||
for (uint i = 0; i < varnum; i++)
|
||||
if (READ_LE_UINT16(buf + (i << 1)) == slc) // Found it?
|
||||
return i; // report success
|
||||
|
||||
return -1; // Failed
|
||||
}
|
||||
|
||||
static int _class_locate_funcselector(Object *obj, Selector slc) {
|
||||
// Determines if obj is a class and explicitly defines slc as a funcselector
|
||||
// Does NOT say anything about obj's superclasses, i.e. failure may be
|
||||
// returned even if one of the superclasses defines the funcselector.
|
||||
int funcnum = obj->methods_nr;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < funcnum; i++)
|
||||
if (obj->getFuncSelector(i) == slc) // Found it?
|
||||
return i; // report success
|
||||
|
||||
return -1; // Failed
|
||||
}
|
||||
|
||||
static SelectorType _lookup_selector_function(SegManager *segMan, int seg_id, Object *obj, Selector selector_id, reg_t *fptr) {
|
||||
int index;
|
||||
|
||||
// "recursive" lookup
|
||||
|
||||
while (obj) {
|
||||
index = _class_locate_funcselector(obj, selector_id);
|
||||
|
||||
if (index >= 0) {
|
||||
if (fptr) {
|
||||
*fptr = obj->getFunction(index);
|
||||
}
|
||||
|
||||
return kSelectorMethod;
|
||||
} else {
|
||||
seg_id = obj->getSuperClassSelector().segment;
|
||||
obj = segMan->getObject(obj->getSuperClassSelector());
|
||||
}
|
||||
}
|
||||
|
||||
return kSelectorNone;
|
||||
}
|
||||
|
||||
SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector selector_id, ObjVarRef *varp, reg_t *fptr) {
|
||||
Object *obj = segMan->getObject(obj_location);
|
||||
Object *species;
|
||||
int index;
|
||||
bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
|
||||
|
||||
// Early SCI versions used the LSB in the selector ID as a read/write
|
||||
// toggle, meaning that we must remove it for selector lookup.
|
||||
if (oldScriptHeader)
|
||||
selector_id &= ~1;
|
||||
|
||||
if (!obj) {
|
||||
error("lookup_selector(): Attempt to send to non-object or invalid script. Address was %04x:%04x",
|
||||
PRINT_REG(obj_location));
|
||||
}
|
||||
|
||||
if (obj->isClass())
|
||||
species = obj;
|
||||
else
|
||||
species = segMan->getObject(obj->getSpeciesSelector());
|
||||
|
||||
|
||||
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->getSpeciesSelector()));
|
||||
return kSelectorNone;
|
||||
}
|
||||
|
||||
index = _obj_locate_varselector(segMan, obj, selector_id);
|
||||
|
||||
if (index >= 0) {
|
||||
// Found it as a variable
|
||||
if (varp) {
|
||||
varp->obj = obj_location;
|
||||
varp->varindex = index;
|
||||
}
|
||||
return kSelectorVariable;
|
||||
}
|
||||
|
||||
return _lookup_selector_function(segMan, obj_location.segment, obj, selector_id, fptr);
|
||||
}
|
||||
|
||||
#define INST_LOOKUP_CLASS(id) ((id == 0xffff)? NULL_REG : segMan->getClassAddress(id, SCRIPT_GET_LOCK, reg))
|
||||
|
||||
int script_instantiate_common(ResourceManager *resMan, SegManager *segMan, int script_nr, Resource **script, Resource **heap, int *was_new) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue