diff options
Diffstat (limited to 'engines/sci/engine/vm.cpp')
-rw-r--r-- | engines/sci/engine/vm.cpp | 104 |
1 files changed, 0 insertions, 104 deletions
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b114af1034..be09cd5de0 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -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) { |