[Scummvm-git-logs] scummvm master -> 256f809bc7e195f48ce27bb96ef34d2aa1b0b9be

djsrv dservilla at gmail.com
Thu Jun 18 18:28:42 UTC 2020


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:
1a62ddac61 DIRECTOR: LINGO: Remove c_property
256f809bc7 DIRECTOR: LINGO: Implement script/xtra method call


Commit: 1a62ddac61db456fa445f52015106dc3436c1000
    https://github.com/scummvm/scummvm/commit/1a62ddac61db456fa445f52015106dc3436c1000
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T14:28:00-04:00

Commit Message:
DIRECTOR: LINGO: Remove c_property

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index ac2449c7d3..e87bcd84db 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -113,7 +113,6 @@ static struct FuncDescr {
 	{ LC::c_printtop,		"c_printtop",		""  },
 	{ LC::c_procret,		"c_procret",		"" },
 	{ LC::c_proparraypush,	"c_proparraypush",	"i" },
-	{ LC::c_property,		"c_property",		"s" },
 	{ LC::c_setImmediate,	"c_setImmediate",	"i" },
 	{ LC::c_starts,			"c_starts",			"" },
 	{ LC::c_stringpush,		"c_stringpush",		"s" },
@@ -1465,12 +1464,6 @@ void LC::c_procret() {
 	}
 }
 
-void LC::c_property() {
-	Common::String name(g_lingo->readString());
-
-	warning("STUB: c_property()");
-}
-
 void LC::c_open() {
 	Datum d2 = g_lingo->pop();
 	Datum d1 = g_lingo->pop();
diff --git a/engines/director/lingo/lingo-code.h b/engines/director/lingo/lingo-code.h
index c46c6793b9..8c4606e835 100644
--- a/engines/director/lingo/lingo-code.h
+++ b/engines/director/lingo/lingo-code.h
@@ -126,7 +126,6 @@ namespace LC {
 	void c_gotoloop();
 	void c_gotonext();
 	void c_gotoprevious();
-	void c_property();
 
 	void c_play();
 


Commit: 256f809bc7e195f48ce27bb96ef34d2aa1b0b9be
    https://github.com/scummvm/scummvm/commit/256f809bc7e195f48ce27bb96ef34d2aa1b0b9be
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T14:28:00-04:00

Commit Message:
DIRECTOR: LINGO: Implement script/xtra method call

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index e87bcd84db..5b1ed00298 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -200,6 +200,9 @@ Datum Lingo::peek(uint offset) {
 	assert (_stack.size() > offset);
 
 	Datum ret = _stack[_stack.size() - 1 - offset];
+	if (ret.lazy) {
+		ret = ret.eval();
+	}
 	return ret;
 }
 
@@ -1294,15 +1297,34 @@ void LC::call(const Common::String &name, int nargs) {
 	if (debugChannelSet(3, kDebugLingoExec))
 		g_lingo->printSTUBWithArglist(name.c_str(), nargs, "call:");
 
-	Symbol funcSym = g_lingo->getHandler(name);
+	Symbol funcSym;
 
+	// Script/Xtra method call
+	if (nargs > 0) {
+		Datum target = g_lingo->peek(nargs - 1);
+		if (target.type == OBJECT && (target.u.obj->type & (kScriptObj | kXtraObj))) {
+			debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to <%s>", name.c_str(), target.asString(true).c_str());
+			g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take object out of stack
+			nargs -= 1;
+			if (name.equalsIgnoreCase("birth") || name.equalsIgnoreCase("new")) {
+				target = Datum(target.u.obj->clone());
+			}
+			funcSym = target.u.obj->getMethod(name);
+			call(funcSym, nargs, target);
+			return;
+		}
+	}
+
+	// Normal handler call
+	funcSym = g_lingo->getHandler(name);
+
+	// Factory/XObject method call
 	if (funcSym.type == VOID) {
-		Datum eventName(name);
-		eventName.type = VAR;
-		Datum d = g_lingo->varFetch(eventName);
-		if (d.type == OBJECT && (d.u.obj->type & (kFactoryObj | kXObj))) {
-			debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to <%s>", name.c_str(), d.asString(true).c_str());
-			Datum target = d;
+		Datum objName(name);
+		objName.type = VAR;
+		Datum target = g_lingo->varFetch(objName);
+		if (target.type == OBJECT && (target.u.obj->type & (kFactoryObj | kXObj))) {
+			debugC(3, kDebugLingoExec,  "Dereferencing object reference: %s to <%s>", name.c_str(), target.asString(true).c_str());
 			Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
 			nargs -= 1;
 			if (methodName.u.s->equalsIgnoreCase("mNew")) {
@@ -1313,6 +1335,7 @@ void LC::call(const Common::String &name, int nargs) {
 			return;
 		}
 	}
+
 	call(funcSym, nargs);
 }
 
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index ed14229710..cb489f966c 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -36,13 +36,14 @@ static struct MethodProto {
 	int type;
 	int version;
 } predefinedMethods[] = {
+	{ "birth",					LM::m_new,					-1, 0,	kScriptObj | kXtraObj, 	4 },			// D4
 	{ "describe",				LM::m_describe,				 0, 0,	kXObj,					2 },	// D2
 	{ "dispose",				LM::m_dispose,				 0, 0,	kFactoryObj | kXObj,	2 },	// D2
 	{ "get",					LM::m_get,					 1, 1,	kFactoryObj,			2 },	// D2
 	{ "instanceRespondsTo",		LM::m_instanceRespondsTo,	 1, 1,	kXObj,					3 },		// D3
 	{ "messageList",			LM::m_messageList,			 0, 0,	kXObj,					3 },		// D3
 	{ "name",					LM::m_name,					 0, 0,	kXObj,					3 },		// D3
-	{ "new",					LM::m_new,					-1, 0,	kFactoryObj | kXObj, 	2 },	// D2
+	{ "new",					LM::m_new,					-1, 0,	kAllObj, 				2 },	// D2
 	{ "perform",				LM::m_perform,				-1, 0,	kFactoryObj | kXObj, 	3 },		// D3
 	{ "put",					LM::m_put,					 2, 2,	kFactoryObj,			2 },	// D2
 	{ "respondsTo",				LM::m_respondsTo,			 1, 1,	kXObj,					2 },	// D2
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 3c67e0db71..2d4e46172f 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -233,7 +233,8 @@ enum ObjectType {
 	kFactoryObj = 1 << 0,
 	kXObj = 1 << 1,
 	kScriptObj = 1 << 2,
-	kXtraObj = 1 << 3
+	kXtraObj = 1 << 3,
+	kAllObj = kFactoryObj | kXObj | kScriptObj | kXtraObj
 };
 
 struct Object {




More information about the Scummvm-git-logs mailing list