[Scummvm-git-logs] scummvm master -> e0a3a387b986ced784b9635244d29b924f830863

sluicebox 22204938+sluicebox at users.noreply.github.com
Fri Jan 10 02:07:10 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
a804afc571 SCI: Trigger bpr/bpw breakpoints within kernel calls
e0a3a387b9 SCI: Log bp_function (bpe) parameters in debugger


Commit: a804afc57192a5ca5db0ce408d658300ceb2651f
    https://github.com/scummvm/scummvm/commit/a804afc57192a5ca5db0ce408d658300ceb2651f
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2020-01-09T18:04:03-08:00

Commit Message:
SCI: Trigger bpr/bpw breakpoints within kernel calls

Trac #9835

Changed paths:
    engines/sci/engine/scriptdebug.cpp
    engines/sci/engine/scriptdebug.h
    engines/sci/engine/selector.cpp
    engines/sci/engine/vm.cpp


diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index 7a1fe66..05d9ade 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;
 
-		varSelector = var_container->getVarSelector(index);
+			if (index >= var_container->getVarCount()) {
+				// TODO: error, warning, debug?
+				return;
+			}
+
+			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,
diff --git a/engines/sci/engine/scriptdebug.h b/engines/sci/engine/scriptdebug.h
index 5e927ef..7b176ae 100644
--- a/engines/sci/engine/scriptdebug.h
+++ b/engines/sci/engine/scriptdebug.h
@@ -31,7 +31,7 @@ extern const char *opcodeNames[];
 
 void debugSelectorCall(reg_t send_obj, Selector selector, int argc, StackPtr argp, ObjVarRef &varp, reg_t funcp, SegManager *segMan, SelectorType selectorType);
 
-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);
 
 void logKernelCall(const KernelFunction *kernelCall, const KernelSubFunction *kernelSubCall, EngineState *s, int argc, reg_t *argv, reg_t result);
 
diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp
index 6196495..1a63b4d 100644
--- a/engines/sci/engine/selector.cpp
+++ b/engines/sci/engine/selector.cpp
@@ -23,6 +23,7 @@
 #include "sci/sci.h"
 #include "sci/engine/features.h"
 #include "sci/engine/kernel.h"
+#include "sci/engine/scriptdebug.h"
 #include "sci/engine/state.h"
 #include "sci/engine/selector.h"
 
@@ -246,8 +247,14 @@ reg_t readSelector(SegManager *segMan, reg_t object, Selector selectorId) {
 
 	if (lookupSelector(segMan, object, selectorId, &address, NULL) != kSelectorVariable)
 		return NULL_REG;
-	else
-		return *address.getPointer(segMan);
+
+	if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTORREAD) {
+		reg_t curValue = *address.getPointer(segMan);
+		debugPropertyAccess(segMan->getObject(object), object, 0, selectorId,
+			                curValue, NULL_REG, segMan, BREAK_SELECTORREAD);
+	}
+
+	return *address.getPointer(segMan);
 }
 
 #ifdef ENABLE_SCI32
@@ -271,6 +278,12 @@ void writeSelector(SegManager *segMan, reg_t object, Selector selectorId, reg_t
 		error("Selector '%s' of object could not be written to. Address %04x:%04x, %s", g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object), origin.toString().c_str());
 	}
 
