[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