Made locateVarSelector() a method of the Object class

svn-id: r49031
This commit is contained in:
Filippos Karapetis 2010-05-14 15:23:42 +00:00
parent 25bac3bef4
commit 6d38cf8b8f
3 changed files with 35 additions and 26 deletions

View file

@ -674,6 +674,33 @@ void NodeTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback
//-------------------- hunk -------------------- //-------------------- hunk --------------------
//-------------------- object ----------------------------
Object *Object::getClass(SegManager *segMan) {
return isClass() ? this : segMan->getObject(getSuperClassSelector());
}
int Object::locateVarSelector(SegManager *segMan, Selector slc) {
byte *buf;
uint varnum;
if (getSciVersion() < SCI_VERSION_1_1) {
varnum = getVarCount();
int selector_name_offset = varnum * 2 + SCRIPT_SELECTOR_OFFSET;
buf = _baseObj + selector_name_offset;
} else {
Object *obj = getClass(segMan);
varnum = obj->getVariable(1).toUint16();
buf = (byte *)obj->_baseVars;
}
for (uint i = 0; i < varnum; i++)
if (READ_LE_UINT16(buf + (i << 1)) == slc) // Found it?
return i; // report success
return -1; // Failed
}
//-------------------- dynamic memory -------------------- //-------------------- dynamic memory --------------------
reg_t DynMem::findCanonicAddress(SegManager *segMan, reg_t addr) { reg_t DynMem::findCanonicAddress(SegManager *segMan, reg_t addr) {

View file

@ -254,7 +254,14 @@ public:
return -1; return -1;
} }
/**
* Determines if the object explicitly defines slc as a varselector
* Returns -1 if not found
*/
int locateVarSelector(SegManager *segMan, Selector slc);
bool isClass() { return (getInfoSelector().offset & SCRIPT_INFO_CLASS); } bool isClass() { return (getInfoSelector().offset & SCRIPT_INFO_CLASS); }
Object *getClass(SegManager *segMan);
void markAsFreed() { _flags |= OBJECT_FLAG_FREED; } void markAsFreed() { _flags |= OBJECT_FLAG_FREED; }
bool isFreed() { return _flags & OBJECT_FLAG_FREED; } bool isFreed() { return _flags & OBJECT_FLAG_FREED; }

View file

@ -258,31 +258,6 @@ int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvoc
return retval; return retval;
} }
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->getVarCount();
int selector_name_offset = varnum * 2 + SCRIPT_SELECTOR_OFFSET;
buf = obj->_baseObj + selector_name_offset;
} else {
if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS))
obj = segMan->getObject(obj->getSuperClassSelector());
buf = (byte *)obj->_baseVars;
varnum = obj->getVariable(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
}
SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector selector_id, ObjVarRef *varp, reg_t *fptr) { SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector selector_id, ObjVarRef *varp, reg_t *fptr) {
Object *obj = segMan->getObject(obj_location); Object *obj = segMan->getObject(obj_location);
int index; int index;
@ -298,7 +273,7 @@ SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector se
PRINT_REG(obj_location)); PRINT_REG(obj_location));
} }
index = _obj_locate_varselector(segMan, obj, selector_id); index = obj->locateVarSelector(segMan, selector_id);
if (index >= 0) { if (index >= 0) {
// Found it as a variable // Found it as a variable