Made locateVarSelector() a method of the Object class
svn-id: r49031
This commit is contained in:
parent
25bac3bef4
commit
6d38cf8b8f
3 changed files with 35 additions and 26 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue