[Scummvm-cvs-logs] scummvm master -> c7b8689c6c25f5c176629de04acf79db3afa8096

sev- sev at scummvm.org
Tue Aug 9 22:37:40 CEST 2016


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:
2dd109c483 DIRECTOR: Lingo: Pass number of arguments to built-in functions
c7b8689c6c DIRECTOR: Lingo: Proper stubs for commands with variable arguments


Commit: 2dd109c4838a82f8a4976aede8125b3c9fff05c1
    https://github.com/scummvm/scummvm/commit/2dd109c4838a82f8a4976aede8125b3c9fff05c1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-08-09T22:37:35+02:00

Commit Message:
DIRECTOR: Lingo: Pass number of arguments to built-in functions

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo.h



diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 8b1d48f..7ecb5cc 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -26,7 +26,7 @@ namespace Director {
 
 static struct BuiltinProto {
 	const char *name;
-	void (*func)(void);
+	void (*func)(int);
 	int minArgs;
 	int maxArgs;
 	bool parens;
@@ -116,7 +116,7 @@ void Lingo::initBuiltIns() {
 		sym->nargs = blt->minArgs;
 		sym->maxArgs = blt->maxArgs;
 		sym->parens = blt->parens;
-		sym->u.func = blt->func;
+		sym->u.bltin = blt->func;
 
 		_handlers[blt->name] = sym;
 	}
@@ -125,7 +125,7 @@ void Lingo::initBuiltIns() {
 ///////////////////
 // Math
 ///////////////////
-void Lingo::b_abs() {
+void Lingo::b_abs(int nargs) {
 	Datum d = g_lingo->pop();
 
 	if (d.type == INT)
@@ -136,21 +136,21 @@ void Lingo::b_abs() {
 	g_lingo->push(d);
 }
 
-void Lingo::b_atan() {
+void Lingo::b_atan(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toFloat();
 	d.u.f = atan(d.u.f);
 	g_lingo->push(d);
 }
 
-void Lingo::b_cos() {
+void Lingo::b_cos(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toFloat();
 	d.u.f = cos(d.u.f);
 	g_lingo->push(d);
 }
 
-void Lingo::b_exp() {
+void Lingo::b_exp(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toInt(); // Lingo uses int, so we're enforcing it
 	d.toFloat();
@@ -158,33 +158,33 @@ void Lingo::b_exp() {
 	g_lingo->push(d);
 }
 
-void Lingo::b_float() {
+void Lingo::b_float(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toFloat();
 	g_lingo->push(d);
 }
 
-void Lingo::b_integer() {
+void Lingo::b_integer(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toInt();
 	g_lingo->push(d);
 }
 
-void Lingo::b_log() {
+void Lingo::b_log(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toFloat();
 	d.u.f = log(d.u.f);
 	g_lingo->push(d);
 }
 
-void Lingo::b_pi() {
+void Lingo::b_pi(int nargs) {
 	Datum d;
 	d.toFloat();
 	d.u.f = M_PI;
 	g_lingo->push(d);
 }
 
-void Lingo::b_power() {
+void Lingo::b_power(int nargs) {
 	Datum d1 = g_lingo->pop();
 	Datum d2 = g_lingo->pop();
 	d1.toFloat();
@@ -193,7 +193,7 @@ void Lingo::b_power() {
 	g_lingo->push(d1);
 }
 
-void Lingo::b_random() {
+void Lingo::b_random(int nargs) {
 	Datum max = g_lingo->pop();
 	Datum res;
 
@@ -205,21 +205,21 @@ void Lingo::b_random() {
 	g_lingo->push(res);
 }
 
-void Lingo::b_sin() {
+void Lingo::b_sin(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toFloat();
 	d.u.f = sin(d.u.f);
 	g_lingo->push(d);
 }
 
-void Lingo::b_sqrt() {
+void Lingo::b_sqrt(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toFloat();
 	d.u.f = sqrt(d.u.f);
 	g_lingo->push(d);
 }
 
-void Lingo::b_tan() {
+void Lingo::b_tan(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toFloat();
 	d.u.f = tan(d.u.f);
@@ -229,7 +229,7 @@ void Lingo::b_tan() {
 ///////////////////
 // String
 ///////////////////
-void Lingo::b_chars() {
+void Lingo::b_chars(int nargs) {
 	Datum to = g_lingo->pop();
 	Datum from = g_lingo->pop();
 	Datum s = g_lingo->pop();
@@ -253,7 +253,7 @@ void Lingo::b_chars() {
 	g_lingo->push(s);
 }
 
-void Lingo::b_length() {
+void Lingo::b_length(int nargs) {
 	Datum d = g_lingo->pop();
 
 	if (d.type != STRING)
@@ -267,7 +267,7 @@ void Lingo::b_length() {
 	g_lingo->push(d);
 }
 
-void Lingo::b_string() {
+void Lingo::b_string(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toString();
 	g_lingo->push(d);
@@ -276,11 +276,11 @@ void Lingo::b_string() {
 ///////////////////
 // Files
 ///////////////////
-void Lingo::b_closeDA() {
+void Lingo::b_closeDA(int nargs) {
 	warning("STUB: b_closeDA");
 }
 
-void Lingo::b_closeResFile() {
+void Lingo::b_closeResFile(int nargs) {
 	Datum d = g_lingo->pop();
 
 	d.toString();
@@ -290,7 +290,7 @@ void Lingo::b_closeResFile() {
 	delete d.u.s;
 }
 
-void Lingo::b_closeXlib() {
+void Lingo::b_closeXlib(int nargs) {
 	Datum d = g_lingo->pop();
 
 	d.toString();
@@ -300,7 +300,7 @@ void Lingo::b_closeXlib() {
 	delete d.u.s;
 }
 
-void Lingo::b_openDA() {
+void Lingo::b_openDA(int nargs) {
 	Datum d = g_lingo->pop();
 
 	d.toString();
@@ -310,7 +310,7 @@ void Lingo::b_openDA() {
 	delete d.u.s;
 }
 
-void Lingo::b_openResFile() {
+void Lingo::b_openResFile(int nargs) {
 	Datum d = g_lingo->pop();
 
 	d.toString();
@@ -320,7 +320,7 @@ void Lingo::b_openResFile() {
 	delete d.u.s;
 }
 
-void Lingo::b_openXlib() {
+void Lingo::b_openXlib(int nargs) {
 	Datum d = g_lingo->pop();
 
 	d.toString();
@@ -330,7 +330,7 @@ void Lingo::b_openXlib() {
 	delete d.u.s;
 }
 
-void Lingo::b_showResFile() {
+void Lingo::b_showResFile(int nargs) {
 	Datum d = g_lingo->pop();
 
 	d.toString();
@@ -340,7 +340,7 @@ void Lingo::b_showResFile() {
 	delete d.u.s;
 }
 
-void Lingo::b_showXlib() {
+void Lingo::b_showXlib(int nargs) {
 	Datum d = g_lingo->pop();
 
 	d.toString();
@@ -353,55 +353,55 @@ void Lingo::b_showXlib() {
 ///////////////////
 // Control
 ///////////////////
-void Lingo::b_dontPassEvent() {
+void Lingo::b_dontPassEvent(int nargs) {
 	warning("STUB: b_dontPassEvent");
 }
 
-void Lingo::b_continue() {
+void Lingo::b_continue(int nargs) {
 	warning("STUB: b_continue");
 }
 
-void Lingo::b_nothing() {
+void Lingo::b_nothing(int nargs) {
 	warning("STUB: b_nothing");
 }
 
-void Lingo::b_delay() {
+void Lingo::b_delay(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toInt();
 	warning("STUB: b_delay(%d)", d.u.i);
 }
 
-void Lingo::b_do() {
+void Lingo::b_do(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toString();
 	warning("STUB: b_do(%s)", d.u.s->c_str());
 }
 
-void Lingo::b_pause() {
+void Lingo::b_pause(int nargs) {
 	warning("STUB: b_pause");
 }
 
-void Lingo::b_playAccel() {
+void Lingo::b_playAccel(int nargs) {
 	warning("STUB: b_playAccel");
 }
 
-void Lingo::b_printFrom() {
+void Lingo::b_printFrom(int nargs) {
 	warning("STUB: b_printFrom");
 }
 
-void Lingo::b_quit() {
+void Lingo::b_quit(int nargs) {
 	warning("STUB: b_quit");
 }
 
-void Lingo::b_restart() {
+void Lingo::b_restart(int nargs) {
 	warning("STUB: b_restart");
 }
 
-void Lingo::b_shutDown() {
+void Lingo::b_shutDown(int nargs) {
 	warning("STUB: b_shutDown");
 }
 
-void Lingo::b_startTimer() {
+void Lingo::b_startTimer(int nargs) {
 	warning("STUB: b_startTimer");
 }
 
@@ -409,14 +409,14 @@ void Lingo::b_startTimer() {
 ///////////////////
 // Misc
 ///////////////////
-void Lingo::b_ilk() {
+void Lingo::b_ilk(int nargs) {
 	Datum d = g_lingo->pop();
 	d.u.i = d.type;
 	d.type = SYMBOL;
 	g_lingo->push(d);
 }
 
-void Lingo::b_alert() {
+void Lingo::b_alert(int nargs) {
 	Datum d = g_lingo->pop();
 
 	d.toString();
@@ -426,17 +426,17 @@ void Lingo::b_alert() {
 	delete d.u.s;
 }
 
-void Lingo::b_cursor() {
+void Lingo::b_cursor(int nargs) {
 	Datum d = g_lingo->pop();
 	d.toInt();
 	warning("STUB: b_cursor(%d)", d.u.i);
 }
 
-void Lingo::b_showGlobals() {
+void Lingo::b_showGlobals(int nargs) {
 	warning("STUB: b_showGlobals");
 }
 
-void Lingo::b_showLocals() {
+void Lingo::b_showLocals(int nargs) {
 	warning("STUB: b_showLocals");
 }
 
@@ -445,50 +445,50 @@ void Lingo::b_showLocals() {
 ///////////////////
 // Score
 ///////////////////
-void Lingo::b_updateStage() {
+void Lingo::b_updateStage(int nargs) {
 	warning("STUB: b_updateStage");
 }
 
-void Lingo::b_editableText() {
+void Lingo::b_editableText(int nargs) {
 	warning("STUB: b_editableText");
 }
 
-void Lingo::b_installMenu() {
+void Lingo::b_installMenu(int nargs) {
 	Datum d = g_lingo->pop();
 	warning("STUB: b_installMenu(%d)", d.u.i);
 }
 
-void Lingo::b_moveableSprite() {
+void Lingo::b_moveableSprite(int nargs) {
 	Datum d = g_lingo->pop();
 	warning("STUB: b_moveableSprite(%d)", d.u.i);
 }
 
-void Lingo::b_puppetPalette() {
+void Lingo::b_puppetPalette(int nargs) {
 	warning("STUB: b_puppetPalette");
 }
 
-void Lingo::b_puppetSound() {
+void Lingo::b_puppetSound(int nargs) {
 	warning("STUB: b_puppetSound");
 }
 
-void Lingo::b_puppetSprite() {
+void Lingo::b_puppetSprite(int nargs) {
 	warning("STUB: b_puppetSprite");
 }
 
-void Lingo::b_puppetTempo() {
+void Lingo::b_puppetTempo(int nargs) {
 	Datum d = g_lingo->pop();
 	warning("STUB: b_puppetTempo(%d)", d.u.i);
 }
 
-void Lingo::b_puppetTransition() {
+void Lingo::b_puppetTransition(int nargs) {
 	warning("STUB: b_puppetTransition");
 }
 
-void Lingo::b_spriteBox() {
+void Lingo::b_spriteBox(int nargs) {
 	warning("STUB: b_spriteBox");
 }
 
-void Lingo::b_zoomBox() {
+void Lingo::b_zoomBox(int nargs) {
 	warning("STUB: b_zoomBox");
 }
 
@@ -497,7 +497,7 @@ void Lingo::b_zoomBox() {
 ///////////////////
 // Point
 ///////////////////
-void Lingo::b_point() {
+void Lingo::b_point(int nargs) {
 	Datum y = g_lingo->pop();
 	Datum x = g_lingo->pop();
 	Datum d;
@@ -518,7 +518,7 @@ void Lingo::b_point() {
 ///////////////////
 // Sound
 ///////////////////
-void Lingo::b_beep() {
+void Lingo::b_beep(int nargs) {
 	Datum d = g_lingo->pop();
 	warning("STUB: b_beep(%d)", d.u.i);
 }
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 8d2b663..13778ee 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -769,9 +769,7 @@ void Lingo::c_call() {
 	}
 
 	if (sym->type == BLTIN) {
-		// FIXME. TODO. Pass nargs
-
-		(*sym->u.func)();
+		(*sym->u.bltin)(nargs);
 
 		return;
 	}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index ad70640..186f8cc 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -85,7 +85,8 @@ struct Symbol {	/* symbol table entry */
 		int		i;			/* VAR */
 		double	f;			/* FLOAT */
 		ScriptData	*defn;	/* FUNCTION, PROCEDURE */
-		void (*func)(void); /* BUILTIN */
+		void (*func)();		/* OPCODE */
+		void (*bltin)(int);	/* BUILTIN */
 		Common::String	*s;	/* STRING */
 		FloatArray *arr;	/* ARRAY, POINT, RECT */
 	} u;
@@ -254,66 +255,66 @@ public:
 
 	static void c_open();
 
-	static void b_abs();
-	static void b_atan();
-	static void b_chars();
-	static void b_cos();
-	static void b_exp();
-	static void b_float();
-	static void b_integer();
-	static void b_length();
-	static void b_log();
-	static void b_pi();
-	static void b_power();
-	static void b_random();
-	static void b_sin();
-	static void b_sqrt();
-	static void b_string();
-	static void b_tan();
-
-	static void b_ilk();
-	static void b_alert();
-	static void b_cursor();
-	static void b_printFrom();
-	static void b_showGlobals();
-	static void b_showLocals();
-
-	static void b_editableText();
-	static void b_installMenu();
-	static void b_updateStage();
-	static void b_moveableSprite();
-	static void b_puppetPalette();
-	static void b_puppetSound();
-	static void b_puppetSprite();
-	static void b_puppetTempo();
-	static void b_puppetTransition();
-	static void b_spriteBox();
-	static void b_zoomBox();
-
-	static void b_continue();
-	static void b_dontPassEvent();
-	static void b_delay();
-	static void b_do();
-	static void b_nothing();
-	static void b_pause();
-	static void b_playAccel();
-	static void b_quit();
-	static void b_restart();
-	static void b_shutDown();
-	static void b_startTimer();
-
-	static void b_closeDA();
-	static void b_closeResFile();
-	static void b_closeXlib();
-	static void b_openDA();
-	static void b_openResFile();
-	static void b_openXlib();
-	static void b_showResFile();
-	static void b_showXlib();
-
-	static void b_point();
-
-	static void b_beep();
+	static void b_abs(int nargs);
+	static void b_atan(int nargs);
+	static void b_chars(int nargs);
+	static void b_cos(int nargs);
+	static void b_exp(int nargs);
+	static void b_float(int nargs);
+	static void b_integer(int nargs);
+	static void b_length(int nargs);
+	static void b_log(int nargs);
+	static void b_pi(int nargs);
+	static void b_power(int nargs);
+	static void b_random(int nargs);
+	static void b_sin(int nargs);
+	static void b_sqrt(int nargs);
+	static void b_string(int nargs);
+	static void b_tan(int nargs);
+
+	static void b_ilk(int nargs);
+	static void b_alert(int nargs);
+	static void b_cursor(int nargs);
+	static void b_printFrom(int nargs);
+	static void b_showGlobals(int nargs);
+	static void b_showLocals(int nargs);
+
+	static void b_editableText(int nargs);
+	static void b_installMenu(int nargs);
+	static void b_updateStage(int nargs);
+	static void b_moveableSprite(int nargs);
+	static void b_puppetPalette(int nargs);
+	static void b_puppetSound(int nargs);
+	static void b_puppetSprite(int nargs);
+	static void b_puppetTempo(int nargs);
+	static void b_puppetTransition(int nargs);
+	static void b_spriteBox(int nargs);
+	static void b_zoomBox(int nargs);
+
+	static void b_continue(int nargs);
+	static void b_dontPassEvent(int nargs);
+	static void b_delay(int nargs);
+	static void b_do(int nargs);
+	static void b_nothing(int nargs);
+	static void b_pause(int nargs);
+	static void b_playAccel(int nargs);
+	static void b_quit(int nargs);
+	static void b_restart(int nargs);
+	static void b_shutDown(int nargs);
+	static void b_startTimer(int nargs);
+
+	static void b_closeDA(int nargs);
+	static void b_closeResFile(int nargs);
+	static void b_closeXlib(int nargs);
+	static void b_openDA(int nargs);
+	static void b_openResFile(int nargs);
+	static void b_openXlib(int nargs);
+	static void b_showResFile(int nargs);
+	static void b_showXlib(int nargs);
+
+	static void b_point(int nargs);
+
+	static void b_beep(int nargs);
 
 	void func_mci(Common::String &s);
 	void func_mciwait(Common::String &s);


Commit: c7b8689c6c25f5c176629de04acf79db3afa8096
    https://github.com/scummvm/scummvm/commit/c7b8689c6c25f5c176629de04acf79db3afa8096
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-08-09T22:37:35+02:00

Commit Message:
DIRECTOR: Lingo: Proper stubs for commands with variable arguments

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo.h



diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 7ecb5cc..6981e1c 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -122,6 +122,32 @@ void Lingo::initBuiltIns() {
 	}
 }
 
+void Lingo::printStubWithArglist(const char *funcname, int nargs) {
+	Common::String s(funcname);
+
+	s += '(';
+
+	for (int i = 0; i < nargs; i++) {
+		Datum d = _stack[_stack.size() - nargs + i];
+
+		d.toString();
+		s += *d.u.s;
+
+		if (i != nargs - 1)
+			s += ", ";
+	}
+
+	s += ")";
+
+	warning("STUB: %s", s.c_str());
+}
+
+void Lingo::dropStack(int nargs) {
+	for (int i = 0; i < nargs; i++)
+		pop();
+}
+
+
 ///////////////////
 // Math
 ///////////////////
@@ -382,11 +408,15 @@ void Lingo::b_pause(int nargs) {
 }
 
 void Lingo::b_playAccel(int nargs) {
-	warning("STUB: b_playAccel");
+	g_lingo->printStubWithArglist("b_playAccel", nargs);
+
+	g_lingo->dropStack(nargs);
 }
 
 void Lingo::b_printFrom(int nargs) {
-	warning("STUB: b_printFrom");
+	g_lingo->printStubWithArglist("b_printFrom", nargs);
+
+	g_lingo->dropStack(nargs);
 }
 
 void Lingo::b_quit(int nargs) {
@@ -464,15 +494,21 @@ void Lingo::b_moveableSprite(int nargs) {
 }
 
 void Lingo::b_puppetPalette(int nargs) {
-	warning("STUB: b_puppetPalette");
+	g_lingo->printStubWithArglist("b_puppetPalette", nargs);
+
+	g_lingo->dropStack(nargs);
 }
 
 void Lingo::b_puppetSound(int nargs) {
-	warning("STUB: b_puppetSound");
+	g_lingo->printStubWithArglist("b_puppetSound", nargs);
+
+	g_lingo->dropStack(nargs);
 }
 
 void Lingo::b_puppetSprite(int nargs) {
-	warning("STUB: b_puppetSprite");
+	g_lingo->printStubWithArglist("b_puppetSprite", nargs);
+
+	g_lingo->dropStack(nargs);
 }
 
 void Lingo::b_puppetTempo(int nargs) {
@@ -481,15 +517,21 @@ void Lingo::b_puppetTempo(int nargs) {
 }
 
 void Lingo::b_puppetTransition(int nargs) {
-	warning("STUB: b_puppetTransition");
+	g_lingo->printStubWithArglist("b_puppetTransition", nargs);
+
+	g_lingo->dropStack(nargs);
 }
 
 void Lingo::b_spriteBox(int nargs) {
-	warning("STUB: b_spriteBox");
+	g_lingo->printStubWithArglist("b_spriteBox", nargs);
+
+	g_lingo->dropStack(nargs);
 }
 
 void Lingo::b_zoomBox(int nargs) {
-	warning("STUB: b_zoomBox");
+	g_lingo->printStubWithArglist("b_zoomBox", nargs);
+
+	g_lingo->dropStack(nargs);
 }
 
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 186f8cc..2bc1c59 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -255,6 +255,9 @@ public:
 
 	static void c_open();
 
+	void printStubWithArglist(const char *funcname, int nargs);
+	void dropStack(int nargs);
+
 	static void b_abs(int nargs);
 	static void b_atan(int nargs);
 	static void b_chars(int nargs);






More information about the Scummvm-git-logs mailing list