diff options
-rw-r--r-- | engines/sci/engine/kgraphics32.cpp | 11 | ||||
-rw-r--r-- | engines/sci/engine/klists.cpp | 21 | ||||
-rw-r--r-- | engines/sci/engine/seg_manager.h | 7 |
3 files changed, 24 insertions, 15 deletions
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 880ea0f559..a3f7e4fbd3 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -656,16 +656,9 @@ reg_t kBitmapCreate(EngineState *s, int argc, reg_t *argv) { } reg_t kBitmapDestroy(EngineState *s, int argc, reg_t *argv) { - const reg_t &addr = argv[0]; - const SegmentObj *const segment = s->_segMan->getSegmentObj(addr.getSegment()); - - if (segment != nullptr && - segment->getType() == SEG_TYPE_BITMAP && - segment->isValidOffset(addr.getOffset())) { - - s->_segMan->freeBitmap(addr); + if (s->_segMan->isValidAddr(argv[0], SEG_TYPE_BITMAP)) { + s->_segMan->freeBitmap(argv[0]); } - return s->r_acc; } diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index de5d7f1536..305d459ac1 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -586,7 +586,8 @@ reg_t kListIndexOf(EngineState *s, int argc, reg_t *argv) { } reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv) { - List *list = s->_segMan->lookupList(argv[0]); + const reg_t listReg = argv[0]; + List *list = s->_segMan->lookupList(listReg); Node *curNode = s->_segMan->lookupNode(list->first); Selector slc = argv[1].toUint16(); @@ -627,13 +628,16 @@ reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv) { curNode = s->_segMan->lookupNode(list->nextNodes[list->numRecursions]); } - --list->numRecursions; + if (s->_segMan->isValidAddr(listReg, SEG_TYPE_LISTS)) { + --list->numRecursions; + } return s->r_acc; } reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv) { - List *list = s->_segMan->lookupList(argv[0]); + const reg_t listReg = argv[0]; + List *list = s->_segMan->lookupList(listReg); Node *curNode = s->_segMan->lookupNode(list->first); Selector slc = argv[1].toUint16(); @@ -678,13 +682,16 @@ reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv) { curNode = s->_segMan->lookupNode(list->nextNodes[list->numRecursions]); } - --list->numRecursions; + if (s->_segMan->isValidAddr(listReg, SEG_TYPE_LISTS)) { + --list->numRecursions; + } return s->r_acc; } reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv) { - List *list = s->_segMan->lookupList(argv[0]); + const reg_t listReg = argv[0]; + List *list = s->_segMan->lookupList(listReg); Node *curNode = s->_segMan->lookupNode(list->first); reg_t curObject; @@ -723,7 +730,9 @@ reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv) { curNode = s->_segMan->lookupNode(list->nextNodes[list->numRecursions]); } - --list->numRecursions; + if (s->_segMan->isValidAddr(listReg, SEG_TYPE_LISTS)) { + --list->numRecursions; + } return s->r_acc; } diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index e3ccb9ae5f..916b813eb5 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -432,6 +432,13 @@ public: reg_t getParserPtr() const { return _parserPtr; } #ifdef ENABLE_SCI32 + bool isValidAddr(reg_t reg, SegmentType expected) const { + SegmentObj *mobj = getSegmentObj(reg.getSegment()); + return (mobj && + mobj->getType() == expected && + mobj->isValidOffset(reg.getOffset())); + } + SciArray *allocateArray(SciArrayType type, uint16 size, reg_t *addr); SciArray *lookupArray(reg_t addr); void freeArray(reg_t addr); |