aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/scriptdebug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/scriptdebug.cpp')
-rw-r--r--engines/sci/engine/scriptdebug.cpp84
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();