diff options
author | Matthew Hoops | 2011-05-03 17:17:27 -0400 |
---|---|---|
committer | Matthew Hoops | 2011-05-03 17:25:41 -0400 |
commit | 9cb600099f4c29298707787cafad2741a1cd6686 (patch) | |
tree | fb1930fa56b611317831d66442cba19b18d2e57a /engines/sci/engine/segment.cpp | |
parent | 3b2283daf850605ca897002afbafe44489c35473 (diff) | |
parent | 95a6098f672191dc0792bd4f9bfa18706bbe8e3a (diff) | |
download | scummvm-rg350-9cb600099f4c29298707787cafad2741a1cd6686.tar.gz scummvm-rg350-9cb600099f4c29298707787cafad2741a1cd6686.tar.bz2 scummvm-rg350-9cb600099f4c29298707787cafad2741a1cd6686.zip |
Merge remote branch 'upstream/master' into pegasus
Diffstat (limited to 'engines/sci/engine/segment.cpp')
-rw-r--r-- | engines/sci/engine/segment.cpp | 190 |
1 files changed, 51 insertions, 139 deletions
diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 05d914cffb..2bb77c707a 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -39,7 +39,6 @@ namespace Sci { //#define GC_DEBUG // Debug garbage collection //#define GC_DEBUG_VERBOSE // Debug garbage verbosely - SegmentObj *SegmentObj::createSegmentObj(SegmentType type) { SegmentObj *mem = 0; switch (type) { @@ -85,116 +84,12 @@ SegmentObj *SegmentObj::createSegmentObj(SegmentType type) { return mem; } -const char *SegmentObj::getSegmentTypeName(SegmentType type) { - switch (type) { - case SEG_TYPE_SCRIPT: - return "script"; - break; - case SEG_TYPE_CLONES: - return "clones"; - break; - case SEG_TYPE_LOCALS: - return "locals"; - break; - case SEG_TYPE_STACK: - return "stack"; - break; - case SEG_TYPE_HUNK: - return "hunk"; - break; - case SEG_TYPE_LISTS: - return "lists"; - break; - case SEG_TYPE_NODES: - return "nodes"; - break; - case SEG_TYPE_DYNMEM: - return "dynmem"; - break; -#ifdef ENABLE_SCI32 - case SEG_TYPE_ARRAY: - return "array"; - break; - case SEG_TYPE_STRING: - return "string"; - break; -#endif - default: - error("Unknown SegmentObj type %d", type); - break; - } - return NULL; -} - SegmentRef SegmentObj::dereference(reg_t pointer) { error("Error: Trying to dereference pointer %04x:%04x to inappropriate segment", PRINT_REG(pointer)); return SegmentRef(); } - -bool LocalVariables::isValidOffset(uint16 offset) const { - return offset < _locals.size() * 2; -} - -SegmentRef LocalVariables::dereference(reg_t pointer) { - SegmentRef ret; - ret.isRaw = false; // reg_t based data! - ret.maxSize = (_locals.size() - pointer.offset / 2) * 2; - - if (pointer.offset & 1) { - ret.maxSize -= 1; - ret.skipByte = true; - } - - if (ret.maxSize > 0) { - ret.reg = &_locals[pointer.offset / 2]; - } else { - if ((g_sci->getEngineState()->currentRoomNumber() == 660 || g_sci->getEngineState()->currentRoomNumber() == 660) - && g_sci->getGameId() == GID_LAURABOW2) { - // Happens in two places during the intro of LB2CD, both from kMemory(peek): - // - room 160: Heap 160 has 83 local variables (0-82), and the game - // asks for variables at indices 83 - 90 too. - // - room 220: Heap 220 has 114 local variables (0-113), and the - // game asks for variables at indices 114-120 too. - } else { - error("LocalVariables::dereference: Offset at end or out of bounds %04x:%04x", PRINT_REG(pointer)); - } - ret.reg = 0; - } - return ret; -} - -bool DataStack::isValidOffset(uint16 offset) const { - return offset < _capacity * 2; -} - -SegmentRef DataStack::dereference(reg_t pointer) { - SegmentRef ret; - ret.isRaw = false; // reg_t based data! - ret.maxSize = (_capacity - pointer.offset / 2) * 2; - - if (pointer.offset & 1) { - ret.maxSize -= 1; - ret.skipByte = true; - } - - ret.reg = &_entries[pointer.offset / 2]; - return ret; -} - -bool DynMem::isValidOffset(uint16 offset) const { - return offset < _size; -} - -SegmentRef DynMem::dereference(reg_t pointer) { - SegmentRef ret; - ret.isRaw = true; - ret.maxSize = _size - pointer.offset; - ret.raw = _buf + pointer.offset; - return ret; -} - //-------------------- clones -------------------- Common::Array<reg_t> CloneTable::listAllOutgoingReferences(reg_t addr) const { @@ -220,8 +115,6 @@ Common::Array<reg_t> CloneTable::listAllOutgoingReferences(reg_t addr) const { void CloneTable::freeAtAddress(SegManager *segMan, reg_t addr) { #ifdef GC_DEBUG - // assert(addr.segment == _segId); - Object *victim_obj = &(_table[addr.offset]); if (!(victim_obj->_flags & OBJECT_FLAG_FREED)) @@ -229,30 +122,54 @@ void CloneTable::freeAtAddress(SegManager *segMan, reg_t addr) { #ifdef GC_DEBUG_VERBOSE else warning("[GC-DEBUG] Clone %04x:%04x: Freeing", PRINT_REG(addr)); + + warning("[GC] Clone had pos %04x:%04x", PRINT_REG(victim_obj->pos)); #endif #endif - /* - warning("[GC] Clone %04x:%04x: Freeing", PRINT_REG(addr)); - warning("[GC] Clone had pos %04x:%04x", PRINT_REG(victim_obj->pos)); - */ + freeEntry(addr.offset); } //-------------------- locals -------------------- + +SegmentRef LocalVariables::dereference(reg_t pointer) { + SegmentRef ret; + ret.isRaw = false; // reg_t based data! + ret.maxSize = (_locals.size() - pointer.offset / 2) * 2; + + if (pointer.offset & 1) { + ret.maxSize -= 1; + ret.skipByte = true; + } + + if (ret.maxSize > 0) { + ret.reg = &_locals[pointer.offset / 2]; + } else { + if ((g_sci->getEngineState()->currentRoomNumber() == 660 || g_sci->getEngineState()->currentRoomNumber() == 660) + && g_sci->getGameId() == GID_LAURABOW2) { + // Happens in two places during the intro of LB2CD, both from kMemory(peek): + // - room 160: Heap 160 has 83 local variables (0-82), and the game + // asks for variables at indices 83 - 90 too. + // - room 220: Heap 220 has 114 local variables (0-113), and the + // game asks for variables at indices 114-120 too. + } else { + error("LocalVariables::dereference: Offset at end or out of bounds %04x:%04x", PRINT_REG(pointer)); + } + ret.reg = 0; + } + return ret; +} + reg_t LocalVariables::findCanonicAddress(SegManager *segMan, reg_t addr) const { // Reference the owning script SegmentId owner_seg = segMan->getScriptSegment(script_id); - assert(owner_seg > 0); - return make_reg(owner_seg, 0); } Common::Array<reg_t> LocalVariables::listAllOutgoingReferences(reg_t addr) const { Common::Array<reg_t> tmp; -// assert(addr.segment == _segId); - for (uint i = 0; i < _locals.size(); i++) tmp.push_back(_locals[i]); @@ -261,9 +178,19 @@ Common::Array<reg_t> LocalVariables::listAllOutgoingReferences(reg_t addr) const //-------------------- stack -------------------- -reg_t DataStack::findCanonicAddress(SegManager *segMan, reg_t addr) const { - addr.offset = 0; - return addr; + +SegmentRef DataStack::dereference(reg_t pointer) { + SegmentRef ret; + ret.isRaw = false; // reg_t based data! + ret.maxSize = (_capacity - pointer.offset / 2) * 2; + + if (pointer.offset & 1) { + ret.maxSize -= 1; + ret.skipByte = true; + } + + ret.reg = &_entries[pointer.offset / 2]; + return ret; } Common::Array<reg_t> DataStack::listAllOutgoingReferences(reg_t object) const { @@ -274,11 +201,7 @@ Common::Array<reg_t> DataStack::listAllOutgoingReferences(reg_t object) const { return tmp; } - //-------------------- lists -------------------- -void ListTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { - freeEntry(sub_addr.offset); -} Common::Array<reg_t> ListTable::listAllOutgoingReferences(reg_t addr) const { Common::Array<reg_t> tmp; @@ -296,11 +219,7 @@ Common::Array<reg_t> ListTable::listAllOutgoingReferences(reg_t addr) const { return tmp; } - //-------------------- nodes -------------------- -void NodeTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { - freeEntry(sub_addr.offset); -} Common::Array<reg_t> NodeTable::listAllOutgoingReferences(reg_t addr) const { Common::Array<reg_t> tmp; @@ -321,14 +240,12 @@ Common::Array<reg_t> NodeTable::listAllOutgoingReferences(reg_t addr) const { //-------------------- dynamic memory -------------------- -reg_t DynMem::findCanonicAddress(SegManager *segMan, reg_t addr) const { - addr.offset = 0; - return addr; -} - -Common::Array<reg_t> DynMem::listAllDeallocatable(SegmentId segId) const { - const reg_t r = make_reg(segId, 0); - return Common::Array<reg_t>(&r, 1); +SegmentRef DynMem::dereference(reg_t pointer) { + SegmentRef ret; + ret.isRaw = true; + ret.maxSize = _size - pointer.offset; + ret.raw = _buf + pointer.offset; + return ret; } #ifdef ENABLE_SCI32 @@ -393,11 +310,6 @@ SegmentRef StringTable::dereference(reg_t pointer) { return ret; } -void StringTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { - _table[sub_addr.offset].destroy(); - freeEntry(sub_addr.offset); -} - #endif } // End of namespace Sci |