diff options
Diffstat (limited to 'engines/sci/engine/scriptdebug.cpp')
-rw-r--r-- | engines/sci/engine/scriptdebug.cpp | 84 |
1 files changed, 52 insertions, 32 deletions
diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 7a1fe66d35..2f0dd008fc 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -945,32 +945,34 @@ void debugSelectorCall(reg_t send_obj, Selector selector, int argc, StackPtr arg } // switch } -void debugPropertyAccess(Object *obj, reg_t objp, unsigned int index, reg_t curValue, reg_t newValue, SegManager *segMan, BreakpointType breakpointType) { +void debugPropertyAccess(Object *obj, reg_t objp, unsigned int index, Selector selector, reg_t curValue, reg_t newValue, SegManager *segMan, BreakpointType breakpointType) { const Object *var_container = obj; if (!obj->isClass() && getSciVersion() != SCI_VERSION_3) var_container = segMan->getObject(obj->getSuperClassSelector()); - uint16 varSelector; - if (getSciVersion() == SCI_VERSION_3) { - varSelector = index; - } else { - index >>= 1; - - if (index >= var_container->getVarCount()) { - // TODO: error, warning, debug? - return; + if (selector == NULL_SELECTOR) { + if (getSciVersion() == SCI_VERSION_3) { + selector = index; } + else { + index >>= 1; + + if (index >= var_container->getVarCount()) { + // TODO: error, warning, debug? + return; + } - varSelector = var_container->getVarSelector(index); + selector = var_container->getVarSelector(index); + } } - if (g_sci->checkSelectorBreakpoint(breakpointType, objp, varSelector)) { + if (g_sci->checkSelectorBreakpoint(breakpointType, objp, selector)) { // checkSelectorBreakpoint has already triggered the breakpoint. // We just output the relevant data here. Console *con = g_sci->getSciDebugger(); const char *objectName = segMan->getObjectName(objp); - const char *selectorName = g_sci->getKernel()->getSelectorName(varSelector).c_str(); + const char *selectorName = g_sci->getKernel()->getSelectorName(selector).c_str(); if (breakpointType == BREAK_SELECTORWRITE) { con->debugPrintf("Write to selector (%s:%s): change %04x:%04x to %04x:%04x\n", objectName, selectorName, @@ -986,27 +988,11 @@ void debugPropertyAccess(Object *obj, reg_t objp, unsigned int index, reg_t curV } } -void logKernelCall(const KernelFunction *kernelCall, const KernelSubFunction *kernelSubCall, EngineState *s, int argc, reg_t *argv, reg_t result) { - if (s->abortScriptProcessing != kAbortNone) { - return; - } - - Kernel *kernel = g_sci->getKernel(); - if (!kernelSubCall) { - debugN("k%s: ", kernelCall->name); - } else { - int callNameLen = strlen(kernelCall->name); - if (strncmp(kernelCall->name, kernelSubCall->name, callNameLen) == 0) { - const char *subCallName = kernelSubCall->name + callNameLen; - debugN("k%s(%s): ", kernelCall->name, subCallName); - } else { - debugN("k%s(%s): ", kernelCall->name, kernelSubCall->name); - } - } +static void logParameters(const KernelFunction *kernelCall, EngineState *s, int argc, reg_t *argv) { for (int parmNr = 0; parmNr < argc; parmNr++) { if (parmNr) debugN(", "); - uint16 regType = kernel->findRegType(argv[parmNr]); + uint16 regType = g_sci->getKernel()->findRegType(argv[parmNr]); if (regType & SIG_TYPE_NULL) debugN("0"); else if (regType & SIG_TYPE_UNINITIALIZED) @@ -1043,7 +1029,7 @@ void logKernelCall(const KernelFunction *kernelCall, const KernelSubFunction *ke // TODO: Any other segment types which could // use special handling? - if (kernelCall->function == &kSaid) { + if (kernelCall != nullptr && kernelCall->function == &kSaid) { SegmentRef saidSpec = s->_segMan->dereference(argv[parmNr]); if (saidSpec.isRaw) { debugN(" ('"); @@ -1064,12 +1050,46 @@ void logKernelCall(const KernelFunction *kernelCall, const KernelSubFunction *ke } } } +} + +void logKernelCall(const KernelFunction *kernelCall, const KernelSubFunction *kernelSubCall, EngineState *s, int argc, reg_t *argv, reg_t result) { + if (s->abortScriptProcessing != kAbortNone) { + return; + } + + if (!kernelSubCall) { + debugN("k%s: ", kernelCall->name); + } else { + int callNameLen = strlen(kernelCall->name); + if (strncmp(kernelCall->name, kernelSubCall->name, callNameLen) == 0) { + const char *subCallName = kernelSubCall->name + callNameLen; + debugN("k%s(%s): ", kernelCall->name, subCallName); + } else { + debugN("k%s(%s): ", kernelCall->name, kernelSubCall->name); + } + } + + logParameters(kernelCall, s, argc, argv); + if (result.isPointer()) debugN(" = %04x:%04x\n", PRINT_REG(result)); else debugN(" = %d\n", result.getOffset()); } +void logExportCall(uint16 script, uint16 pubfunct, EngineState *s, int argc, reg_t *argv) { + if (s->abortScriptProcessing != kAbortNone) { + return; + } + + debugN("script %d, export %d: ", script, pubfunct); + + if (argc > 1) { + argv++; + logParameters(nullptr, s, argc, argv); + } + debugN("\n"); +} void logBacktrace() { Console *con = g_sci->getSciDebugger(); |