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

waltervn at users.sourceforge.net waltervn at users.sourceforge.net
Thu Jan 28 21:29:46 CET 2010


Revision: 47649
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47649&view=rev
Author:   waltervn
Date:     2010-01-28 20:29:45 +0000 (Thu, 28 Jan 2010)

Log Message:
-----------
SCI: Cleanup

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel.h
    scummvm/trunk/engines/sci/engine/klists.cpp
    scummvm/trunk/engines/sci/engine/selector.cpp

Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h	2010-01-28 19:57:14 UTC (rev 47648)
+++ scummvm/trunk/engines/sci/engine/kernel.h	2010-01-28 20:29:45 UTC (rev 47649)
@@ -239,6 +239,8 @@
 void write_selector(SegManager *segMan, reg_t object, Selector selector_id, reg_t value);
 int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid,
 	StackPtr k_argp, int k_argc, int argc, ...);
+int invoke_selector_argv(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid,
+	StackPtr k_argp, int k_argc, int argc, const reg_t *argv);
 
 
 /******************** Text functionality ********************/

Modified: scummvm/trunk/engines/sci/engine/klists.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/klists.cpp	2010-01-28 19:57:14 UTC (rev 47648)
+++ scummvm/trunk/engines/sci/engine/klists.cpp	2010-01-28 20:29:45 UTC (rev 47649)
@@ -535,18 +535,7 @@
 				write_selector(s->_segMan, curObject, slc, argv[2]);
 			}
 		} else {
-			// FIXME: Yes, this is an ugly hack...
-			if (argc == 2) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 0);
-			} else if (argc == 3) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 1, argv[2]);
-			} else if (argc == 4) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 2, argv[2], argv[3]);
-			} else if (argc == 5) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 3, argv[2], argv[3], argv[4]);
-			} else {
-				warning("kListEachElementDo: called with %d params", argc);
-			}
+			invoke_selector_argv(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, argc - 2, argv + 2);
 		}
 
 		// Lookup node again, since the nodetable it was in may have been reallocated
@@ -556,7 +545,6 @@
 		curNode = s->_segMan->lookupNode(curAddress);
 	}
 
-
 	return s->r_acc;
 }
 
@@ -580,18 +568,7 @@
 			// Can this happen with variable selectors?
 			warning("kListFirstTrue: Attempted to access a variable selector");
 		} else {
-			// FIXME: Yes, this is an ugly hack...
-			if (argc == 2) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 0);
-			} else if (argc == 3) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 1, argv[2]);
-			} else if (argc == 4) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 2, argv[2], argv[3]);
-			} else if (argc == 5) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 3, argv[2], argv[3], argv[4]);
-			} else {
-				warning("kListFirstTrue: called with %d params", argc);
-			}
+			invoke_selector_argv(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, argc - 2, argv + 2);
 
 			// Check if the result is true
 			if (!s->r_acc.isNull())
@@ -629,18 +606,7 @@
 			// Can this happen with variable selectors?
 			warning("kListAllTrue: Attempted to access a variable selector");
 		} else {
-			// FIXME: Yes, this is an ugly hack...
-			if (argc == 2) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 0);
-			} else if (argc == 3) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 1, argv[2]);
-			} else if (argc == 4) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 2, argv[2], argv[3]);
-			} else if (argc == 5) {
-				invoke_selector(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, 3, argv[2], argv[3], argv[4]);
-			} else {
-				warning("kListAllTrue: called with %d params", argc);
-			}
+			invoke_selector_argv(s, curObject, slc, kContinueOnInvalidSelector, argv, argc, argc - 2, argv + 2);
 
 			// Check if the result isn't true
 			if (s->r_acc.isNull())

Modified: scummvm/trunk/engines/sci/engine/selector.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/selector.cpp	2010-01-28 19:57:14 UTC (rev 47648)
+++ scummvm/trunk/engines/sci/engine/selector.cpp	2010-01-28 20:29:45 UTC (rev 47649)
@@ -53,9 +53,8 @@
 		*address.getPointer(segMan) = value;
 }
 
-int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid,
-	StackPtr k_argp, int k_argc, int argc, ...) {
-	va_list argp;
+int invoke_selector_argv(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid,
+	StackPtr k_argp, int k_argc, int argc, const reg_t *argv) {
 	int i;
 	int framesize = 2 + 1 * argc;
 	reg_t address;
@@ -80,12 +79,8 @@
 		return 0;
 	}
 
-	va_start(argp, argc);
-	for (i = 0; i < argc; i++) {
-		reg_t arg = va_arg(argp, reg_t);
-		stackframe[2 + i] = arg; // Write each argument
-	}
-	va_end(argp);
+	for (i = 0; i < argc; i++)
+		stackframe[2 + i] = argv[i]; // Write each argument
 
 	ExecStack *xstack;
 
@@ -100,6 +95,22 @@
 	return 0;
 }
 
+int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid,
+	StackPtr k_argp, int k_argc, int argc, ...) {
+	va_list argp;
+	reg_t *args = new reg_t[argc];
+
+	va_start(argp, argc);
+	for (int i = 0; i < argc; i++)
+		args[i] = va_arg(argp, reg_t);
+	va_end(argp);
+
+	int retval = invoke_selector_argv(s, object, selector_id, noinvalid, k_argp, k_argc, argc, args);
+
+	delete[] args;
+	return retval;
+}
+
 static int _obj_locate_varselector(SegManager *segMan, Object *obj, Selector slc) {
 	// Determines if obj explicitly defines slc as a varselector
 	// Returns -1 if not found


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