[Scummvm-cvs-logs] SF.net SVN: scummvm:[45097] scummvm/trunk/engines/sci

wjpalenstijn at users.sourceforge.net wjpalenstijn at users.sourceforge.net
Thu Oct 15 00:41:03 CEST 2009


Revision: 45097
          http://scummvm.svn.sourceforge.net/scummvm/?rev=45097&view=rev
Author:   wjpalenstijn
Date:     2009-10-14 22:41:03 +0000 (Wed, 14 Oct 2009)

Log Message:
-----------
SCI: Improve cmdSend slightly. It's still broken, though

Modified Paths:
--------------
    scummvm/trunk/engines/sci/console.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp

Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp	2009-10-14 22:40:43 UTC (rev 45096)
+++ scummvm/trunk/engines/sci/console.cpp	2009-10-14 22:41:03 UTC (rev 45097)
@@ -2231,6 +2231,7 @@
 	ExecStack *xstack;
 	Object *o;
 	reg_t fptr;
+	ObjVarRef varp;
 
 	selector_id = _vm->getKernel()->findSelector(selector_name);
 
@@ -2245,7 +2246,7 @@
 		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 @@
 	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 @@
 	}
 
 	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);

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-10-14 22:40:43 UTC (rev 45096)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-10-14 22:41:03 UTC (rev 45097)
@@ -228,13 +228,16 @@
 	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];
+		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;
-
+			} else // No, read
+				s->r_acc = *var;
+		}
 		s->_executionStack.pop_back();
 	}
 }


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list