[Scummvm-git-logs] scummvm master -> 24042ab1e6dc4bdff2e9995004b09e36edd2ec1a

djsrv dservilla at gmail.com
Tue Aug 18 01:20:35 UTC 2020


This automated email contains information about 9 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
19a0e574be DIRECTOR: LINGO: Mark kThePerFrameHook as writable
d5f5aac867 DIRECTOR: LINGO: Fix c_namepush return type
5c5f3d0ea6 DIRECTOR: LINGO: Fix Datum::asString for SYMBOL
82814b24e1 DIRECTOR: LINGO: Use printonly asString in b_put
1e71b60d7c DIRECTOR: LINGO: Clean up wrong arg count handling
ab0d0b5ac8 DIRECTOR: LINGO: Handle null in Datum constructor
518c90ec8f DIRECTOR: LINGO: Pass me as arg to factory methods
7feaa01003 DIRECTOR: LINGO: Reuse LC::call in cb_objectcall
24042ab1e6 DIRECTOR: LINGO: Fix compiled `go loop`


Commit: 19a0e574be1a9c50886fb7e6820691882992b499
    https://github.com/scummvm/scummvm/commit/19a0e574be1a9c50886fb7e6820691882992b499
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:54-04:00

Commit Message:
DIRECTOR: LINGO: Mark kThePerFrameHook as writable

Changed paths:
    engines/director/lingo/lingo-bytecode.cpp


diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 86bed0113c..d5c6604534 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -244,7 +244,7 @@ static LingoV4TheEntity lingoV4TheEntity[] = {
 	{ 0x07, 0x22, kTheTimer,			kTheNOField,		true, kTEANOArgs },
 	{ 0x07, 0x23, kThePreLoadRAM,		kTheNOField,		true, kTEANOArgs },
 
-	{ 0x08, 0x01, kThePerFrameHook,		kTheNOField,		false, kTEANOArgs },
+	{ 0x08, 0x01, kThePerFrameHook,		kTheNOField,		true, kTEANOArgs },
 	{ 0x08, 0x02, kTheCastMembers,		kTheNumber,			false, kTEANOArgs },
 	{ 0x08, 0x03, kTheMenus,			kTheNumber,			false, kTEANOArgs },
 


Commit: d5f5aac8679e602e7b81bb37f4ba55c2206a0de6
    https://github.com/scummvm/scummvm/commit/d5f5aac8679e602e7b81bb37f4ba55c2206a0de6
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:54-04:00

Commit Message:
DIRECTOR: LINGO: Fix c_namepush return type

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 55c6f15d30..6e9914158e 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -388,7 +388,9 @@ void LC::c_symbolpush() {
 void LC::c_namepush() {
 	Datum d;
 	int i = g_lingo->readInt();
-	g_lingo->push(Datum(Common::String(g_lingo->_currentArchive->getName(i))));
+	d.type = SYMBOL;
+	d.u.s = new Common::String(g_lingo->_currentArchive->getName(i));
+	g_lingo->push(d);
 }
 
 void LC::c_argcpush() {


Commit: 5c5f3d0ea6a6435edc5ec7477ccf73198101cc9e
    https://github.com/scummvm/scummvm/commit/5c5f3d0ea6a6435edc5ec7477ccf73198101cc9e
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:54-04:00

Commit Message:
DIRECTOR: LINGO: Fix Datum::asString for SYMBOL

Changed paths:
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 9abeab02f1..0a8fd66a04 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -938,9 +938,9 @@ Common::String Datum::asString(bool printonly) const {
 		break;
 	case SYMBOL:
 		if (!printonly) {
-			s = Common::String::format("#%s", u.s->c_str());
+			s = *u.s;
 		} else {
-			s = Common::String::format("symbol: #%s", u.s->c_str());
+			s = Common::String::format("#%s", u.s->c_str());
 		}
 		break;
 	case OBJECT:


Commit: 82814b24e1186e53c2ffc853d9664de01801d747
    https://github.com/scummvm/scummvm/commit/82814b24e1186e53c2ffc853d9664de01801d747
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:55-04:00

Commit Message:
DIRECTOR: LINGO: Use printonly asString in b_put

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 5480528bf8..048989bf19 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1522,7 +1522,7 @@ void LB::b_put(int nargs) {
 	// Prints a statement to the Message window
 	Common::String output;
 	for (int i = nargs - 1; i >= 0; i--) {
-		output += g_lingo->peek(i).asString();
+		output += g_lingo->peek(i).asString(true);
 		if (i > 0)
 			output += " ";
 	}


Commit: 1e71b60d7c7e072095d074edc58fb8ccb3f131c5
    https://github.com/scummvm/scummvm/commit/1e71b60d7c7e072095d074edc58fb8ccb3f131c5
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:55-04:00

Commit Message:
DIRECTOR: LINGO: Clean up wrong arg count handling

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


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 6e9914158e..778b5b14e6 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1524,23 +1524,9 @@ void LC::call(const Common::String &name, int nargs, bool allowRetVal) {
 }
 
 void LC::call(const Symbol &funcSym, int nargs, bool allowRetVal) {
-	bool dropArgs = false;
-
 	if (funcSym.type == VOIDSYM) {
 		warning("Call to undefined handler. Dropping %d stack items", nargs);
-		dropArgs = true;
-	} else {
-		if (funcSym.type != HANDLER && funcSym.nargs != -1 && (funcSym.nargs > nargs || funcSym.maxArgs < nargs)) {
-			if (funcSym.nargs == funcSym.maxArgs)
-				warning("Incorrect number of arguments to handler '%s', expecting %d. Dropping %d stack items", funcSym.name->c_str(), funcSym.nargs, nargs);
-			else
-				warning("Incorrect number of arguments to handler '%s', expecting %d or %d. Dropping %d stack items", funcSym.name->c_str(), funcSym.nargs, funcSym.maxArgs, nargs);
-
-			dropArgs = true;
-		}
-	}
 
-	if (dropArgs) {
 		for (int i = 0; i < nargs; i++)
 			g_lingo->pop();
 
@@ -1551,11 +1537,40 @@ void LC::call(const Symbol &funcSym, int nargs, bool allowRetVal) {
 		return;
 	}
 
-	if (funcSym.nargs != -1 && funcSym.maxArgs < nargs) {
-		warning("Incorrect number of arguments for function %s (%d, expected %d to %d). Dropping extra %d",
-					funcSym.name->c_str(), nargs, funcSym.nargs, funcSym.maxArgs, nargs - funcSym.nargs);
-		for (int i = 0; i < nargs - funcSym.maxArgs; i++)
-			g_lingo->pop();
+	if (funcSym.nargs != -1) {
+		if (funcSym.type == HANDLER || funcSym.type == HBLTIN) {
+			if (funcSym.maxArgs < nargs) {
+				warning("Incorrect number of arguments for handler %s (%d, expected %d to %d). Dropping extra %d",
+							funcSym.name->c_str(), nargs, funcSym.nargs, funcSym.maxArgs, nargs - funcSym.maxArgs);
+				while (nargs > funcSym.maxArgs) {
+					g_lingo->pop();
+					nargs--;
+				}
+			}
+			if (funcSym.nargs > nargs) {
+				warning("Incorrect number of arguments for handler %s (%d, expected %d to %d). Adding extra %d voids",
+							funcSym.name->c_str(), nargs, funcSym.nargs, funcSym.maxArgs, funcSym.nargs - nargs);
+				while (nargs < funcSym.nargs) {
+					Datum d;
+					d.u.s = NULL;
+					d.type = VOID;
+					g_lingo->push(d);
+					nargs++;
+				}
+			}
+		} else if (funcSym.nargs > nargs || funcSym.maxArgs < nargs) {
+			warning("Incorrect number of arguments for builtin %s (%d, expected %d to %d). Dropping %d stack items.",
+						funcSym.name->c_str(), nargs, funcSym.nargs, funcSym.maxArgs, nargs);
+
+			for (int i = 0; i < nargs; i++)
+				g_lingo->pop();
+
+			// Push dummy value
+			if (allowRetVal)
+				g_lingo->pushVoid();
+
+			return;
+		}
 	}
 
 	if (funcSym.type != HANDLER) {
@@ -1592,14 +1607,6 @@ void LC::call(const Symbol &funcSym, int nargs, bool allowRetVal) {
 		return;
 	}
 
-	for (int i = nargs; i < funcSym.nargs; i++) {
-		Datum d;
-
-		d.u.s = NULL;
-		d.type = VOID;
-		g_lingo->push(d);
-	}
-
 	Datum defaultRetVal;
 	if (funcSym.target && funcSym.target->getObjType() == kFactoryObj && funcSym.name->equalsIgnoreCase("mNew")) {
 		defaultRetVal = funcSym.target; // return me


Commit: ab0d0b5ac8edc5bb27c7d2f1b0885d0dbe9bcab5
    https://github.com/scummvm/scummvm/commit/ab0d0b5ac8edc5bb27c7d2f1b0885d0dbe9bcab5
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:55-04:00

Commit Message:
DIRECTOR: LINGO: Handle null in Datum constructor

Changed paths:
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 0a8fd66a04..9c0023da1e 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -786,10 +786,16 @@ Datum::Datum(const Common::String &val) {
 
 Datum::Datum(AbstractObject *val) {
 	u.obj = val;
-	type = OBJECT;
 	lazy = false;
-	refCount = val->getRefCount();
-	*refCount += 1;
+	if (val) {
+		type = OBJECT;
+		refCount = val->getRefCount();
+		*refCount += 1;
+	} else {
+		type = VOID;
+		refCount = new int;
+		*refCount = 1;
+	}
 }
 
 void Datum::reset() {


Commit: 518c90ec8fa8e7a8e623b956b384447ad7ed382d
    https://github.com/scummvm/scummvm/commit/518c90ec8fa8e7a8e623b956b384447ad7ed382d
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:55-04:00

Commit Message:
DIRECTOR: LINGO: Pass me as arg to factory methods

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 778b5b14e6..f5cb0ab5e8 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1469,14 +1469,8 @@ void LC::call(const Common::String &name, int nargs, bool allowRetVal) {
 					target = target->clone();
 				}
 				funcSym = target->getMethod(*firstArg.u.s);
-				if (target->getObjType() == kScriptObj && funcSym.type == HANDLER) {
-					// For kFactoryObj handlers the target is the first argument
-					g_lingo->_stack[g_lingo->_stack.size() - nargs] = funcSym.target;
-				} else {
-					// Otherwise, take the method name out of the stack
-					g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs);
-					nargs -= 1;
-				}
+				// Set first arg to target
+				g_lingo->_stack[g_lingo->_stack.size() - nargs] = funcSym.target;
 				call(funcSym, nargs, allowRetVal);
 				return;
 			}
@@ -1492,14 +1486,8 @@ void LC::call(const Common::String &name, int nargs, bool allowRetVal) {
 			}
 			funcSym = target->getMethod(name);
 			if (funcSym.type != VOIDSYM) {
-				if (target->getObjType() == kScriptObj && funcSym.type == HANDLER) {
-					// For kScriptObj handlers the target is the first argument
-					g_lingo->_stack[g_lingo->_stack.size() - nargs] = funcSym.target;
-				} else {
-					// Otherwise, take the target object out of the stack
-					g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs);
-					nargs -= 1;
-				}
+				// Set first arg to target
+				g_lingo->_stack[g_lingo->_stack.size() - nargs] = funcSym.target;
 				call(funcSym, nargs, allowRetVal);
 				return;
 			}
@@ -1524,6 +1512,8 @@ void LC::call(const Common::String &name, int nargs, bool allowRetVal) {
 }
 
 void LC::call(const Symbol &funcSym, int nargs, bool allowRetVal) {
+	Datum target = funcSym.target;
+
 	if (funcSym.type == VOIDSYM) {
 		warning("Call to undefined handler. Dropping %d stack items", nargs);
 
@@ -1537,6 +1527,12 @@ void LC::call(const Symbol &funcSym, int nargs, bool allowRetVal) {
 		return;
 	}
 
+	if (funcSym.type != HANDLER && target.type != VOID) {
+		// Drop the target argument (only needed for user-defined methods)
+		g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs);
+		nargs--;
+	}
+
 	if (funcSym.nargs != -1) {
 		if (funcSym.type == HANDLER || funcSym.type == HBLTIN) {
 			if (funcSym.maxArgs < nargs) {
@@ -1576,11 +1572,11 @@ void LC::call(const Symbol &funcSym, int nargs, bool allowRetVal) {
 	if (funcSym.type != HANDLER) {
 		uint stackSizeBefore = g_lingo->_stack.size() - nargs;
 
-		if (funcSym.target) {
+		if (target.type != VOID) {
 			// Only need to update the me obj
 			// Pushing an entire stack frame is not necessary
 			Datum retMe = g_lingo->_currentMe;
-			g_lingo->_currentMe = funcSym.target;
+			g_lingo->_currentMe = target;
 			(*funcSym.u.bltin)(nargs);
 			g_lingo->_currentMe = retMe;
 		} else {
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 70c20977da..3ef87b1ef7 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -778,10 +778,10 @@ static const yytype_int16 yyrline[] =
      698,   698,   699,   702,   705,   711,   711,   716,   719,   723,
      724,   727,   731,   732,   735,   739,   740,   743,   754,   755,
      756,   757,   761,   765,   770,   771,   773,   777,   781,   785,
-     785,   815,   815,   821,   822,   822,   828,   836,   842,   842,
-     844,   846,   847,   848,   850,   851,   852,   854,   856,   857,
-     858,   860,   861,   862,   864,   866,   867,   868,   869,   871,
-     872,   874,   875,   877,   881,   885
+     785,   815,   815,   821,   822,   822,   832,   840,   846,   846,
+     848,   850,   851,   852,   854,   855,   856,   858,   860,   861,
+     862,   864,   865,   866,   868,   870,   871,   872,   873,   875,
+     876,   878,   879,   881,   885,   889
 };
 #endif
 
@@ -3197,22 +3197,27 @@ yyreduce:
 
   case 164: /* $@17: %empty  */
 #line 822 "engines/director/lingo/lingo-gr.y"
-                  { startDef(); (*g_lingo->_methodVars)["me"] = kVarArgument; }
-#line 3202 "engines/director/lingo/lingo-gr.cpp"
+                  {
+			startDef();
+			Common::String me("me");
+			g_lingo->codeArg(&me);
+			mVar(&me, kVarArgument);
+		}
+#line 3207 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165: /* defn: tMETHOD $@17 lbl argdef '\n' argstore stmtlist  */
-#line 823 "engines/director/lingo/lingo-gr.y"
-                                                                        {
-		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1);
-		endDef();
-		delete (yyvsp[-6].s); }
-#line 3212 "engines/director/lingo/lingo-gr.cpp"
+#line 827 "engines/director/lingo/lingo-gr.y"
+                                                    {
+			g_lingo->code1(LC::c_procret);
+			g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1);
+			endDef();
+			delete (yyvsp[-6].s); }
+#line 3217 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166: /* defn: on lbl argdef '\n' argstore stmtlist ENDCLAUSE endargdef  */
-#line 828 "engines/director/lingo/lingo-gr.y"
+#line 832 "engines/director/lingo/lingo-gr.y"
                                                                    {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3221,192 +3226,192 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3225 "engines/director/lingo/lingo-gr.cpp"
+#line 3230 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167: /* defn: on lbl argdef '\n' argstore stmtlist  */
-#line 836 "engines/director/lingo/lingo-gr.y"
+#line 840 "engines/director/lingo/lingo-gr.y"
                                                {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-5].s); }
-#line 3235 "engines/director/lingo/lingo-gr.cpp"
+#line 3240 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168: /* $@18: %empty  */
-#line 842 "engines/director/lingo/lingo-gr.y"
+#line 846 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3241 "engines/director/lingo/lingo-gr.cpp"
+#line 3246 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169: /* on: tON $@18 ID  */
-#line 842 "engines/director/lingo/lingo-gr.y"
+#line 846 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = (yyvsp[0].s); }
-#line 3247 "engines/director/lingo/lingo-gr.cpp"
+#line 3252 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170: /* argname: ID  */
-#line 844 "engines/director/lingo/lingo-gr.y"
+#line 848 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); delete (yyvsp[0].s); }
-#line 3253 "engines/director/lingo/lingo-gr.cpp"
+#line 3258 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171: /* argdef: %empty  */
-#line 846 "engines/director/lingo/lingo-gr.y"
+#line 850 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3259 "engines/director/lingo/lingo-gr.cpp"
+#line 3264 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172: /* argdef: argname  */
-#line 847 "engines/director/lingo/lingo-gr.y"
+#line 851 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3265 "engines/director/lingo/lingo-gr.cpp"
+#line 3270 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173: /* argdef: argname ',' argdef  */
-#line 848 "engines/director/lingo/lingo-gr.y"
+#line 852 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[0].narg) + 1; }
-#line 3271 "engines/director/lingo/lingo-gr.cpp"
+#line 3276 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 175: /* endargdef: ID  */
-#line 851 "engines/director/lingo/lingo-gr.y"
+#line 855 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3277 "engines/director/lingo/lingo-gr.cpp"
+#line 3282 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 176: /* endargdef: endargdef ',' ID  */
-#line 852 "engines/director/lingo/lingo-gr.y"
+#line 856 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3283 "engines/director/lingo/lingo-gr.cpp"
+#line 3288 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 177: /* argstore: %empty  */
-#line 854 "engines/director/lingo/lingo-gr.y"
+#line 858 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3289 "engines/director/lingo/lingo-gr.cpp"
+#line 3294 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 178: /* arglist: %empty  */
-#line 856 "engines/director/lingo/lingo-gr.y"
+#line 860 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3295 "engines/director/lingo/lingo-gr.cpp"
+#line 3300 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 179: /* arglist: expr  */
-#line 857 "engines/director/lingo/lingo-gr.y"
+#line 861 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3301 "engines/director/lingo/lingo-gr.cpp"
+#line 3306 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 180: /* arglist: expr ',' arglist  */
-#line 858 "engines/director/lingo/lingo-gr.y"
+#line 862 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[0].narg) + 1; }
-#line 3307 "engines/director/lingo/lingo-gr.cpp"
+#line 3312 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 181: /* nonemptyarglist: expr  */
-#line 860 "engines/director/lingo/lingo-gr.y"
+#line 864 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3313 "engines/director/lingo/lingo-gr.cpp"
+#line 3318 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 182: /* nonemptyarglist: expr ','  */
-#line 861 "engines/director/lingo/lingo-gr.y"
+#line 865 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3319 "engines/director/lingo/lingo-gr.cpp"
+#line 3324 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 183: /* nonemptyarglist: expr ',' nonemptyarglist  */
-#line 862 "engines/director/lingo/lingo-gr.y"
+#line 866 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[0].narg) + 1; }
-#line 3325 "engines/director/lingo/lingo-gr.cpp"
+#line 3330 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 184: /* list: '[' valuelist ']'  */
-#line 864 "engines/director/lingo/lingo-gr.y"
+#line 868 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3331 "engines/director/lingo/lingo-gr.cpp"
+#line 3336 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 185: /* valuelist: %empty  */
-#line 866 "engines/director/lingo/lingo-gr.y"
+#line 870 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3337 "engines/director/lingo/lingo-gr.cpp"
+#line 3342 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 186: /* valuelist: ':'  */
-#line 867 "engines/director/lingo/lingo-gr.y"
+#line 871 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3343 "engines/director/lingo/lingo-gr.cpp"
+#line 3348 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 187: /* valuelist: proplist  */
-#line 868 "engines/director/lingo/lingo-gr.y"
+#line 872 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3349 "engines/director/lingo/lingo-gr.cpp"
+#line 3354 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 188: /* valuelist: linearlist  */
-#line 869 "engines/director/lingo/lingo-gr.y"
+#line 873 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3355 "engines/director/lingo/lingo-gr.cpp"
+#line 3360 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 189: /* linearlist: expr  */
-#line 871 "engines/director/lingo/lingo-gr.y"
+#line 875 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3361 "engines/director/lingo/lingo-gr.cpp"
+#line 3366 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 190: /* linearlist: linearlist ',' expr  */
-#line 872 "engines/director/lingo/lingo-gr.y"
+#line 876 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3367 "engines/director/lingo/lingo-gr.cpp"
+#line 3372 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 191: /* proplist: proppair  */
-#line 874 "engines/director/lingo/lingo-gr.y"
+#line 878 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3373 "engines/director/lingo/lingo-gr.cpp"
+#line 3378 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 192: /* proplist: proplist ',' proppair  */
-#line 875 "engines/director/lingo/lingo-gr.y"
+#line 879 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3379 "engines/director/lingo/lingo-gr.cpp"
+#line 3384 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 193: /* proppair: SYMBOL ':' expr  */
-#line 877 "engines/director/lingo/lingo-gr.y"
+#line 881 "engines/director/lingo/lingo-gr.y"
                           {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3388 "engines/director/lingo/lingo-gr.cpp"
+#line 3393 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 194: /* proppair: STRING ':' expr  */
-#line 881 "engines/director/lingo/lingo-gr.y"
+#line 885 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3397 "engines/director/lingo/lingo-gr.cpp"
+#line 3402 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 195: /* proppair: ID ':' expr  */
-#line 885 "engines/director/lingo/lingo-gr.y"
+#line 889 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3406 "engines/director/lingo/lingo-gr.cpp"
+#line 3411 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3410 "engines/director/lingo/lingo-gr.cpp"
+#line 3415 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3605,7 +3610,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 891 "engines/director/lingo/lingo-gr.y"
+#line 895 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index f7f54aba58..41664374cf 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -819,12 +819,16 @@ defn: tMACRO { startDef(); } ID
 		endDef();
 		delete $ID; }
 	| tFACTORY ID	{ g_lingo->codeFactory(*$ID); delete $ID; }
-	| tMETHOD { startDef(); (*g_lingo->_methodVars)["me"] = kVarArgument; }
-			lbl argdef '\n' argstore stmtlist 		{
-		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*$tMETHOD, $lbl, $argdef + 1);
-		endDef();
-		delete $tMETHOD; }
+	| tMETHOD {
+			startDef();
+			Common::String me("me");
+			g_lingo->codeArg(&me);
+			mVar(&me, kVarArgument);
+		} lbl argdef '\n' argstore stmtlist {
+			g_lingo->code1(LC::c_procret);
+			g_lingo->codeDefine(*$tMETHOD, $lbl, $argdef + 1);
+			endDef();
+			delete $tMETHOD; }
 	| on lbl argdef '\n' argstore stmtlist ENDCLAUSE endargdef {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*$on, $lbl, $argdef);
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 9c0023da1e..e6e05172f9 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1224,9 +1224,10 @@ void Lingo::executePerFrameHook(int frame, int subframe) {
 		Symbol method = _perFrameHook.u.obj->getMethod("mAtFrame");
 		if (method.type != VOIDSYM) {
 			debugC(1, kDebugLingoExec, "Executing perFrameHook : <%s>(mAtFrame, %d, %d)", _perFrameHook.asString(true).c_str(), frame, subframe);
-			push(Datum(frame));
-			push(Datum(subframe));
-			LC::call(method, 2, false);
+			push(_perFrameHook);
+			push(frame);
+			push(subframe);
+			LC::call(method, 3, false);
 			execute(_pc);
 		}
 	}
@@ -1335,12 +1336,6 @@ Datum Lingo::varFetch(Datum &var, bool global, DatumHash *localvars, bool silent
 		Datum d;
 		Common::String name = *var.u.s;
 
-		// For kScriptObj handlers the target is an argument
-		// (and can be renamed from 'me)
-		if (_currentMe.type == OBJECT && _currentMe.u.obj->getObjType() != kScriptObj && name.equalsIgnoreCase("me")) {
-			result = _currentMe;
-			return result;
-		}
 		if (localvars && localvars->contains(name)) {
 			if (global)
 				warning("varFetch: variable %s is local, not global", name.c_str());


Commit: 7feaa01003db579b488c6a06d9b7bdf746aef1c4
    https://github.com/scummvm/scummvm/commit/7feaa01003db579b488c6a06d9b7bdf746aef1c4
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:55-04:00

Commit Message:
DIRECTOR: LINGO: Reuse LC::call in cb_objectcall

Changed paths:
    engines/director/lingo/lingo-bytecode.cpp


diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index d5c6604534..de0b5de0eb 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -361,8 +361,6 @@ void LC::cb_objectcall() {
 	Datum d = g_lingo->pop();
 	Datum nargs = g_lingo->pop();
 
-	AbstractObject *target = nullptr;
-
 	if (d.type == INT) {
 		if (g_lingo->_callstack.empty()) {
 			warning("cb_objectcall: no call frame");
@@ -383,82 +381,23 @@ void LC::cb_objectcall() {
 		return;
 	}
 
-	// try to fetch target
-	d.type = VAR;
-	Datum val = g_lingo->varFetch(d);
-	if (val.type == OBJECT) {
-		target = val.u.obj;
-	} else {
-		warning("cb_objectcall: target is not an object");
-	}
+	Common::String name = d.asString();
 
 	if ((nargs.type != ARGC) && (nargs.type != ARGCNORET)) {
 		warning("cb_objectcall: second arg should be of type ARGC or ARGCNORET, not %s", nargs.type2str());
 		return;
 	}
 
-	StackData args;
-	if (target) {
-		// last arg on the stack is the method name
-		nargs.u.i -= 1;
-	}
-
 	for (int i = 0; i < nargs.u.i; i++) {
-		Datum arg = g_lingo->pop();
-		// for some reason, strings that are sent to here are actually variable names???
-		// other constants (e.g. ints) are fine.
-		if (arg.type == STRING) {
-			Datum varTest(arg);
-			varTest.type = VAR;
-			varTest = g_lingo->varFetch(varTest);
-			if (varTest.type != VOID)
-				arg = varTest;
-		}
-		args.push_back(arg);
-	}
-
-	Datum methodName;
-	if (target) {
-		methodName = g_lingo->pop();
-		if (methodName.u.s->equalsIgnoreCase("mNew")) {
-			target = target->clone();
-		}
-		Symbol method = target->getMethod(methodName.asString());
-		if (method.type != VOIDSYM) {
-			if (target->getObjType() == kFactoryObj && method.type == HANDLER) {
-				// For kFactoryObj handlers the target is the first argument
-				g_lingo->push(method.target);
-				nargs.u.i += 1;
-			}
-			while (args.size()) {
-				g_lingo->push(args.back());
-				args.pop_back();
-			}
-			LC::call(method, nargs.u.i, nargs.type == ARGC);
-			return;
+		Datum &arg = g_lingo->_stack[g_lingo->_stack.size() - nargs.u.i + i];
+		// symbols that are sent to here are actually variable names
+		if (arg.type == SYMBOL) {
+			arg.type = VAR;
+			arg.lazy = true; // var will be evaluated on pop
 		}
-
-		warning("cb_objectcall: target has no method named %s", methodName.asString().c_str());
 	}
 
-	// if there's nothing, try calling a function with that name
-	Symbol func = g_lingo->getHandler(*d.u.s);
-	if (func.type != VOIDSYM) {
-		if (target) {
-			g_lingo->push(methodName);
-		}
-		while (args.size()) {
-			g_lingo->push(args.back());
-			args.pop_back();
-		}
-
-		LC::call(func, nargs.u.i, nargs.type == ARGC);
-	} else {
-		warning("cb_objectcall: could not find object or function with name %s", d.u.s->c_str());
-		// Push a VOID to the stack if function is supposed to return
-		if (nargs.type == ARGC)
-			g_lingo->push(Datum());
-	}
+	LC::call(name, nargs.u.i, nargs.type == ARGC);
 }
 
 


Commit: 24042ab1e6dc4bdff2e9995004b09e36edd2ec1a
    https://github.com/scummvm/scummvm/commit/24042ab1e6dc4bdff2e9995004b09e36edd2ec1a
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-17T21:19:55-04:00

Commit Message:
DIRECTOR: LINGO: Fix compiled `go loop`

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 048989bf19..3fd63f6a14 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1209,7 +1209,7 @@ void LB::b_go(int nargs) {
 		nargs -= 1;
 		bool callSpecial = false;
 
-		if (firstArg.type == STRING) {
+		if (firstArg.type == SYMBOL) {
 			if (*firstArg.u.s == "loop") {
 				g_lingo->func_gotoloop();
 				callSpecial = true;




More information about the Scummvm-git-logs mailing list