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

sev- sev at scummvm.org
Thu Aug 11 19:50:28 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:
22b6fec5f3 DIRECTOR: Lingo: Initial code for factory creation
a13aa26207 DIRECTOR: Lingo: Code for calling out factory methods


Commit: 22b6fec5f3e88d85bbcfa03abf0a5e502ac769f5
    https://github.com/scummvm/scummvm/commit/22b6fec5f3e88d85bbcfa03abf0a5e502ac769f5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-08-11T19:50:25+02:00

Commit Message:
DIRECTOR: Lingo: Initial code for factory creation

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



diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 573a005..3c888c1 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -621,4 +621,20 @@ void Lingo::b_false(int nargs) {
 	g_lingo->push(d);
 }
 
+void Lingo::b_factory(int nargs) {
+	// This is intentionally empty
+}
+
+void Lingo::factoryCall(Common::String &name, int nargs) {
+	Common::String s("factoryCall: ");
+
+	s += name;
+
+	convertVOIDtoString(0, nargs);
+
+	printStubWithArglist(s.c_str(), nargs);
+
+	dropStack(nargs);
+}
+
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 125365a..fe2b82e 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -755,7 +755,10 @@ void Lingo::c_call() {
 	}
 
 	if (sym->type == BLTIN) {
-		(*sym->u.bltin)(nargs);
+		if (sym->u.bltin == b_factory)
+			g_lingo->factoryCall(name, nargs);
+		else
+			(*sym->u.bltin)(nargs);
 
 		return;
 	}
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 4284fa7..bf96802 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -270,6 +270,18 @@ void Lingo::processIf(int elselabel, int endlabel) {
 
 void Lingo::codeFactory(Common::String &name) {
 	_currentFactory = name;
+
+	Symbol *sym = new Symbol;
+
+	sym->name = (char *)calloc(name.size() + 1, 1);
+	Common::strlcpy(sym->name, name.c_str(), name.size());
+	sym->type = BLTIN;
+	sym->nargs = -1;
+	sym->maxArgs = 0;
+	sym->parens = true;
+	sym->u.bltin = g_lingo->b_factory;
+
+	_handlers[name] = sym;
 }
 
 }
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 35bdea9..a51988c 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -325,6 +325,9 @@ public:
 	static void b_false(int nargs);
 	static void b_true(int nargs);
 
+	static void b_factory(int nargs);
+	void factoryCall(Common::String &name, int nargs);
+
 	void func_mci(Common::String &s);
 	void func_mciwait(Common::String &s);
 	void func_goto(Datum &frame, Datum &movie);


Commit: a13aa2620744b9bd6f82dd978e6788ee197b7605
    https://github.com/scummvm/scummvm/commit/a13aa2620744b9bd6f82dd978e6788ee197b7605
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-08-11T19:50:25+02:00

Commit Message:
DIRECTOR: Lingo: Code for calling out factory methods

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 3c888c1..f20d1bf 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -634,7 +634,11 @@ void Lingo::factoryCall(Common::String &name, int nargs) {
 
 	printStubWithArglist(s.c_str(), nargs);
 
-	dropStack(nargs);
+	Datum method = _stack[_stack.size() - nargs + 0];
+
+	s = name + "-" + *method.u.s;
+
+	call(s, nargs);
 }
 
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index fe2b82e..0d4afca 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -718,6 +718,11 @@ void Lingo::c_call() {
 	g_lingo->_pc += g_lingo->calcStringAlignment(name.c_str());
 
 	int nargs = READ_UINT32(&(*g_lingo->_currentScript)[g_lingo->_pc++]);
+
+	g_lingo->call(name, nargs);
+}
+
+void Lingo::call(Common::String &name, int nargs) {
 	bool drop = false;
 
 	Symbol *sym;
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index a51988c..90adcbb 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -240,6 +240,9 @@ public:
 	static void c_ge();
 	static void c_le();
 	static void c_call();
+
+	void call(Common::String &name, int nargs);
+
 	static void c_procret();
 
 	static void c_mci();






More information about the Scummvm-git-logs mailing list