[Scummvm-git-logs] scummvm master -> f430e3318aa491ba1c126aea570fcf65bf9e5ec6
sev-
sev at scummvm.org
Sun Dec 1 13:25:13 UTC 2019
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
b513ecdabf DIRECTOR: LINGO: JANITORIAL: Whitespace fixes for grammar
0f1128b943 DIRECTOR: LINGO: Made decodeInstruction() universal
c489e87bf3 DIRECTOR: LINGO: Improve debug output
c3dde9220c DIRECTOR: LINGO: Properly compile scripts with mixed immediate code and definitions
f430e3318a DIRECTOR: LINGO: Fix compilation of the mixed code, and add relevant test
Commit: b513ecdabf6c3c2b123a0516892bdea18389ef41
https://github.com/scummvm/scummvm/commit/b513ecdabf6c3c2b123a0516892bdea18389ef41
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-12-01T14:25:01+01:00
Commit Message:
DIRECTOR: LINGO: JANITORIAL: Whitespace fixes for grammar
Changed paths:
engines/director/lingo/lingo-gr.cpp
engines/director/lingo/lingo-gr.y
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 023ea72..dc46574 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -699,20 +699,20 @@ static const yytype_uint16 yyrline[] =
0, 120, 120, 121, 122, 125, 130, 135, 140, 145,
146, 147, 148, 151, 157, 160, 161, 162, 168, 175,
181, 187, 194, 202, 203, 206, 207, 212, 225, 243,
- 257, 263, 266, 271, 281, 293, 305, 315, 325, 335,
- 347, 348, 351, 352, 355, 356, 359, 367, 368, 374,
- 382, 383, 384, 387, 390, 397, 404, 412, 415, 418,
- 419, 420, 423, 429, 433, 436, 439, 442, 445, 446,
- 449, 452, 453, 454, 457, 461, 469, 475, 476, 477,
- 478, 479, 480, 481, 482, 483, 484, 485, 486, 487,
- 488, 489, 490, 491, 492, 493, 494, 495, 496, 497,
- 498, 499, 500, 501, 502, 503, 504, 505, 506, 509,
- 514, 515, 516, 517, 518, 519, 520, 521, 522, 525,
- 528, 531, 535, 536, 537, 538, 539, 540, 541, 544,
- 545, 548, 549, 552, 553, 564, 565, 566, 567, 571,
- 575, 581, 582, 585, 586, 589, 590, 594, 598, 602,
- 602, 632, 632, 637, 640, 640, 645, 653, 660, 662,
- 663, 664, 665, 668, 672, 680, 681, 682, 685, 686
+ 257, 262, 265, 270, 280, 292, 304, 314, 324, 334,
+ 346, 347, 350, 351, 354, 355, 358, 366, 367, 373,
+ 381, 382, 383, 386, 389, 396, 403, 411, 414, 417,
+ 418, 419, 422, 428, 432, 435, 438, 441, 444, 445,
+ 448, 451, 452, 453, 456, 460, 468, 474, 475, 476,
+ 477, 478, 479, 480, 481, 482, 483, 484, 485, 486,
+ 487, 488, 489, 490, 491, 492, 493, 494, 495, 496,
+ 497, 498, 499, 500, 501, 502, 503, 504, 505, 508,
+ 513, 514, 515, 516, 517, 518, 519, 520, 521, 524,
+ 527, 530, 534, 535, 536, 537, 538, 539, 540, 543,
+ 544, 547, 548, 551, 552, 563, 564, 565, 566, 570,
+ 574, 580, 581, 584, 585, 588, 589, 593, 597, 601,
+ 601, 631, 631, 636, 637, 637, 642, 649, 655, 657,
+ 658, 659, 660, 663, 667, 675, 676, 677, 680, 681
};
#endif
@@ -2325,29 +2325,28 @@ yyreduce:
case 30:
#line 257 "engines/director/lingo/lingo-gr.y"
{
- inst end = 0;
- WRITE_UINT32(&end, (yyvsp[(3) - (3)].code) - (yyvsp[(1) - (3)].code));
- g_lingo->code1(STOP);
- (*g_lingo->_currentScript)[(yyvsp[(1) - (3)].code) + 1] = end;
- ;}
+ inst end = 0;
+ WRITE_UINT32(&end, (yyvsp[(3) - (3)].code) - (yyvsp[(1) - (3)].code));
+ g_lingo->code1(STOP);
+ (*g_lingo->_currentScript)[(yyvsp[(1) - (3)].code) + 1] = end; ;}
break;
case 31:
-#line 263 "engines/director/lingo/lingo-gr.y"
+#line 262 "engines/director/lingo/lingo-gr.y"
{
warning("STUB: TELL is not implemented");
checkEnd((yyvsp[(6) - (6)].s), "tell", true); ;}
break;
case 32:
-#line 266 "engines/director/lingo/lingo-gr.y"
+#line 265 "engines/director/lingo/lingo-gr.y"
{
warning("STUB: TELL is not implemented");
;}
break;
case 33:
-#line 271 "engines/director/lingo/lingo-gr.y"
+#line 270 "engines/director/lingo/lingo-gr.y"
{
inst then = 0, end = 0;
WRITE_UINT32(&then, (yyvsp[(4) - (6)].code) - (yyvsp[(1) - (6)].code));
@@ -2361,7 +2360,7 @@ yyreduce:
break;
case 34:
-#line 281 "engines/director/lingo/lingo-gr.y"
+#line 280 "engines/director/lingo/lingo-gr.y"
{
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, (yyvsp[(4) - (9)].code) - (yyvsp[(1) - (9)].code));
@@ -2377,7 +2376,7 @@ yyreduce:
break;
case 35:
-#line 293 "engines/director/lingo/lingo-gr.y"
+#line 292 "engines/director/lingo/lingo-gr.y"
{
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, (yyvsp[(4) - (9)].code) - (yyvsp[(1) - (9)].code));
@@ -2393,7 +2392,7 @@ yyreduce:
break;
case 36:
-#line 305 "engines/director/lingo/lingo-gr.y"
+#line 304 "engines/director/lingo/lingo-gr.y"
{
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, (yyvsp[(4) - (9)].code) - (yyvsp[(1) - (9)].code));
@@ -2407,7 +2406,7 @@ yyreduce:
break;
case 37:
-#line 315 "engines/director/lingo/lingo-gr.y"
+#line 314 "engines/director/lingo/lingo-gr.y"
{
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, (yyvsp[(4) - (6)].code) - (yyvsp[(1) - (6)].code));
@@ -2421,7 +2420,7 @@ yyreduce:
break;
case 38:
-#line 325 "engines/director/lingo/lingo-gr.y"
+#line 324 "engines/director/lingo/lingo-gr.y"
{
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, (yyvsp[(4) - (10)].code) - (yyvsp[(1) - (10)].code));
@@ -2435,7 +2434,7 @@ yyreduce:
break;
case 39:
-#line 335 "engines/director/lingo/lingo-gr.y"
+#line 334 "engines/director/lingo/lingo-gr.y"
{
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, (yyvsp[(4) - (10)].code) - (yyvsp[(1) - (10)].code));
@@ -2449,17 +2448,17 @@ yyreduce:
break;
case 40:
-#line 347 "engines/director/lingo/lingo-gr.y"
+#line 346 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = 0; ;}
break;
case 41:
-#line 348 "engines/director/lingo/lingo-gr.y"
+#line 347 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = (yyvsp[(2) - (3)].code); ;}
break;
case 46:
-#line 359 "engines/director/lingo/lingo-gr.y"
+#line 358 "engines/director/lingo/lingo-gr.y"
{
inst then = 0;
WRITE_UINT32(&then, (yyvsp[(4) - (6)].code) - (yyvsp[(1) - (6)].code));
@@ -2469,7 +2468,7 @@ yyreduce:
break;
case 48:
-#line 368 "engines/director/lingo/lingo-gr.y"
+#line 367 "engines/director/lingo/lingo-gr.y"
{
inst then = 0;
WRITE_UINT32(&then, (yyvsp[(5) - (6)].code) - (yyvsp[(1) - (6)].code));
@@ -2479,7 +2478,7 @@ yyreduce:
break;
case 49:
-#line 374 "engines/director/lingo/lingo-gr.y"
+#line 373 "engines/director/lingo/lingo-gr.y"
{
inst then = 0;
WRITE_UINT32(&then, (yyvsp[(5) - (6)].code) - (yyvsp[(1) - (6)].code));
@@ -2489,22 +2488,22 @@ yyreduce:
break;
case 50:
-#line 382 "engines/director/lingo/lingo-gr.y"
+#line 381 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(STOP); ;}
break;
case 51:
-#line 383 "engines/director/lingo/lingo-gr.y"
+#line 382 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code2(g_lingo->c_eq, STOP); ;}
break;
case 53:
-#line 387 "engines/director/lingo/lingo-gr.y"
+#line 386 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = g_lingo->code3(g_lingo->c_repeatwhilecode, STOP, STOP); ;}
break;
case 54:
-#line 390 "engines/director/lingo/lingo-gr.y"
+#line 389 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code3(g_lingo->c_repeatwithcode, STOP, STOP);
g_lingo->code3(STOP, STOP, STOP);
@@ -2513,7 +2512,7 @@ yyreduce:
break;
case 55:
-#line 397 "engines/director/lingo/lingo-gr.y"
+#line 396 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_ifcode);
g_lingo->code3(STOP, STOP, STOP);
@@ -2522,7 +2521,7 @@ yyreduce:
break;
case 56:
-#line 404 "engines/director/lingo/lingo-gr.y"
+#line 403 "engines/director/lingo/lingo-gr.y"
{
inst skipEnd;
WRITE_UINT32(&skipEnd, 1); // We have to skip end to avoid multiple executions
@@ -2532,22 +2531,22 @@ yyreduce:
break;
case 57:
-#line 412 "engines/director/lingo/lingo-gr.y"
+#line 411 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = g_lingo->_currentScript->size(); ;}
break;
case 58:
-#line 415 "engines/director/lingo/lingo-gr.y"
+#line 414 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(STOP); (yyval.code) = g_lingo->_currentScript->size(); ;}
break;
case 59:
-#line 418 "engines/director/lingo/lingo-gr.y"
+#line 417 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = g_lingo->_currentScript->size(); ;}
break;
case 62:
-#line 423 "engines/director/lingo/lingo-gr.y"
+#line 422 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_whencode);
g_lingo->code1(STOP);
@@ -2556,73 +2555,73 @@ yyreduce:
break;
case 63:
-#line 429 "engines/director/lingo/lingo-gr.y"
+#line 428 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_tellcode);
g_lingo->code1(STOP); ;}
break;
case 64:
-#line 433 "engines/director/lingo/lingo-gr.y"
+#line 432 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_intpush);
g_lingo->codeInt((yyvsp[(1) - (1)].i)); ;}
break;
case 65:
-#line 436 "engines/director/lingo/lingo-gr.y"
+#line 435 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_floatpush);
g_lingo->codeFloat((yyvsp[(1) - (1)].f)); ;}
break;
case 66:
-#line 439 "engines/director/lingo/lingo-gr.y"
+#line 438 "engines/director/lingo/lingo-gr.y"
{ // D3
(yyval.code) = g_lingo->code1(g_lingo->c_symbolpush);
g_lingo->codeString((yyvsp[(1) - (1)].s)->c_str()); ;}
break;
case 67:
-#line 442 "engines/director/lingo/lingo-gr.y"
+#line 441 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_stringpush);
g_lingo->codeString((yyvsp[(1) - (1)].s)->c_str()); ;}
break;
case 69:
-#line 446 "engines/director/lingo/lingo-gr.y"
+#line 445 "engines/director/lingo/lingo-gr.y"
{
g_lingo->codeFunc((yyvsp[(1) - (1)].s), 0);
delete (yyvsp[(1) - (1)].s); ;}
break;
case 70:
-#line 449 "engines/director/lingo/lingo-gr.y"
+#line 448 "engines/director/lingo/lingo-gr.y"
{
g_lingo->codeFunc((yyvsp[(1) - (2)].s), 1);
delete (yyvsp[(1) - (2)].s); ;}
break;
case 71:
-#line 452 "engines/director/lingo/lingo-gr.y"
+#line 451 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeFunc((yyvsp[(1) - (2)].s), (yyvsp[(2) - (2)].narg)); ;}
break;
case 72:
-#line 453 "engines/director/lingo/lingo-gr.y"
+#line 452 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeFunc((yyvsp[(1) - (4)].s), (yyvsp[(3) - (4)].narg)); ;}
break;
case 73:
-#line 454 "engines/director/lingo/lingo-gr.y"
+#line 453 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->codeFunc((yyvsp[(1) - (4)].s), (yyvsp[(3) - (4)].narg));
delete (yyvsp[(1) - (4)].s); ;}
break;
case 74:
-#line 457 "engines/director/lingo/lingo-gr.y"
+#line 456 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_eval);
g_lingo->codeString((yyvsp[(1) - (1)].s)->c_str());
@@ -2630,7 +2629,7 @@ yyreduce:
break;
case 75:
-#line 461 "engines/director/lingo/lingo-gr.y"
+#line 460 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_intpush);
g_lingo->codeInt(0); // Put dummy id
@@ -2642,7 +2641,7 @@ yyreduce:
break;
case 76:
-#line 469 "engines/director/lingo/lingo-gr.y"
+#line 468 "engines/director/lingo/lingo-gr.y"
{
(yyval.code) = g_lingo->code1(g_lingo->c_theentitypush);
inst e = 0, f = 0;
@@ -2652,205 +2651,205 @@ yyreduce:
break;
case 78:
-#line 476 "engines/director/lingo/lingo-gr.y"
+#line 475 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_add); ;}
break;
case 79:
-#line 477 "engines/director/lingo/lingo-gr.y"
+#line 476 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_sub); ;}
break;
case 80:
-#line 478 "engines/director/lingo/lingo-gr.y"
+#line 477 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_mul); ;}
break;
case 81:
-#line 479 "engines/director/lingo/lingo-gr.y"
+#line 478 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_div); ;}
break;
case 82:
-#line 480 "engines/director/lingo/lingo-gr.y"
+#line 479 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_mod); ;}
break;
case 83:
-#line 481 "engines/director/lingo/lingo-gr.y"
+#line 480 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_gt); ;}
break;
case 84:
-#line 482 "engines/director/lingo/lingo-gr.y"
+#line 481 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_lt); ;}
break;
case 85:
-#line 483 "engines/director/lingo/lingo-gr.y"
+#line 482 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_neq); ;}
break;
case 86:
-#line 484 "engines/director/lingo/lingo-gr.y"
+#line 483 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_ge); ;}
break;
case 87:
-#line 485 "engines/director/lingo/lingo-gr.y"
+#line 484 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_le); ;}
break;
case 88:
-#line 486 "engines/director/lingo/lingo-gr.y"
+#line 485 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_and); ;}
break;
case 89:
-#line 487 "engines/director/lingo/lingo-gr.y"
+#line 486 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_or); ;}
break;
case 90:
-#line 488 "engines/director/lingo/lingo-gr.y"
+#line 487 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_not); ;}
break;
case 91:
-#line 489 "engines/director/lingo/lingo-gr.y"
+#line 488 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_ampersand); ;}
break;
case 92:
-#line 490 "engines/director/lingo/lingo-gr.y"
+#line 489 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_concat); ;}
break;
case 93:
-#line 491 "engines/director/lingo/lingo-gr.y"
+#line 490 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_contains); ;}
break;
case 94:
-#line 492 "engines/director/lingo/lingo-gr.y"
+#line 491 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_starts); ;}
break;
case 95:
-#line 493 "engines/director/lingo/lingo-gr.y"
+#line 492 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = (yyvsp[(2) - (2)].code); ;}
break;
case 96:
-#line 494 "engines/director/lingo/lingo-gr.y"
+#line 493 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = (yyvsp[(2) - (2)].code); g_lingo->code1(g_lingo->c_negate); ;}
break;
case 97:
-#line 495 "engines/director/lingo/lingo-gr.y"
+#line 494 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = (yyvsp[(2) - (3)].code); ;}
break;
case 98:
-#line 496 "engines/director/lingo/lingo-gr.y"
+#line 495 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = g_lingo->code1(g_lingo->c_arraypush); g_lingo->codeArray((yyvsp[(2) - (3)].narg)); ;}
break;
case 99:
-#line 497 "engines/director/lingo/lingo-gr.y"
+#line 496 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_intersects); ;}
break;
case 100:
-#line 498 "engines/director/lingo/lingo-gr.y"
+#line 497 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_within); ;}
break;
case 101:
-#line 499 "engines/director/lingo/lingo-gr.y"
+#line 498 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_charOf); ;}
break;
case 102:
-#line 500 "engines/director/lingo/lingo-gr.y"
+#line 499 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_charToOf); ;}
break;
case 103:
-#line 501 "engines/director/lingo/lingo-gr.y"
+#line 500 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_itemOf); ;}
break;
case 104:
-#line 502 "engines/director/lingo/lingo-gr.y"
+#line 501 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_itemToOf); ;}
break;
case 105:
-#line 503 "engines/director/lingo/lingo-gr.y"
+#line 502 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_lineOf); ;}
break;
case 106:
-#line 504 "engines/director/lingo/lingo-gr.y"
+#line 503 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_lineToOf); ;}
break;
case 107:
-#line 505 "engines/director/lingo/lingo-gr.y"
+#line 504 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_wordOf); ;}
break;
case 108:
-#line 506 "engines/director/lingo/lingo-gr.y"
+#line 505 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_wordToOf); ;}
break;
case 109:
-#line 509 "engines/director/lingo/lingo-gr.y"
+#line 508 "engines/director/lingo/lingo-gr.y"
{
g_lingo->codeFunc((yyvsp[(1) - (2)].s), 1);
delete (yyvsp[(1) - (2)].s); ;}
break;
case 110:
-#line 514 "engines/director/lingo/lingo-gr.y"
+#line 513 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_printtop); ;}
break;
case 113:
-#line 517 "engines/director/lingo/lingo-gr.y"
+#line 516 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_exitRepeat); ;}
break;
case 114:
-#line 518 "engines/director/lingo/lingo-gr.y"
+#line 517 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_procret); ;}
break;
case 118:
-#line 522 "engines/director/lingo/lingo-gr.y"
+#line 521 "engines/director/lingo/lingo-gr.y"
{
g_lingo->codeFunc((yyvsp[(1) - (1)].s), 0);
delete (yyvsp[(1) - (1)].s); ;}
break;
case 119:
-#line 525 "engines/director/lingo/lingo-gr.y"
+#line 524 "engines/director/lingo/lingo-gr.y"
{
g_lingo->codeFunc((yyvsp[(1) - (2)].s), 1);
delete (yyvsp[(1) - (2)].s); ;}
break;
case 120:
-#line 528 "engines/director/lingo/lingo-gr.y"
+#line 527 "engines/director/lingo/lingo-gr.y"
{
g_lingo->codeFunc((yyvsp[(1) - (2)].s), 1);
delete (yyvsp[(1) - (2)].s); ;}
break;
case 121:
-#line 531 "engines/director/lingo/lingo-gr.y"
+#line 530 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_voidpush);
g_lingo->codeFunc((yyvsp[(1) - (1)].s), 1);
@@ -2858,87 +2857,87 @@ yyreduce:
break;
case 122:
-#line 535 "engines/director/lingo/lingo-gr.y"
+#line 534 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeFunc((yyvsp[(1) - (2)].s), (yyvsp[(2) - (2)].narg)); ;}
break;
case 123:
-#line 536 "engines/director/lingo/lingo-gr.y"
+#line 535 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeFunc((yyvsp[(1) - (4)].s), (yyvsp[(3) - (4)].narg)); ;}
break;
case 124:
-#line 537 "engines/director/lingo/lingo-gr.y"
+#line 536 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeMe((yyvsp[(3) - (4)].s), 0); ;}
break;
case 125:
-#line 538 "engines/director/lingo/lingo-gr.y"
+#line 537 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeMe((yyvsp[(3) - (6)].s), (yyvsp[(5) - (6)].narg)); ;}
break;
case 126:
-#line 539 "engines/director/lingo/lingo-gr.y"
+#line 538 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_open); ;}
break;
case 127:
-#line 540 "engines/director/lingo/lingo-gr.y"
+#line 539 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code2(g_lingo->c_voidpush, g_lingo->c_open); ;}
break;
case 128:
-#line 541 "engines/director/lingo/lingo-gr.y"
+#line 540 "engines/director/lingo/lingo-gr.y"
{ Common::String s(*(yyvsp[(1) - (3)].s)); s += '-'; s += *(yyvsp[(2) - (3)].s); g_lingo->codeFunc(&s, (yyvsp[(3) - (3)].narg)); ;}
break;
case 129:
-#line 544 "engines/director/lingo/lingo-gr.y"
+#line 543 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_global); g_lingo->codeString((yyvsp[(1) - (1)].s)->c_str()); delete (yyvsp[(1) - (1)].s); ;}
break;
case 130:
-#line 545 "engines/director/lingo/lingo-gr.y"
+#line 544 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_global); g_lingo->codeString((yyvsp[(3) - (3)].s)->c_str()); delete (yyvsp[(3) - (3)].s); ;}
break;
case 131:
-#line 548 "engines/director/lingo/lingo-gr.y"
+#line 547 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_property); g_lingo->codeString((yyvsp[(1) - (1)].s)->c_str()); delete (yyvsp[(1) - (1)].s); ;}
break;
case 132:
-#line 549 "engines/director/lingo/lingo-gr.y"
+#line 548 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_property); g_lingo->codeString((yyvsp[(3) - (3)].s)->c_str()); delete (yyvsp[(3) - (3)].s); ;}
break;
case 133:
-#line 552 "engines/director/lingo/lingo-gr.y"
+#line 551 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_instance); g_lingo->codeString((yyvsp[(1) - (1)].s)->c_str()); delete (yyvsp[(1) - (1)].s); ;}
break;
case 134:
-#line 553 "engines/director/lingo/lingo-gr.y"
+#line 552 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_instance); g_lingo->codeString((yyvsp[(3) - (3)].s)->c_str()); delete (yyvsp[(3) - (3)].s); ;}
break;
case 135:
-#line 564 "engines/director/lingo/lingo-gr.y"
+#line 563 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_gotoloop); ;}
break;
case 136:
-#line 565 "engines/director/lingo/lingo-gr.y"
+#line 564 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_gotonext); ;}
break;
case 137:
-#line 566 "engines/director/lingo/lingo-gr.y"
+#line 565 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_gotoprevious); ;}
break;
case 138:
-#line 567 "engines/director/lingo/lingo-gr.y"
+#line 566 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_intpush);
g_lingo->codeInt(1);
@@ -2946,7 +2945,7 @@ yyreduce:
break;
case 139:
-#line 571 "engines/director/lingo/lingo-gr.y"
+#line 570 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_intpush);
g_lingo->codeInt(3);
@@ -2954,7 +2953,7 @@ yyreduce:
break;
case 140:
-#line 575 "engines/director/lingo/lingo-gr.y"
+#line 574 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_intpush);
g_lingo->codeInt(2);
@@ -2962,12 +2961,12 @@ yyreduce:
break;
case 145:
-#line 589 "engines/director/lingo/lingo-gr.y"
+#line 588 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(g_lingo->c_playdone); ;}
break;
case 146:
-#line 590 "engines/director/lingo/lingo-gr.y"
+#line 589 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_intpush);
g_lingo->codeInt(1);
@@ -2975,7 +2974,7 @@ yyreduce:
break;
case 147:
-#line 594 "engines/director/lingo/lingo-gr.y"
+#line 593 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_intpush);
g_lingo->codeInt(3);
@@ -2983,7 +2982,7 @@ yyreduce:
break;
case 148:
-#line 598 "engines/director/lingo/lingo-gr.y"
+#line 597 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_intpush);
g_lingo->codeInt(2);
@@ -2991,24 +2990,24 @@ yyreduce:
break;
case 149:
-#line 602 "engines/director/lingo/lingo-gr.y"
+#line 601 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeSetImmediate(true); ;}
break;
case 150:
-#line 602 "engines/director/lingo/lingo-gr.y"
+#line 601 "engines/director/lingo/lingo-gr.y"
{
g_lingo->codeSetImmediate(false);
g_lingo->codeFunc((yyvsp[(1) - (3)].s), (yyvsp[(3) - (3)].narg)); ;}
break;
case 151:
-#line 632 "engines/director/lingo/lingo-gr.y"
+#line 631 "engines/director/lingo/lingo-gr.y"
{ g_lingo->_indef = true; g_lingo->_currentFactory.clear(); ;}
break;
case 152:
-#line 633 "engines/director/lingo/lingo-gr.y"
+#line 632 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_procret);
g_lingo->define(*(yyvsp[(2) - (8)].s), (yyvsp[(4) - (8)].code), (yyvsp[(5) - (8)].narg));
@@ -3016,19 +3015,17 @@ yyreduce:
break;
case 153:
-#line 637 "engines/director/lingo/lingo-gr.y"
- {
- g_lingo->codeFactory(*(yyvsp[(2) - (2)].s));
- ;}
+#line 636 "engines/director/lingo/lingo-gr.y"
+ { g_lingo->codeFactory(*(yyvsp[(2) - (2)].s)); ;}
break;
case 154:
-#line 640 "engines/director/lingo/lingo-gr.y"
+#line 637 "engines/director/lingo/lingo-gr.y"
{ g_lingo->_indef = true; ;}
break;
case 155:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 638 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_procret);
g_lingo->define(*(yyvsp[(2) - (8)].s), (yyvsp[(4) - (8)].code), (yyvsp[(5) - (8)].narg) + 1, &g_lingo->_currentFactory);
@@ -3036,59 +3033,57 @@ yyreduce:
break;
case 156:
-#line 645 "engines/director/lingo/lingo-gr.y"
+#line 642 "engines/director/lingo/lingo-gr.y"
{ // D3
- g_lingo->code1(g_lingo->c_procret);
- g_lingo->define(*(yyvsp[(1) - (7)].s), (yyvsp[(2) - (7)].code), (yyvsp[(3) - (7)].narg));
- g_lingo->_indef = false;
- g_lingo->_ignoreMe = false;
+ g_lingo->code1(g_lingo->c_procret);
+ g_lingo->define(*(yyvsp[(1) - (7)].s), (yyvsp[(2) - (7)].code), (yyvsp[(3) - (7)].narg));
+ g_lingo->_indef = false;
+ g_lingo->_ignoreMe = false;
- checkEnd((yyvsp[(7) - (7)].s), (yyvsp[(1) - (7)].s)->c_str(), false);
- ;}
+ checkEnd((yyvsp[(7) - (7)].s), (yyvsp[(1) - (7)].s)->c_str(), false); ;}
break;
case 157:
-#line 653 "engines/director/lingo/lingo-gr.y"
+#line 649 "engines/director/lingo/lingo-gr.y"
{ // D4. No 'end' clause
- g_lingo->code1(g_lingo->c_procret);
- g_lingo->define(*(yyvsp[(1) - (6)].s), (yyvsp[(2) - (6)].code), (yyvsp[(3) - (6)].narg));
- g_lingo->_indef = false;
- g_lingo->_ignoreMe = false;
- ;}
+ g_lingo->code1(g_lingo->c_procret);
+ g_lingo->define(*(yyvsp[(1) - (6)].s), (yyvsp[(2) - (6)].code), (yyvsp[(3) - (6)].narg));
+ g_lingo->_indef = false;
+ g_lingo->_ignoreMe = false; ;}
break;
case 158:
-#line 660 "engines/director/lingo/lingo-gr.y"
+#line 655 "engines/director/lingo/lingo-gr.y"
{ (yyval.s) = (yyvsp[(2) - (2)].s); g_lingo->_indef = true; g_lingo->_currentFactory.clear(); g_lingo->_ignoreMe = true; ;}
break;
case 159:
-#line 662 "engines/director/lingo/lingo-gr.y"
+#line 657 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 0; ;}
break;
case 160:
-#line 663 "engines/director/lingo/lingo-gr.y"
+#line 658 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeArg((yyvsp[(1) - (1)].s)); (yyval.narg) = 1; ;}
break;
case 161:
-#line 664 "engines/director/lingo/lingo-gr.y"
+#line 659 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeArg((yyvsp[(3) - (3)].s)); (yyval.narg) = (yyvsp[(1) - (3)].narg) + 1; ;}
break;
case 162:
-#line 665 "engines/director/lingo/lingo-gr.y"
+#line 660 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeArg((yyvsp[(4) - (4)].s)); (yyval.narg) = (yyvsp[(1) - (4)].narg) + 1; ;}
break;
case 163:
-#line 668 "engines/director/lingo/lingo-gr.y"
+#line 663 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeArgStore(); ;}
break;
case 164:
-#line 672 "engines/director/lingo/lingo-gr.y"
+#line 667 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(g_lingo->c_call);
g_lingo->codeString((yyvsp[(1) - (2)].s)->c_str());
@@ -3098,33 +3093,33 @@ yyreduce:
break;
case 165:
-#line 680 "engines/director/lingo/lingo-gr.y"
+#line 675 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 0; ;}
break;
case 166:
-#line 681 "engines/director/lingo/lingo-gr.y"
+#line 676 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 1; ;}
break;
case 167:
-#line 682 "engines/director/lingo/lingo-gr.y"
+#line 677 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = (yyvsp[(1) - (3)].narg) + 1; ;}
break;
case 168:
-#line 685 "engines/director/lingo/lingo-gr.y"
+#line 680 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 1; ;}
break;
case 169:
-#line 686 "engines/director/lingo/lingo-gr.y"
+#line 681 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = (yyvsp[(1) - (3)].narg) + 1; ;}
break;
/* Line 1267 of yacc.c. */
-#line 3128 "engines/director/lingo/lingo-gr.cpp"
+#line 3123 "engines/director/lingo/lingo-gr.cpp"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3338,6 +3333,6 @@ yyreturn:
}
-#line 689 "engines/director/lingo/lingo-gr.y"
+#line 684 "engines/director/lingo/lingo-gr.y"
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index c3a4b1d..9f45121 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -255,11 +255,10 @@ stmt: stmtoneliner
checkEnd($11, "repeat", true); }
| when stmtoneliner end {
- inst end = 0;
- WRITE_UINT32(&end, $3 - $1);
- g_lingo->code1(STOP);
- (*g_lingo->_currentScript)[$1 + 1] = end;
- }
+ inst end = 0;
+ WRITE_UINT32(&end, $3 - $1);
+ g_lingo->code1(STOP);
+ (*g_lingo->_currentScript)[$1 + 1] = end; }
| tell expr nl stmtlist end ENDCLAUSE {
warning("STUB: TELL is not implemented");
checkEnd($6, "tell", true); }
@@ -634,28 +633,24 @@ defn: tMACRO ID { g_lingo->_indef = true; g_lingo->_currentFactory.clear(); }
g_lingo->code1(g_lingo->c_procret);
g_lingo->define(*$2, $4, $5);
g_lingo->_indef = false; }
- | tFACTORY ID {
- g_lingo->codeFactory(*$2);
- }
+ | tFACTORY ID { g_lingo->codeFactory(*$2); }
| tMETHOD ID { g_lingo->_indef = true; }
begin argdef nl argstore stmtlist {
g_lingo->code1(g_lingo->c_procret);
g_lingo->define(*$2, $4, $5 + 1, &g_lingo->_currentFactory);
- g_lingo->_indef = false; } ;
+ g_lingo->_indef = false; }
| on begin argdef nl argstore stmtlist ENDCLAUSE { // D3
- g_lingo->code1(g_lingo->c_procret);
- g_lingo->define(*$1, $2, $3);
- g_lingo->_indef = false;
- g_lingo->_ignoreMe = false;
+ g_lingo->code1(g_lingo->c_procret);
+ g_lingo->define(*$1, $2, $3);
+ g_lingo->_indef = false;
+ g_lingo->_ignoreMe = false;
- checkEnd($7, $1->c_str(), false);
- }
+ checkEnd($7, $1->c_str(), false); }
| on begin argdef nl argstore stmtlist { // D4. No 'end' clause
- g_lingo->code1(g_lingo->c_procret);
- g_lingo->define(*$1, $2, $3);
- g_lingo->_indef = false;
- g_lingo->_ignoreMe = false;
- }
+ g_lingo->code1(g_lingo->c_procret);
+ g_lingo->define(*$1, $2, $3);
+ g_lingo->_indef = false;
+ g_lingo->_ignoreMe = false; }
on: tON ID { $$ = $2; g_lingo->_indef = true; g_lingo->_currentFactory.clear(); g_lingo->_ignoreMe = true; }
Commit: 0f1128b943ae0fb6667b238871e38dc639cdb94e
https://github.com/scummvm/scummvm/commit/0f1128b943ae0fb6667b238871e38dc639cdb94e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-12-01T14:25:01+01:00
Commit Message:
DIRECTOR: LINGO: Made decodeInstruction() universal
Changed paths:
engines/director/lingo/lingo-code.cpp
engines/director/lingo/lingo-codegen.cpp
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 81fad9b..05ad0cc 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1002,14 +1002,14 @@ void Lingo::c_whencode() {
int entity = g_lingo->_currentEntityId;
g_lingo->_currentEntityId = 0;
- g_lingo->define(eventname, start, 0, NULL, end);
+ Symbol *sym = g_lingo->define(eventname, start, 0, NULL, end);
g_lingo->_currentEntityId = entity;
if (debugChannelSet(1, kDebugLingoExec)) {
- uint pc = start;
- while (pc <= end) {
- Common::String instr = g_lingo->decodeInstruction(pc, &pc);
+ uint pc = 0;
+ while (pc < sym->u.defn->size()) {
+ Common::String instr = g_lingo->decodeInstruction(sym->u.defn, pc, &pc);
debugC(1, kDebugLingoExec, "[%5d] %s", pc, instr.c_str());
}
}
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 2be8848..16874f6 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -54,7 +54,7 @@ namespace Director {
void Lingo::execute(uint pc) {
for (_pc = pc; !_returning && (*_currentScript)[_pc] != STOP;) {
- Common::String instr = decodeInstruction(_pc);
+ Common::String instr = decodeInstruction(_currentScript, _pc);
if (debugChannelSet(5, kDebugLingoExec))
printStack("Stack before: ");
@@ -85,11 +85,11 @@ void Lingo::printStack(const char *s) {
debugC(5, kDebugLingoExec, "%s", stack.c_str());
}
-Common::String Lingo::decodeInstruction(uint pc, uint *newPc) {
+Common::String Lingo::decodeInstruction(ScriptData *sd, uint pc, uint *newPc) {
Symbol sym;
Common::String res;
- sym.u.func = (*_currentScript)[pc++];
+ sym.u.func = (*sd)[pc++];
if (_functions.contains((void *)sym.u.s)) {
res = _functions[(void *)sym.u.s]->name;
const char *pars = _functions[(void *)sym.u.s]->proto;
@@ -99,7 +99,7 @@ Common::String Lingo::decodeInstruction(uint pc, uint *newPc) {
switch (*pars++) {
case 'i':
{
- i = (*_currentScript)[pc++];
+ i = (*sd)[pc++];
int v = READ_UINT32(&i);
res += Common::String::format(" %d", v);
@@ -108,7 +108,7 @@ Common::String Lingo::decodeInstruction(uint pc, uint *newPc) {
case 'f':
{
Datum d;
- i = (*_currentScript)[pc++];
+ i = (*sd)[pc++];
d.u.f = *(double *)(&i);
res += Common::String::format(" %f", d.u.f);
@@ -116,7 +116,7 @@ Common::String Lingo::decodeInstruction(uint pc, uint *newPc) {
}
case 'o':
{
- i = (*_currentScript)[pc++];
+ i = (*sd)[pc++];
int v = READ_UINT32(&i);
res += Common::String::format(" [%5d]", v);
@@ -124,7 +124,7 @@ Common::String Lingo::decodeInstruction(uint pc, uint *newPc) {
}
case 's':
{
- char *s = (char *)&(*_currentScript)[pc];
+ char *s = (char *)&(*sd)[pc];
pc += calcStringAlignment(s);
res += Common::String::format(" \"%s\"", s);
@@ -212,7 +212,7 @@ void Lingo::cleanLocalVars() {
g_lingo->_localvars = 0;
}
-void Lingo::define(Common::String &name, int start, int nargs, Common::String *prefix, int end) {
+Symbol *Lingo::define(Common::String &name, int start, int nargs, Common::String *prefix, int end) {
if (prefix)
name = *prefix + "-" + name;
@@ -243,6 +243,8 @@ void Lingo::define(Common::String &name, int start, int nargs, Common::String *p
sym->u.defn = new ScriptData(&(*_currentScript)[start], end - start + 1);
sym->nargs = nargs;
sym->maxArgs = nargs;
+
+ return sym;
}
int Lingo::codeString(const char *str) {
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index b9236d8..703a5b2 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -182,7 +182,7 @@ void Lingo::addCode(const char *code, ScriptType type, uint16 id) {
if (debugChannelSet(3, kDebugLingoCompile)) {
uint pc = 0;
while (pc < _currentScript->size()) {
- Common::String instr = decodeInstruction(pc, &pc);
+ Common::String instr = decodeInstruction(_currentScript, pc, &pc);
debugC(2, kDebugLingoCompile, "[%5d] %s", pc, instr.c_str());
}
}
@@ -215,7 +215,7 @@ void Lingo::addCode(const char *code, ScriptType type, uint16 id) {
uint pc = 0;
while (pc < _currentScript->size()) {
- Common::String instr = decodeInstruction(pc, &pc);
+ Common::String instr = decodeInstruction(_currentScript, pc, &pc);
debugC(2, kDebugLingoCompile, "[%5d] %s", pc, instr.c_str());
}
}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index b2acdd8..13dbc0a 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -179,7 +179,7 @@ public:
void addNamesV4(Common::SeekableSubReadStreamEndian &stream);
void executeScript(ScriptType type, uint16 id, uint16 function);
void printStack(const char *s);
- Common::String decodeInstruction(uint pc, uint *newPC = NULL);
+ Common::String decodeInstruction(ScriptData *sd, uint pc, uint *newPC = NULL);
void initBuiltIns();
void initFuncs();
@@ -214,7 +214,7 @@ public:
void popContext();
Symbol *lookupVar(const char *name, bool create = true, bool putInGlobalList = false);
void cleanLocalVars();
- void define(Common::String &s, int start, int nargs, Common::String *prefix = NULL, int end = -1);
+ Symbol *define(Common::String &s, int start, int nargs, Common::String *prefix = NULL, int end = -1);
void processIf(int elselabel, int endlabel);
int alignTypes(Datum &d1, Datum &d2);
Commit: c489e87bf3c47980cb18558c2d7862659ae47169
https://github.com/scummvm/scummvm/commit/c489e87bf3c47980cb18558c2d7862659ae47169
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-12-01T14:25:01+01:00
Commit Message:
DIRECTOR: LINGO: Improve debug output
Changed paths:
engines/director/lingo/lingo-codegen.cpp
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 16874f6..2f31f5c 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -216,7 +216,7 @@ Symbol *Lingo::define(Common::String &name, int start, int nargs, Common::String
if (prefix)
name = *prefix + "-" + name;
- debugC(1, kDebugLingoCompile, "define(\"%s\", %d, %d, %d)", name.c_str(), start, _currentScript->size() - 1, nargs);
+ debugC(1, kDebugLingoCompile, "define(\"%s\"(len: %d), %d, %d, \"%s\", %d)", name.c_str(), _currentScript->size() - 1, start, nargs, (prefix ? prefix->c_str() : ""), end);
Symbol *sym = getHandler(name);
if (sym == NULL) { // Create variable if it was not defined
Commit: c3dde9220c03f46d76bfeed579cb0a1a833367d9
https://github.com/scummvm/scummvm/commit/c3dde9220c03f46d76bfeed579cb0a1a833367d9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-12-01T14:25:01+01:00
Commit Message:
DIRECTOR: LINGO: Properly compile scripts with mixed immediate code and definitions
Changed paths:
engines/director/lingo/lingo-code.cpp
engines/director/lingo/lingo-codegen.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 05ad0cc..b2607ed 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1002,7 +1002,7 @@ void Lingo::c_whencode() {
int entity = g_lingo->_currentEntityId;
g_lingo->_currentEntityId = 0;
- Symbol *sym = g_lingo->define(eventname, start, 0, NULL, end);
+ Symbol *sym = g_lingo->define(eventname, start, 0, NULL, end, false); // Redefine, but not remove code
g_lingo->_currentEntityId = entity;
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 2f31f5c..2ba3c09 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -212,7 +212,7 @@ void Lingo::cleanLocalVars() {
g_lingo->_localvars = 0;
}
-Symbol *Lingo::define(Common::String &name, int start, int nargs, Common::String *prefix, int end) {
+Symbol *Lingo::define(Common::String &name, int start, int nargs, Common::String *prefix, int end, bool removeCode) {
if (prefix)
name = *prefix + "-" + name;
@@ -244,6 +244,12 @@ Symbol *Lingo::define(Common::String &name, int start, int nargs, Common::String
sym->nargs = nargs;
sym->maxArgs = nargs;
+ // Now remove all defined code from the _currentScript
+ if (removeCode)
+ for (int i = end - 1; i >= start; i--) {
+ _currentScript->remove_at(i);
+ }
+
return sym;
}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 13dbc0a..872ac21 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -214,7 +214,7 @@ public:
void popContext();
Symbol *lookupVar(const char *name, bool create = true, bool putInGlobalList = false);
void cleanLocalVars();
- Symbol *define(Common::String &s, int start, int nargs, Common::String *prefix = NULL, int end = -1);
+ Symbol *define(Common::String &s, int start, int nargs, Common::String *prefix = NULL, int end = -1, bool removeCode = true);
void processIf(int elselabel, int endlabel);
int alignTypes(Datum &d1, Datum &d2);
Commit: f430e3318aa491ba1c126aea570fcf65bf9e5ec6
https://github.com/scummvm/scummvm/commit/f430e3318aa491ba1c126aea570fcf65bf9e5ec6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-12-01T14:25:01+01:00
Commit Message:
DIRECTOR: LINGO: Fix compilation of the mixed code, and add relevant test
Changed paths:
A engines/director/lingo/tests/mixed-code.lingo
engines/director/lingo/lingo-codegen.cpp
engines/director/lingo/lingo.cpp
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 2ba3c09..0b97477 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -250,6 +250,14 @@ Symbol *Lingo::define(Common::String &name, int start, int nargs, Common::String
_currentScript->remove_at(i);
}
+ if (debugChannelSet(1, kDebugLingoExec)) {
+ uint pc = 0;
+ while (pc < sym->u.defn->size()) {
+ Common::String instr = g_lingo->decodeInstruction(sym->u.defn, pc, &pc);
+ debugC(1, kDebugLingoExec, "[%5d] %s", pc, instr.c_str());
+ }
+ }
+
return sym;
}
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 703a5b2..d009893 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -155,17 +155,11 @@ void Lingo::addCode(const char *code, ScriptType type, uint16 id) {
// Strip comments for ease of the parser
Common::String codeNorm = stripComments(code);
code = codeNorm.c_str();
+ begin = code;
// macros and factories have conflicting grammar. Thus we ease life for the parser.
- if ((begin = findNextDefinition(code))) {
- bool first = true;
-
- while ((end = findNextDefinition(begin + 1))) {
-
- if (first) {
- begin = code;
- first = false;
- }
+ if ((end = findNextDefinition(code))) {
+ do {
Common::String chunk(begin, end);
if (chunk.hasPrefix("factory") || chunk.hasPrefix("method"))
@@ -187,15 +181,8 @@ void Lingo::addCode(const char *code, ScriptType type, uint16 id) {
}
}
- _currentScript->clear();
-
begin = end;
- }
-
- // Do not execute event handlers, macros and factories
- // A side effect of it is that if you had those in your test script,
- // then the whole script will not be executed
- _hadError = true;
+ } while ((end = findNextDefinition(begin + 1)));
debugC(1, kDebugLingoCompile, "Code chunk:\n#####\n%s\n#####", begin);
parse(begin);
diff --git a/engines/director/lingo/tests/mixed-code.lingo b/engines/director/lingo/tests/mixed-code.lingo
new file mode 100644
index 0000000..6f03e0b
--- /dev/null
+++ b/engines/director/lingo/tests/mixed-code.lingo
@@ -0,0 +1,14 @@
+put "ONE"
+
+on two
+ put "TWO"
+end two
+
+put "THREE"
+
+on four
+ put "FOUR"
+end FOUR
+
+four
+two
More information about the Scummvm-git-logs
mailing list