mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-17 15:18:11 +00:00
SCI: Fix segfault in dual-language KQ5.
svn-id: r46864
This commit is contained in:
parent
137744c40c
commit
205f7437ea
@ -568,6 +568,13 @@ Object *Script::scriptObjInit(reg_t obj_pos) {
|
||||
return obj;
|
||||
}
|
||||
|
||||
void Script::scriptObjRemove(reg_t obj_pos) {
|
||||
if (getSciVersion() < SCI_VERSION_1_1)
|
||||
obj_pos.offset += 8;
|
||||
|
||||
_objects.erase(obj_pos.toUint16());
|
||||
}
|
||||
|
||||
LocalVariables *SegManager::allocLocalsSegment(Script *scr, int count) {
|
||||
if (!count) { // No locals
|
||||
scr->_localsSegment = 0;
|
||||
|
@ -380,6 +380,12 @@ public:
|
||||
*/
|
||||
Object *scriptObjInit(reg_t obj_pos);
|
||||
|
||||
/**
|
||||
* Removes a script object
|
||||
* @param obj_pos Location (segment, offset) of the object.
|
||||
*/
|
||||
void scriptObjRemove(reg_t obj_pos);
|
||||
|
||||
/**
|
||||
* Processes a relocation block witin a script
|
||||
* This function is idempotent, but it must only be called after all
|
||||
|
@ -1644,11 +1644,18 @@ int script_instantiate_sci0(ResourceManager *resMan, SegManager *segMan, int scr
|
||||
obj->setSpeciesSelector(INST_LOOKUP_CLASS(obj->getSpeciesSelector().offset));
|
||||
|
||||
Object *baseObj = segMan->getObject(obj->getSpeciesSelector());
|
||||
obj->setVarCount(baseObj->getVarCount());
|
||||
// Copy base from species class, as we need its selector IDs
|
||||
obj->_baseObj = baseObj->_baseObj;
|
||||
|
||||
obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector().offset));
|
||||
if (baseObj) {
|
||||
obj->setVarCount(baseObj->getVarCount());
|
||||
// Copy base from species class, as we need its selector IDs
|
||||
obj->_baseObj = baseObj->_baseObj;
|
||||
|
||||
obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector().offset));
|
||||
} else {
|
||||
warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr));
|
||||
|
||||
scr->scriptObjRemove(addr);
|
||||
}
|
||||
} // if object or class
|
||||
break;
|
||||
case SCI_OBJ_POINTERS: // A relocation table
|
||||
|
Loading…
Reference in New Issue
Block a user