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

wjpalenstijn at users.sourceforge.net wjpalenstijn at users.sourceforge.net
Thu Oct 15 21:24:51 CEST 2009


Revision: 45128
          http://scummvm.svn.sourceforge.net/scummvm/?rev=45128&view=rev
Author:   wjpalenstijn
Date:     2009-10-15 19:24:50 +0000 (Thu, 15 Oct 2009)

Log Message:
-----------
SCI: Fix send debugger command

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

Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp	2009-10-15 18:41:20 UTC (rev 45127)
+++ scummvm/trunk/engines/sci/console.cpp	2009-10-15 19:24:50 UTC (rev 45128)
@@ -2219,75 +2219,61 @@
 	reg_t object;
 	
 	if (parse_reg_t(_vm->_gamestate, argv[1], &object)) {
-		DebugPrintf("Invalid address passed for parameter 1.\n");
+		DebugPrintf("Invalid address \"%s\" passed.\n", argv[1]);
 		DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
 		return true;
 	}
 	
 	const char *selector_name = argv[2];
-	StackPtr stackframe = _vm->_gamestate->_executionStack.front().sp;
-	int selector_id;
-	int i;
-	ExecStack *xstack;
-	Object *o;
-	reg_t fptr;
-	ObjVarRef varp;
+	int selector_id = _vm->getKernel()->findSelector(selector_name);
 
-	selector_id = _vm->getKernel()->findSelector(selector_name);
-
 	if (selector_id < 0) {
 		DebugPrintf("Unknown selector: \"%s\"\n", selector_name);
 		return true;
 	}
 
-	o = _vm->_gamestate->_segMan->getObject(object);
+	Object *o = _vm->_gamestate->_segMan->getObject(object);
 	if (o == NULL) {
 		DebugPrintf("Address \"%04x:%04x\" is not an object\n", PRINT_REG(object));
 		return true;
 	}
 
-	SelectorType selector_type = lookup_selector(_vm->_gamestate->_segMan, object, selector_id, &varp, &fptr);
+	SelectorType selector_type = lookup_selector(_vm->_gamestate->_segMan, object, selector_id, 0, 0);
 
 	if (selector_type == kSelectorNone) {
 		DebugPrintf("Object does not support selector: \"%s\"\n", selector_name);
 		return true;
 	}
 
-	stackframe[0] = make_reg(0, selector_id);
-	stackframe[1] = make_reg(0, argc - 3);	// -object -selector name -command name
+	// everything after the selector name is passed as an argument to the send
+	int send_argc = argc - 3;
 
-	for (i = 3; i < argc; i++) {
-		if (parse_reg_t(_vm->_gamestate, argv[i], &stackframe[i-1])) {
-			DebugPrintf("Invalid address passed for parameter %d.\n", i);
+	// Create the data block for send_selecor() at the top of the stack:
+	// [selector_number][argument_counter][arguments...]
+	StackPtr stackframe = _vm->_gamestate->_executionStack.back().sp;
+	stackframe[0] = make_reg(0, selector_id);
+	stackframe[1] = make_reg(0, send_argc);
+	for (int i = 0; i < send_argc; i++) {
+		if (parse_reg_t(_vm->_gamestate, argv[3+i], &stackframe[2+i])) {
+			DebugPrintf("Invalid address \"%s\" passed.\n", argv[3+i]);
 			DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
 			return true;
 		}
 	}
 
-	xstack = add_exec_stack_entry(_vm->_gamestate, fptr,
-	                 stackframe + argc,
-	                 object, argc - 3,
-	                 stackframe - 1, 0, object,
-	                 _vm->_gamestate->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS);
-	xstack->selector = selector_id;
-	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);
+	ExecStack *old_xstack, *xstack;
+	old_xstack = &_vm->_gamestate->_executionStack.back();
+	xstack = send_selector(_vm->_gamestate, object, object,
+	                       stackframe + 2 + send_argc,
+	                       2 + send_argc, stackframe);
 
-	xstack->sp += argc;
-	xstack->fp += argc;
+	if (old_xstack != xstack) {
+		_vm->_gamestate->_executionStackPosChanged = true;
+		DebugPrintf("Message scheduled for execution\n");
+	}
 
-	_vm->_gamestate->_executionStackPosChanged = true;
-	g_debugState.debugging = true;
-
-	return false;
+	return true;
 }
 
 bool Console::cmdGo(int argc, const char **argv) {


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