+	if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTORWRITE) {
+		reg_t curValue = *address.getPointer(segMan);
+		debugPropertyAccess(segMan->getObject(object), object, 0, selectorId,
+			                curValue, value, segMan, BREAK_SELECTORWRITE);
+	}
+
 	*address.getPointer(segMan) = value;
 #ifdef ENABLE_SCI32
 	updateInfoFlagViewVisible(segMan->getObject(object), address.varindex);
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index d5bcb63c..b4221eb 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -1133,7 +1133,7 @@ void run_vm(EngineState *s) {
 		case op_pToa: // 0x31 (49)
 			// Property To Accumulator
 			if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTORREAD) {
-				debugPropertyAccess(obj, s->xs->objp, opparams[0],
+				debugPropertyAccess(obj, s->xs->objp, opparams[0], NULL_SELECTOR,
 				                    validate_property(s, obj, opparams[0]), NULL_REG,
 				                    s->_segMan, BREAK_SELECTORREAD);
 			}
@@ -1145,7 +1145,7 @@ void run_vm(EngineState *s) {
 			// Accumulator To Property
 			reg_t &opProperty = validate_property(s, obj, opparams[0]);
 			if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTORWRITE) {
-				debugPropertyAccess(obj, s->xs->objp, opparams[0],
+				debugPropertyAccess(obj, s->xs->objp, opparams[0], NULL_SELECTOR,
 				                    opProperty, s->r_acc,
 				                    s->_segMan, BREAK_SELECTORWRITE);
 			}
@@ -1162,7 +1162,7 @@ void run_vm(EngineState *s) {
 			// Property To Stack
 			reg_t value = validate_property(s, obj, opparams[0]);
 			if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTORREAD) {
-				debugPropertyAccess(obj, s->xs->objp, opparams[0],
+				debugPropertyAccess(obj, s->xs->objp, opparams[0], NULL_SELECTOR,
 				                    value, NULL_REG,
 				                    s->_segMan, BREAK_SELECTORREAD);
 			}
@@ -1176,7 +1176,7 @@ void run_vm(EngineState *s) {
 			reg_t newValue = POP32();
 			reg_t &opProperty = validate_property(s, obj, opparams[0]);
 			if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTORWRITE) {
-				debugPropertyAccess(obj, s->xs->objp, opparams[0],
+				debugPropertyAccess(obj, s->xs->objp, opparams[0], NULL_SELECTOR,
 				                    opProperty, newValue,
 				                    s->_segMan, BREAK_SELECTORWRITE);
 			}
@@ -1198,7 +1198,7 @@ void run_vm(EngineState *s) {
 			reg_t oldValue = opProperty;
 
 			if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTORREAD) {
-				debugPropertyAccess(obj, s->xs->objp, opparams[0],
+				debugPropertyAccess(obj, s->xs->objp, opparams[0], NULL_SELECTOR,
 				                    oldValue, NULL_REG,
 				                    s->_segMan, BREAK_SELECTORREAD);
 			}
@@ -1209,7 +1209,7 @@ void run_vm(EngineState *s) {
 				opProperty -= 1;
 
 			if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTORWRITE) {
-				debugPropertyAccess(obj, s->xs->objp, opparams[0],
+				debugPropertyAccess(obj, s->xs->objp, opparams[0], NULL_SELECTOR,
 				                    oldValue, opProperty,
 				                    s->_segMan, BREAK_SELECTORWRITE);
 			}


Commit: e0a3a387b986ced784b9635244d29b924f830863
    https://github.com/scummvm/scummvm/commit/e0a3a387b986ced784b9635244d29b924f830863
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2020-01-09T18:04:03-08:00

Commit Message:
SCI: Log bp_function (bpe) parameters in debugger

Trac #9833

Changed paths:
    engines/sci/engine/scriptdebug.cpp
    engines/sci/engine/scriptdebug.h
    engines/sci/engine/vm.cpp


diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index 05d9ade..2f0dd00 100644
--- a/engines/sci/engine/scriptdebug.cpp
+++ b/engines/sci/engine/scriptdebug.cpp
@@ -988,27 +988,11 @@ void debugPropertyAccess(Object *obj, reg_t objp, unsigned int index, Selector s
 	}
 }
 
-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)
@@ -1045,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(" ('");
@@ -1066,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();
diff --git a/engines/sci/engine/scriptdebug.h b/engines/sci/engine/scriptdebug.h
index 7b176ae..3d54b32 100644
--- a/engines/sci/engine/scriptdebug.h
+++ b/engines/sci/engine/scriptdebug.h
@@ -35,6 +35,8 @@ void debugPropertyAccess(Object *obj, reg_t objp, unsigned int index, Selector s
 
 void logKernelCall(const KernelFunction *kernelCall, const KernelSubFunction *kernelSubCall, EngineState *s, int argc, reg_t *argv, reg_t result);
 
+void logExportCall(uint16 script, uint16 pubfunct, EngineState *s, int argc, reg_t *argv);
+
 void logBacktrace();
 
 bool printObject(reg_t obj);
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index b4221eb..e8808a7 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -222,7 +222,9 @@ ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackP
 	}
 
 	// Check if a breakpoint is set on this method
-	g_sci->checkExportBreakpoint(script, pubfunct);
+	if (g_sci->checkExportBreakpoint(script, pubfunct)) {
+		logExportCall(script, pubfunct, s, argc, argp);
+	}
 
 	uint32 exportAddr = scr->validateExportFunc(pubfunct, false);
 	if (!exportAddr)




More information about the Scummvm-git-logs mailing list