aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2009-10-14 22:41:03 +0000
committerWillem Jan Palenstijn2009-10-14 22:41:03 +0000
commite6d3bb80b4123df4b6c1d472a426ee333df3bb9f (patch)
tree35ab0ccbee3427e1ffbe00df099baf8758f464a2 /engines
parent984527a479b29b31cc4065eb70723d194d656530 (diff)
downloadscummvm-rg350-e6d3bb80b4123df4b6c1d472a426ee333df3bb9f.tar.gz
scummvm-rg350-e6d3bb80b4123df4b6c1d472a426ee333df3bb9f.tar.bz2
scummvm-rg350-e6d3bb80b4123df4b6c1d472a426ee333df3bb9f.zip
SCI: Improve cmdSend slightly. It's still broken, though
svn-id: r45097
Diffstat (limited to 'engines')
-rw-r--r--engines/sci/console.cpp17
-rw-r--r--engines/sci/engine/vm.cpp15
2 files changed, 21 insertions, 11 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index d6abe4c40a..d67d652770 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -2231,6 +2231,7 @@ bool Console::cmdSend(int argc, const char **argv) {
ExecStack *xstack;
Object *o;
reg_t fptr;
+ ObjVarRef varp;
selector_id = _vm->getKernel()->findSelector(selector_name);
@@ -2245,7 +2246,7 @@ bool Console::cmdSend(int argc, const char **argv) {
return true;
}
- SelectorType selector_type = lookup_selector(_vm->_gamestate->_segMan, object, selector_id, 0, &fptr);
+ SelectorType selector_type = lookup_selector(_vm->_gamestate->_segMan, object, selector_id, &varp, &fptr);
if (selector_type == kSelectorNone) {
DebugPrintf("Object does not support selector: \"%s\"\n", selector_name);
@@ -2256,7 +2257,7 @@ bool Console::cmdSend(int argc, const char **argv) {
stackframe[1] = make_reg(0, argc - 3); // -object -selector name -command name
for (i = 3; i < argc; i++) {
- if (parse_reg_t(_vm->_gamestate, argv[i], &stackframe[i])) {
+ if (parse_reg_t(_vm->_gamestate, argv[i], &stackframe[i-1])) {
DebugPrintf("Invalid address passed for parameter %d.\n", i);
DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
@@ -2264,12 +2265,18 @@ bool Console::cmdSend(int argc, const char **argv) {
}
xstack = add_exec_stack_entry(_vm->_gamestate, fptr,
- _vm->_gamestate->_executionStack.front().sp + argc,
+ stackframe + argc,
object, argc - 3,
- _vm->_gamestate->_executionStack.front().sp - 1, 0, object,
+ stackframe - 1, 0, object,
_vm->_gamestate->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS);
xstack->selector = selector_id;
- xstack->type = selector_type == kSelectorVariable ? EXEC_STACK_TYPE_VARSELECTOR : EXEC_STACK_TYPE_CALL;
+ if (selector_type == kSelectorVariable) {
+ xstack->addr.varp = varp;
+ xstack->type = EXEC_STACK_TYPE_VARSELECTOR;
+ } else {
+ xstack->addr.pc = fptr;
+ xstack->type = EXEC_STACK_TYPE_CALL;
+ }
// Now commit the actual function:
xstack = send_selector(_vm->_gamestate, object, object, stackframe, argc - 3, stackframe);
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index f1679ae7b5..69dde0d63c 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -228,13 +228,16 @@ static void _exec_varselectors(EngineState *s) {
while (!s->_executionStack.empty() && s->_executionStack.back().type == EXEC_STACK_TYPE_VARSELECTOR) {
ExecStack &xs = s->_executionStack.back();
reg_t *var = xs.getVarPointer(s->_segMan);
- // varselector access?
- if (xs.argc) { // write?
- *var = xs.variables_argp[1];
-
- } else // No, read
- s->r_acc = *var;
+ if (!var) {
+ warning("Invalid varselector exec stack entry");
+ } else {
+ // varselector access?
+ if (xs.argc) { // write?
+ *var = xs.variables_argp[1];
+ } else // No, read
+ s->r_acc = *var;
+ }
s->_executionStack.pop_back();
}
}