[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