diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 99494fa8006..d17b1facaaa 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -419,13 +419,6 @@ ResourceType parseResourceType(const char *resid) { return res; } -const char *selector_name(EngineState *s, int selector) { - if (selector >= 0 && selector < (int)g_sci->getKernel()->getSelectorNamesSize()) - return g_sci->getKernel()->getSelectorName(selector).c_str(); - else - return "--INVALID--"; -} - bool Console::cmdGetVersion(int argc, const char **argv) { const char *viewTypeDesc[] = { "Unknown", "EGA", "VGA", "VGA SCI1.1", "Amiga" }; @@ -2217,7 +2210,7 @@ bool Console::cmdViewReference(int argc, const char **argv) { if (reg_end.segment != 0 && size < reg_end.offset - reg.offset) { DebugPrintf("Block end out of bounds (size %d). Resetting.\n", size); - reg_end = NULL_REG; + reg_end = NULL_REG; } if (reg_end.segment != 0 && (size >= reg_end.offset - reg.offset)) @@ -2324,11 +2317,10 @@ bool Console::cmdBacktrace(int argc, const char **argv) { switch (call.type) { - case EXEC_STACK_TYPE_CALL: {// Normal function + case EXEC_STACK_TYPE_CALL: // Normal function DebugPrintf(" %x:[%x] %s::%s(", i, call.origin, objname, (call.selector == -1) ? "" : - selector_name(_engine->_gamestate, call.selector)); - } - break; + _engine->getKernel()->getSelectorName(call.selector).c_str()); + break; case EXEC_STACK_TYPE_KERNEL: // Kernel function DebugPrintf(" %x:[%x] k%s(", i, call.origin, _engine->getKernel()->getKernelName(call.selector).c_str()); @@ -2554,11 +2546,11 @@ bool Console::cmdSend(int argc, const char **argv) { return true; } - const char *selector_name = argv[2]; - int selectorId = _engine->getKernel()->findSelector(selector_name); + const char *selectorName = argv[2]; + int selectorId = _engine->getKernel()->findSelector(selectorName); if (selectorId < 0) { - DebugPrintf("Unknown selector: \"%s\"\n", selector_name); + DebugPrintf("Unknown selector: \"%s\"\n", selectorName); return true; } @@ -2571,7 +2563,7 @@ bool Console::cmdSend(int argc, const char **argv) { SelectorType selector_type = lookupSelector(_engine->_gamestate->_segMan, object, selectorId, NULL, NULL); if (selector_type == kSelectorNone) { - DebugPrintf("Object does not support selector: \"%s\"\n", selector_name); + DebugPrintf("Object does not support selector: \"%s\"\n", selectorName); return true; } @@ -3273,7 +3265,7 @@ int Console::printObject(reg_t pos) { DebugPrintf(" "); if (i < var_container->getVarCount()) { uint16 varSelector = var_container->getVarSelector(i); - DebugPrintf("[%03x] %s = ", varSelector, selector_name(s, varSelector)); + DebugPrintf("[%03x] %s = ", varSelector, _engine->getKernel()->getSelectorName(varSelector).c_str()); } else DebugPrintf("p#%x = ", i); @@ -3292,7 +3284,7 @@ int Console::printObject(reg_t pos) { DebugPrintf(" -- methods:\n"); for (i = 0; i < obj->getMethodCount(); i++) { reg_t fptr = obj->getFunction(i); - DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), selector_name(s, obj->getFuncSelector(i)), PRINT_REG(fptr)); + DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), _engine->getKernel()->getSelectorName(obj->getFuncSelector(i)).c_str(), PRINT_REG(fptr)); } if (s->_segMan->_heap[pos.segment]->getType() == SEG_TYPE_SCRIPT) DebugPrintf("\nOwner script: %d\n", s->_segMan->getScript(pos.segment)->_nr); diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index b6e064b4d53..8ebe78637c4 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -410,7 +410,8 @@ SciKernelFunction kfunct_mappers[] = { {NULL, NULL, NULL} // Terminator }; -Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan) { +Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) + : _resMan(resMan), _segMan(segMan), _invalid("") { loadSelectorNames(); mapSelectors(); // Map a few special selectors for later use } @@ -428,6 +429,8 @@ uint Kernel::getSelectorNamesSize() const { } const Common::String &Kernel::getSelectorName(uint selector) const { + if (selector >= _selectorNames.size()) + return _invalid; return _selectorNames[selector]; } @@ -439,9 +442,8 @@ const Common::String &Kernel::getKernelName(uint number) const { // FIXME: The following check is a temporary workaround for // an issue leading to crashes when using the debugger's backtrace // command. - static const Common::String invalid = "(invalid)"; if (number >= _kernelNames.size()) - return invalid; + return _invalid; return _kernelNames[number]; } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 0a4998868d2..f17e7517095 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -246,6 +246,8 @@ private: // Kernel-related lists Common::StringArray _selectorNames; Common::StringArray _kernelNames; + + const Common::String _invalid; }; #ifdef USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 436eaafec51..d829b01c318 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -63,9 +63,7 @@ const char *opcodeNames[] = { "-sli", "-sti", "-spi" }; -extern const char *selector_name(EngineState *s, int selector); - -DebugState g_debugState; +DebugState g_debugState; // FIXME: Avoid non-const global vars // Disassembles one command from the heap, returns address of next command or 0 if a ret was encountered. reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecode) { @@ -197,7 +195,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod if (!obj) warning("Attempted to reference on non-object at %04x:%04x", PRINT_REG(s->xs->objp)); else - printf(" (%s)", selector_name(s, obj->propertyOffsetToId(s->_segMan, scr[pos.offset + 1]))); + printf(" (%s)", g_sci->getKernel()->getSelectorName(obj->propertyOffsetToId(s->_segMan, scr[pos.offset + 1])).c_str()); } } @@ -244,7 +242,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod if (!name) name = ""; - printf(" %s::%s[", name, (selector > kernel->getSelectorNamesSize()) ? "" : selector_name(s, selector)); + printf(" %s::%s[", name, g_sci->getKernel()->getSelectorName(selector).c_str()); switch (lookupSelector(s->_segMan, called_obj_addr, selector, 0, &fun_ref)) { case kSelectorMethod: @@ -314,17 +312,15 @@ void script_debug(EngineState *s) { if (paramb1 != g_debugState.seekSpecial) return; - case kDebugSeekCallk: { + case kDebugSeekCallk: if (op != op_callk) return; break; - } - case kDebugSeekLevelRet: { + case kDebugSeekLevelRet: if ((op != op_ret) || (g_debugState.seekLevel < (int)s->_executionStack.size()-1)) return; break; - } case kDebugSeekGlobal: if (op < op_sag) @@ -361,7 +357,7 @@ void script_debug(EngineState *s) { g_debugState.debugging = false; - Console *con = ((Sci::SciEngine*)g_engine)->getSciDebugger(); + Console *con = ((Sci::SciEngine *)g_engine)->getSciDebugger(); con->attach(); } @@ -491,19 +487,17 @@ void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) { dumpScriptObject((char *)script->data, seeker, objsize); break; - case SCI_OBJ_CODE: { + case SCI_OBJ_CODE: printf("Code\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case 3: { + case 3: printf("\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case SCI_OBJ_SAID: { + case SCI_OBJ_SAID: printf("Said\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); @@ -551,46 +545,40 @@ void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) { } } printf("\n"); - } - break; + break; - case SCI_OBJ_STRINGS: { + case SCI_OBJ_STRINGS: printf("Strings\n"); while (script->data [seeker]) { printf("%04x: %s\n", seeker, script->data + seeker); seeker += strlen((char *)script->data + seeker) + 1; } seeker++; // the ending zero byte - }; - break; + break; case SCI_OBJ_CLASS: dumpScriptClass((char *)script->data, seeker, objsize); break; - case SCI_OBJ_EXPORTS: { + case SCI_OBJ_EXPORTS: printf("Exports\n"); Common::hexdump((unsigned char *)script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case SCI_OBJ_POINTERS: { + case SCI_OBJ_POINTERS: printf("Pointers\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case 9: { + case 9: printf("\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case SCI_OBJ_LOCALVARS: { + case SCI_OBJ_LOCALVARS: printf("Local vars\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; default: printf("Unsupported!\n"); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index c594184f29b..00f832817be 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -276,7 +276,7 @@ Common::Error SciEngine::run() { #ifdef ENABLE_SCI32 } #endif - + _kernel->loadKernelNames(_features); // Must be called after game_init() script_adjust_opcode_formats();